2016-07-31 42 views
3

Ich habe ein Plugin mit Decorator erstellt, das die aktuelle Datei als Eingabe nimmt und den entsprechenden Dekorator anzeigt.Wie update Decorator bei Datei speichern?

Dies funktioniert gut und Dekorateur wird ordnungsgemäß angezeigt, wenn die Sonnenfinsternis zum ersten Mal geladen wird.

Wenn jedoch die Datei geändert wird, wird der Decorator nicht aktualisiert.

Wie kann ich Decorator jedes Mal aktualisieren, wenn die Datei geändert wird? Wie kann ich den Decorator bei einem Ereignis zum Speichern einer Datei aktualisieren?

Dies ist der Beispielcode

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); 
    } 
} 

Antwort

2

Sie können die IDecoratorManager fragen Dekorationen mit einer bestimmten ID zu aktualisieren mit:

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

decoratorManager.update("decorator id"); 

diese auf tun, Datei speichern Sie verwenden müssen Ein IResourceChangeListener, um Änderungen der Arbeitsbereichsressourcen anzuhören und zu reagieren, wenn Ihre Datei geändert wird.

ResourcesPlugin.getWorkspace().addResourceChangeListener(listener); 

In der IResourceChangeListener Sie so etwas wie tun::

einen Zuhörer mit ein.

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 
    } 
} 
+0

Wird es richtig sein Hörer einzurichten durch Zugabe von 'ResourcesPlugin.getWorkspace() addResourceChangeListener (Listener) 'zu' addListener (ILabelProviderListener) 'Methode von' ILightWeightDecorator'? Was kann eine andere Prozedur sein, um den Listener einzurichten? –

+0

Sie könnten es im Decorator-Konstruktor hinzufügen (und in der Dispose-Methode entfernen). –