blob: 5243180d884a358bda7025bf56ab30db61d3fe8f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.internal;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
/**
* The abstract superclass for actions that depend on the active editor.
* This implementation tracks the active editor (see <code>getActiveEditor</code>)
* and updates the availability of the action when an editor becomes
* active.
* <p>
* Subclasses must implement the following <code>IAction</code> method:
* <ul>
* <li><code>run</code> - to do the action's work</li>
* </ul>
* </p>
* <p>
* Subclasses may extend any of the <code>IPartListener</code> methods if the
* action availablity needs to be recalculated:
* <ul>
* <li><code>partActivated</code></li>
* <li><code>partDeactivated</code></li>
* <li><code>partOpened</code></li>
* <li><code>partClosed</code></li>
* <li><code>partBroughtToTop</code></li>
* </ul>
* </p>
* <p>
* Subclasses may extend any of the <code>IPageListener</code> methods if the
* action availablity needs to be recalculated:
* <ul>
* <li><code>pageActivated</code></li>
* <li><code>pageClosed</code></li>
* <li><code>pageOpened</code></li>
* </ul>
* </p>
* <p>
* This method implements the <code>IPartListener</code> and
* <code>IPageListener</code>interfaces, and automatically registers listeners
* so that it can keep its enablement state up to date. Ordinarily, the
* window's references to these listeners will be dropped automatically when
* the window closes. However, if the client needs to get rid of an action
* while the window is still open, the client must call
* {@link IWorkbenchAction#dispose dispose} to give the action an
* opportunity to deregister its listeners and to perform any other cleanup.
* </p>
*/
public abstract class ActiveEditorAction extends PageEventAction {
private IEditorPart activeEditor;
/**
* Creates a new action with the given text.
*
* @param text the string used as the text for the action,
* or <code>null</code> if there is no text
* @param window the workbench window this action is
* registered with.
*/
protected ActiveEditorAction(String text, IWorkbenchWindow window) {
super(text, window);
updateState();
}
/**
* Notification that the active editor tracked
* by the action is being activated.
*
* Subclasses may override.
*/
protected void editorActivated(IEditorPart part) {
}
/**
* Notification that the active editor tracked
* by the action is being deactivated.
*
* Subclasses may override.
*/
protected void editorDeactivated(IEditorPart part) {
}
/**
* Return the active editor
*
* @return the page's active editor, and <code>null</code>
* if no active editor or no active page.
*/
public final IEditorPart getActiveEditor() {
return activeEditor;
}
/* (non-Javadoc)
* Method declared on PageEventAction.
*/
public void pageActivated(IWorkbenchPage page) {
super.pageActivated(page);
updateActiveEditor();
updateState();
}
/* (non-Javadoc)
* Method declared on PageEventAction.
*/
public void pageClosed(IWorkbenchPage page) {
super.pageClosed(page);
updateActiveEditor();
updateState();
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partActivated(IWorkbenchPart part) {
super.partActivated(part);
if (part instanceof IEditorPart) {
updateActiveEditor();
updateState();
}
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partBroughtToTop(IWorkbenchPart part) {
super.partBroughtToTop(part);
if (part instanceof IEditorPart) {
updateActiveEditor();
updateState();
}
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partClosed(IWorkbenchPart part) {
super.partClosed(part);
if (part instanceof IEditorPart) {
updateActiveEditor();
updateState();
}
}
/* (non-Javadoc)
* Method declared on PartEventAction.
*/
public void partDeactivated(IWorkbenchPart part) {
super.partDeactivated(part);
if (part instanceof IEditorPart) {
updateActiveEditor();
updateState();
}
}
/**
* Set the active editor
*/
private void setActiveEditor(IEditorPart part) {
if (activeEditor == part) {
return;
}
if (activeEditor != null) {
editorDeactivated(activeEditor);
}
activeEditor = part;
if (activeEditor != null) {
editorActivated(activeEditor);
}
}
/**
* Update the active editor based on the current
* active page.
*/
private void updateActiveEditor() {
if (getActivePage() == null) {
setActiveEditor(null);
} else {
setActiveEditor(getActivePage().getActiveEditor());
}
}
/**
* Update the state of the action. By default, the action
* is enabled if there is an active editor.
*
* Subclasses may override or extend this method.
*/
protected void updateState() {
setEnabled(getActiveEditor() != null);
}
}