/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.tabfolder;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.IPostSelectionProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
public class DelegatedSelectionProvider implements IDelegatedSelectionProvider,
IPostSelectionProvider {
private ISelectionProvider delegate = null;
private ISelectionChangedListener listener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
delegateSelectionChanged(event.getSelection());
}
};
private ISelectionChangedListener postListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
postDelegateSelectionChanged(event.getSelection());
}
};
private List<ISelectionChangedListener> listeners = null;
private List<ISelectionChangedListener> postListeners = null;
public void setDelegate(ISelectionProvider delegate) {
if (delegate == this.delegate)
return;
ISelectionProvider oldDelegate = this.delegate;
ISelectionProvider newDelegate = delegate;
this.delegate = delegate;
if (oldDelegate != null) {
oldDelegate.removeSelectionChangedListener(listener);
if (oldDelegate instanceof IPostSelectionProvider) {
((IPostSelectionProvider) oldDelegate)
.removePostSelectionChangedListener(postListener);
}
}
final ISelection newSelection = getSelection();
if (newDelegate != null) {
newDelegate.addSelectionChangedListener(listener);
delegateSelectionChanged(newSelection);
if (newDelegate instanceof IPostSelectionProvider) {
((IPostSelectionProvider) newDelegate)
.addPostSelectionChangedListener(postListener);
} else {
newDelegate.addSelectionChangedListener(postListener);
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
postDelegateSelectionChanged(newSelection);
}
});
} else {
delegateSelectionChanged(newSelection);
postDelegateSelectionChanged(newSelection);
}
}
public ISelectionProvider getDelegate() {
return delegate;
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
if (listeners == null) {
listeners = new ArrayList<ISelectionChangedListener>();
}
listeners.add(listener);
}
public ISelection getSelection() {
return delegate == null ? StructuredSelection.EMPTY : delegate
.getSelection();
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
if (listeners != null) {
listeners.remove(listener);
}
}
public void setSelection(ISelection selection) {
if (delegate != null) {
delegate.setSelection(selection);
}
}
public void addPostSelectionChangedListener(
ISelectionChangedListener listener) {
if (postListeners == null) {
postListeners = new ArrayList<ISelectionChangedListener>();
}
postListeners.add(listener);
}
public void removePostSelectionChangedListener(
ISelectionChangedListener listener) {
if (postListeners != null) {
postListeners.remove(listener);
}
}
private void delegateSelectionChanged(ISelection selection) {
fireSelectionChangedEvent(new SelectionChangedEvent(this, selection),
listeners);
}
private void postDelegateSelectionChanged(ISelection selection) {
fireSelectionChangedEvent(new SelectionChangedEvent(this, selection),
postListeners);
}
private void fireSelectionChangedEvent(final SelectionChangedEvent event,
List<ISelectionChangedListener> listeners) {
if (listeners == null)
return;
Object[] ls = listeners.toArray();
for (int i = 0; i < ls.length; ++i) {
final ISelectionChangedListener l = (ISelectionChangedListener) ls[i];
SafeRunner.run(new SafeRunnable() {
public void run() {
l.selectionChanged(event);
}
});
}
}
}