blob: 985f18de100b7ae15b6e788143566f8ef5ee3f1d [file] [log] [blame]
/*******************************************************************************
* 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.eclipse.ui;
import org.eclipse.core.runtime.Assert;
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;
/**
* Helper for opening editors on the viewer's selection and link the selection with the editor.
*
* @since 1.4
*/
public abstract class OpenAndLinkWithEditorHelper {
private StructuredViewer viewer;
private boolean isLinkingEnabled;
private ISelection lastOpenSelection;
private InternalListener listener;
private final class InternalListener implements IOpenListener, ISelectionChangedListener, IDoubleClickListener {
/*
* @see org.eclipse.jface.viewers.IOpenListener#open(org.eclipse.jface.viewers.OpenEvent)
*/
public final void open(OpenEvent event) {
lastOpenSelection = event.getSelection();
OpenAndLinkWithEditorHelper.this.open(lastOpenSelection, OpenStrategy.activateOnOpen());
}
/*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
final ISelection selection = event.getSelection();
if (isLinkingEnabled && !selection.equals(lastOpenSelection) && viewer.getControl().isFocusControl())
linkToEditor(selection);
lastOpenSelection = null;
}
/*
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
public void doubleClick(DoubleClickEvent event) {
if (!OpenStrategy.activateOnOpen())
activate(event.getSelection());
}
}
/**
* Creates a new helper for the given viewer.
*
* @param viewer the viewer
*/
public OpenAndLinkWithEditorHelper(StructuredViewer viewer) {
Assert.isLegal(viewer != null);
this.viewer = viewer;
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(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;
}
/**
* Tells to activate the editor that is open on the given selection.
* <p>
* <strong>Note:</strong> The implementation must not open a new editor.
* </p>
*
* @param selection the viewer's selection
* @since 1.4
*/
protected abstract void activate(ISelection selection);
/**
* Tells to open an editor for the given selection.
*
* @param selection the viewer's selection
* @param activate <code>true</code> if the editor should be activated, <code>false</code>
* otherwise
* @since 1.4
*/
protected abstract void open(ISelection selection, boolean activate);
/**
* Tells to link the given selection to the editor that is open on the given selection but does
* nothing if no matching editor can be found.
* <p>
* The common implementation brings that editor to front but more advanced implementations may
* also select the given selection inside the editor.
* </p>
* <p>
* <strong>Note:</strong> The implementation must not open a new editor.
* </p>
*
* @param selection the viewer's selection
* @since 1.4
*/
protected abstract void linkToEditor(ISelection selection);
}