]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java
Fire selection change events on every selection change
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / GraphExplorerImpl.java
index 0168ad864ae5e98258498d76fef7f04f42ee4282..e90ae5eeecf78dee9d9bd0f6a74084e116d83af9 100644 (file)
@@ -173,6 +173,8 @@ import org.simantics.utils.ui.SWTUtils;
 import org.simantics.utils.ui.jface.BasePostSelectionProvider;
 import org.simantics.utils.ui.widgets.VetoingEventHandler;
 import org.simantics.utils.ui.workbench.WorkbenchUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import gnu.trove.map.hash.THashMap;
 import gnu.trove.procedure.TObjectProcedure;
@@ -185,6 +187,8 @@ import gnu.trove.set.hash.THashSet;
  */
 class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, GraphExplorer /*, IPostSelectionProvider*/ {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(GraphExplorerImpl.class);
+
        private static class GraphExplorerPostSelectionProvider implements IPostSelectionProvider {
                
                private GraphExplorerImpl ge;
@@ -1552,10 +1556,16 @@ class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, Graph
         });
 
         OpenStrategy os = new OpenStrategy(tree);
+        os.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+            ISelection s = resetSelectionFromWidget();
+            if (s != null) {
+                LOGGER.trace("Fire selection change: {}", s);
+                selectionProvider.fireSelection(s);
+            }
+        }));
         os.addPostSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
-            //System.out.println("OPENSTRATEGY: post selection changed: " + e);
-            resetSelection();
-            selectionProvider.firePostSelection(selectionProvider.getSelection());
+            LOGGER.trace("Fire post-selection change: {}", selectionProvider.getSelection());
+            resetSelectionFromWidgetAndFirePostSelection(true);
         }));
 
         // This listener takes care of updating the set of currently selected
@@ -1578,12 +1588,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 +2330,7 @@ class GraphExplorerImpl extends GraphExplorerImplBase implements Listener, Graph
 //                    System.out.println("MODCOUNT: " + modCount + " vs. " + count);
                     if (modCount != count)
                         return;
-                    resetSelection();
+                    resetSelectionFromWidgetAndFirePostSelection(false);
                 }
             });
         }