+package org.argeo.gis.ui.views;
+
+import org.argeo.eclipse.ui.TreeParent;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.part.ViewPart;
+import org.geotools.map.MapContext;
+import org.geotools.map.MapLayer;
+import org.geotools.map.event.MapLayerListEvent;
+import org.geotools.map.event.MapLayerListListener;
+
+public class LayersView extends ViewPart implements MapLayerListListener {
+ public final static String ID = "org.argeo.gis.ui.layersView";
+
+ private TreeViewer viewer;
+
+ private MapContext mapContext;
+
+ @Override
+ public void createPartControl(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new MapContextContentProvider());
+ viewer.setLabelProvider(new MapContextLabelProvider());
+ viewer.setInput(getViewSite());
+ }
+
+ public void setMapContext(MapContext mapContext) {
+ viewer.setInput(mapContext);
+ if (this.mapContext != null) {
+ this.mapContext.removeMapLayerListListener(this);
+ }
+ this.mapContext = mapContext;
+ this.mapContext.addMapLayerListListener(this);
+ }
+
+ /*
+ * MAP LAYER LIST LISTENER
+ */
+ public void layerAdded(MapLayerListEvent event) {
+ viewer.refresh();
+ }
+
+ public void layerRemoved(MapLayerListEvent event) {
+ viewer.refresh();
+ }
+
+ public void layerChanged(MapLayerListEvent event) {
+ viewer.refresh();
+ }
+
+ public void layerMoved(MapLayerListEvent event) {
+ viewer.refresh();
+ }
+
+ /*
+ * VIEW
+ */
+ @Override
+ public void setFocus() {
+ viewer.getTree().setFocus();
+ }
+
+ public void refresh() {
+ viewer.refresh();
+ }
+
+ private class MapContextContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof MapContext)
+ return new Object[] { new MapContextNode(
+ (MapContext) inputElement) };
+ else if (inputElement instanceof IViewSite)
+ return new Object[] {};
+ else
+ return getChildren(inputElement);
+ }
+
+ public Object[] getChildren(Object element) {
+ if (element instanceof MapContextNode) {
+ MapContextNode mapContextNode = (MapContextNode) element;
+ return mapContextNode.getMapContext().getLayers();
+ } else if (element instanceof MapLayer) {
+ // MapLayer mapLayer = (MapLayer) element;
+
+ } else if (element instanceof TreeParent) {
+ return ((TreeParent) element).getChildren();
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof TreeParent) {
+ return ((TreeParent) element).getParent();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof MapContextNode) {
+ return true;
+ } else if (element instanceof TreeParent) {
+ return ((TreeParent) element).hasChildren();
+ } else if (element instanceof MapLayer) {
+ return false;
+ }
+ return false;
+ }
+
+ }
+
+ private class MapContextLabelProvider extends LabelProvider {
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof MapLayer) {
+ MapLayer mapLayer = (MapLayer) element;
+ String title = mapLayer.getTitle();
+ if (title == null || title.trim().equals(""))
+ title = mapLayer.toString();
+ return title;
+ }
+ return super.getText(element);
+ }
+
+ }
+
+ private class MapContextNode extends TreeParent {
+ private MapContext mapContext;
+
+ public MapContextNode(MapContext mapContext) {
+ super("Map Context");
+ this.mapContext = mapContext;
+ }
+
+ public MapContext getMapContext() {
+ return mapContext;
+ }
+
+ }
+}