Bug 570852: [UI-Viewers] Revise AbstractPostSelectionProvider

Change-Id: Ia41ba52e9963aa9cdb017a924f7e740fa43d6c6e
Signed-off-by: Stephan Wahlbrink <sw@wahlbrink.eu>
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/AbstractPostSelectionProvider.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/AbstractPostSelectionProvider.java
deleted file mode 100644
index 707bbcf..0000000
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/AbstractPostSelectionProvider.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*=============================================================================#
- # Copyright (c) 2012, 2021 Stephan Wahlbrink and others.
- # 
- # This program and the accompanying materials are made available under the
- # terms of the Eclipse Public License 2.0 which is available at
- # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
- # which is available at https://www.apache.org/licenses/LICENSE-2.0.
- # 
- # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
- # 
- # Contributors:
- #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
- #=============================================================================*/
-
-package org.eclipse.statet.ecommons.ui.util;
-
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-import org.eclipse.statet.ecommons.collections.FastList;
-
-
-public abstract class AbstractPostSelectionProvider implements IPostSelectionProvider {
-	
-	
-	private final FastList<ISelectionChangedListener> fSelectionListeners= new FastList<>(ISelectionChangedListener.class);
-	private final FastList<ISelectionChangedListener> fPostSelectionListeners= new FastList<>(ISelectionChangedListener.class);
-	
-	
-	public AbstractPostSelectionProvider() {
-	}
-	
-	
-	@Override
-	public void addSelectionChangedListener(final ISelectionChangedListener listener) {
-		fSelectionListeners.add(listener);
-	}
-	
-	@Override
-	public void removeSelectionChangedListener(final ISelectionChangedListener listener) {
-		fSelectionListeners.remove(listener);
-	}
-	
-	
-	@Override
-	public void addPostSelectionChangedListener(final ISelectionChangedListener listener) {
-		fPostSelectionListeners.add(listener);
-	}
-	
-	@Override
-	public void removePostSelectionChangedListener(final ISelectionChangedListener listener) {
-		fPostSelectionListeners.remove(listener);
-	}
-	
-	
-	protected void fireSelectionChanged(final SelectionChangedEvent event) {
-		final ISelectionChangedListener[] listeners = fSelectionListeners.toArray();
-		for (int i = 0; i < listeners.length; i++) {
-			final ISelectionChangedListener l = listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				@Override
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-	
-	protected void firePostSelectionChanged(final SelectionChangedEvent event) {
-		final ISelectionChangedListener[] listeners = fPostSelectionListeners.toArray();
-		for (int i = 0; i < listeners.length; i++) {
-			final ISelectionChangedListener l = listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				@Override
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-	
-}
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/PostSelectionProviderProxy.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/PostSelectionProviderProxy.java
index e363159..3f38160 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/PostSelectionProviderProxy.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/util/PostSelectionProviderProxy.java
@@ -21,6 +21,8 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 
+import org.eclipse.statet.ecommons.ui.viewers.AbstractPostSelectionProvider;
+
 
 public class PostSelectionProviderProxy extends AbstractPostSelectionProvider {
 	
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/AbstractPostSelectionProvider.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/AbstractPostSelectionProvider.java
new file mode 100644
index 0000000..31cdd67
--- /dev/null
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/AbstractPostSelectionProvider.java
@@ -0,0 +1,77 @@
+/*=============================================================================#
+ # Copyright (c) 2012, 2021 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.ecommons.ui.viewers;
+
+import java.util.List;
+
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+import org.eclipse.statet.jcommons.collections.CopyOnWriteList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+
+@NonNullByDefault
+public abstract class AbstractPostSelectionProvider implements IPostSelectionProvider {
+	
+	
+	private final CopyOnWriteList<ISelectionChangedListener> selectionListeners= new CopyOnWriteList<>();
+	
+	private final CopyOnWriteList<ISelectionChangedListener> postSelectionListeners= new CopyOnWriteList<>();
+	
+	
+	public AbstractPostSelectionProvider() {
+	}
+	
+	
+	@Override
+	public void addSelectionChangedListener(final ISelectionChangedListener listener) {
+		this.selectionListeners.add(listener);
+	}
+	
+	@Override
+	public void removeSelectionChangedListener(final ISelectionChangedListener listener) {
+		this.selectionListeners.remove(listener);
+	}
+	
+	
+	@Override
+	public void addPostSelectionChangedListener(final ISelectionChangedListener listener) {
+		this.postSelectionListeners.add(listener);
+	}
+	
+	@Override
+	public void removePostSelectionChangedListener(final ISelectionChangedListener listener) {
+		this.postSelectionListeners.remove(listener);
+	}
+	
+	
+	protected void fireSelectionChanged(final SelectionChangedEvent event) {
+		final List<ISelectionChangedListener> listeners = this.selectionListeners.toList();
+		for (final ISelectionChangedListener listener : listeners) {
+			SafeRunnable.run(() -> listener.selectionChanged(event));
+		}
+	}
+	
+	protected void firePostSelectionChanged(final SelectionChangedEvent event) {
+		final List<ISelectionChangedListener> listeners = this.postSelectionListeners.toList();
+		for (final ISelectionChangedListener listener : listeners) {
+			SafeRunnable.run(() -> listener.selectionChanged(event));
+		}
+	}
+	
+}