]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/jface/BasePostSelectionProvider.java
Revert "Usability fixes for GraphExplorerImpl -related WB selection propagation"
[simantics/platform.git] / bundles / org.simantics.utils.ui / src / org / simantics / utils / ui / jface / BasePostSelectionProvider.java
index b06143bf6ee23cc82574666390a0d49c3c99de4a..c5ca0e754cada161035bbcee68289b4dc135062a 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2018 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -21,6 +21,8 @@ import org.eclipse.jface.viewers.IPostSelectionProvider;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.simantics.utils.ObjectUtils;
 
 /**
  * BaseSelectionProvider is a base implementation ISelectionProvider -interface.
@@ -34,21 +36,40 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
  * </p>
  * 
  * @author Toni Kalajainen
- * @author Tuukka Lehtonen
  */
-public class BasePostSelectionProvider extends BaseSelectionProvider implements IPostSelectionProvider {
+public class BasePostSelectionProvider implements IPostSelectionProvider {
 
-    protected ListenerList<ISelectionChangedListener> postSelectionListeners = new ListenerList<>();
+    protected ListenerList selectionListeners = new ListenerList();
+
+    protected ListenerList postSelectionListeners = new ListenerList();
+
+    protected ISelection selection = StructuredSelection.EMPTY;
+
+    public void addSelectionChangedListener(ISelectionChangedListener listener) {
+        selectionListeners.add(listener);
+    }
+
+    public ISelection getSelection() {
+        return selection;
+    }
 
     public void clearListeners() {
-        super.clearListeners();
-        clearPostSelectionChangedListeners();
+        selectionListeners.clear();
+        postSelectionListeners.clear();
+    }
+
+    public void clearSelectionChangedListeners() {
+        postSelectionListeners.clear();
     }
 
     public void clearPostSelectionChangedListeners() {
         postSelectionListeners.clear();
     }
 
+    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+        selectionListeners.remove(listener);
+    }
+
     @Override
     public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
         postSelectionListeners.add(listener);
@@ -59,10 +80,30 @@ public class BasePostSelectionProvider extends BaseSelectionProvider implements
         postSelectionListeners.remove(listener);
     }
 
+    public void setSelection(ISelection selection) {
+        setSelectionWithoutFiring(selection);
+    }
+
+    protected Object[] getListeners() {
+        return selectionListeners.getListeners();
+    }
+
     protected Object[] getPostListeners() {
         return postSelectionListeners.getListeners();
     }
 
+    /**
+     * Notify other UIs that selection has changed
+     * @param selection new selection
+     */
+    public void fireSelection(ISelection selection) {
+        if (selection == null)
+            return;
+        SelectionChangedEvent e = new SelectionChangedEvent(this, selection);
+        for (Object l : getListeners())
+            ((ISelectionChangedListener) l).selectionChanged(e);
+    }
+
     /**
      * Notify other UIs that selection has changed
      * @param selection new selection
@@ -82,4 +123,46 @@ public class BasePostSelectionProvider extends BaseSelectionProvider implements
         }
     }
 
+    public void setSelectionWithoutFiring(ISelection selection) {
+        this.selection = selection;
+    }
+
+
+    /**
+     * Sets a new selection and always fires a SelectionChangedEvent about it.
+     * 
+     * @param selection the new selection
+     */
+    public void setAndFireSelection(ISelection selection) {
+        setSelection(selection);
+        fireSelection(selection);
+    }
+
+    /**
+     * Sets the new selection for this provider and fires all selection change
+     * listeners if the specified selection differs from the current selection.
+     * If the selection is either the same object or considered equal to the
+     * current selection, the listeners are not fired.
+     * 
+     * @param selection the new selection
+     */
+    public void setAndFireNonEqualSelection(ISelection selection) {
+        ISelection old = getSelection();
+        if (ObjectUtils.objectEquals(old, selection))
+            return;
+
+        this.selection = selection;
+        if (selection != null && !selection.equals(old))
+            fireSelection(selection);
+    }
+
+    public boolean selectionEquals(ISelection s) {
+        if (s == selection)
+            return true;
+        if (s == null)
+            // Old selection had to be non-null
+            return true;
+        return s.equals(selection);
+    }
+
 }