基于org.eclipse.ui.commands实现Eclipse RCP 3.x切换工作区方案咨询
我之前在维护Eclipse RCP 3.x项目时也碰到过这个问题,废弃的ActionBarAdvisor方式确实不够规范,用org.eclipse.ui.commands扩展点的方式更符合3.x的组件化设计,下面是具体的实现步骤和依赖说明:
实现切换工作区的步骤(基于
org.eclipse.ui.commands扩展点) 1. 定义命令扩展
在你的插件plugin.xml中添加org.eclipse.ui.commands扩展,定义一个唯一的命令ID:
<extension point="org.eclipse.ui.commands"> <command id="com.your.plugin.id.commands.switchWorkspace" name="Switch Workspace"> </command> </extension>
2. 实现命令处理类
创建一个继承自AbstractHandler的处理类,在execute方法里完成切换工作区的核心逻辑。这里可以直接复用Eclipse IDE内置的工作区选择逻辑,不用自己从头写对话框:
import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.handlers.AbstractHandler; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; public class SwitchWorkspaceHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { // 获取当前激活的工作台窗口 var window = HandlerUtil.getActiveWorkbenchWindow(event); if (window == null) { return null; } // 弹出确认对话框(可选,提升用户体验) boolean confirm = MessageDialog.openConfirm( window.getShell(), "Switch Workspace", "Restart is required to switch workspace. Proceed?" ); if (!confirm) { return null; } try { // 调用IDE内置的工作区选择器,获取用户选中的新路径 String newWorkspacePath = IDE.promptForWorkspace(window.getShell(), Platform.getInstanceLocation().getURL().getPath()); if (newWorkspacePath != null && !newWorkspacePath.isEmpty()) { // 设置新工作区路径并重启工作台 Platform.getInstanceLocation().setURL(new java.net.URL("file:" + newWorkspacePath)); window.getWorkbench().restart(); } } catch (Exception e) { MessageDialog.openError(window.getShell(), "Error", "Failed to switch workspace: " + e.getMessage()); } return null; } }
3. 绑定命令与处理类
在plugin.xml中添加org.eclipse.ui.handlers扩展,把刚才的处理类和命令绑定起来:
<extension point="org.eclipse.ui.handlers"> <handler commandId="com.your.plugin.id.commands.switchWorkspace" class="com.your.plugin.id.handlers.SwitchWorkspaceHandler"> </handler> </extension>
4. 可选:将命令添加到菜单/工具栏
如果需要把这个功能放到菜单或工具栏里,可以用org.eclipse.ui.menus扩展点,比如添加到窗口菜单的末尾:
<extension point="org.eclipse.ui.menus"> <menuContribution locationURI="menu:window?after=additions"> <command commandId="com.your.plugin.id.commands.switchWorkspace" label="Switch Workspace" style="push"> </command> </menuContribution> </extension>
需要依赖的插件
在插件的MANIFEST.MF中添加以下依赖项:
org.eclipse.ui:提供命令、Handler等核心UI组件APIorg.eclipse.ui.ide:包含IDE相关的工作区操作工具(比如IDE.promptForWorkspace)org.eclipse.core.runtime:提供平台实例位置、URL处理等底层核心功能org.eclipse.jface:提供对话框等基础UI组件支持
内容的提问来源于stack exchange,提问作者781227
相关产品推荐
相关产品推荐

