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;
ESelectionService selectionService;
- private final LocalResourceManager resourceManager;
+ @SuppressWarnings("unused")
+ private LocalResourceManager resourceManager;
private TreeViewer tree;
}
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());
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;
}
};
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) {
}
}
-}
+ 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