From 75dc26dacf421e7027e959643963af1efdf10986 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Sat, 10 Nov 2018 12:43:08 +0200 Subject: [PATCH] Fixed GraphExplorerImpl to set selection upon keyboard-based selection 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 --- .../browsing/ui/swt/GraphExplorerImpl.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java b/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java index 0168ad864..df4860d42 100644 --- a/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java +++ b/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/GraphExplorerImpl.java @@ -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); } }); } -- 2.47.1