package rocks.inspectit.ui.rcp.view.util; 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; // NOCHKALL: Not our code. /** * 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. * <p> * <b>IMPORTANT:</b> The class code is copied/taken/based from <a href= * "http://www.eclipse.org/articles/Article-WorkbenchSelections/SelectionProviderIntermediate.java" * >Eclipse Workbench article</a>. Original author is Marc R. Hoffmann. License info can be found * <a href="https://eclipse.org/legal/termsofuse.php">here</a>. Copied from * * * @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() { @Override public void selectionChanged(SelectionChangedEvent event) { if (event.getSelectionProvider() == delegate) { fireSelectionChanged(event.getSelection()); } } }; private ISelectionChangedListener postSelectionListener = new ISelectionChangedListener() { @Override 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) { // NOPMD 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 (Object listener2 : listeners) { ISelectionChangedListener listener = (ISelectionChangedListener) listener2; listener.selectionChanged(event); } } // IPostSelectionProvider Implementation @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionListeners.add(listener); } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionListeners.remove(listener); } @Override public void addPostSelectionChangedListener(ISelectionChangedListener listener) { postSelectionListeners.add(listener); } @Override public void removePostSelectionChangedListener(ISelectionChangedListener listener) { postSelectionListeners.remove(listener); } @Override public ISelection getSelection() { return delegate == null ? null : delegate.getSelection(); } @Override public void setSelection(ISelection selection) { if (delegate != null) { delegate.setSelection(selection); } } public ISelectionProvider getSelectionProviderDelegate() { return delegate; } }