/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.rcp.provider.selectionprovider; 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; /** * Taken from Marc R. Hoffmann's article * "Eclipse Workbench: Using the Selection Service" * (http://www.eclipse.org/articles/Article-WorkbenchSelections/article.html) * * and modified to pass Checkstyle. * * From the original javadoc: * 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 BREDEX GmbH * @created Apr 14, 2009 */ public class SelectionProviderIntermediate implements IPostSelectionProvider { /** the selection listeners for this provider */ private final ListenerList m_selectionListeners = new ListenerList(); /** the post-selection listeners for this provider */ private final ListenerList m_postSelectionListeners = new ListenerList(); /** the selection provider currently being used as a delegate */ private ISelectionProvider m_delegate; /** * Listens for changes in selection from the current delegate and forwards * those changes as events. */ private ISelectionChangedListener m_selectionListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { fireSelectionChanged(event.getSelection()); } }; /** * Listens for changes in selection from the current delegate and forwards * those changes as events. This is used if the delegate is a * <code>IPostSelectionListener</code>. */ private ISelectionChangedListener m_postSelectionListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { firePostSelectionChanged(event.getSelection()); } }; /** * Sets a new selection provider to delegate to. Selection listeners * registered with the previous delegate are removed beforehand. * * @param newDelegate new selection provider */ public void setSelectionProviderDelegate(ISelectionProvider newDelegate) { if (m_delegate == newDelegate) { return; } if (m_delegate != null) { m_delegate.removeSelectionChangedListener(m_selectionListener); if (m_delegate instanceof IPostSelectionProvider) { ((IPostSelectionProvider)m_delegate) .removePostSelectionChangedListener( m_postSelectionListener); } } m_delegate = newDelegate; if (newDelegate != null) { newDelegate.addSelectionChangedListener(m_selectionListener); if (newDelegate instanceof IPostSelectionProvider) { ((IPostSelectionProvider)newDelegate) .addPostSelectionChangedListener(m_postSelectionListener); } fireSelectionChanged(newDelegate.getSelection()); firePostSelectionChanged(newDelegate.getSelection()); } } /** * Fires a selection changed event. * * @param selection The new selection with which to fire the event. */ protected void fireSelectionChanged(ISelection selection) { fireSelectionChanged(m_selectionListeners, selection); } /** * Fires a post-selection changed event. * * @param selection The new selection with which to fire the event. */ protected void firePostSelectionChanged(ISelection selection) { fireSelectionChanged(m_postSelectionListeners, selection); } /** * Fires a selection changed event. * * @param list The list of listeners that should be informed of the event. * @param selection The new selection with which to fire the event. */ private void fireSelectionChanged( ListenerList list, ISelection selection) { SelectionChangedEvent event = new SelectionChangedEvent(m_delegate, selection); Object[] listeners = list.getListeners(); for (int i = 0; i < listeners.length; i++) { ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i]; listener.selectionChanged(event); } } // IPostSelectionProvider Implementation /** * * {@inheritDoc} */ public void addSelectionChangedListener( ISelectionChangedListener listener) { m_selectionListeners.add(listener); } /** * * {@inheritDoc} */ public void removeSelectionChangedListener( ISelectionChangedListener listener) { m_selectionListeners.remove(listener); } /** * * {@inheritDoc} */ public void addPostSelectionChangedListener( ISelectionChangedListener listener) { m_postSelectionListeners.add(listener); } /** * * {@inheritDoc} */ public void removePostSelectionChangedListener( ISelectionChangedListener listener) { m_postSelectionListeners.remove(listener); } /** * * {@inheritDoc} */ public ISelection getSelection() { return m_delegate == null ? null : m_delegate.getSelection(); } /** * * {@inheritDoc} */ public void setSelection(ISelection selection) { if (m_delegate != null) { m_delegate.setSelection(selection); } } }