OSDN Git Service

fixed bug: can't restore config "autoAdjustMode" and "postProcessMode"
[stew/Stew4.git] / src / net / argius / stew / ui / window / Menu.java
1 package net.argius.stew.ui.window;
2
3 import static net.argius.stew.ui.window.Menu.Item.*;
4 import static net.argius.stew.ui.window.Utilities.getImageIcon;
5 import static net.argius.stew.ui.window.Utilities.getMenuShortcutKeyMask;
6
7 import java.awt.*;
8 import java.awt.event.*;
9 import java.beans.*;
10 import java.util.*;
11 import java.util.List;
12
13 import javax.swing.*;
14
15 import net.argius.stew.*;
16
17 /**
18  * The menu bar.
19  */
20 final class Menu extends JMenuBar implements PropertyChangeListener {
21
22     private static final ResourceManager res = ResourceManager.getInstance(Menu.class);
23
24     /**
25      * Menu Items.
26      */
27     enum Item {
28         newWindow,
29         closeWindow,
30         quit,
31         cut,
32         copy,
33         paste,
34         selectAll,
35         find,
36         toggleFocus,
37         clearMessage,
38         showStatusBar,
39         showColumnNumber,
40         showInfoTree,
41         showAlwaysOnTop,
42         refresh,
43         widenColumnWidth,
44         narrowColumnWidth,
45         adjustColumnWidth,
46         autoAdjustMode,
47         autoAdjustModeNone,
48         autoAdjustModeHeader,
49         autoAdjustModeValue,
50         autoAdjustModeHeaderAndValue,
51         executeCommand,
52         breakCommand,
53         lastHistory,
54         nextHistory,
55         sendRollback,
56         sendCommit,
57         connect,
58         disconnect,
59         postProcessMode,
60         postProcessModeNone,
61         postProcessModeFocus,
62         postProcessModeShake,
63         postProcessModeBlink,
64         inputEcryptionKey,
65         editConnectors,
66         sortResult,
67         importFile,
68         exportFile,
69         showHelp,
70         showAbout;
71     }
72
73     private List<JMenuItem> lockingTargets;
74     private List<JMenuItem> unlockingTargets;
75     private EnumMap<Item, JMenuItem> itemToCompMap;
76     private Map<JMenuItem, Item> compToItemMap;
77
78     Menu(final AnyActionListener anyActionListener) {
79         this.lockingTargets = new ArrayList<JMenuItem>();
80         this.unlockingTargets = new ArrayList<JMenuItem>();
81         this.itemToCompMap = new EnumMap<Item, JMenuItem>(Item.class);
82         this.compToItemMap = new HashMap<JMenuItem, Item>();
83         final boolean autoMnemonic = res.getInt("auto-mnemonic") == 1;
84         AnyAction aa = new AnyAction(anyActionListener);
85         for (final String groupId : res.get("groups").split(",", -1)) {
86             final String groupKey = "group." + groupId;
87             JMenu group = add(buildGroup(groupId, autoMnemonic));
88             for (final String itemId : res.get(groupKey + ".items").split(",", -1)) {
89                 if (itemId.length() == 0) {
90                     group.add(new JSeparator());
91                     continue;
92                 }
93                 JMenuItem m = group.add(buildItem(itemId, autoMnemonic));
94                 Item item;
95                 try {
96                     item = Item.valueOf(itemId);
97                 } catch (Exception ex) {
98                     assert false : ex.toString();
99                     continue;
100                 }
101                 m.addActionListener(aa);
102                 itemToCompMap.put(item, m);
103                 compToItemMap.put(m, item);
104                 final String shortcutId = "item." + itemId + ".shortcut";
105                 if (res.containsKey(shortcutId)) {
106                     KeyStroke shortcutKey = KeyStroke.getKeyStroke(res.get(shortcutId));
107                     if (shortcutKey != null) {
108                         setAccelerator(item, shortcutKey);
109                     }
110                 }
111                 switch (item) {
112                     case closeWindow:
113                     case quit:
114                     case cut:
115                     case copy:
116                     case paste:
117                     case selectAll:
118                     case find:
119                     case clearMessage:
120                     case refresh:
121                     case widenColumnWidth:
122                     case narrowColumnWidth:
123                     case adjustColumnWidth:
124                     case autoAdjustMode:
125                     case executeCommand:
126                     case lastHistory:
127                     case nextHistory:
128                     case connect:
129                     case disconnect:
130                     case postProcessMode:
131                     case sortResult:
132                     case exportFile:
133                         lockingTargets.add(m);
134                         break;
135                     case breakCommand:
136                         unlockingTargets.add(m);
137                         break;
138                     default:
139                 }
140             }
141         }
142         for (final Item item : EnumSet.of(autoAdjustModeNone,
143                                           autoAdjustModeHeader,
144                                           autoAdjustModeValue,
145                                           autoAdjustModeHeaderAndValue,
146                                           postProcessMode,
147                                           postProcessModeNone,
148                                           postProcessModeFocus,
149                                           postProcessModeShake,
150                                           postProcessModeBlink)) {
151             itemToCompMap.get(item).addActionListener(aa);
152         }
153         setEnabledStates(false);
154     }
155
156     private static JMenu buildGroup(String groupId, boolean autoMnemonic) {
157         final String key = (res.containsKey("group." + groupId) ? "group" : "item") + '.' + groupId;
158         final char mn = res.getChar(key + ".mnemonic");
159         final String groupString = res.get(key) + (autoMnemonic ? "(" + mn + ")" : "");
160         JMenu group = new JMenu(groupString);
161         group.setMnemonic(mn);
162         return group;
163     }
164
165     private JMenuItem buildItem(String itemId, boolean autoMnemonic) {
166         final String itemKey = "item." + itemId;
167         final char mn = res.getChar(itemKey + ".mnemonic");
168         final JMenuItem m;
169         if (res.isTrue(itemKey + ".checkbox")) {
170             m = new JCheckBoxMenuItem();
171         } else if (res.isTrue(itemKey + ".subgroup")) {
172             m = buildGroup(itemId, autoMnemonic);
173             ButtonGroup buttonGroup = new ButtonGroup();
174             boolean selected = false;
175             for (final String id : res.get(itemKey + ".items").split(",", -1)) {
176                 final JMenuItem sub = buildItem(itemId + id, autoMnemonic);
177                 m.add(sub);
178                 buttonGroup.add(sub);
179                 if (!selected) {
180                     sub.setSelected(true);
181                     selected = true;
182                 }
183                 Item subItem = Item.valueOf(itemId + id);
184                 itemToCompMap.put(subItem, sub);
185                 compToItemMap.put(sub, subItem);
186             }
187         } else {
188             m = new JMenuItem();
189         }
190         m.setText(res.get(itemKey) + (autoMnemonic ? "(" + mn + ")" : ""));
191         m.setMnemonic(mn);
192         m.setActionCommand(itemId);
193         m.setIcon(getImageIcon(String.format("menu-%s.png", itemId)));
194         m.setDisabledIcon(getImageIcon(String.format("menu-disabled-%s.png", itemId)));
195         return m;
196     }
197
198     @Override
199     public void propertyChange(PropertyChangeEvent e) {
200         final String propertyName = e.getPropertyName();
201         final Object source = e.getSource();
202         if (source instanceof JLabel && propertyName.equals("ancestor")) {
203             itemToCompMap.get(showStatusBar).setSelected(((JLabel)source).isVisible());
204         } else if (source instanceof ResultSetTable && propertyName.equals("showNumber")) {
205             itemToCompMap.get(showColumnNumber).setSelected((Boolean)e.getNewValue());
206         } else if (source instanceof DatabaseInfoTree) {
207             itemToCompMap.get(showInfoTree).setSelected(((Component)source).isEnabled());
208         } else if (source instanceof JFrame && propertyName.equals("alwaysOnTop")) {
209             itemToCompMap.get(showAlwaysOnTop).setSelected((Boolean)e.getNewValue());
210         } else if (source instanceof ResultSetTable && propertyName.equals("autoAdjustMode")) {
211             final String itemName = e.getNewValue().toString();
212             if (!itemName.matches("[A-Z_]+")) { // ignore old version
213                 itemToCompMap.get(Item.valueOf(itemName)).setSelected(true);
214             }
215         } else if (source instanceof WindowOutputProcessor && propertyName.equals("postProcessMode")) {
216             final String itemName = e.getNewValue().toString();
217             if (!itemName.matches("[A-Z_]+")) { // ignore old version
218                 itemToCompMap.get(Item.valueOf(itemName)).setSelected(true);
219             }
220         }
221     }
222
223     /**
224      * Sets a Accelerator (shortcut key).
225      * @param item
226      * @param ks
227      */
228     void setAccelerator(Item item, KeyStroke ks) {
229         int m = 0;
230         final String s = ks.toString();
231         if (s.contains("ctrl")) {
232             m |= getMenuShortcutKeyMask();
233         }
234         if (s.contains("alt")) {
235             m |= InputEvent.ALT_DOWN_MASK;
236         }
237         if (s.contains("shift")) {
238             m |= InputEvent.SHIFT_DOWN_MASK;
239         }
240         itemToCompMap.get(item).setAccelerator(KeyStroke.getKeyStroke(ks.getKeyCode(), m));
241     }
242
243     /**
244      * Sets the state that command was started or not.
245      * @param commandStarted
246      */
247     void setEnabledStates(boolean commandStarted) {
248         final boolean lockingTargetsState = !commandStarted;
249         for (JMenuItem item : lockingTargets) {
250             item.setEnabled(lockingTargetsState);
251         }
252         final boolean unlockingTargetsState = commandStarted;
253         for (JMenuItem item : unlockingTargets) {
254             item.setEnabled(unlockingTargetsState);
255         }
256     }
257
258 }