package com.mountainminds.eclipse.selectionsample; | |
import org.eclipse.core.runtime.ListenerList; | |
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; | |
/** | |
* IPostSelectionProvider implementation that delegates to another | |
* ISelectionProvider or IPostSelectionProvider. The selection provider used | |
* for delegation can be exchanged dynamically. Registered listeners are | |
* adjusted accordingly. This utility class may be used in workbench parts with | |
* multiple viewers. | |
* | |
* @author Marc R. Hoffmann | |
*/ | |
public class SelectionProviderIntermediate implements IPostSelectionProvider { | |
private final ListenerList selectionListeners = new ListenerList(); | |
private final ListenerList postSelectionListeners = new ListenerList(); | |
private ISelectionProvider delegate; | |
private ISelectionChangedListener selectionListener = new ISelectionChangedListener() { | |
public void selectionChanged(SelectionChangedEvent event) { | |
if (event.getSelectionProvider() == delegate) { | |
fireSelectionChanged(event.getSelection()); | |
} | |
} | |
}; | |
private ISelectionChangedListener postSelectionListener = new ISelectionChangedListener() { | |
public void selectionChanged(SelectionChangedEvent event) { | |
if (event.getSelectionProvider() == delegate) { | |
firePostSelectionChanged(event.getSelection()); | |
} | |
} | |
}; | |
/** | |
* Sets a new selection provider to delegate to. Selection listeners | |
* registered with the previous delegate are removed before. | |
* | |
* @param newDelegate new selection provider | |
*/ | |
public void setSelectionProviderDelegate(ISelectionProvider newDelegate) { | |
if (delegate == newDelegate) { | |
return; | |
} | |
if (delegate != null) { | |
delegate.removeSelectionChangedListener(selectionListener); | |
if (delegate instanceof IPostSelectionProvider) { | |
((IPostSelectionProvider)delegate).removePostSelectionChangedListener(postSelectionListener); | |
} | |
} | |
delegate = newDelegate; | |
if (newDelegate != null) { | |
newDelegate.addSelectionChangedListener(selectionListener); | |
if (newDelegate instanceof IPostSelectionProvider) { | |
((IPostSelectionProvider)newDelegate).addPostSelectionChangedListener(postSelectionListener); | |
} | |
fireSelectionChanged(newDelegate.getSelection()); | |
firePostSelectionChanged(newDelegate.getSelection()); | |
} | |
} | |
protected void fireSelectionChanged(ISelection selection) { | |
fireSelectionChanged(selectionListeners, selection); | |
} | |
protected void firePostSelectionChanged(ISelection selection) { | |
fireSelectionChanged(postSelectionListeners, selection); | |
} | |
private void fireSelectionChanged(ListenerList list, ISelection selection) { | |
SelectionChangedEvent event = new SelectionChangedEvent(delegate, selection); | |
Object[] listeners = list.getListeners(); | |
for (int i = 0; i < listeners.length; i++) { | |
ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i]; | |
listener.selectionChanged(event); | |
} | |
} | |
// IPostSelectionProvider Implementation | |
public void addSelectionChangedListener(ISelectionChangedListener listener) { | |
selectionListeners.add(listener); | |
} | |
public void removeSelectionChangedListener( | |
ISelectionChangedListener listener) { | |
selectionListeners.remove(listener); | |
} | |
public void addPostSelectionChangedListener( | |
ISelectionChangedListener listener) { | |
postSelectionListeners.add(listener); | |
} | |
public void removePostSelectionChangedListener( | |
ISelectionChangedListener listener) { | |
postSelectionListeners.remove(listener); | |
} | |
public ISelection getSelection() { | |
return delegate == null ? null : delegate.getSelection(); | |
} | |
public void setSelection(ISelection selection) { | |
if (delegate != null) { | |
delegate.setSelection(selection); | |
} | |
} | |
} |