Eclipse - 将鼠标悬停在标记上时的自定义文本

Eclipse - custom text when hovering over a marker

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

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

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->Preferences->General->Editors 检查了可用的编辑器,MyEditor 在那里。

2) 动态添加自定义注释悬停。我查了 here 的资料说是可以的。所以每次我打开一个“*.c”文件,我都有这个代码:

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 根本没有被调用。

知道我做错了什么吗?

对于有类似问题的人 - 我找到了 "hacky" 解决方案。我已经创建了自己的 class 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());