blob: 7754afbc7596a1fa57b4643467dd3761df6cb2c9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.texteditor;
import java.util.ResourceBundle;
/**
* Skeleton of a standard text editor action. The action is
* initially associated with a text editor via the constructor,
* but can subsequently be changed using <code>setEditor</code>.
* Subclasses must implement the <code>run</code> method and if
* required override the <code>update</code> method.
* <p>
* Subclasses that may modify the editor content should use {@link #canModifyEditor()}
* in their <code>update</code> code to check whether updating the editor is most
* likely possible (even if it is read-only - this may change for editor contents
* that are under version control) and {@link #validateEditorInputState()} before
* actually modifying the editor contents.
* </p>
*/
public abstract class TextEditorAction extends ResourceAction implements IUpdate {
/** The action's editor */
private ITextEditor fTextEditor;
/**
* Creates and initializes the action for the given text editor. The action
* configures its visual representation from the given resource bundle.
*
* @param bundle the resource bundle
* @param prefix a prefix to be prepended to the various resource keys
* (described in <code>ResourceAction</code> constructor), or
* <code>null</code> if none
* @param editor the text editor
* @see ResourceAction#ResourceAction(ResourceBundle, String)
*/
protected TextEditorAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
super(bundle, prefix);
setEditor(editor);
update();
}
/**
* Creates and initializes the action for the given text editor. The action
* configures its visual representation from the given resource bundle.
*
* @param bundle the resource bundle
* @param prefix a prefix to be prepended to the various resource keys
* (described in <code>ResourceAction</code> constructor), or
* <code>null</code> if none
* @param editor the text editor
* @param style the style of this action
* @see ResourceAction#ResourceAction(ResourceBundle, String, int)
* @since 3.0
*/
protected TextEditorAction(ResourceBundle bundle, String prefix, ITextEditor editor, int style) {
super(bundle, prefix, style);
setEditor(editor);
update();
}
/**
* Returns the action's text editor.
*
* @return the action's text editor
*/
protected ITextEditor getTextEditor() {
return fTextEditor;
}
/**
* Retargets this action to the given editor.
*
* @param editor the new editor, or <code>null</code> if none
*/
public void setEditor(ITextEditor editor) {
fTextEditor= editor;
}
/**
* Always enables this action if it is connected to a text editor.
* If the associated editor is <code>null</code>, the action is disabled.
* Subclasses may override.
*/
public void update() {
setEnabled(getTextEditor() != null);
}
/**
* Checks the editor's modifiable state. Returns <code>true</code> if the editor can be modified,
* taking in account the possible editor extensions.
*
* <p>If the editor implements <code>ITextEditorExtension2</code>,
* this method returns {@link ITextEditorExtension2#isEditorInputModifiable()};<br> else if the editor
* implements <code>ITextEditorExtension</code>, it returns {@link ITextEditorExtension#isEditorInputReadOnly()};<br>
* else, {@link ITextEditor#isEditable()} is returned, or <code>false</code> if the editor is <code>null</code>.</p>
*
* <p>There is only a difference to {@link #validateEditorInputState()} if the editor implements
* <code>ITextEditorExtension2</code>.</p>
*
* @return <code>true</code> if a modifying action should be enabled, <code>false</code> otherwise
* @since 3.0
*/
protected boolean canModifyEditor() {
ITextEditor editor= getTextEditor();
if (editor instanceof ITextEditorExtension2)
return ((ITextEditorExtension2) editor).isEditorInputModifiable();
else if (editor instanceof ITextEditorExtension)
return !((ITextEditorExtension) editor).isEditorInputReadOnly();
else if (editor != null)
return editor.isEditable();
else
return false;
}
/**
* Checks and validates the editor's modifiable state. Returns <code>true</code> if an action
* can proceed modifying the editor's input, <code>false</code> if it should not.
*
* <p>If the editor implements <code>ITextEditorExtension2</code>,
* this method returns {@link ITextEditorExtension2#validateEditorInputState()};<br> else if the editor
* implements <code>ITextEditorExtension</code>, it returns {@link ITextEditorExtension#isEditorInputReadOnly()};<br>
* else, {@link ITextEditor#isEditable()} is returned, or <code>false</code> if the editor is <code>null</code>.</p>
*
* <p>There is only a difference to {@link #canModifyEditor()} if the editor implements
* <code>ITextEditorExtension2</code>.</p>
*
* @return <code>true</code> if a modifying action can proceed to modify the underlying document, <code>false</code> otherwise
* @since 3.0
*/
protected boolean validateEditorInputState() {
ITextEditor editor= getTextEditor();
if (editor instanceof ITextEditorExtension2)
return ((ITextEditorExtension2) editor).validateEditorInputState();
else if (editor instanceof ITextEditorExtension)
return !((ITextEditorExtension) editor).isEditorInputReadOnly();
else if (editor != null)
return editor.isEditable();
else
return false;
}
}