/******************************************************************************* * Copyright (c) 2010 SAP AG. * 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: * Emil Simeonov - initial API and implementation. * Dimitar Donchev - initial API and implementation. * Dimitar Tenev - initial API and implementation. * Nevena Manova - initial API and implementation. * Georgi Konstantinov - initial API and implementation. *******************************************************************************/ package org.eclipse.wst.sse.sieditor.ui.providers; import org.eclipse.jface.util.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. * */ public class SurrogateSelectionProvider 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); } } }