做插件开发得时候碰到了这个需求,要求只显示工作空间中当前选中的项目,当时弄了好久没啥办法,网上搜了好久也没有想要的,怎么办了?只有自己想办法了,一开始是想办法控制给它的值,发现不行,最后只能进行反编译,然后自己改源码咯
private void handleBrowse(Text selectTest) {
String project = containerText.getText().replace("/","").trim();
ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(),
ResourcesPlugin.getWorkspace().getRoot(),
false,
"Select new file container");
dialog.setProjectName(project);
if (dialog.open() == ContainerSelectionDialog.OK) {
Object[] result = dialog.getResult();
if (result.length == 1) {
String sour=containerText.getText();
selectTest.setText(((Path) result[0]).toString().substring(sour.length()+1).replace("/", "."));
}
}
}
这是对它基础调用,ContainerSelectionDialog对它翻译之后会在类开头看到一个ContainerSelectionGroup类的声明,这个类里面才是封装ContainerSelectionDialog里面的树状菜单,然后继续反编译,ContainerSelectionGroup类反编译之后找到createTreeViewer方法,在这个方法最后一行有一个this.treeViewer.setInput(ResourcesPlugin.getWorkspace()<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">);代码,这就是传值到树状菜单了,然后把这个改掉,我改成的是IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
hide(root); this.treeViewer.setInput(root); 先获取项目空间所有项目,然后把当前选中得项目名传过来遍历对比,不是当前项目就全部隐藏掉</span><pre name="code" class="java">private void hide(IWorkspaceRoot root){
try {
iproject =root.getProjects();
if(iproject==null || iproject.length==0){
return;
}
for (int i = 0; i < iproject.length; i++) {
if(!projectName.equals(iproject[i].getName())){
iproject[i].setHidden(true);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
最后在设值,显示出来之后再把值还原回去,需要在ContainerSelectionDialog类里面createDialogArea方法中设置<pre name="code" class="java">public void show(){
try {
if(iproject==null || iproject.length==0){
return;
}
for (int i = 0; i < iproject.length; i++) {
iproject[i].setHidden(false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
<span style="white-space:pre"> </span>然后就搞定了