]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/ExpandNodeHandler.java
b0e75e538d79af65483881b0c9133d2adc4144cd
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / ExpandNodeHandler.java
1 package org.simantics.modeling.ui;
2
3 import java.util.Arrays;
4 import java.util.Comparator;
5
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;
22
23 /**
24  * @author Tuukka Lehtonen
25  */
26 public class ExpandNodeHandler implements IDoubleClickAction {
27
28     @Override
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);
32         if (node == null)
33             return;
34
35         Object widget = e.getHintContext().getHint(IWorkbenchActionHints.KEY_WIDGET);
36         if (!(widget instanceof GraphExplorer))
37             return;
38         final GraphExplorer explorer = (GraphExplorer) widget;
39
40         EditorAdapter[] editorAdapters = EditorRegistry.getInstance().getAdaptersFor(g, node);
41
42         Arrays.sort(editorAdapters, new Comparator<EditorAdapter>() {
43             @Override
44             public int compare(EditorAdapter o1, EditorAdapter o2) {
45                 // Sort in descending priority order
46                 return -(o1.getPriority() - o2.getPriority());
47             }
48         });
49
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));
53             e.consume();
54         } else if (editorAdapters.length > 1 && editorAdapters[0].getPriority() == editorAdapters[1].getPriority()) {
55             e.add(expandAction(explorer, node));
56             e.consume();
57         }
58     }
59
60     private IPriorityAction expandAction(final GraphExplorer explorer, final NodeContext node) {
61         return new PriorityAction(100) {
62             @Override
63             public void run() {
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);
69                 }
70             }
71         };
72     }
73
74 }