1
2
3
4
5
6
7 package net.curre.prefcount.gui.menu;
8
9 import javax.swing.AbstractButton;
10 import javax.swing.ButtonGroup;
11 import javax.swing.InputMap;
12 import javax.swing.JButton;
13 import javax.swing.JComponent;
14 import javax.swing.JMenuItem;
15 import javax.swing.JPanel;
16 import javax.swing.JRadioButton;
17 import javax.swing.JRadioButtonMenuItem;
18 import javax.swing.KeyStroke;
19 import javax.swing.AbstractAction;
20 import java.awt.CheckboxMenuItem;
21 import java.awt.MenuItem;
22 import java.awt.MenuShortcut;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.awt.event.FocusListener;
26 import java.awt.event.ItemEvent;
27 import java.awt.event.ItemListener;
28 import java.awt.event.KeyEvent;
29 import java.awt.event.KeyListener;
30 import java.util.HashMap;
31 import java.util.Map;
32
33 import net.curre.prefcount.event.MainController;
34 import net.curre.prefcount.gui.aa.AAJButton;
35 import net.curre.prefcount.gui.type.WindowComponent;
36 import static net.curre.prefcount.gui.type.WindowComponent.DIALOG_FORWARD2;
37 import net.curre.prefcount.util.LocaleExt;
38 import net.curre.prefcount.util.Utilities;
39
40
41
42
43
44
45
46
47
48
49 public class MenuItemsBean {
50
51
52 private ActionListener actionListener;
53
54
55 private Map<WindowComponent, JRadioButtonMenuItem> menuBarRadioItems;
56
57
58 private Map<WindowComponent, CheckboxMenuItem> menuBarCheckBoxItems;
59
60
61 private Map<WindowComponent, JMenuItem> menuBarMenuItems;
62
63
64 private Map<WindowComponent, MenuItem> menuAwtBarMenuItems;
65
66
67 private Map<String, ButtonGroup> menuBarGroups;
68
69
70 private Map<String, AwtCheckboxMenuGroup> menuBarAwtGroups;
71
72
73 private Map<WindowComponent, JRadioButton> radioButtons;
74
75
76 private Map<WindowComponent, JButton> jButtons;
77
78
79 private Map<String, ButtonGroup> radioButtonGroups;
80
81
82 public MenuItemsBean() {
83 this.menuBarRadioItems = new HashMap<WindowComponent, JRadioButtonMenuItem>();
84 this.menuBarMenuItems = new HashMap<WindowComponent, JMenuItem>();
85 this.menuAwtBarMenuItems = new HashMap<WindowComponent, MenuItem>();
86 this.menuBarCheckBoxItems = new HashMap<WindowComponent, CheckboxMenuItem>();
87 this.menuBarGroups = new HashMap<String, ButtonGroup>();
88 this.menuBarAwtGroups = new HashMap<String, AwtCheckboxMenuGroup>();
89 this.radioButtons = new HashMap<WindowComponent, JRadioButton>();
90 this.radioButtonGroups = new HashMap<String, ButtonGroup>();
91 this.jButtons = new HashMap<WindowComponent, JButton>();
92 }
93
94
95
96
97
98
99
100
101 public void setActionListener(ActionListener actionListener) {
102 this.actionListener = actionListener;
103 }
104
105
106
107
108
109
110
111
112
113 public JRadioButtonMenuItem getJRadioButtonMenuItem(WindowComponent itemEnum) {
114 JRadioButtonMenuItem item = this.menuBarRadioItems.get(itemEnum);
115 if (item == null) {
116 String text = LocaleExt.getString(itemEnum.getTextKey());
117 item = new JRadioButtonMenuItem(text);
118 LocaleExt.registerComponent(item, itemEnum);
119 item.addActionListener(new ItemActionListener(itemEnum));
120 this.menuBarRadioItems.put(itemEnum, item);
121
122
123
124
125
126
127
128
129 if (itemEnum.groupKey != null) {
130 ButtonGroup group = this.menuBarGroups.get(itemEnum.groupKey);
131 if (group == null) {
132 group = new ButtonGroup();
133 this.menuBarGroups.put(itemEnum.groupKey, group);
134 }
135 group.add(item);
136 }
137
138 if (itemEnum.getShortcutKey() != null) {
139 item.setAccelerator(KeyStroke.getKeyStroke(
140 LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0), ActionEvent.CTRL_MASK));
141 }
142 }
143 return item;
144 }
145
146
147
148
149
150
151
152
153
154 public CheckboxMenuItem getRadioButtonMenuItem(WindowComponent itemEnum) {
155
156 CheckboxMenuItem item = this.menuBarCheckBoxItems.get(itemEnum);
157 if (item == null) {
158 String text = LocaleExt.getString(itemEnum.getTextKey());
159 item = new CheckboxMenuItem(text);
160 LocaleExt.registerComponent(item, itemEnum);
161 item.addItemListener(new ItemActionListener(itemEnum));
162 this.menuBarCheckBoxItems.put(itemEnum, item);
163
164
165
166
167
168
169
170
171 if (itemEnum.groupKey != null) {
172 AwtCheckboxMenuGroup group = this.menuBarAwtGroups.get(itemEnum.groupKey);
173 if (group == null) {
174 group = new AwtCheckboxMenuGroup();
175 this.menuBarAwtGroups.put(itemEnum.groupKey, group);
176 }
177 group.addItemToGroup(item);
178 }
179
180 if (itemEnum.getShortcutKey() != null) {
181 item.setShortcut(new MenuShortcut(LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0), false));
182 }
183 }
184 return item;
185 }
186
187
188
189
190
191
192
193
194
195 public JRadioButton getJRadioButton(WindowComponent itemEnum) {
196 JRadioButton button = this.radioButtons.get(itemEnum);
197 if (button == null) {
198 button = new JRadioButton(Utilities.generateButtonText(itemEnum));
199 LocaleExt.registerComponent(button, itemEnum);
200 button.addActionListener(new ItemActionListener(itemEnum));
201 this.radioButtons.put(itemEnum, button);
202
203
204 if (itemEnum.tooltipKey != null) {
205 button.setToolTipText(LocaleExt.getString(itemEnum.tooltipKey));
206 }
207
208 if (itemEnum.groupKey != null) {
209 ButtonGroup group = this.radioButtonGroups.get(itemEnum.groupKey);
210 if (group == null) {
211 group = new ButtonGroup();
212 this.radioButtonGroups.put(itemEnum.groupKey, group);
213 }
214 group.add(button);
215 }
216 }
217
218 return button;
219 }
220
221
222
223
224
225
226
227
228
229
230 public JButton getJButton(WindowComponent itemEnum, JPanel pane) {
231 JButton button = this.jButtons.get(itemEnum);
232 if (button == null) {
233 button = new AAJButton(Utilities.generateButtonText(itemEnum));
234 ItemActionListener listener = new ItemActionListener(itemEnum);
235 button.addActionListener(listener);
236
237
238 if (Utilities.getPlatformType() != Utilities.PlatformType.WINDOWS) {
239 button.addKeyListener(listener);
240 }
241
242 final String shortcutKey = itemEnum.getShortcutKey();
243 if (shortcutKey != null) {
244 char mnemonicCode = LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0);
245 button.setMnemonic(mnemonicCode);
246
247
248 if (pane != null) {
249 InputMap map = pane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
250 String actionKey = LocaleExt.getString(shortcutKey);
251 map.put(KeyStroke.getKeyStroke("control " + actionKey), shortcutKey);
252 pane.getActionMap().put(shortcutKey, MainController.getActionForComponent(itemEnum));
253 LocaleExt.registerShortcuts(map, shortcutKey);
254 }
255 }
256
257 this.jButtons.put(itemEnum, button);
258 }
259
260 return button;
261 }
262
263
264
265
266
267
268
269
270
271 public JButton createJButtonForChoosePlayerDialog(JPanel pane) {
272 WindowComponent itemEnum = DIALOG_FORWARD2;
273 JButton button = new AAJButton(Utilities.generateButtonText(itemEnum));
274 ItemActionListener listener = new ItemActionListener(itemEnum);
275 button.addActionListener(listener);
276
277
278 if (Utilities.getPlatformType() != Utilities.PlatformType.WINDOWS) {
279 button.addKeyListener(listener);
280 }
281
282 final String shortcutKey = itemEnum.getShortcutKey();
283 if (shortcutKey != null) {
284 char mnemonicCode = LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0);
285 final String shortcut = (Utilities.isMacOs() ? "meta " : "control ") + mnemonicCode;
286 pane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
287 .put(KeyStroke.getKeyStroke(shortcut), "moveForward");
288 pane.getActionMap().put("moveForward", listener);
289 }
290
291 return button;
292 }
293
294
295
296
297
298
299
300
301
302 public JMenuItem getJMenuItem(WindowComponent itemEnum) {
303 JMenuItem menuItem = this.menuBarMenuItems.get(itemEnum);
304 if (menuItem == null) {
305 String text = LocaleExt.getString(itemEnum.getTextKey());
306 menuItem = new JMenuItem(text);
307 LocaleExt.registerComponent(menuItem, itemEnum);
308 if (itemEnum.getShortcutKey() != null) {
309 menuItem.setAccelerator(KeyStroke.getKeyStroke(
310 LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0), ActionEvent.CTRL_MASK));
311 }
312 menuItem.addActionListener(new ItemActionListener(itemEnum));
313 this.menuBarMenuItems.put(itemEnum, menuItem);
314 }
315 return menuItem;
316 }
317
318
319
320
321
322
323
324
325
326 public MenuItem getMenuItem(WindowComponent itemEnum) {
327 MenuItem menuItem = this.menuAwtBarMenuItems.get(itemEnum);
328 if (menuItem == null) {
329 menuItem = new MenuItem(LocaleExt.getString(itemEnum.getTextKey()));
330 if (itemEnum.getShortcutKey() != null) {
331 menuItem.setShortcut(new MenuShortcut(LocaleExt.getString(itemEnum.getShortcutKey()).charAt(0), false));
332 }
333 LocaleExt.registerComponent(menuItem, itemEnum);
334 menuItem.addActionListener(new ItemActionListener(itemEnum));
335 this.menuAwtBarMenuItems.put(itemEnum, menuItem);
336 }
337 return menuItem;
338 }
339
340
341
342
343
344
345
346 public void addListener(Object listener, WindowComponent... itemEnums) {
347 for (WindowComponent item : itemEnums) {
348 addListenerHelper(this.radioButtons.get(item), listener);
349 addListenerHelper(this.jButtons.get(item), listener);
350 addListenerHelper(this.menuBarRadioItems.get(item), listener);
351 addListenerHelper(this.menuBarMenuItems.get(item), listener);
352 }
353 }
354
355
356
357
358
359
360
361 public void setSelected(WindowComponent itemEnum, boolean isSelected) {
362 JRadioButtonMenuItem menuItem = MenuItemsBean.this.menuBarRadioItems.get(itemEnum);
363 if (menuItem != null) {
364 menuItem.setSelected(isSelected);
365 }
366 JRadioButton button = MenuItemsBean.this.radioButtons.get(itemEnum);
367 if (button != null) {
368 button.setSelected(isSelected);
369 }
370
371
372 CheckboxMenuItem checkItem = MenuItemsBean.this.menuBarCheckBoxItems.get(itemEnum);
373 if (checkItem != null) {
374 checkItem.dispatchEvent(new ActionEvent(itemEnum, ActionEvent.ACTION_PERFORMED, null));
375 }
376 }
377
378
379
380
381
382
383
384
385
386
387
388 private void addListenerHelper(AbstractButton component, Object listener) {
389 if (component != null && listener != null) {
390 if (listener instanceof ActionListener) {
391 component.addActionListener((ActionListener) listener);
392
393 } else if (listener instanceof FocusListener) {
394 component.addFocusListener((FocusListener) listener);
395
396 } else if (listener instanceof KeyListener) {
397 component.addKeyListener((KeyListener) listener);
398
399 } else {
400 throw new IllegalArgumentException("Illegal listener class: " + listener.getClass().getName());
401 }
402 }
403 }
404
405
406
407
408
409
410
411 private class ItemActionListener extends AbstractAction implements ActionListener, ItemListener, KeyListener {
412
413
414 private WindowComponent itemEnum;
415
416
417
418
419
420
421 private ItemActionListener(WindowComponent itemEnum) {
422 this.itemEnum = itemEnum;
423 }
424
425
426 public void actionPerformed(ActionEvent event) {
427 doAction(event);
428 }
429
430
431 public void itemStateChanged(ItemEvent event) {
432 ActionEvent aEvent = new ActionEvent(this.itemEnum, ActionEvent.ACTION_PERFORMED, this.itemEnum.getTextKey());
433 doAction(aEvent);
434 }
435
436
437 public void keyTyped(KeyEvent event) {
438 }
439
440
441 public void keyPressed(KeyEvent event) {
442 }
443
444
445 public void keyReleased(KeyEvent event) {
446 if (KeyEvent.VK_ENTER == event.getKeyCode()) {
447 ActionEvent aEvent = new ActionEvent(this.itemEnum, ActionEvent.ACTION_PERFORMED, this.itemEnum.getTextKey());
448 doAction(aEvent);
449 }
450 }
451
452
453
454
455
456
457 private void doAction(ActionEvent event) {
458 MenuItemsBean.this.setSelected(this.itemEnum, true);
459 if (MenuItemsBean.this.actionListener != null) {
460 event.setSource(this.itemEnum);
461 MenuItemsBean.this.actionListener.actionPerformed(event);
462 }
463 }
464
465 }
466
467 }