package org.openscada.ui.databinding.observable; import org.eclipse.core.databinding.observable.map.IMapChangeListener; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.map.MapChangeEvent; import org.eclipse.core.databinding.observable.map.MapDiff; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; public class ObservableMapContentProvider implements IStructuredContentProvider { private IObservableMap input; private IMapChangeListener mapListener; private StructuredViewer viewer; @Override public void dispose () { detach (); } @Override public void inputChanged ( final Viewer viewer, final Object oldInput, final Object newInput ) { detach (); this.viewer = (StructuredViewer)viewer; if ( newInput instanceof IObservableMap ) { setInput ( (IObservableMap)newInput ); } } private void detach () { if ( this.mapListener != null && this.input != null ) { this.input.removeMapChangeListener ( this.mapListener ); this.mapListener = null; this.input = null; } } private void setInput ( final IObservableMap input ) { this.input = input; input.addMapChangeListener ( this.mapListener = new IMapChangeListener () { @Override public void handleMapChange ( final MapChangeEvent event ) { mapChange ( event.diff ); } } ); } protected void mapChange ( final MapDiff diff ) { this.viewer.refresh (); } @Override public Object[] getElements ( final Object inputElement ) { if ( inputElement != this.input ) { return null; } return this.input.entrySet ().toArray (); } }