如何使用 JFACE 为 RCP MDirectToolItem 创建自定义 SWT 工具提示?

How to create a custom SWT Tooltip using JFACE for an RCP MDirectToolItem?

我想为 RCP MDirectToolItem 或 MHandledToolItem 创建自定义工具提示。 JFace 提供了 org.eclipse.jface.window.ToolTip class,我可以扩展和覆盖 createToolTipContentArea() 方法。但是,要实例化 JFace 工具提示,我必须为其提供将使用该工具提示的 SWT 控件。我想不出从 MDirectToolItem 获取底层 SWT 控件的方法。

我已经能够使用 EModelService.find() 方法获取 MToolBar 和 MDirectToolItem(我在 Application.e4xmi 中定义的)。我尝试从 MDirectToolItem 获取底层 SWT 控件,但似乎没有办法做到这一点。

我也尝试创建一个 SWT ToolItem 并将其添加到 MToolBar,但是 MToolBar 的子项只是 MToolBarElement 的。

工具项没有单独的控件,它们是父 ToolBar 控件的一部分。 SWT ToolItem class 表示工具项,这只是从 Widget 而不是 Control.

派生的

因此您必须在工具栏控件上设置工具提示,并计算出显示工具提示时哪个工具项处于活动状态。

表示UI对象的应用程序模型classes都扩展了MUIElement接口。这提供了一个 getWidget 方法来获取 UI 对象。

所以对于 MToolBar 你可以这样做:

ToolBar toolbar = (ToolBar)mtoolbar.getWidget();

对于MToolItem(处理或直接),您可以:

ToolItem toolitem = (ToolItem)mtoolitem.getWidget();

如果您使用 NO_RECREATE 样式创建 ToolTip,它将调用 getToolTipArea 判断工具提示是否需要改变的方法。您可以使用类似以下的内容为每个工具项设置不同的区域:

@Override
protected Object getToolTipArea(final Event event)
{
  // TODO save the ToolBar in the class as 'toolBar'
  ToolItem item = toolBar.getItem(new Point(event.x, event.y));
  if (item != null)
    return item;

  return super.getToolTipArea(event);
}