如何在Eclipse插件中切换菜单按钮图标和工具提示文本?

4
我正在开发一个 Eclipse 插件,其中有一个工具栏菜单项,它将启用/禁用某个功能。我知道可以使用 plugin.xml 文件设置其图标和提示文本,但我希望能够根据正在处理的项目的状态更改其图标和提示文本,特别是后者。例如,如果该功能未启用,则希望显示一个表示启用该功能的图标,并显示“启用功能”的提示文本;但如果该功能已启用,则希望显示一个表示禁用该功能的图标,并显示“禁用功能”的提示文本。目前,我唯一看到的选项是通用的图标和提示文本,“启用/禁用功能”,但我觉得这样很笨拙。
编辑补充:针对 indigomonkey 的答案(原始内容中没有),这是一个我们极力反对禁用的行为(在启用它时会弹出对话框以验证是否要启用它,因为它不应轻易启动,同时还会防止他们在启用后禁用它)。因此,我希望将图标更改为暗示“请勿点击”的图标。
3个回答

7
如果你的命令处理程序实现了 IElementUpdater 接口,那么每次运行命令时都会调用 updateElement 方法。 updateElement 方法的 UIElement 参数具有 setIconsetTooltip 方法。

1
非常好,尽管我还不得不添加代码来触发事件,使用我在这里找到的内容:http://www.robertwloch.net/2011/01/eclipse-tips-tricks-label-updating-command-handler/ - Ben Hocking
我有一个 class DeployHandler,它 extends AbstractHandler 并且 implements IElementUpdater,其中包含了 updateElement 方法的实现代码:if (proj == null) element.setTooltip("Work with selected project"); else element.setTooltip("Work with project \"" + proj.getName() + "\""); 但是这个方法并没有被框架调用,尽管处理器已经正确地注册和调用了。你能帮我找出原因吗? - Danny Lo
显然,我还缺少一些代码来触发更新事件。在哪个方法中应该调用ICommandService#refreshElements - Danny Lo
@DannyLo 不要试图在评论中添加后续问题 - 提一个新问题。 - greg-449
2
感谢@BenHocking - 虽然原始链接已经失效,但是在archive.org上有页面的最后一个版本的副本。 - Mark Booth

3
我建议您选择将工具栏贡献创建为“复选框”类型,而不是标准的“push”类型。这意味着按钮将在已选择和未选择状态之间切换,让您将此行为与功能的启用和禁用状态相匹配。
如果您正在使用org.eclipse.ui.commandsorg.eclipse.ui.handlers,以及org.eclipse.ui.menus扩展点来通过<command>元素贡献您的按钮,则需要将其style属性设置为check。然后可以从处理程序内部读取和切换命令的选择状态。
有关更多信息,请参见http://blog.eclipse-tips.com/2009/03/commands-part-6-toggle-radio-menu.html

我正在使用toggleState,但是我看不到基于它改变工具提示文本或按钮图标行为的方法。 - Ben Hocking
2
我明白了。一般情况下,Eclipse生态系统不倾向于这种做法。通过使用切换按钮,您可以避免更改图标或工具提示的需要。 相反,它们应该参考按钮切换打开时的行为。例如,在任何包含调试透视图的Eclipse中查看“跳过所有断点”按钮。它的图标(一个被划掉的断点)表示当它切换打开时会发生什么,同样还有它的工具提示。 如果图标改变为未划掉的断点,并且工具提示改为“不要跳过所有断点”,那么行为将变得混乱。 - Ben Cox
你的解释很好,indigomonkey。我已经相应地更新了我的问题。 - Ben Hocking

0
在rcp E4中,解决方案似乎有些不同。自从我第一次遇到这个问题以来,我想为未来的开发人员总结/链接解决方案。
我找到答案的相关问题是Switch Image of a Handler in a e4 rcpRCP 4 Toggle a button in the toolbar
基本上,您需要像这样将参数MToolItem添加到Execute方法中:
@Execute
public void execute(final MToolItem item)
{
   item.setIconURI("platform:/plugin/......");
   //additional changes e.g. to the tooltip are also possible.
}

如果您额外给您的工具栏按钮类型检查

 <elements xsi:type="menu:HandledToolItem" type="Check" ...

每次单击该项,它将自动在选中/未选中之间切换。您可以使用item.isSelected()获取当前状态。作为副作用,工具栏图标将在选定状态下突出显示。如果您不想要这个效果,您需要自己跟踪状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接