001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.actions; 003 004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.awt.event.ActionEvent; 008 import java.awt.event.KeyEvent; 009 010 import org.openstreetmap.josm.Main; 011 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 012 import org.openstreetmap.josm.tools.Shortcut; 013 014 /** 015 * Undoes the last command. 016 * 017 * @author imi 018 */ 019 public class UndoAction extends JosmAction implements OsmDataLayer.CommandQueueListener { 020 021 /** 022 * Construct the action with "Undo" as label. 023 */ 024 public UndoAction() { 025 super(tr("Undo"), "undo", tr("Undo the last action."), 026 Shortcut.registerShortcut("system:undo", tr("Edit: {0}", tr("Undo")), KeyEvent.VK_Z, Shortcut.CTRL), true); 027 setEnabled(false); 028 putValue("help", ht("/Action/Undo")); 029 } 030 031 public void actionPerformed(ActionEvent e) { 032 if (Main.map == null) 033 return; 034 Main.map.repaint(); 035 Main.main.undoRedo.undo(); 036 } 037 038 @Override 039 protected void updateEnabledState() { 040 setEnabled(Main.main != null && !Main.main.undoRedo.commands.isEmpty()); 041 } 042 043 @Override 044 public void commandChanged(int queueSize, int redoSize) { 045 if (Main.main.undoRedo.commands.isEmpty()) { 046 putValue(NAME, tr("Undo")); 047 setTooltip(tr("Undo the last action.")); 048 } else { 049 putValue(NAME, tr("Undo ...")); 050 setTooltip(tr("Undo {0}", 051 Main.main.undoRedo.commands.getLast().getDescriptionText())); 052 } 053 } 054 }