/******************************************************************************* * Copyright (c) 2008 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.erlide.ui.editors.erl.outline; import org.eclipse.jface.util.OpenStrategy; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.ui.IWorkbenchPage; import org.erlide.ui.editors.erl.ErlangEditor; /** * Helper for opening editors on the viewer's selection and link the selection * with the editor. */ public class OpenAndLinkWithEditorHelper { private final StructuredViewer viewer; private boolean isLinkingEnabled; private ISelection lastOpenSelection; private InternalListener listener; private final ErlangEditor fEditor; private final IWorkbenchPage page; private final class InternalListener implements IOpenListener, ISelectionChangedListener, IDoubleClickListener { @Override public final void open(final OpenEvent event) { lastOpenSelection = event.getSelection(); OpenAndLinkWithEditorHelper.this.open(lastOpenSelection, OpenStrategy.activateOnOpen()); } @Override public void selectionChanged(final SelectionChangedEvent event) { final ISelection selection = event.getSelection(); if (isLinkingEnabled && !selection.equals(lastOpenSelection) && viewer.getControl().isFocusControl()) { linkToEditor(selection); } lastOpenSelection = null; } @Override public void doubleClick(final DoubleClickEvent event) { if (!OpenStrategy.activateOnOpen()) { activate(event.getSelection()); } } } /** * Creates a new helper for the given viewer. * * @param viewer * the viewer * @param iWorkbenchPage */ public OpenAndLinkWithEditorHelper(final StructuredViewer viewer, final ErlangEditor fEditor, final IWorkbenchPage page) { if (viewer == null) { throw new IllegalArgumentException( "viewer can't be null in OpenAndLinkWithEditorHelper"); } this.viewer = viewer; this.fEditor = fEditor; this.page = page; listener = new InternalListener(); viewer.addPostSelectionChangedListener(listener); viewer.addOpenListener(listener); viewer.addDoubleClickListener(listener); } /** * Sets whether editor that corresponds to the viewer's selection should be * brought to front. * * @param enabled * <code>true</code> to enable, <code>false</code> to disable */ public void setLinkWithEditor(final boolean enabled) { isLinkingEnabled = enabled; } /** * Disposes this helper. * <p> * Clients only need to call this method if their viewer has a longer * life-cycle than this helper. * </p> */ public void dispose() { viewer.removePostSelectionChangedListener(listener); viewer.removeOpenListener(listener); viewer.removeDoubleClickListener(listener); listener = null; } private void activate(final ISelection selection) { fEditor.doSelectionChanged(selection); page.activate(fEditor); } private void linkToEditor(final ISelection selection) { fEditor.doSelectionChanged(selection); } private void open(final ISelection selection, final boolean activate) { fEditor.doSelectionChanged(selection); if (activate) { page.activate(fEditor); } } public boolean isLinkedWithEditor() { return isLinkingEnabled; } }