/*
* Created on 07-Mar-2004
*/
package pipe.actions.gui;
import java.net.URL;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoableEdit;
import pipe.gui.PipeResourceLocator;
/**
* Abstract action which all PIPE GUI actions should subclass. These
* actions should be buttons on the PIPE tool bar
*
* This class is responsible for loading the images of the button
*/
@SuppressWarnings("serial")
public abstract class GuiAction extends AbstractAction {
public static final String SELECTED = "selected";
protected UndoableEditListener listener;
/**
*
* Constructor loading the image and setting the tool tip mssage.
* It sets the keyboard shortcut of the action to that specified
*
* @param name image name
* @param tooltip tooltip message
* @param key {@link java.awt.event.KeyEvent} key
* @param modifiers e.g. ctrl/shift obtained from {@link java.awt.event.InputEvent}
*/
protected GuiAction(String name, String tooltip, int key, int modifiers) {
this(name, tooltip);
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(key, modifiers));
}
/**
*
* Constructor loading the image and setting the tooltip message.
* It does not provide a keyboard shortcut
* @param name image name
* @param tooltip tooltip message
*/
protected GuiAction(String name, String tooltip) {
super(name);
PipeResourceLocator locator = new PipeResourceLocator();
try {
URL iconURL = locator.getImage(name);
putValue(SMALL_ICON, new ImageIcon(iconURL));
} catch (RuntimeException e) {
// some actions don't have icons; ignore
}
if (tooltip != null) {
putValue(SHORT_DESCRIPTION, tooltip);
}
}
/**
*
* Constructor loading the image and setting the tooltip message.
* It sets the short cut to the specified keystrol and the accelerator key
* @param name image name
* @param tooltip tooltip message
* @param keystroke shortcut for action
*/
protected GuiAction(String name, String tooltip, String keystroke) {
this(name, tooltip);
if (keystroke != null) {
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(keystroke));
}
}
/**
* Adds a listener to this action that is interested in undoable actions
* @param l listener
*/
public void addUndoableEditListener(UndoableEditListener l) {
//TODO: Should ideally throw an exception if listener != null
listener = l;
}
/**
* Removes the listener from this action
* @param l listener
*/
public void removeUndoableEditListener(UndoableEditListener l) {
listener = null;
}
/**
*
* @return true if the action is currently selected
*/
public boolean isSelected() {
Boolean b = (Boolean) getValue(SELECTED);
return b != null && b;
}
/**
*
* @param selected true or false for setting the action as selected and not selected accordingly
*/
public void setSelected(boolean selected) {
Boolean b = (Boolean) getValue(SELECTED);
if (b != null) {
putValue(SELECTED, Boolean.valueOf(selected));
}
}
/**
*
* Notifies the lister that the following undo event has been created.
*
* @param edit event
*/
protected void registerUndoEvent(UndoableEdit edit) {
if (listener != null) {
listener.undoableEditHappened(new UndoableEditEvent(this, edit));
}
}
}