修饰符

插件可以使用修饰符来注释出现在工作台视图中的资源和其它对象的图像。当插件添加现有资源类型的功能时,修饰符会很有用。许多标准工作台视图参与显示修饰。

例如,PDE 添加使您能够区分二进制和源项目的修饰符。

带有 PDE 修饰符的“包资源管理器”视图

com.example.helloworld 项目是唯一显示在导航器中的源项目。注意所有其它二进制项目如何在 Java 项目图标的左上方显示二进制修饰符。此修饰符是 PDE 使用 org.eclipse.ui.decorators 扩展点添加的。

<extension
   point="org.eclipse.ui.decorators">
      <decorator
            lightweight="true"
            quadrant="TOP_LEFT"
            adaptable="true"
            label="%decorator.label"
            icon="icons/full/ovr16/binary_co.png"
            state="false"
            id="org.eclipse.pde.ui.binaryProjectDecorator">
         <description>
            %decorator.desc
         </description>
       <enablement>
            ...
       </enablement>
      </decorator>
</extension>

有几种提供修饰符实现的不同方法。此标记使用最简单的方法(称为声明性轻量级修饰符)。当定义声明性轻量级修饰符时,该标记包含修饰符的图标、放置和启用条件的完整描述。仅当一个图标用来修饰标签时,声明性修饰符就会很有用。插件只需要指定应该在常规图标上覆盖修饰符的象限和覆盖程序段的图标。如图所示,在包图标的左上角象限中覆盖了 PDE 二进制图标。

如果插件除了处理图标之外还需要处理标签文本,或者如果动态确定了图标的类型,则您可以使用非声明性轻量级修饰符。在这种情况下,必须定义实现 ILightweightLabelDecorator 的实现。指定的类负责在运行时提供应用于标签的前缀、后缀和覆盖程序段图像。将前缀和后缀与标签文本并置并执行覆盖程序段的机制由后台线程中的工作台代码处理。因此,由插件在其 ILightweightLabelDecorator 实现中执行的任何工作都必须是用户界面线程安全的。(有关更多详细信息,请参阅从非用户界面线程执行代码。)

以下标记显示 CVS 客户机如何使用此技术定义其修饰符:

<extension
   point="org.eclipse.ui.decorators">
      <decorator
            objectClass="org.eclipse.core.resources.IResource"
            adaptable="true"
        label="%DecoratorStandard.name"
            state="false"
            lightweight= "true"
            quadrant = "BOTTOM_RIGHT"
            class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator"
        id="org.eclipse.team.cvs.ui.decorator">
         <description>
            %DecoratorStandard.desc
         </description>
      </decorator>
</extension>

修饰符最终由用户通过工作台标签修饰首选项页面控制。可以打开和关闭各个修饰符。即使情况如此,设计您的修饰符以使它们不覆盖现有平台 SDK 修饰符或不与这些现有修饰符冲突,是一个很好的主意。如果多个插件向同一象限添加轻量级修饰符,则会以非决定性的方式解决冲突。  

插件本身还可进行所有图像和标签管理。在这种情况下,lightweight 属性应该设置为 false,而 class 属性应该对一个实现 ILabelDecorator 的类进行命名。此类允许您使用自己的注释修饰原始标签的图像和文本。这就向您提供了更大的灵活性,因为您不再限于只能使用前缀、后缀和简单象限覆盖程序段。

修饰符的其它属性与特定实现样式无关。labeldescription 属性指定用来在首选项对话框中命名和描述修饰符的文本。objectClass 命名修饰符应当应用于的对象的类。enablement 属性允许您描述应该修饰对象的条件。adaptable 标志指示是否还应修饰适用于 IResource 的对象。state 标志控制在缺省情况下修饰符是否可视。

如果修饰符包括很难去计算或可能会混淆的信息,您可能想要添加自已的首选项,这些首选项允许用户在修饰符打开的情况下对其进行进一步的调整。此技术由 CVS 客户机使用。

CVS 修饰符首选项页面

 

修饰符更新周期

修饰是通过刷新使用 DecoratorManager 来提供修饰的标签提供程序来启动的。当在后台执行修饰处理时,则在请求标签与激发将由修饰计算采用的 labelProviderChanged 事件之间有一段时间。在此时间内,由于效率的原因,对象上的修饰将仅计算一次。如果修饰符在此期间发生更改,则因为将忽略第二个以及后续的用来修饰元素的调用,所以有可能将广播旧的结果。

修饰符添加程序应该避免在执行修饰时更改其修饰符。如果不可能做到这一点,则在处理 labelProviderChanged 之后将需要执行第二个用来修饰元素的调用。