摘要 在開發eclipse pluin的時候
某些情況下我們需要訪問eclipse workspace
例如
在插件中以編程的方式調用ant命令
訪問eclipse workspace中的project等
一次在網上偶遇到本文的原創者kobye
此人正在進行jsports項目的開發
對此頗有心地
故在此行文與眾人共同探討之
一基礎工作在插件中以編程的方式調用ant命令 在開發eclipse pluin的時候
某些情況下我們需要訪問eclipse workspace
例如
在插件中以編程的方式調用ant命令等
如何做到這一點?
public void execute(){
IWorkspace ws = ResourcesPlugin
getWorkspace();
IProject[] ps = ws
getRoot()
getProjects();
System
out
println(ws
getRoot()
getFullPath()
makeAbsolute()
toOSString());
for(int i=
;i<ps
length;i++){
IProject p = ps[i];
IPath location = p
getLocation();
IFile ifile = p
getFile(
build
xml
);
System
out
println(ifile
getLocation()
toFile()
getAbsolutePath());
File f = new File(ifile
getLocation()
toFile()
getAbsolutePath());
if(!f
exists()){
continue;
}
Project pro = new Project();
pro
setBasedir(location
toFile()
getAbsolutePath());
pro
init();
ProjectHelper helper = ProjectHelper
getProjectHelper();
helper
parse(pro
f);
Hashtable tars = pro
getTargets();
System
out
println(
name===
+name);
Target t = (Target) tars
get(name);
if(t==null){
return;
}
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger
setErrorPrintStream(System
err);
consoleLogger
setOutputPrintStream(System
out);
consoleLogger
setMessageOutputLevel(Project
MSG_INFO);
pro
addBuildListener(consoleLogger);
pro
executeTarget(this
name);
break;
}
}
以上代碼(單獨編譯不會通過
請把 name換位ant 的target)可以放到插件的代碼中
以上代碼的含義
獲得eclipse workspace的引用
對workspace下的pronjects進行循環
如果該project下有build
xml並且該文件中有name的target那麼就以ant的方式調用
並把ant運行的輸出輸出到eclipse的console
二如何訪問current project 上一節給出來在eclipse plugin 中訪問eclipse workspace
從而訪問該workspace下所有project的方案
WorkSpace以及相關的類不提供直接訪問current project的方法
所以只能走其他途徑
在我們的plugin中
我們要提供界面入口
比如 PopMenu ActionMenu 等之類的
這些界面入口是要實現一些接口的
例如:PopMenu要實現IObjectActionDelegate
這個接口有幾個方法
其中 public void selectionChanged(IAction action
ISelection
selection) ;
這個方法很早重要
可以通過ISelection獲得當前選擇中的Project
ISelection共有三個子接口
分別對應三個實現類
那麼通過判斷ISelection的實際類型可以獲得其子接口的引用
然後對其遍歷
通過getAdaptor方法獲得所有的選擇的IResource的引用
再進一步對IResource進行類型識別
得到IResource
PROJECT類型的元素即為IProject的引用
下面是程序:
import java
lang
reflect
Array;import java
util
ArrayList;
import java
util
Iterator;import re
resources
IProject;
import re
resources
IResource;
import re
runtime
IAdaptable;
import org
eclipse
jface
action
IAction;
import org
eclipse
jface
dialogs
MessageDialog;
import org
eclipse
jface
viewers
ISelection;
import org
eclipse
jface
viewers
IStructuredSelection;import org
eclipse
swt
widgets
Shell;import org
eclipse
ui
IObjectActionDelegate;
import org
eclipse
ui
IWorkbenchPart;
/** * @author Kobye */public class TestPopMenu implements IObjectActionDelegate {
private IStructuredSelection selection;
/** * Constructor for Action
*/ public TestPopMenu () { super();
} /** * @see IObjectActionDelegate#setActivePart(IAction IWorkbenchPart)
*/ public void setActivePart(IAction action
IWorkbenchPart targetPart) { }
/**
* @see IActionDelegate#run(IAction) */ public void run(IAction action) { Shell shell = new Shell();
MessageDialog
openInformation( shell
Pop Plug
in
NewAction was executed
);
} public static Object getAdapter(Object adaptable
Class c) { if (c
isInstance(adaptable)) { return adaptable; } if (adaptable instanceof IAdaptable) { IAdaptable a = (IAdaptable) adaptable;
Object adapter = a
getAdapter(c);
if (c
isInstance(adapter)) { return adapter;
} } return null;
} /*** * 這個方法和下面的方法很重要
* @param selection * @param c * @return */ private Object[] getSelectedResources(IStructuredSelection selection
Class c) { return getSelectedAdaptables(selection
c);
} private static Object[] getSelectedAdaptables(ISelection selection
Class c) { ArrayList result = null;
if (!selection
isEmpty()) { result = new ArrayList();
Iterator elements = ((IStructuredSelection) erator();
while (elements
hasNext()) { Object adapter = getAdapter(elements
next()
c);
if (c
isInstance(adapter)) { result
add(adapter);
} } } if (result != null && !result
isEmpty()) { return result
toArray((Object[])Array
newInstance(c
result
size())); } return (Object[])Array
newInstance(c
);
} /** * 這個方法保存了ISelection的引用
* 請注意
ISelection的實際類型因不同的應用
其實際類型可能不同
* 共有三種可能
請查閱eclipse API
* * @see IActionDelegate#selectionChanged(IAction
ISelection) */ public void selectionChanged(IAction action
ISelection selection) { this
selection = (IStructuredSelection) selection;
System
out
println(
current project name===
+this
getProject()
getName());
} /** * 這個方法可以得到current project
* * @return */ private IProject getProject(){ IResource[]rs =(IResource[])getSelectedResources((IStructuredSelection)selection
IResource
class);
IProject project = null;
for(int i =
;i<rs
length;i++){
IResource r = rs[i];
if(r
getType()==IResource
PROJECT){
project = (IProject) r;
break;
}
}
return project; }}
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28648.html