/* * @(#)RedoAction.java * * Copyright (c) 1996-2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.app.action.edit; import edu.umd.cs.findbugs.annotations.Nullable; import java.awt.event.*; import javax.swing.*; import java.beans.*; import org.jhotdraw.util.*; import org.jhotdraw.app.Application; import org.jhotdraw.app.View; import org.jhotdraw.app.action.AbstractViewAction; /** * Redoes the last user action on the active view. * <p> * This action requires that the View returns a project * specific redo action when invoking getActionMap("redo") on a View. * <p> * This action is called when the user selects the Redo item in the Edit * menu. The menu item is automatically created by the application. * <p> * If you want this behavior in your application, you have to create an action * with this ID and put it in your {@code ApplicationModel} in method * {@link org.jhotdraw.app.ApplicationModel#initApplication}. * * @author Werner Randelshofer * @version $Id$ */ public class RedoAction extends AbstractViewAction { private static final long serialVersionUID = 1L; public static final String ID = "edit.redo"; private ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.app.Labels"); private PropertyChangeListener redoActionPropertyListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (name == AbstractAction.NAME) { putValue(AbstractAction.NAME, evt.getNewValue()); } else if (name == "enabled") { updateEnabledState(); } } }; /** Creates a new instance. */ public RedoAction(Application app, @Nullable View view) { super(app, view); labels.configureAction(this, ID); } protected void updateEnabledState() { boolean isEnabled = false; Action realRedoAction = getRealRedoAction(); if (realRedoAction != null && realRedoAction!=this) { isEnabled = realRedoAction.isEnabled(); } setEnabled(isEnabled); } @Override protected void updateView(@Nullable View oldValue, @Nullable View newValue) { super.updateView(oldValue, newValue); if (newValue != null && // newValue.getActionMap().get(ID) != null && // newValue.getActionMap().get(ID) != this) { putValue(AbstractAction.NAME, newValue.getActionMap().get(ID). getValue(AbstractAction.NAME)); updateEnabledState(); } } /** * Installs listeners on the view object. */ @Override protected void installViewListeners(View p) { super.installViewListeners(p); Action redoActionInView = p.getActionMap().get(ID); if (redoActionInView != null && redoActionInView != this) { redoActionInView.addPropertyChangeListener(redoActionPropertyListener); } } /** * Installs listeners on the view object. */ @Override protected void uninstallViewListeners(View p) { super.uninstallViewListeners(p); Action redoActionInView = p.getActionMap().get(ID); if (redoActionInView != null && redoActionInView != this) { redoActionInView.removePropertyChangeListener(redoActionPropertyListener); } } @Override public void actionPerformed(ActionEvent e) { Action realAction = getRealRedoAction(); if (realAction != null && realAction!=this) { realAction.actionPerformed(e); } } @Nullable private Action getRealRedoAction() { return (getActiveView() == null) ? null : getActiveView().getActionMap().get(ID); } }