在做的项目里,需要一个这样的显示效果.
以前从来没有做过,也不知道该用什么关键字来搜索.
于是,只好用最原始的办法,看Eclipse的源代码.最后一些跟decorator相关的类引起了我的注意,还发现有一个相关的LabelProvider.于是我用这个词作为关键字搜索到了下面这篇文章,觉得十分有用,所以暂存到这里.
原文标题: org.eclipse.ui.decorators得用法
 <extension point="org.eclipse.ui.decorators">
<extension point="org.eclipse.ui.decorators">
 <decorator icon="icons/warning_small.gif" id="cnooc.rcp.decorator.node.warning" label="Data Warning Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
    <decorator icon="icons/warning_small.gif" id="cnooc.rcp.decorator.node.warning" label="Data Warning Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
 <enablement>
        <enablement>
 <and>
            <and>
 <objectClass "com.eplat.cnooc.rcp.node.INode"/>
                <objectClass "com.eplat.cnooc.rcp.node.INode"/>
 <objectState name="hasWarning" value="true"/>
                <objectState name="hasWarning" value="true"/>
 </and>
            </and>
 </enablement>
        </enablement>
 </decorator>
    </decorator>
 <decorator icon="icons/error_small.gif" id="cnooc.rcp.decorator.node.error" label="Data Error Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
    <decorator icon="icons/error_small.gif" id="cnooc.rcp.decorator.node.error" label="Data Error Decorator" lightweight="true" location="BOTTOM_LEFT" state="true">
 <enablement>
        <enablement>
 <and>
            <and>
 <objectClass "com.eplat.cnooc.rcp.node.INode"/>
                <objectClass "com.eplat.cnooc.rcp.node.INode"/>
 <objectState name="hasError" value="true"/>
                <objectState name="hasError" value="true"/>
 </and>
            </and>
 </enablement>
        </enablement>
 </decorator>
    </decorator>
 </extension>
</extension>
INode是TreeViewer里面节点得对象.
Viewer设置LabelProvider时需要如下:
 viewer.setLabelProvider(new DecoratingLabelProvider(new ViewLabelProvider(),
viewer.setLabelProvider(new DecoratingLabelProvider(new ViewLabelProvider(),
 Activator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
        Activator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
写了这个以后还没完, 需要让INode实现IActionFilter接口. eclipse得API中说要么实现IActionFilter接口, 要么实现IAdapter接口, 如果实现后者得话, 系统会调用getAdapter()方法. 不过我还是选择前者.

 /** *//**
    /** *//**
 * (non-Javadoc)
     * (non-Javadoc)
 *
     * 
 * @see org.eclipse.ui.IActionFilter#testAttribute(java.lang.Object, java.lang.String,java.lang.String)
     * @see org.eclipse.ui.IActionFilter#testAttribute(java.lang.Object, java.lang.String,java.lang.String)
 */
     */

 public boolean testAttribute(Object target, String name, String value)
    public boolean testAttribute(Object target, String name, String value) {
{

 if (name.equals("hasWarning"))
        if (name.equals("hasWarning")) {
{
 return !getProblems().hasError() && getProblems().hasWarning();
            return !getProblems().hasError() && getProblems().hasWarning();

 } else if (name.equals("hasError"))
        } else if (name.equals("hasError")) {
{
 return getProblems().hasError();
            return getProblems().hasError();
 }
        }
 return false;
        return false;
 }
    }
意思应该比较明显得, 如果有warning并且没有error得时候warning得decorator生效. 如果有error则error得decorator生效. name参数对应得就是objectState得name参数. value参数对应得objectState得value参数. target参数就是viewer中得节点对象, 不过由于INode实现了IActionFilter接口, 因此这里得target就是this了.
一般来说需要判断得就是根据name获取得值是否等于value, 等于返回true, 否则返回false. 不过这里我不需要判断这个了, 直接根据当前状态返回就好了.
按照eclipse得原理, 理论上应该INode变化以后viewer就会跟着变化, 但是我实验下来有时候好有时候不好.
因此在Editor得verify方法里增加了下面得逻辑:

 /** *//**
    /** *//**
 * 校验数据
     * 校验数据
 *
     * 
 * @return
     * @return
 */
     */

 private boolean verify()
    private boolean verify() {
{
 //校验数据
        //校验数据
 //不管是否有error或者warning都需要通知向导树刷新一下节点.
        //不管是否有error或者warning都需要通知向导树刷新一下节点.
 ExplorerView view = (ExplorerView) getSite().getPage().findView(ExplorerView.class.getName());
        ExplorerView view = (ExplorerView) getSite().getPage().findView(ExplorerView.class.getName());
 view.refresh((INode) getEditorInput());
        view.refresh((INode) getEditorInput());

 return true;
        return true;
 }
    }
现在好了, 只要执行verify方法, viewer就会刷新对应得节点, 以达到显示左下方小图标得目的.
原文地址: http://blog.csdn.net/bradwoo8621/archive/2007/05/11/1604738.aspx