OSDN Git Service

from subversion repository
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / ActionManager.java
1 /*\r
2  * action manager\r
3  *\r
4  * Copyright(c) 2008 olyutorskii\r
5  * $Id: ActionManager.java 935 2009-12-02 12:10:29Z olyutorskii $\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.awt.Insets;\r
11 import java.awt.event.ActionListener;\r
12 import java.awt.event.KeyEvent;\r
13 import java.net.URL;\r
14 import java.util.HashMap;\r
15 import java.util.HashSet;\r
16 import java.util.Map;\r
17 import java.util.Set;\r
18 import javax.swing.AbstractButton;\r
19 import javax.swing.ButtonGroup;\r
20 import javax.swing.ButtonModel;\r
21 import javax.swing.Icon;\r
22 import javax.swing.ImageIcon;\r
23 import javax.swing.JButton;\r
24 import javax.swing.JMenu;\r
25 import javax.swing.JMenuBar;\r
26 import javax.swing.JMenuItem;\r
27 import javax.swing.JRadioButtonMenuItem;\r
28 import javax.swing.JToolBar;\r
29 import javax.swing.KeyStroke;\r
30 import javax.swing.LookAndFeel;\r
31 import javax.swing.UIManager;\r
32 \r
33 /**\r
34  * メニュー、ボタン、その他各種Actionを伴うイベントを生成する\r
35  * コンポーネントの一括管理。\r
36  */\r
37 public class ActionManager{\r
38 \r
39     /** アクション{@value}。 */\r
40     public static final String CMD_ACCOUNT    = "ACCOUNT";\r
41     /** アクション{@value}。 */\r
42     public static final String CMD_EXIT       = "EXIT";\r
43     /** アクション{@value}。 */\r
44     public static final String CMD_COPY       = "COPY";\r
45     /** アクション{@value}。 */\r
46     public static final String CMD_SHOWFIND   = "SHOWFIND";\r
47     /** アクション{@value}。 */\r
48     public static final String CMD_SEARCHNEXT = "SEARCHNEXT";\r
49     /** アクション{@value}。 */\r
50     public static final String CMD_SEARCHPREV = "SEARCHPREV";\r
51     /** アクション{@value}。 */\r
52     public static final String CMD_ALLPERIOD  = "ALLPERIOD";\r
53     /** アクション{@value}。 */\r
54     public static final String CMD_SHOWDIGEST = "DIGEST";\r
55     /** アクション{@value}。 */\r
56     public static final String CMD_WEBVILL    = "WEBVILL";\r
57     /** アクション{@value}。 */\r
58     public static final String CMD_WEBCAST    = "WEBCAST";\r
59     /** アクション{@value}。 */\r
60     public static final String CMD_WEBWIKI    = "WEBWIKI";\r
61     /** アクション{@value}。 */\r
62     public static final String CMD_RELOAD     = "RELOAD";\r
63     /** アクション{@value}。 */\r
64     public static final String CMD_DAYSUMMARY = "DAYSUMMARY";\r
65     /** アクション{@value}。 */\r
66     public static final String CMD_DAYEXPCSV  = "DAYEXPCSV";\r
67     /** アクション{@value}。 */\r
68     public static final String CMD_WEBDAY     = "WEBDAY";\r
69     /** アクション{@value}。 */\r
70     public static final String CMD_OPTION     = "OPTION";\r
71     /** アクション{@value}。 */\r
72     public static final String CMD_LANDF      = "LANDF";\r
73     /** アクション{@value}。 */\r
74     public static final String CMD_SHOWFILT   = "SHOWFILT";\r
75     /** アクション{@value}。 */\r
76     public static final String CMD_SHOWEDIT   = "SHOWEDIT";\r
77     /** アクション{@value}。 */\r
78     public static final String CMD_SHOWLOG    = "SHOWLOG";\r
79     /** アクション{@value}。 */\r
80     public static final String CMD_HELPDOC    = "HELPDOC";\r
81     /** アクション{@value}。 */\r
82     public static final String CMD_SHOWPORTAL = "SHOWPORTAL";\r
83     /** アクション{@value}。 */\r
84     public static final String CMD_ABOUT      = "ABOUT";\r
85 \r
86     /** アクション{@value}。 */\r
87     public static final String CMD_COPYTALK    = "COPYTALK";\r
88     /** アクション{@value}。 */\r
89     public static final String CMD_JUMPANCHOR  = "JUMPANCHOR";\r
90     /** アクション{@value}。 */\r
91     public static final String CMD_WEBTALK     = "WEBTALK";\r
92     /** アクション{@value}。 */\r
93     public static final String CMD_SWITCHORDER = "SWITCHORDER";\r
94     /** アクション{@value}。 */\r
95     public static final String CMD_VILLAGELIST = "VILLAGELIST";\r
96     /** アクション{@value}。 */\r
97     public static final String CMD_FONTSIZESEL = "FONTSIZESEL";\r
98 \r
99     private static final KeyStroke KEY_F1 = KeyStroke.getKeyStroke("F1");\r
100     private static final KeyStroke KEY_F3 = KeyStroke.getKeyStroke("F3");\r
101     private static final KeyStroke KEY_SHIFT_F3 =\r
102             KeyStroke.getKeyStroke("shift F3");\r
103     private static final KeyStroke KEY_F5 = KeyStroke.getKeyStroke("F5");\r
104     private static final KeyStroke KEY_CTRL_F =\r
105             KeyStroke.getKeyStroke("ctrl F");\r
106 \r
107     /** WWWアイコン。 */\r
108     public static final Icon ICON_WWW = GUIUtils.getWWWIcon();\r
109     /** 検索アイコン。 */\r
110     public static final Icon ICON_FIND;\r
111     /** 前検索アイコン。 */\r
112     public static final Icon ICON_SEARCH_PREV;\r
113     /** 次検索アイコン。 */\r
114     public static final Icon ICON_SEARCH_NEXT;\r
115     /** リロードアイコン。 */\r
116     public static final Icon ICON_RELOAD;\r
117     /** フィルタアイコン。 */\r
118     public static final Icon ICON_FILTER;\r
119     /** 発言エディタアイコン。 */\r
120     public static final Icon ICON_EDITOR;\r
121 \r
122     static{\r
123         URL iconurl;\r
124 \r
125         iconurl = Jindolf.getResource("resources/image/find.png");\r
126         ICON_FIND = new ImageIcon(iconurl);\r
127 \r
128         iconurl = Jindolf.getResource("resources/image/findprev.png");\r
129         ICON_SEARCH_PREV = new ImageIcon(iconurl);\r
130 \r
131         iconurl = Jindolf.getResource("resources/image/findnext.png");\r
132         ICON_SEARCH_NEXT = new ImageIcon(iconurl);\r
133 \r
134         iconurl = Jindolf.getResource("resources/image/reload.png");\r
135         ICON_RELOAD = new ImageIcon(iconurl);\r
136 \r
137         iconurl = Jindolf.getResource("resources/image/filter.png");\r
138         ICON_FILTER = new ImageIcon(iconurl);\r
139 \r
140         iconurl = Jindolf.getResource("resources/image/editor.png");\r
141         ICON_EDITOR = new ImageIcon(iconurl);\r
142     }\r
143 \r
144     private final Set<AbstractButton> actionItems =\r
145             new HashSet<AbstractButton>();\r
146     private final Map<String, JMenuItem> namedMenuItems =\r
147             new HashMap<String, JMenuItem>();\r
148     private final Map<String, JButton> namedToolButtons =\r
149             new HashMap<String, JButton>();\r
150 \r
151     private final JMenuBar menuBar;\r
152 \r
153     private final JMenu menuFile;\r
154     private final JMenu menuEdit;\r
155     private final JMenu menuVillage;\r
156     private final JMenu menuDay;\r
157     private final JMenu menuPreference;\r
158     private final JMenu menuTool;\r
159     private final JMenu menuHelp;\r
160 \r
161     private final JMenu menuLook;\r
162     private final ButtonGroup landfGroup = new ButtonGroup();\r
163     private final Map<ButtonModel, String> landfMap =\r
164         new HashMap<ButtonModel, String>();\r
165 \r
166     private final JToolBar browseToolBar;\r
167 \r
168     /**\r
169      * コンストラクタ。\r
170      */\r
171     public ActionManager(){\r
172         this.menuFile       = buildMenu("ファイル", KeyEvent.VK_F);\r
173         this.menuEdit       = buildMenu("編集",     KeyEvent.VK_E);\r
174         this.menuVillage    = buildMenu("村",       KeyEvent.VK_V);\r
175         this.menuDay        = buildMenu("日",       KeyEvent.VK_D);\r
176         this.menuPreference = buildMenu("設定",     KeyEvent.VK_P);\r
177         this.menuTool       = buildMenu("ツール",   KeyEvent.VK_T);\r
178         this.menuHelp       = buildMenu("ヘルプ",   KeyEvent.VK_H);\r
179 \r
180         this.menuLook = buildLookAndFeelMenu("ルック&フィール", KeyEvent.VK_L);\r
181 \r
182         buildMenuItem(CMD_ACCOUNT, "アカウント管理", KeyEvent.VK_M);\r
183         buildMenuItem(CMD_EXIT, "終了", KeyEvent.VK_X);\r
184         buildMenuItem(CMD_COPY, "選択範囲をコピー", KeyEvent.VK_C);\r
185         buildMenuItem(CMD_SHOWFIND, "検索...", KeyEvent.VK_F);\r
186         buildMenuItem(CMD_SEARCHNEXT, "次候補", KeyEvent.VK_N);\r
187         buildMenuItem(CMD_SEARCHPREV, "前候補", KeyEvent.VK_P);\r
188         buildMenuItem(CMD_ALLPERIOD, "全日程の一括読み込み", KeyEvent.VK_R);\r
189         buildMenuItem(CMD_SHOWDIGEST, "村のダイジェストを表示...",\r
190                 KeyEvent.VK_D);\r
191         buildMenuItem(CMD_WEBVILL, "この村をブラウザで表示...", KeyEvent.VK_N);\r
192         buildMenuItem(CMD_WEBWIKI,\r
193                       "まとめサイトの村ページを表示...", KeyEvent.VK_M);\r
194         buildMenuItem(CMD_WEBCAST, "キャスト紹介表ジェネレータ...",\r
195                       KeyEvent.VK_H);\r
196         buildMenuItem(CMD_RELOAD, "この日を強制リロード", KeyEvent.VK_R);\r
197         buildMenuItem(CMD_DAYSUMMARY, "この日の発言を集計...", KeyEvent.VK_D);\r
198         buildMenuItem(CMD_DAYEXPCSV, "CSVへエクスポート...", KeyEvent.VK_C);\r
199         buildMenuItem(CMD_WEBDAY, "この日をブラウザで表示...", KeyEvent.VK_B);\r
200         buildMenuItem(CMD_OPTION, "オプション...", KeyEvent.VK_O);\r
201         buildMenuItem(CMD_SHOWFILT, "発言フィルタ", KeyEvent.VK_F);\r
202         buildMenuItem(CMD_SHOWEDIT, "発言エディタ", KeyEvent.VK_E);\r
203         buildMenuItem(CMD_SHOWLOG, "ログ表示", KeyEvent.VK_S);\r
204         buildMenuItem(CMD_HELPDOC, "ヘルプ表示", KeyEvent.VK_H);\r
205         buildMenuItem(CMD_SHOWPORTAL, "ポータルサイト...", KeyEvent.VK_P);\r
206         buildMenuItem(CMD_ABOUT, Jindolf.TITLE + "について...", KeyEvent.VK_A);\r
207 \r
208         buildToolButton(CMD_RELOAD, "選択中の日を強制リロード", ICON_RELOAD);\r
209         buildToolButton(CMD_SHOWFIND,   "検索",     ICON_FIND);\r
210         buildToolButton(CMD_SEARCHPREV, "↑前候補", ICON_SEARCH_PREV);\r
211         buildToolButton(CMD_SEARCHNEXT, "↓次候補", ICON_SEARCH_NEXT);\r
212         buildToolButton(CMD_SHOWFILT, "発言フィルタ", ICON_FILTER);\r
213         buildToolButton(CMD_SHOWEDIT, "発言エディタ", ICON_EDITOR);\r
214 \r
215         getMenuItem(CMD_SHOWPORTAL).setIcon(ICON_WWW);\r
216         getMenuItem(CMD_WEBVILL)   .setIcon(ICON_WWW);\r
217         getMenuItem(CMD_WEBWIKI)   .setIcon(ICON_WWW);\r
218         getMenuItem(CMD_WEBCAST)   .setIcon(ICON_WWW);\r
219         getMenuItem(CMD_WEBDAY)    .setIcon(ICON_WWW);\r
220         getMenuItem(CMD_SHOWFIND)  .setIcon(ICON_FIND);\r
221         getMenuItem(CMD_SEARCHPREV).setIcon(ICON_SEARCH_PREV);\r
222         getMenuItem(CMD_SEARCHNEXT).setIcon(ICON_SEARCH_NEXT);\r
223         getMenuItem(CMD_SHOWFILT)  .setIcon(ICON_FILTER);\r
224         getMenuItem(CMD_SHOWEDIT)  .setIcon(ICON_EDITOR);\r
225 \r
226         registKeyAccelerator();\r
227 \r
228         this.menuBar       = buildMenuBar();\r
229         this.browseToolBar = buildBrowseToolBar();\r
230 \r
231         appearVillageImpl(false);\r
232         appearPeriodImpl(false);\r
233 \r
234         return;\r
235     }\r
236 \r
237     /**\r
238      * メニューを生成する。\r
239      * @param label メニューラベル\r
240      * @param nemonic ニモニックキー\r
241      * @return メニュー\r
242      */\r
243     private JMenu buildMenu(String label, int nemonic){\r
244         JMenu result = new JMenu();\r
245 \r
246         String keyText = label + "(" + KeyEvent.getKeyText(nemonic) + ")";\r
247 \r
248         result.setText(keyText);\r
249         result.setMnemonic(nemonic);\r
250 \r
251         return result;\r
252     }\r
253 \r
254     /**\r
255      * メニューアイテムを生成する。\r
256      * @param command アクションコマンド名\r
257      * @param label メニューラベル\r
258      * @param nemonic ニモニックキー\r
259      * @return メニューアイテム\r
260      */\r
261     private JMenuItem buildMenuItem(String command,\r
262                                       String label,\r
263                                       int nemonic ){\r
264         JMenuItem result = new JMenuItem();\r
265 \r
266         String keyText = label + "(" + KeyEvent.getKeyText(nemonic) + ")";\r
267 \r
268         result.setActionCommand(command);\r
269         result.setText(keyText);\r
270         result.setMnemonic(nemonic);\r
271 \r
272         this.actionItems.add(result);\r
273         this.namedMenuItems.put(command, result);\r
274 \r
275         return result;\r
276     }\r
277 \r
278     /**\r
279      * ツールボタンを生成する。\r
280      * @param command アクションコマンド名\r
281      * @param tooltip ツールチップ文字列\r
282      * @param icon アイコン画像\r
283      * @return ツールボタン\r
284      */\r
285     private JButton buildToolButton(String command,\r
286                                       String tooltip,\r
287                                       Icon icon){\r
288         JButton result = new JButton();\r
289 \r
290         result.setIcon(icon);\r
291         result.setToolTipText(tooltip);\r
292         result.setMargin(new Insets(1, 1, 1, 1));\r
293         result.setActionCommand(command);\r
294 \r
295         this.actionItems.add(result);\r
296         this.namedToolButtons.put(command, result);\r
297 \r
298         return result;\r
299     }\r
300 \r
301     /**\r
302      * L&F 一覧メニューを作成する。\r
303      * @param label メニューラベル\r
304      * @param nemonic ニモニックキー\r
305      * @return L&F 一覧メニュー\r
306      */\r
307     private JMenu buildLookAndFeelMenu(String label, int nemonic){\r
308         JMenu result = buildMenu(label, nemonic);\r
309 \r
310         LookAndFeel currentLookAndFeel = UIManager.getLookAndFeel();\r
311         String currentName = currentLookAndFeel.getClass().getName();\r
312         JMenuItem matchedButton = null;\r
313 \r
314         UIManager.LookAndFeelInfo[] landfs =\r
315                 UIManager.getInstalledLookAndFeels();\r
316         for(UIManager.LookAndFeelInfo lafInfo : landfs){\r
317             String name      = lafInfo.getName();\r
318             String className = lafInfo.getClassName();\r
319 \r
320             JRadioButtonMenuItem button = new JRadioButtonMenuItem(name);\r
321             button.setActionCommand(CMD_LANDF);\r
322 \r
323             if(className.equals(currentName)) matchedButton = button;\r
324 \r
325             this.actionItems.add(button);\r
326             this.landfGroup.add(button);\r
327             this.landfMap.put(button.getModel(), className);\r
328 \r
329             result.add(button);\r
330         }\r
331 \r
332         if(matchedButton != null) matchedButton.setSelected(true);\r
333 \r
334         return result;\r
335     }\r
336 \r
337     /**\r
338      * アクセラレータの設定。\r
339      */\r
340     private void registKeyAccelerator(){\r
341         getMenuItem(CMD_HELPDOC)    .setAccelerator(KEY_F1);\r
342         getMenuItem(CMD_SHOWFIND)   .setAccelerator(KEY_CTRL_F);\r
343         getMenuItem(CMD_SEARCHNEXT) .setAccelerator(KEY_F3);\r
344         getMenuItem(CMD_SEARCHPREV) .setAccelerator(KEY_SHIFT_F3);\r
345         getMenuItem(CMD_RELOAD)     .setAccelerator(KEY_F5);\r
346         return;\r
347     }\r
348 \r
349     /**\r
350      * アクションコマンド名からメニューアイテムを探す。\r
351      * @param command アクションコマンド名\r
352      * @return メニューアイテム\r
353      */\r
354     private JMenuItem getMenuItem(String command){\r
355         JMenuItem result = this.namedMenuItems.get(command);\r
356         return result;\r
357     }\r
358 \r
359     /**\r
360      * アクションコマンド名からツールボタンを探す。\r
361      * @param command アクションコマンド名\r
362      * @return ツールボタン\r
363      */\r
364     private JButton getToolButton(String command){\r
365         JButton result = this.namedToolButtons.get(command);\r
366         return result;\r
367     }\r
368 \r
369     /**\r
370      * 現在メニューで選択中のL&Fのクラス名を返す。\r
371      * @return L&F クラス名\r
372      */\r
373     public String getSelectedLookAndFeel(){\r
374         ButtonModel selected = this.landfGroup.getSelection();\r
375         if(selected == null) return null;\r
376         String className = this.landfMap.get(selected);\r
377         return className;\r
378     }\r
379 \r
380     /**\r
381      * 全てのボタンにアクションリスナーを登録する。\r
382      * @param listener アクションリスナー\r
383      */\r
384     public void addActionListener(ActionListener listener){\r
385         for(AbstractButton button : this.actionItems){\r
386             button.addActionListener(listener);\r
387         }\r
388         return;\r
389     }\r
390 \r
391     /**\r
392      * メニューバーを生成する。\r
393      * @return メニューバー\r
394      */\r
395     private JMenuBar buildMenuBar(){\r
396         this.menuFile.add(getMenuItem(CMD_ACCOUNT));\r
397         this.menuFile.addSeparator();\r
398         this.menuFile.add(getMenuItem(CMD_EXIT));\r
399 \r
400         this.menuEdit.add(getMenuItem(CMD_COPY));\r
401         this.menuEdit.addSeparator();\r
402         this.menuEdit.add(getMenuItem(CMD_SHOWFIND));\r
403         this.menuEdit.add(getMenuItem(CMD_SEARCHPREV));\r
404         this.menuEdit.add(getMenuItem(CMD_SEARCHNEXT));\r
405 \r
406         this.menuVillage.add(getMenuItem(CMD_ALLPERIOD));\r
407         this.menuVillage.add(getMenuItem(CMD_SHOWDIGEST));\r
408         this.menuVillage.addSeparator();\r
409         this.menuVillage.add(getMenuItem(CMD_WEBVILL));\r
410         this.menuVillage.add(getMenuItem(CMD_WEBWIKI));\r
411         this.menuVillage.add(getMenuItem(CMD_WEBCAST));\r
412 \r
413         this.menuDay.add(getMenuItem(CMD_RELOAD));\r
414         this.menuDay.add(getMenuItem(CMD_DAYSUMMARY));\r
415         this.menuDay.add(getMenuItem(CMD_DAYEXPCSV));\r
416         this.menuDay.addSeparator();\r
417         this.menuDay.add(getMenuItem(CMD_WEBDAY));\r
418 \r
419         this.menuPreference.add(getMenuItem(CMD_OPTION));\r
420         this.menuPreference.addSeparator();\r
421         this.menuPreference.add(this.menuLook);\r
422 \r
423         this.menuTool.add(getMenuItem(CMD_SHOWFILT));\r
424         this.menuTool.add(getMenuItem(CMD_SHOWEDIT));\r
425         this.menuTool.add(getMenuItem(CMD_SHOWLOG));\r
426 \r
427         this.menuHelp.add(getMenuItem(CMD_HELPDOC));\r
428         this.menuHelp.addSeparator();\r
429         this.menuHelp.add(getMenuItem(CMD_SHOWPORTAL));\r
430         this.menuHelp.add(getMenuItem(CMD_ABOUT));\r
431 \r
432         JMenuBar bar = new JMenuBar();\r
433 \r
434         bar.add(this.menuFile);\r
435         bar.add(this.menuEdit);\r
436         bar.add(this.menuVillage);\r
437         bar.add(this.menuDay);\r
438         bar.add(this.menuPreference);\r
439         bar.add(this.menuTool);\r
440         bar.add(this.menuHelp);\r
441 \r
442         return bar;\r
443     }\r
444 \r
445     /**\r
446      * メニューバーを取得する。\r
447      * @return メニューバー\r
448      */\r
449     public JMenuBar getMenuBar(){\r
450         return this.menuBar;\r
451     }\r
452 \r
453     /**\r
454      * ブラウザ用ツールバーの生成を行う。\r
455      * @return ツールバー\r
456      */\r
457     private JToolBar buildBrowseToolBar(){\r
458         JToolBar toolBar = new JToolBar();\r
459 \r
460         toolBar.add(getToolButton(CMD_RELOAD));\r
461         toolBar.addSeparator();\r
462         toolBar.add(getToolButton(CMD_SHOWFIND));\r
463         toolBar.add(getToolButton(CMD_SEARCHNEXT));\r
464         toolBar.add(getToolButton(CMD_SEARCHPREV));\r
465         toolBar.addSeparator();\r
466         toolBar.add(getToolButton(CMD_SHOWFILT));\r
467         toolBar.add(getToolButton(CMD_SHOWEDIT));\r
468 \r
469         return toolBar;\r
470     }\r
471 \r
472     /**\r
473      * ブラウザ用ツールバーを取得する。\r
474      * @return ツールバー\r
475      */\r
476     public JToolBar getBrowseToolBar(){\r
477         return this.browseToolBar;\r
478     }\r
479 \r
480     /**\r
481      * Periodが表示されているか通知を受ける。\r
482      * @param appear 表示されているときはtrue\r
483      */\r
484     private void appearPeriodImpl(boolean appear){\r
485         if(appear) appearVillageImpl(appear);\r
486 \r
487         this.menuEdit.setEnabled(appear);\r
488         this.menuDay .setEnabled(appear);\r
489 \r
490         getToolButton(CMD_RELOAD)     .setEnabled(appear);\r
491         getToolButton(CMD_SHOWFIND)   .setEnabled(appear);\r
492         getToolButton(CMD_SEARCHNEXT) .setEnabled(appear);\r
493         getToolButton(CMD_SEARCHPREV) .setEnabled(appear);\r
494 \r
495         return;\r
496     }\r
497 \r
498     /**\r
499      * Periodが表示されているか通知を受ける。\r
500      * @param appear 表示されているときはtrue\r
501      */\r
502     public void appearPeriod(boolean appear){\r
503         appearPeriodImpl(appear);\r
504         return;\r
505     }\r
506 \r
507     /**\r
508      * 村が表示されているか通知を受ける。\r
509      * @param appear 表示されているときはtrue\r
510      */\r
511     private void appearVillageImpl(boolean appear){\r
512         if( ! appear) appearPeriodImpl(appear);\r
513 \r
514         this.menuVillage.setEnabled(appear);\r
515 \r
516         return;\r
517     }\r
518 \r
519     /**\r
520      * 村が表示されているか通知を受ける。\r
521      * @param appear 表示されているときはtrue\r
522      */\r
523     public void appearVillage(boolean appear){\r
524         appearVillageImpl(appear);\r
525         return;\r
526     }\r
527 \r
528 }\r