如何在文件保存时更新装饰器?

How to update decorator on file save?

我创建了一个带有装饰器的插件,它将当前文件作为输入并显示适当的装饰器。

这工作正常,装饰器在 eclipse 第一次加载时正确显示。

但是,当文件更改时,装饰器不会更新。

如何在每次修改文件时更新装饰器?即如何在文件保存事件上更新装饰器?

这是示例代码

public class Decorator implements ILightweightLabelDecorator {

    private final ImageDescriptor OVERLAY1 = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/1.png");
    private final ImageDescriptor OVERLAY2 = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/2.png");

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
     */
    @Override
    public void addListener(ILabelProviderListener listener) {
        // TODO Auto-generated method stub
        // IResourceChangeEvent.POST_CHANGE

    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
     */
    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
     */
    @Override
    public boolean isLabelProperty(Object element, String property) {
        // TODO Auto-generated method stub
        return false;
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
 */
    @Override
    public void removeListener(ILabelProviderListener listener) {
        // TODO Auto-generated method stub

    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
     */
    @Override
    public void decorate(Object element, IDecoration decoration) {
        if (some_condition)
            decoration.addOverlay(OVERLAY1);
        else
            decoration.addOverlay(OVERLAY2);
    }
}

您可以要求 IDecoratorManager 使用特定 ID 更新装饰:

IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();

decoratorManager.update("decorator id");

要在文件保存时执行此操作,您将必须使用 IResourceChangeListener 来侦听工作区资源更改并在您看到文件被更改时做出反应。

设置侦听器:

ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);

IResourceChangeListener 中,您可以执行以下操作:

public void resourceChanged(IResourceChangeEvent event) {
    IResourceDelta delta = event.getDelta();

    IResourceDelta fileDelta = delta.findMember(IPath of file you are interested in);

    if (fileDelta != null) {
       // TODO handle the delta
    }
}