package org.jactr.eclipse.runtime.ui.selection; /* * default logging */ import java.util.ArrayList; import java.util.List; import javolution.util.FastList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; public class SessionTimeSelectionProvider implements ISelectionProvider { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(SessionTimeSelectionProvider.class); private List<ISelectionChangedListener> _listeners; private List<ISelectionChangedListener> _cachedListeners; private ISelection _selection; public SessionTimeSelectionProvider() { _listeners = new ArrayList<ISelectionChangedListener>(); } public void addSelectionChangedListener(ISelectionChangedListener listener) { synchronized (_listeners) { _listeners.add(listener); _cachedListeners = null; } } public ISelection getSelection() { return _selection; } public void removeSelectionChangedListener(ISelectionChangedListener listener) { synchronized (_listeners) { _listeners.remove(listener); _cachedListeners = null; } } public void setSelection(ISelection selection) { _selection = selection; List<ISelectionChangedListener> listeners = null; synchronized (_listeners) { if (_listeners.size() == 0) return; if (_cachedListeners == null) _cachedListeners = new FastList<ISelectionChangedListener>(_listeners); listeners = _cachedListeners; } SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection()); fireSelectionEvent(listeners, event); } private void fireSelectionEvent( final List<ISelectionChangedListener> listeners, final SelectionChangedEvent event) { // Job fireLater = new Job("selecion propogation") { // // @Override // protected IStatus run(IProgressMonitor monitor) // { for (ISelectionChangedListener listener : listeners) try { listener.selectionChanged(event); } catch (Exception e) { // silently swallow or log? LOGGER.error("Failed to propogate selection change event", e); } // return Status.OK_STATUS; // } // // }; // // // fireLater.schedule(); } }