Eclipse RCP:如何按条件控制透视图切换器中透视图的启用/禁用
针对自定义透视图的显示/启用控制方案
一、最优方案:根据条件控制透视图的显示或置灰
Eclipse支持通过**核心表达式(Core Expressions)**声明式控制透视图的可见性和启用状态,无需硬编码逻辑,推荐优先使用:
1. 控制透视图隐藏/显示
在插件的plugin.xml中,给自定义透视图的扩展添加<visibleWhen>节点,绑定你的条件b:
<extension point="org.eclipse.ui.perspectives"> <perspective class="com.yourpackage.YourPerspectiveClass" id="com.yourpackage.yourPerspectiveId" name="自定义透视图"> <!-- 当条件b为true时才显示透视图 --> <visibleWhen> <with variable="com.yourpackage.conditionB"> <equals value="true"/> </with> </visibleWhen> </perspective> </extension>
需要配合自定义变量提供器,将条件b的值注入到Eclipse的评估上下文:
// 注册变量提供器 IEvaluationService evalService = PlatformUI.getWorkbench().getService(IEvaluationService.class); evalService.addVariableResolver(new IVariableResolver() { @Override public Object resolve(String name, Object[] args) throws CoreException { if ("com.yourpackage.conditionB".equals(name)) { return yourConditionB; // 返回你的条件b的布尔值 } return null; } }); // 当条件b变化时,触发UI更新 evalService.requestEvaluation("com.yourpackage.conditionB");
2. 控制透视图置灰(禁用)
如果需要透视图仍显示但不可选中,将<visibleWhen>替换为<enabledWhen>即可:
<perspective class="com.yourpackage.YourPerspectiveClass" id="com.yourpackage.yourPerspectiveId" name="自定义透视图"> <!-- 当条件b为true时才允许切换到该透视图 --> <enabledWhen> <with variable="com.yourpackage.conditionB"> <equals value="true"/> </with> </enabledWhen> </perspective>
二、次优方案:阻止透视图切换操作
如果不想修改透视图的显示状态,仅在条件不满足时阻止切换,可以通过监听透视图切换事件实现:
// 给当前工作台窗口添加透视监听器 IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); window.addPerspectiveListener(new IPerspectiveListener() { @Override public boolean perspectivePreChange(IWorkbenchPage page, IPerspectiveDescriptor oldPersp, IPerspectiveDescriptor newPersp) { // 判断是否是目标透视图,且条件b不满足 if ("com.yourpackage.yourPerspectiveId".equals(newPersp.getId()) && !yourConditionB) { // 可选:弹出提示告知用户 MessageDialog.openInformation(window.getShell(), "提示", "当前条件不满足,无法切换到该透视图"); return false; // 返回false阻止切换 } return true; // 允许其他切换操作 } // 实现其他空方法 @Override public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {} @Override public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {} });
注意:如果存在多个工作台窗口,需要给每个窗口都添加该监听器。
内容的提问来源于stack exchange,提问作者Sadık
相关产品推荐
相关产品推荐

