]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.route.ui/src/org/simantics/district/route/ui/RouteTree.java
Improved Routes view functionality
[simantics/district.git] / org.simantics.district.route.ui / src / org / simantics / district / route / ui / RouteTree.java
index c275b5b5f6be008b207f25e8da1b43ad2b3efcc3..04ffc2361a380f5d2b2f03a21c92dea2dd7fc9ca 100644 (file)
@@ -1,31 +1,37 @@
 package org.simantics.district.route.ui;
 
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 
 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.TreeColumnLayout;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ColumnViewerEditor;
+import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
+import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.TreeViewerEditor;
+import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerCell;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
-import org.simantics.db.Resource;
+import org.eclipse.swt.widgets.Tree;
 import org.simantics.district.route.Route;
 import org.simantics.district.route.RouteEvent;
-import org.simantics.district.route.RouteJob;
 import org.simantics.district.route.RouteService;
 import org.simantics.district.route.RouteServiceListener;
 import org.simantics.district.route.Waypoint;
@@ -44,7 +50,8 @@ public class RouteTree extends Composite {
 
     ESelectionService selectionService;
 
-    private final LocalResourceManager resourceManager;
+    @SuppressWarnings("unused")
+    private LocalResourceManager resourceManager;
 
     private TreeViewer tree;
 
@@ -57,7 +64,7 @@ public class RouteTree extends Composite {
     }
 
     private RouteServiceListener routeServiceListener = e -> {
-        System.out.println("Route event: " + e);
+        LOGGER.info("Route event: {}", e);
         switch (e.type) {
             case RouteEvent.TYPE_ROUTE_DISCARDED:
                 runUi(() -> tree.refresh());
@@ -82,7 +89,16 @@ public class RouteTree extends Composite {
                 break;
 
             case RouteEvent.TYPE_ROUTE_SOURCE_CHANGED:
-                runUi(() -> tree.setInput(e.service.listRoutes()));
+                runUi(() -> {
+                    tree.getTree().setRedraw(false);
+                    try {
+                        Object[] expanded = tree.getExpandedElements();
+                        tree.setInput(e.service.listRoutes());
+                        tree.setExpandedElements(expanded);
+                    } finally {
+                        tree.getTree().setRedraw(true);
+                    }
+                });
                 break;
         }
     };
@@ -98,46 +114,71 @@ public class RouteTree extends Composite {
 
     private void defaultInitializeUI() {
         GridDataFactory.fillDefaults().grab(true, true).applyTo(this);
-        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this);
-
         createTree(this);
     }
 
     private void createTree(Composite parent) {
-        tree = new TreeViewer(parent, SWT.SINGLE);
+        TreeColumnLayout columnLayout = new TreeColumnLayout(false);
+        parent.setLayout(columnLayout);
+
+        tree = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
         tree.setUseHashlookup(true);
         GridDataFactory.fillDefaults().grab(true, true).applyTo(tree.getControl());
         tree.setContentProvider(new ContentProvider());
         tree.setLabelProvider(new LabelProvider());
         tree.addSelectionChangedListener(this::treeSelectionChanged);
-        //tree.addPostSelectionChangedListener(this::treeSelectionChanged);
-        tree.addDoubleClickListener(this::itemDoubleClicked);
-        // TODO: add route renaming (F2), DnD reordering support
-    }
 
-    private void itemDoubleClicked(DoubleClickEvent e) {
-        // TODO: default action, i.e. highlight route?
-        LOGGER.info("double click {}", e);
+        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(tree, new FocusCellOwnerDrawHighlighter(tree));
+        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tree) {
+            @Override
+            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
+                boolean singleSelect = tree.getStructuredSelection().size() == 1;
+                return singleSelect && (
+                        (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.F2)
+                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
+                        );
+            }
+        };
+
+        int feature = ColumnViewerEditor.KEYBOARD_ACTIVATION;
+
+        TreeViewerEditor.create(tree, focusCellManager, actSupport, feature);
+        final TextCellEditor textCellEditor = new TextCellEditor(tree.getTree());
+
+        TreeViewerColumn viewerColumn = new TreeViewerColumn(tree, SWT.LEFT);
+        columnLayout.setColumnData(viewerColumn.getColumn(), new ColumnWeightData(1));
+        viewerColumn.setLabelProvider(new LabelProvider());
+        viewerColumn.setEditingSupport(new EditingSupport(tree) {
+            @Override
+            protected void setValue(Object element, Object value) {
+                LOGGER.info("set value {} for {}", value, element);
+                Route r = (Route) element;
+                r.setName((String) value);
+                Activator.getDefault().getRouteService().persistRoute(r);
+                getViewer().update(element, null);
+            }
+
+            @Override
+            protected Object getValue(Object element) {
+                return ((Route) element).getName();
+            }
+
+            @Override
+            protected CellEditor getCellEditor(Object element) {
+                return textCellEditor;
+            }
+
+            @Override
+            protected boolean canEdit(Object element) {
+                return element instanceof Route;
+            }
+        });
+
+        // TODO: add DnD reordering support
     }
 
     private void treeSelectionChanged(SelectionChangedEvent e) {
         selectionService.setSelection(e.getSelection());
-        /*
-        IStructuredSelection ss = (IStructuredSelection) e.getSelection();
-        Object[] arr = ss.toArray();
-        if (arr.length == 1) {
-            Object o = arr[0];
-            if (o instanceof Route) {
-                CompletableFuture<List<Resource>> callback = new CompletableFuture<>();
-                callback.thenAccept(dnElements -> {
-                    runUi(() -> selectionService.setSelection(new StructuredSelection(dnElements)));
-                });
-                new RouteJob((Route) o, callback).schedule();
-            } else if (o instanceof Waypoint) {
-                selectionService.setSelection(new StructuredSelection(((Waypoint) o).<Object>getObject()));
-            }
-        }
-        */
     }
 
     protected void setInput(List<Route> result) {
@@ -218,4 +259,15 @@ public class RouteTree extends Composite {
         }
     }
 
-}
+    public Tree getTree() {
+        return tree.getTree();
+    }
+
+    public void editCurrentSelection() {
+        IStructuredSelection s = tree.getStructuredSelection();
+        if (s.size() == 1) {
+            tree.editElement(s.getFirstElement(), 0);
+        }
+    }
+
+}
\ No newline at end of file