1 package org.simantics.modeling.ui;
3 import java.util.Arrays;
4 import java.util.Comparator;
6 import org.simantics.browsing.ui.BuiltinKeys;
7 import org.simantics.browsing.ui.GraphExplorer;
8 import org.simantics.browsing.ui.NodeContext;
9 import org.simantics.browsing.ui.PrimitiveQueryProcessor;
10 import org.simantics.browsing.ui.common.processors.IsExpandedProcessor;
11 import org.simantics.db.ReadGraph;
12 import org.simantics.db.exception.DatabaseException;
13 import org.simantics.db.layer0.SelectionHints;
14 import org.simantics.ui.DoubleClickEvent;
15 import org.simantics.ui.IDoubleClickAction;
16 import org.simantics.ui.workbench.action.IWorkbenchActionHints;
17 import org.simantics.ui.workbench.editor.EditorAdapter;
18 import org.simantics.ui.workbench.editor.EditorRegistry;
19 import org.simantics.utils.ui.ISelectionUtils;
20 import org.simantics.utils.ui.action.IPriorityAction;
21 import org.simantics.utils.ui.action.PriorityAction;
24 * @author Tuukka Lehtonen
26 public class ExpandNodeHandler implements IDoubleClickAction {
29 public void doubleClickEvent(DoubleClickEvent e) throws DatabaseException {
30 ReadGraph g = e.getGraph();
31 final NodeContext node = ISelectionUtils.getSinglePossibleKey(e.getResource(), SelectionHints.KEY_MAIN, NodeContext.class);
35 Object widget = e.getHintContext().getHint(IWorkbenchActionHints.KEY_WIDGET);
36 if (!(widget instanceof GraphExplorer))
38 final GraphExplorer explorer = (GraphExplorer) widget;
40 EditorAdapter[] editorAdapters = EditorRegistry.getInstance().getAdaptersFor(g, node);
42 Arrays.sort(editorAdapters, new Comparator<EditorAdapter>() {
44 public int compare(EditorAdapter o1, EditorAdapter o2) {
45 // Sort in descending priority order
46 return -(o1.getPriority() - o2.getPriority());
50 // If editor selection is unanimous, use the editor. Otherwise just expand/collapse the clicked node.
51 if (editorAdapters.length == 0) {
52 e.add(expandAction(explorer, node));
54 } else if (editorAdapters.length > 1 && editorAdapters[0].getPriority() == editorAdapters[1].getPriority()) {
55 e.add(expandAction(explorer, node));
60 private IPriorityAction expandAction(final GraphExplorer explorer, final NodeContext node) {
61 return new PriorityAction(100) {
64 PrimitiveQueryProcessor<?> pqp = explorer.getPrimitiveProcessor(BuiltinKeys.IS_EXPANDED);
65 if (pqp instanceof IsExpandedProcessor) {
66 IsExpandedProcessor iep = (IsExpandedProcessor) pqp;
67 boolean expanded = iep.getExpanded(node);
68 iep.replaceExpanded(node, !expanded);