create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / main / UndoRedoAction.java
1 package net.sf.openrocket.gui.main;\r
2 \r
3 import java.awt.event.ActionEvent;\r
4 \r
5 import javax.swing.AbstractAction;\r
6 \r
7 import net.sf.openrocket.document.OpenRocketDocument;\r
8 import net.sf.openrocket.document.UndoRedoListener;\r
9 import net.sf.openrocket.gui.util.Icons;\r
10 import net.sf.openrocket.l10n.Translator;\r
11 import net.sf.openrocket.logging.LogHelper;\r
12 import net.sf.openrocket.startup.Application;\r
13 import net.sf.openrocket.util.BugException;\r
14 \r
15 /**\r
16  * Inner class to implement undo/redo actions.\r
17  */\r
18 public class UndoRedoAction extends AbstractAction implements UndoRedoListener {\r
19         \r
20         // Use Factory mechanism because we want to register the new instance as an\r
21         // UndoRedoListener.\r
22         public static UndoRedoAction newUndoAction( OpenRocketDocument document ) {\r
23                 UndoRedoAction undo = new UndoRedoAction( UNDO, document );\r
24                 document.addUndoRedoListener(undo);\r
25                 return undo;\r
26         }\r
27 \r
28         public static UndoRedoAction newRedoAction( OpenRocketDocument document ) {\r
29                 UndoRedoAction redo = new UndoRedoAction( REDO, document );\r
30                 document.addUndoRedoListener(redo);\r
31                 return redo;\r
32         }\r
33 \r
34         private static final LogHelper log = Application.getLogger();\r
35         private static final Translator trans = Application.getTranslator();\r
36 \r
37         private static final int UNDO = 1;\r
38         private static final int REDO = 2;\r
39         \r
40         private final int type;\r
41         \r
42         private final OpenRocketDocument document;\r
43         \r
44         // Sole constructor\r
45         private UndoRedoAction(int type, OpenRocketDocument document) {\r
46                 this.document = document;\r
47                 if (type != UNDO && type != REDO) {\r
48                         throw new IllegalArgumentException("Unknown type = " + type);\r
49                 }\r
50                 this.type = type;\r
51                 setAllValues();\r
52         }\r
53         \r
54         \r
55         // Actual action to make\r
56         @Override\r
57         public void actionPerformed(ActionEvent e) {\r
58                 switch (type) {\r
59                 case UNDO:\r
60                         log.user("Performing undo, event=" + e);\r
61                         document.undo();\r
62                         break;\r
63                 \r
64                 case REDO:\r
65                         log.user("Performing redo, event=" + e);\r
66                         document.redo();\r
67                         break;\r
68                 }\r
69         }\r
70         \r
71         \r
72         // Set all the values correctly (name and enabled/disabled status)\r
73         public void setAllValues() {\r
74                 String name, desc;\r
75                 boolean actionEnabled;\r
76                 \r
77                 switch (type) {\r
78                 case UNDO:\r
79                         //// Undo\r
80                         name = trans.get("OpenRocketDocument.Undo");\r
81                         desc = document.getUndoDescription();\r
82                         actionEnabled = document.isUndoAvailable();\r
83                         this.putValue(SMALL_ICON, Icons.EDIT_UNDO);\r
84                         break;\r
85                 \r
86                 case REDO:\r
87                         ////Redo\r
88                         name = trans.get("OpenRocketDocument.Redo");\r
89                         desc = document.getRedoDescription();\r
90                         actionEnabled = document.isRedoAvailable();\r
91                         this.putValue(SMALL_ICON, Icons.EDIT_REDO);\r
92                         break;\r
93                 \r
94                 default:\r
95                         throw new BugException("illegal type=" + type);\r
96                 }\r
97                 \r
98                 if (desc != null)\r
99                         name = name + " (" + desc + ")";\r
100                 \r
101                 putValue(NAME, name);\r
102                 setEnabled(actionEnabled);\r
103         }\r
104 }\r