我创建了一个使用自己的注释标记的插件。现在我想添加一个特殊的悬停动作,当我将鼠标悬停在这个特殊的标记上时。我真的不知道在哪里添加这个动作。我已经读过IAnnotationHover接口,但是如何访问普通工作台文本编辑器的垂直标尺来添加/更改AnnotationHover?
p.s。:更确切地说,我使用Eclipse的通用编辑器,而不是自己的编辑器...所以我认为我不应该覆盖SourceViewerConfiguration或IAnnotationHover 到目前为止还有什么想法吗?
答案 0 :(得分:0)
这是a way在默认Java编辑器上创建自定义悬停。
这是@ PKeidel的LangHover类的自定义实现,针对您的特定用例,结合custom script to detect java elements。请注意,您应将ANNOTATION_NAME
的值更改为自定义注释的值,并将getHoverInfo
的返回值更改为您希望自定义鼠标悬停包含的值。
public class LangHover implements IJavaEditorTextHover
{
public static final String ANNOTATION_NAME = "YourCustomAnnotation";
@SuppressWarnings("restriction")
public static ICodeAssist getCodeAssist(IEditorPart fEditor)
{
if (fEditor != null) {
IEditorInput input= fEditor.getEditorInput();
if (input instanceof IClassFileEditorInput) {
IClassFileEditorInput cfeInput= (IClassFileEditorInput) input;
return cfeInput.getClassFile();
}
WorkingCopyManager manager= JavaPlugin.getDefault().getWorkingCopyManager();
return manager.getWorkingCopy(input, false);
}
return null;
}
public static IEditorPart getActiveEditor()
{
IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page= window.getActivePage();
if (page != null) {
return page.getActiveEditor();
}
}
return null;
}
// When this returns true, the custom hover should be shown.
public static boolean elementIsCustomAnnotation(ITextViewer textViewer, IRegion hoverRegion)
{
IEditorPart activeEditor = getActiveEditor();
ICodeAssist resolve = getCodeAssist(activeEditor);
IJavaElement[] detectedJavaElements = null;
if (resolve != null)
{
try
{
detectedJavaElements = resolve.codeSelect(hoverRegion.getOffset(), hoverRegion.getLength());
}
catch (JavaModelException x)
{
System.out.println("JavaModelException occured");
}
}
for (IJavaElement javaElement : detectedJavaElements)
{
// If I found an element of type IJavaElement.ANNOTATION
// and its name equals ANNOTATION_NAME, return true
if (javaElement.getElementType() == IJavaElement.ANNOTATION && javaElement.getElementName().equals(ANNOTATION_NAME))
{
return true;
}
}
return false;
}
@Override
public String getHoverInfo(ITextViewer textviewer, IRegion region)
{
if(elementIsCustomAnnotation(textviewer, region))
{
return "Your own hover text goes here"";
}
return null; // Shows the default Hover (Java Docs)
}
}
基本上,这里发生的是elementIsCustomAnnotation
正在检查用户正在悬停的java元素,将它们放在detectedJavaElements
数组中,然后检查该数组以查找注释名称等于ANNOTATION_NAME
。