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());
我正在开发一个 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());