]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java
Fixed GraphExplorerImpl to set selection upon keyboard-based selection
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / GraphExplorerImpl.java
index 0168ad864ae5e98258498d76fef7f04f42ee4282..df4860d42145551c2fd59c428ae7c749763a5a3d 100644 (file)
@@ -1552,10 +1552,12 @@ class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, Graph
         });
 
         OpenStrategy os = new OpenStrategy(tree);
+        os.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+            resetSelectionFromWidget();
+        }));
         os.addPostSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
             //System.out.println("OPENSTRATEGY: post selection changed: " + e);
-            resetSelection();
-            selectionProvider.firePostSelection(selectionProvider.getSelection());
+            resetSelectionFromWidgetAndFirePostSelection(true);
         }));
 
         // This listener takes care of updating the set of currently selected
@@ -1578,12 +1580,32 @@ class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, Graph
         });
     }
 
-    private void resetSelection() {
-        final ISelection selection = getWidgetSelection();
+    /**
+     * @return the new selection if it was different from the old selection in
+     *         {@link #selectionProvider}
+     */
+    private ISelection resetSelectionFromWidget() {
+        ISelection widgetSelection = getWidgetSelection();
 //        System.out.println("resetSelection()");
 //        System.out.println("    provider selection: " + selectionProvider.getSelection());
-//        System.out.println("    widget selection:   " + selection);
-        selectionProvider.setAndFireNonEqualSelection(selection);
+//        System.out.println("    widget selection:   " + widgetSelection);
+        boolean equals = selectionProvider.selectionEquals(widgetSelection);
+        selectionProvider.setSelectionWithoutFiring(widgetSelection);
+        return equals ? null : widgetSelection;
+    }
+
+    /**
+     * @return the new selection if it was different from the old selection in
+     *         {@link #selectionProvider}
+     */
+    private boolean resetSelectionFromWidgetAndFirePostSelection(boolean force) {
+        ISelection s = resetSelectionFromWidget();
+        boolean fire = s != null || force;
+        if (fire) {
+            //System.out.println("FIRING POST-SELECTION: " + selectionProvider.getSelection());
+            selectionProvider.firePostSelection(selectionProvider.getSelection());
+        }
+        return fire;
     }
 
     protected void setDefaultProcessors() {
@@ -2300,7 +2322,7 @@ class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, Graph
 //                    System.out.println("MODCOUNT: " + modCount + " vs. " + count);
                     if (modCount != count)
                         return;
-                    resetSelection();
+                    resetSelectionFromWidgetAndFirePostSelection(false);
                 }
             });
         }