/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.gef.ui.editor; import java.util.ArrayList; import java.util.List; 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; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Display; import org.xmind.ui.tabfolder.DelegatedSelectionProvider; /** * * @author Frank Shaka * @deprecated Use {@link DelegatedSelectionProvider} instead. */ public class MultiGraphicalPageSelectionProvider implements IPostSelectionProvider, ISelectionChangedListener { private List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>(); private List<ISelectionChangedListener> postListeners = new ArrayList<ISelectionChangedListener>(); private IGraphicalEditorPage activePage = null; private class PostSelectionDispatcher implements Runnable { private ISelection selection; /** * */ public PostSelectionDispatcher(ISelection selection) { this.selection = selection; } public void schedule() { postSelectionDispatcher = this; Display.getCurrent().asyncExec(this); } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { if (postSelectionDispatcher != this) return; try { firePostSelectionChangedEvent(new SelectionChangedEvent( MultiGraphicalPageSelectionProvider.this, selection)); } finally { postSelectionDispatcher = null; } } } private PostSelectionDispatcher postSelectionDispatcher = null; public void addPostSelectionChangedListener( ISelectionChangedListener listener) { postListeners.add(listener); } public void addSelectionChangedListener(ISelectionChangedListener listener) { listeners.add(listener); } public void removePostSelectionChangedListener( ISelectionChangedListener listener) { postListeners.remove(listener); } public void removeSelectionChangedListener( ISelectionChangedListener listener) { listeners.remove(listener); } public void setActivePage(IGraphicalEditorPage page) { if (page == this.activePage) return; if (this.activePage != null) { ISelectionProvider selectionProvider = this.activePage .getSelectionProvider(); if (selectionProvider != null) selectionProvider.removeSelectionChangedListener(this); } this.activePage = page; if (page != null) { ISelectionProvider selectionProvider = page.getSelectionProvider(); if (selectionProvider != null) selectionProvider.addSelectionChangedListener(this); } handlePageSelectionChanged(getSelection()); } private void handlePageSelectionChanged(ISelection selection) { fireSelectionChangedEvent(new SelectionChangedEvent(this, selection)); new PostSelectionDispatcher(selection).schedule(); } protected void fireSelectionChangedEvent(SelectionChangedEvent event) { fireSelectionChangedEvent( new SelectionChangedEvent(this, event.getSelection()), listeners); } protected void firePostSelectionChangedEvent(SelectionChangedEvent event) { fireSelectionChangedEvent( new SelectionChangedEvent(this, event.getSelection()), postListeners); } private void fireSelectionChangedEvent(SelectionChangedEvent event, List<ISelectionChangedListener> listeners) { for (Object listener : listeners.toArray()) { ((ISelectionChangedListener) listener).selectionChanged(event); } } public ISelection getSelection() { if (activePage != null) { ISelectionProvider selectionProvider = activePage .getSelectionProvider(); if (selectionProvider != null) return selectionProvider.getSelection(); } return StructuredSelection.EMPTY; } public void setSelection(ISelection selection) { if (activePage != null) { ISelectionProvider selectionProvider = activePage .getSelectionProvider(); if (selectionProvider != null) { selectionProvider.setSelection(selection); } } } /** * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ public void selectionChanged(SelectionChangedEvent event) { handlePageSelectionChanged(event.getSelection()); } }