随笔 - 0  文章 - 0  trackbacks - 0
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(1)

文章分类

文章档案

搜索

  •  

最新评论

一般在一个陌生领域开发时,动手之前都会找一些功能相同或近似的示例,通过观察示例学习一个实现的路径,而后再加些个性化的东西进去。

编写工作区切换这个功能,第一个想到的,肯定就是Java IDE中的“Switch Workspace”按钮。这个按钮对应的动作写在 org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction 类中,位于org.eclipse.ui.ide 插件里。

eclipse中要实现工作区切换除了OpenWorkspaceAction中的方法,应该还有两种方式可以尝试:

  • PlatformUI.createAndRunWorkbench之前调用 Platform.getInstanceLocation().setURL方法,可以改变工作区,但如果要实现向指定工作目录转向,则需要通过某种方式(例如通过系统参数)将指定目录信息跨过重启的过程传递给启动方法。也是要重启一次。
  • 如果切换工作区的目的只是想改变一个view的显示内容,则直接改这个viewcontentProvider,而后执行以下刷新就可以。不过这只是一个想法,没有付诸实践,得空儿了得去试试。

不过这里不讨论上面的两种情况,只来看看OpenWorkspaceAction中的经典做法是如何实现的吧。

1、 拼装一个启动命令,拿着这个命令你可以直接从命令行跑起一个eclipse示例来

2、 将这个启动命令存储在Systemeclipse.exitdata属性中

3、 Systemeclipse.exitcode属性设置为 24relaunch)。eclipse.exitcode可以有三种状态,在IApplication中注册的,分别是 0EXIT_OK),23EXIT_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插件开发