`
liugang594
  • 浏览: 990741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给Editor加上Annotation

阅读更多

要自定义Annotation,需要实现以下扩展点:

 

“org.eclipse.ui.editors.annotationTypes” 和 “org.eclipse.ui.editors.markerAnnotationSpecification”

 

内容可以按照自己需要的随便填,不行的话可以参考java里的扩展方式。

 

例如:

 

   <extension
         point="org.eclipse.ui.editors.annotationTypes">
      <type
            markerSeverity="2"
            markerType="org.eclipse.core.resources.problemmarker"
            name="com.windriver.liugang.EmbededEditor.error"
            super="org.eclipse.ui.workbench.texteditor.error">
      </type>
      <type
            markerSeverity="2"
            markerType="org.eclipse.core.resources.problemmarker"
            name="com.windriver.liugang.EmbededEditor.warning"
            super="org.eclipse.ui.workbench.texteditor.warning">
      </type>
      <type
            markerSeverity="2"
            markerType="org.eclipse.core.resources.problemmarker"
            name="com.windriver.liugang.EmbededEditor.host"
            super="org.eclipse.ui.workbench.texteditor.info">
      </type>
   </extension>
   <extension
         point="org.eclipse.ui.editors.markerAnnotationSpecification">
      <specification
            annotationType="com.windriver.liugang.EmbededEditor.error"
            colorPreferenceKey="errorColorKey"
            colorPreferenceValue="255,0,0"
            contributesToHeader="true"
            highlightPreferenceKey="errorHightlightKey"
            highlightPreferenceValue="true"
            icon="icons/error.gif"
            includeOnPreferencePage="true"
            isGoToNextNavigationTarget="true"
            isGoToNextNavigationTargetKey="Error_isOccurrenceGoToNextNavigationTarget"
            isGoToPreviousNavigationTarget="true"
            isGoToPreviousNavigationTargetKey="Error_isOccurrenceGoToPreviousNavigationTarget"
            label="ERROR"
            overviewRulerPreferenceKey="errorOverviewKey"
            overviewRulerPreferenceValue="true"
            presentationLayer="4"
            quickFixIcon="icons/error.gif"
            showInNextPrevDropdownToolbarAction="true"
            showInNextPrevDropdownToolbarActionKey="Error_showOccurrenceInNextPrevDropdownToolbarAction"
            symbolicIcon="error"
            textPreferenceKey="errorTextKey"
            textPreferenceValue="true"
            textStylePreferenceKey="occurrenceTextStyle"
            textStylePreferenceValue="NONE"
            verticalRulerPreferenceKey="errorVerticalKey"
            verticalRulerPreferenceValue="true">
      </specification>
      <specification
            annotationType="com.windriver.liugang.EmbededEditor.warning"
            colorPreferenceKey="warningColorKey"
            colorPreferenceValue="255,255,0"
            contributesToHeader="true"
            highlightPreferenceKey="warningHightlightKey"
            highlightPreferenceValue="true"
            icon="icons/warning.gif"
            includeOnPreferencePage="true"
            isGoToNextNavigationTarget="true"
            isGoToNextNavigationTargetKey="Warning_isOccurrenceGoToNextNavigationTarget"
            isGoToPreviousNavigationTarget="true"
            isGoToPreviousNavigationTargetKey="Warning_isOccurrenceGoToPreviousNavigationTarget"
            label="WARNING"
            overviewRulerPreferenceKey="warningOverviewKey"
            overviewRulerPreferenceValue="true"
            presentationLayer="4"
            quickFixIcon="icons/warning.gif"
            showInNextPrevDropdownToolbarAction="true"
            showInNextPrevDropdownToolbarActionKey="Warning_showOccurrenceInNextPrevDropdownToolbarAction"
            symbolicIcon="warning"
            textPreferenceKey="warningTextKey"
            textPreferenceValue="true"
            textStylePreferenceKey="occurrenceTextStyle"
            textStylePreferenceValue="NONE"
            verticalRulerPreferenceKey="warningVerticalKey"
            verticalRulerPreferenceValue="true">
      </specification>
      <specification
            annotationType="com.windriver.liugang.EmbededEditor.host"
            colorPreferenceKey="hostColorKey"
            colorPreferenceValue="255,0,255"
            contributesToHeader="true"
            highlightPreferenceKey="hostHightlightKey"
            highlightPreferenceValue="true"
            icon="icons/host.gif"
            includeOnPreferencePage="true"
            isGoToNextNavigationTarget="true"
            isGoToNextNavigationTargetKey="Host_isOccurrenceGoToNextNavigationTarget"
            isGoToPreviousNavigationTarget="true"
            isGoToPreviousNavigationTargetKey="Host_isOccurrenceGoToPreviousNavigationTarget"
            label="HOST"
            overviewRulerPreferenceKey="hostOverviewKey"
            overviewRulerPreferenceValue="true"
            presentationLayer="4"
            quickFixIcon="icons/host.gif"
            showInNextPrevDropdownToolbarAction="true"
            showInNextPrevDropdownToolbarActionKey="Host_showOccurrenceInNextPrevDropdownToolbarAction"
            symbolicIcon="info"
            textPreferenceKey="hostTextKey"
            textPreferenceValue="true"
            textStylePreferenceKey="occurrenceTextStyle"
            textStylePreferenceValue="NONE"
            verticalRulerPreferenceKey="hostVerticalKey"
            verticalRulerPreferenceValue="true">
      </specification>
   </extension>

 这样就自定义了三种类型的Annotation。

 

有了Annotation后,需要做的就是怎么把Annotation加到对应的Editor上去。

每个Text类型的Editor,都应该有一个DocumentProvider之类的东西与之对应。其中DocumentProvider中会有以下两个方法:

com.windriver.liugang.embedededitor.ui.EmbededDocumentProvider.createAnnotationModel(Object)

com.windriver.liugang.embedededitor.ui.EmbededDocumentProvider.createDocument(Object)

 

其中createAnnotationModel()里返回的AnnotationModel就可以用于管理Annotation了,它有addAnnotation()和removeAnnotation()方法。

 

每个被加到这个AnnotationModel里的Annotation都会被显示出来。

理论上来说,每次Document的内容有变化的时候,都需要更新这个AnnotationModel,最简单的方式就是:

 

document.addDocumentListener(this);

 给这个document加一个DocumentListener,每当有内容变化时发出一个通知。然后在监听事件里更新Annotation。

例如:

 

	public void documentChanged(DocumentEvent event) {
		IDocument document = event.getDocument();
		try {
			refreshAnnotations(document);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	}

 具体的refreshAnnotation()方法的实现就需要根据自己的需求了。例如上面我已经创建了三种类型的annotation了,下面我想如果一行的内容是空则显示一个error类型的;如果含有"java"字样,则显示warning类型的;要是含有"liugang"字样,则显示host类型的:

	private void refreshAnnotations(IDocument document)
			throws BadLocationException {
		if (embededAnnotation == null) {
			return;
		}
		int numberOfLines = document.getNumberOfLines();
		embededAnnotation.removeAllAnnotations();
		for (int i = 0; i < numberOfLines; i++) {
			int lineLength = document.getLineLength(i);
			int lineOffset = document.getLineOffset(i);
			String lineContents = document.get(lineOffset, lineLength);
			if (lineContents.trim().equals("")) {
				Annotation annotation = new Annotation(
						"com.windriver.liugang.EmbededEditor.error", true,
						"Line content can not be null");
				embededAnnotation.addAnnotation(annotation, new Position(
						lineOffset, lineLength));
			} else if (lineContents.contains("java")) {
				Annotation annotation = new Annotation(
						"com.windriver.liugang.EmbededEditor.warning", true,
						"Java is a keyword of Java");
				embededAnnotation.addAnnotation(annotation, new Position(
						lineOffset, lineLength));
			} else if (lineContents.contains("liugang")) {
				Annotation annotation = new Annotation(
						"com.windriver.liugang.EmbededEditor.host", true,
						"The line contains host name");
				embededAnnotation.addAnnotation(annotation, new Position(
						lineOffset, lineLength));
			}
		}

	}
 

最后如果显示结果为:

  结果

 

  • 大小: 4.4 KB
分享到:
评论
3 楼 zxjlwt 2016-03-02  
学习了
素人派
http://surenpi.com
2 楼 zxjlwt 2015-08-17  
学习了。

http://surenpi.com
1 楼 GirasoleY 2012-11-13  
LZ这里AnnotationModel中的connect()disconnect()等几个重写的方法是怎么实现的呢。
刚接触eclipse插件开发,对于这些方法不熟悉不知道可以提供一下源码或者给个思路呢?

相关推荐

    Annotation手册

    7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    annotation

    在实际使用时,我们可以给这个成员赋值,或者直接使用默认值。 接下来,`AnnatationTest.java`可能是用于测试注解处理的类。在Java中,注解的处理通常分为两个阶段:编译时处理和运行时处理。编译时处理通常通过...

    Annotation技术

    【Annotation技术】是Java语言中的一个重要特性,引入于JDK5,主要目的是为程序元素(如包、类、方法、变量等)添加元数据,即附加信息,这些信息可以被编译器、IDE工具或者运行时系统使用。Annotation不会直接改变...

    自定义的Annotation

    在iOS开发中,Annotation是苹果地图(MapKit)框架中的一个重要概念,用于在地图上添加可视化标记,以展示特定地理位置的信息。自定义的Annotation则允许开发者根据需求个性化地图上的标注,比如添加图片、自定义...

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    用Annotation简化Java程序的开发(PDF)

    ### 用Annotation简化Java程序的开发 #### 一、引言 随着软件开发技术的不断发展,特别是Java语言的广泛应用,开发者面临着如何有效地管理和配置代码的问题。传统的做法是使用XML文件来配置程序的各种设置,但这种...

    Annotation详细介绍(大全)

    Annotation是Java语言中的一种元数据,它提供了在代码中附加信息的能力,这些信息可以在编译时或运行时被解析和使用。Annotation的本质是一种特殊类型的注解,它允许开发者向编译器、JVM或者工具提供关于代码的额外...

    javax.annotation.jar

    javax.annotation.jar

    geronimo-annotation_1.0_spec-1.1.1-API文档-中文版.zip

    赠送jar包:geronimo-annotation_1.0_spec-1.1.1.jar; 赠送原API文档:geronimo-annotation_1.0_spec-1.1.1-javadoc.jar; 赠送源代码:geronimo-annotation_1.0_spec-1.1.1-sources.jar; 赠送Maven依赖信息文件:...

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    hibernate annotation中文文档

    hibernate annotation中文文档

Global site tag (gtag.js) - Google Analytics