Eclipse编辑器中的标记未显示消息

时间:2014-04-24 08:51:19

标签: eclipse eclipse-plugin

我正在为Eclipse中的特定于域的语言构建自定义文本编辑器插件。

我可以检测编辑器内容格式的错误,并希望使用eclipse的标记向用户指出错误。

我在插件中有以下代码:

public static void createMarkerForResource(int linenumber, String message) throws CoreException {
    IResource resource = getFile();
    createMarkerForResource(resource, linenumber, message);
  }

  public static void createMarkerForResource(IResource resource, int linenumber, String message)
      throws CoreException {
    HashMap<String, Object> map = new HashMap<String, Object>();
    MarkerUtilities.setLineNumber(map, linenumber);
    MarkerUtilities.setMessage(map, message); 
    MarkerUtilities.createMarker(resource, map, IMarker.PROBLEM);
    IMarker[] markers = resource.findMarkers(null, true, IResource.DEPTH_INFINITE);
    for (IMarker marker : markers){
      System.out.println("Marker contents"+MarkerUtilities.getMessage(marker));
    } 
  }

我使用以下命令运行此代码:

createMarkerForResource(2, "hello");

这成功地为我提供了正确行的图像

enter image description here

如果我将鼠标悬停在它上面,我会得到一个&#39;你可以点击这个东西&#39;光标。 但我无法收到消息。

邮件肯定已被放置,因为:

for (IMarker marker : markers){
          System.out.println("Marker contents"+MarkerUtilities.getMessage(marker));
        } 

代码产生&#34; Marker contentshello&#34;按预期输出。我究竟做错了什么?

编辑:

问题视图中出现 消息:

enter image description here

2 个答案:

答案 0 :(得分:2)

Njol的答案是正确的,对我有用(Eclipse Neon.1)。

但另外两项建议:

  1. 我正在重用一个已创建的字段,因此注释胡佛并不总是新创建的(getter ...不是create方法)
  2. 默认注释胡佛确实会显示所有注释。因此,当您只想显示标记时(并且没有其他标记 - 例如GIT中的Diff注释),您应该覆盖isIncluded,如下例所示。
  3. 示例:

    import org.eclipse.jface.text.source.SourceViewerConfiguration;
        ...
        public class MySourceViewerConfiguration extends SourceViewerConfiguration {
        ...
    
            private IAnnotationHover annotationHoover;
        ...
    
            public MySourceViewerConfiguration(){
              this.annotationHoover=new MyAnnotationHoover();
            }
        ...
            @Override
            public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
            return annotationHoover;
        }
    }
    

    这里是注释胡佛类

    private class MyAnnotationHoover extends DefaultAnnotationHover{
        @Override
        protected boolean isIncluded(Annotation annotation) {
             if (annotation instanceof MarkerAnnotation){
                    return true;
             }
             /* we do not support other annotations than markers*/
             return false;
        }
    }
    

答案 1 :(得分:0)

您需要使用正确的SourceViewerConfiguration,例如@Override public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new DefaultAnnotationHover(false); } 。在您的uniqid()中定义如下:

$key = 'field_' . uniqid();