package com.netifera.platform.ui.spaces.tree; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.StructuredViewer; import com.netifera.platform.api.events.IEvent; import com.netifera.platform.api.events.IEventHandler; import com.netifera.platform.api.model.IEntity; import com.netifera.platform.api.model.IShadowEntity; import com.netifera.platform.api.model.ISpace; import com.netifera.platform.api.model.ISpaceContentChangeEvent; import com.netifera.platform.api.model.layers.ILayerProvider; import com.netifera.platform.model.TreeStructureContext; import com.netifera.platform.ui.internal.spaces.Activator; import com.netifera.platform.ui.updater.StructuredViewerUpdater; public class SpaceTreeUpdater { private final TreeBuilder treeBuilder; // private final StructuredViewer viewer; private final StructuredViewerUpdater updater; private final IEventHandler spaceListener; private final ISpace space; SpaceTreeUpdater(ISpace space, final StructuredViewer treeViewer) { if(space == null || treeViewer == null) { throw new IllegalArgumentException("space=" + space + ", viewer=" + treeViewer); } this.space = space; // this.viewer = treeViewer; this.updater = StructuredViewerUpdater.get(treeViewer); List<ILayerProvider> layerProviders = new ArrayList<ILayerProvider>(); for (ILayerProvider layerProvider: Activator.getDefault().getModel().getLayerProviders()) if (layerProvider.isDefaultEnabled()) layerProviders.add(layerProvider); this.treeBuilder = new TreeBuilder(layerProviders); this.treeBuilder.setListener(createUpdateListener()); this.treeBuilder.setRoot(space.getRootEntity()); this.spaceListener = createSpaceListener(); this.space.addChangeListenerAndPopulate(spaceListener); } public void dispose() { space.removeChangeListener(spaceListener); } public IShadowEntity getRootEntity() { return treeBuilder.getRoot(); } public TreeBuilder getTreeBuilder() { return treeBuilder; } public ISpace getSpace() { return space; } private IEventHandler createSpaceListener() { return new IEventHandler() { public void handleEvent(final IEvent event) { if(event instanceof ISpaceContentChangeEvent) { handleSpaceChange((ISpaceContentChangeEvent)event); } } }; } private void handleSpaceChange(ISpaceContentChangeEvent event) { if(event.isCreationEvent()) { treeBuilder.addEntity(event.getEntity()); } else if(event.isUpdateEvent()) { if(treeBuilderHasValidRoot()) treeBuilder.updateEntity(event.getEntity()); } else if(event.isRemovalEvent()) { treeBuilder.removeEntity(event.getEntity()); } } private ITreeBuilderListener createUpdateListener() { return new ITreeBuilderListener() { public void entityAdded(IShadowEntity entity, IShadowEntity parent) { // if(treeViewer.getControl().isDisposed()) // return; if (parent == treeBuilder.getRoot()) updater.refresh(); updater.refresh(parent); } public void entityChanged(IShadowEntity entity) { // if(treeViewer.getControl().isDisposed()) // return; updater.update(entity,null); } public void entityRemoved(IShadowEntity entity, IShadowEntity parent) { // if(treeViewer.getControl().isDisposed()) // return; if (parent == treeBuilder.getRoot()) updater.refresh(); updater.refresh(parent); } }; } private boolean treeBuilderHasValidRoot() { return (treeBuilder.getRoot() != null && (treeBuilder.getRoot().getStructureContext() instanceof TreeStructureContext)); } public List<ILayerProvider> getLayers() { return treeBuilder.getLayers(); } public void addLayer(ILayerProvider layerProvider) { treeBuilder.addLayer(layerProvider); layersChanged(); } public void removeLayer(ILayerProvider layerProvider) { treeBuilder.removeLayer(layerProvider); layersChanged(); } private void layersChanged() { treeBuilder.setRoot(space.getRootEntity()); for (IEntity entity: space.getEntities()) { treeBuilder.addEntity(entity); } updater.refresh(); } }