/*=============================================================================#
 # 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));
		}
	}
	
}
