Eclipse - 将鼠标悬停在标记

时间:2017-09-27 10:20:09

标签: java c eclipse hover markers

我正在开发一个Eclipse插件,目前我正在尝试让Eclipse(Luna)在鼠标悬停在标记上时显示自定义文本。我知道我可以通过指定标记参数来实现这一点,但我需要动态更改文本,例如:

Use case

我已经尝试过这些方法没有成功:

1)拥有自定义TextEditor的自定义SourceViewerConfiguration

public class MyEditor extends TextEditor {

    public MyEditor() {
        setSourceViewerConfiguration(new SourceViewerConfiguration() {
            @Override
            public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
                return new IAnnotationHover() {
                    @Override
                    public String getHoverInfo(ISourceViewer sv, int ln) {
                        return "Hello world!";
                    }
                };
            }
        });
    }
}

和plugin.xml一样:

<extension
        point="org.eclipse.ui.editors">
    <editor
            id="test"
            name="MyEditor"
            extensions="c"
            class="foo.bar.editors.MyEditor">
    </editor>
</extension>

永远不会调用我的方法 getHoverInfo 。相反,只要我打开任何* .c文件并将鼠标悬停在标记上,就会调用 DefaultAnnotationHover 中的方法 getHoverInfo 。我通过Eclipse-&gt; Preferences-&gt; General-&gt;编辑检查了可用的编辑器,MyEditor就在那里。

2)动态添加自定义注释悬停。我发现here信息是可能的。所以,每当我打开一个&#34; *。c&#34;文件,我有这个代码:

IPartListener2 partListener2 = new IPartListener2() {
    @Override
    public void partOpened(IWorkbenchPartReference partRef) {
            if ("org.eclipse.cdt.ui.editor.CEditor".equals(((EditorReference) partRef).getDescriptor().getId())) {
                CEditor currentCFileEditor = ((CEditor)((EditorReference) partRef).getEditor(false));
                currentCFileEditor.getViewer().setAnnotationHover(new IAnnotationHover() {
                    @Override
                    public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
                        return "Hello world";
                    }
                });
            }
        }

但同样,我没有成功 - 我的getHoverInfo根本没有被召唤。

知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

对于那些有类似问题的人 - 我找到了一个&#34; hacky&#34;解。我创建了自己的课程MyAwesomeHover

public class MyAwesomeHover implements IAnnotationHover {
    @Override
    public String getHoverInfo(ISourceViewer sw, int ln) {
        return "Hey hoo"
    }   
}

然后我使用反射将MyAweseomeHover设置为显示的AnnotationHover

    Field hm= SourceViewer.class.getDeclaredField("fVerticalRulerHoveringController");
    hm.setAccessible(true);
    AnnotationBarHoverManager ma= (AnnotationBarHoverManager) hm.get(sourceViewer);
    Field ah= AnnotationBarHoverManager.class.getDeclaredField("fAnnotationHover");
    ah.setAccessible(true);
    ah.set(ma, MyAwesomeHover());