2011-07-07 55 views
4

我已經創建了一個使用自己的註釋標記的插件。現在我想添加一個特殊的懸停動作,當我將鼠標懸停在這個特殊的標記上時。我不知道在哪裏添加此操作。我已經閱讀了關於IAnnotationHover接口的內容,但是如何訪問普通工作臺文本編輯器的垂直標尺以添加/更改AnnotationHover?懸停在Eclipse中的自己的註釋動作(插件)

P.S:只是爲了更精確,我使用Eclipse的共同編輯,而不是自己的編輯器...所以我想我不應該重寫或SourceViewerConfiguration的的IAnnotationHover 任何想法,那麼遠?

回答

0

這裏的a way在默認Java編輯器上創建自定義懸停。

下面是針對您的特定使用情況,結合custom script to detect java elements,針對該問題的@ PKeidel LangHover類的自定義實現。請注意,您應將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

相關問題