一般在一个陌生领域开发时,动手之前都会找一些功能相同或近似的示例,通过观察示例学习一个实现的路径,而后再加些个性化的东西进去。
编写工作区切换这个功能,第一个想到的,肯定就是Java IDE中的“Switch Workspace”按钮。这个按钮对应的动作写在
org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction 类中,位于org.eclipse.ui.ide 插件里。
eclipse中要实现工作区切换除了OpenWorkspaceAction中的方法,应该还有两种方式可以尝试:
- 在PlatformUI.createAndRunWorkbench之前调用 Platform.getInstanceLocation().setURL方法,可以改变工作区,但如果要实现向指定工作目录转向,则需要通过某种方式(例如通过系统参数)将指定目录信息跨过重启的过程传递给启动方法。也是要重启一次。
- 如果切换工作区的目的只是想改变一个view的显示内容,则直接改这个view的contentProvider,而后执行以下刷新就可以。不过这只是一个想法,没有付诸实践,得空儿了得去试试。
不过这里不讨论上面的两种情况,只来看看OpenWorkspaceAction中的经典做法是如何实现的吧。
1、 拼装一个启动命令,拿着这个命令你可以直接从命令行跑起一个eclipse示例来
2、 将这个启动命令存储在System的eclipse.exitdata属性中
3、 将System的eclipse.exitcode属性设置为 24(relaunch)。eclipse.exitcode可以有三种状态,在IApplication中注册的,分别是 0(EXIT_OK),23(EXIT_RESTART), 24(EXIT_RELAUNCH), 具体每个状态的含义可以参考IApplication的帮助。
4、 调用window.getWorkbench().restart()方法重新启动。
下面是一个handler执行部分的实例代码:
public Object execute(ExecutionEvent event) throws ExecutionException {
window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
// show directory chooser
System.getProperties().list(System.out);
DirectoryDialog dlg = new DirectoryDialog(window.getShell(), SWT.OPEN);
String result = dlg.open();
// get relaunch command
String cmd = buildCommandLine(result);
if (cmd == null)
return null;
System.setProperty(PROP_EXIT_CODE, Integer.toString(24));
System.setProperty(PROP_EXIT_DATA, cmd);
MessageDialog.openConfirm(window.getShell(), "alert",
"I am ready to go with: \n" + cmd);
// Now ready to go
window.getWorkbench().restart();
return null;
}
除了目录选择窗口,其余部分都是从OpenWorkspaceAction中抄来的,包括buildCommandLine方法也是。
不过,有了这个方还不够,目前这个handler对应的按钮点完了重启后应该报错,报告eclipse.vm没有设置,这是因为在buildCommandLine 方法中用到了这个系统属性,但是在调试环境下这个从System取这个属性的值是取不出任何东西的,只有打包发布之后才可以。
打包发布,重启是可以了,但是重启后并没有切换到指定的目录,而是还停留在原工作区没动窝儿。这个陷阱是很容易踩到的,原因揪出来,就是出在Application.java 的 start方法中。至于具体为什么,把更改前和更改后的代码贴出来一看也就知道了:
更改前:
public Object start(IApplicationContext context) throws Exception {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display,
new ApplicationWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART)
return IApplication.EXIT_RESTART;
else
return IApplication.EXIT_OK;
} finally {
display.dispose();
}
}
更改后:
public Object start(IApplicationContext context) {
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI
.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
if (returnCode != PlatformUI.RETURN_RESTART)
return EXIT_OK;
if (EXIT_RELAUNCH.equals(Integer.valueOf(System
.getProperty("eclipse.exitcode"))))
return EXIT_RELAUNCH;
else
return EXIT_RESTART;
} finally {
display.dispose();
}
}
posted on 2009-04-08 23:07
Rick Murphy 阅读(355)
评论(0) 编辑 收藏 所属分类:
eclipse插件开发