工具栏在eclipse编辑器中自定义悬停消失

时间:2018-02-13 13:59:25

标签: java eclipse eclipse-plugin editor mousehover

我正在研究Eclipse的编辑器插件,它处理我自己的脚本语言。在编辑器中,我有一个悬停,显示有关鼠标光标下元素的简短信息。 现在,我正在尝试在悬停的底部创建一个工具栏,并在那里放置一个按钮,在线打开更详细的描述。

我根据answer to that question编写了代码。该按钮是可见的,单击它时它可以工作。 但是,将鼠标移到悬停上后,它会在短时间内消失。为什么会发生这种情况?如何防止这种情况发生?

以下是我的代码的相关部分:

@Override
public IInformationControlCreator getHoverControlCreator() {
    return new IInformationControlCreator() {
        @Override
        public IInformationControl createInformationControl(final Shell parent) {
            ToolBarManager tbm = new ToolBarManager(SWT.FLAT);
            DefaultInformationControl defaultInformationControl = new DefaultInformationControl(parent, tbm);
            Action action = new Action() {
                @Override
                public void run() {
                    MessageDialog.openInformation(parent, "omg", "It works.");
                }
            };
            action.setText("123 test 321");
            Bundle bundle = FrameworkUtil.getBundle(this.getClass());
            URL url = FileLocator.find(bundle, new Path("icons/test.gif"), null);
            action.setImageDescriptor(ImageDescriptor.createFromURL(url));
            tbm.add(action);
            tbm.update(true);
            return defaultInformationControl;
        }
    };
}

1 个答案:

答案 0 :(得分:0)

使用DefaultInformationControl(parent,tbm)创建悬停时,工具栏可见。但是,当您将鼠标移到悬停上时,它将获得焦点。然后调用DefaultInformationControl中的方法getInformationPresenterControlCreator()。

(从源代码中)看起来像:

public IInformationControlCreator getInformationPresenterControlCreator() {
    return new IInformationControlCreator() {
        /*
         * @see org.eclipse.jface.text.IInformationControlCreator#createInformationControl(org.eclipse.swt.widgets.Shell)
         */
        public IInformationControl createInformationControl(Shell parent) {
            return new DefaultInformationControl(parent,
                    (ToolBarManager) null, fPresenter);
        }
    };
}

查看回车线。它使您的工具栏管理器为空。那是原因不见了。

快速解决方案可能是创建一个新类,该类扩展DefaultInformationControl,然后进行覆盖

@Override
public IInformationControlCreator getInformationPresenterControlCreator() {
    return new YourOwnInformationControlCreator();
}

通过这种方式,您可以传递正确的ToolbarManager。