package com.netifera.platform.ui.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; /** * SelectionProviderProxy keeps a list of listeners allowing to change the real * provider. The listeners are not aware of the change. It is used when a part * publishes a selection provider from a viewer and later the viewer is changed. * In that case a proxy is published in the part creation code and the provider * of the proxy is updated in each part's viewer switch. * * */ public class SelectionProviderProxy implements IPostSelectionProvider { private ISelectionProvider provider; private final ListenerList postSelectionList = new ListenerList(); private ISelectionChangedListener postSelectionListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (event.getSelectionProvider() == provider) { firePostSelectionChanged(event.getSelection()); } } }; private final ListenerList selectionList = new ListenerList(); private ISelectionChangedListener selectionListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (event.getSelectionProvider() == provider) { fireSelectionChanged(event.getSelection()); } } }; /* StructuredSelection.EMPTY could be used here */ private final ISelection emptySelection = new ISelection() { public boolean isEmpty() { return true; } }; /** * @param newProvider the real provider represented by this proxy */ public void setSelectionProvider(ISelectionProvider newProvider) { if (provider != null) { provider.removeSelectionChangedListener(selectionListener); if (provider instanceof IPostSelectionProvider) { ((IPostSelectionProvider) provider) .removePostSelectionChangedListener(postSelectionListener); } } provider = newProvider; if (newProvider != null) { newProvider.addSelectionChangedListener(selectionListener); if (newProvider instanceof IPostSelectionProvider) { ((IPostSelectionProvider) newProvider) .addPostSelectionChangedListener(postSelectionListener); } fireSelectionChanged(newProvider.getSelection()); firePostSelectionChanged(newProvider.getSelection()); } } public void addPostSelectionChangedListener( ISelectionChangedListener listener) { postSelectionList.add(listener); } public void removePostSelectionChangedListener( ISelectionChangedListener listener) { postSelectionList.remove(listener); } public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionList.add(listener); } public ISelection getSelection() { return (provider == null) ? emptySelection : provider.getSelection(); } public void removeSelectionChangedListener( ISelectionChangedListener listener) { selectionList.remove(listener); } public void setSelection(ISelection selection) { if (provider != null) { provider.setSelection(selection); } } protected void fireSelectionChanged(ISelection selection) { fireSelectionChanged(selectionList, selection); } protected void firePostSelectionChanged(ISelection selection) { fireSelectionChanged(postSelectionList, selection); } private void fireSelectionChanged(ListenerList list, ISelection selection) { if(selection == null) { return; } SelectionChangedEvent event = new SelectionChangedEvent(provider, selection); Object[] listeners = list.getListeners(); for (int i = 0; i < listeners.length; i++) { ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i]; listener.selectionChanged(event); } } }