Fixed GraphExplorerImpl to set selection upon keyboard-based selection 45/2445/3
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Sat, 10 Nov 2018 10:43:08 +0000 (12:43 +0200)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Sat, 10 Nov 2018 10:48:13 +0000 (10:48 +0000)
Previously scrolling the selection using the keyboard and then pressing
Enter to open the selected resource would result in the wrong resource
being opened because the selection hadn't yet propagated through the
postSelection event.

gitlab #184

Change-Id: Ib1f837b3cb8eb70b32508e4abee36cfa995886ed

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);
                 }
             });
         }