/******************************************************************************* * 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; } }