在Eclipse中使用自己的注释悬停操作(插件)

时间:2011-07-07 12:02:58

标签: eclipse-plugin annotations hover mouseover

我创建了一个使用自己的注释标记的插件。现在我想添加一个特殊的悬停动作,当我将鼠标悬停在这个特殊的标记上时。我真的不知道在哪里添加这个动作。我已经读过IAnnotationHover接口,但是如何访问普通工作台文本编辑器的垂直标尺来添加/更改AnnotationHover?

p.s。:更确切地说,我使用Eclipse的通用编辑器,而不是自己的编辑器...所以我认为我不应该覆盖SourceViewerConfiguration或IAnnotationHover 到目前为止还有什么想法吗?

1 个答案:

答案 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