X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.route.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Froute%2Fui%2FRouteTree.java;h=04ffc2361a380f5d2b2f03a21c92dea2dd7fc9ca;hb=HEAD;hp=c275b5b5f6be008b207f25e8da1b43ad2b3efcc3;hpb=00103b12908c5071e641ca2bea2c42030ff67770;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.route.ui/src/org/simantics/district/route/ui/RouteTree.java b/org.simantics.district.route.ui/src/org/simantics/district/route/ui/RouteTree.java index c275b5b5..04ffc236 100644 --- a/org.simantics.district.route.ui/src/org/simantics/district/route/ui/RouteTree.java +++ b/org.simantics.district.route.ui/src/org/simantics/district/route/ui/RouteTree.java @@ -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> 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).getObject())); - } - } - */ } protected void setInput(List 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