4 * Copyright(c) 2008 olyutorskii
\r
5 * $Id: ActionManager.java 935 2009-12-02 12:10:29Z olyutorskii $
\r
8 package jp.sourceforge.jindolf;
\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
34 * メニュー、ボタン、その他各種Actionを伴うイベントを生成する
\r
37 public class ActionManager{
\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
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
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
108 public static final Icon ICON_WWW = GUIUtils.getWWWIcon();
\r
110 public static final Icon ICON_FIND;
\r
112 public static final Icon ICON_SEARCH_PREV;
\r
114 public static final Icon ICON_SEARCH_NEXT;
\r
116 public static final Icon ICON_RELOAD;
\r
118 public static final Icon ICON_FILTER;
\r
120 public static final Icon ICON_EDITOR;
\r
125 iconurl = Jindolf.getResource("resources/image/find.png");
\r
126 ICON_FIND = new ImageIcon(iconurl);
\r
128 iconurl = Jindolf.getResource("resources/image/findprev.png");
\r
129 ICON_SEARCH_PREV = new ImageIcon(iconurl);
\r
131 iconurl = Jindolf.getResource("resources/image/findnext.png");
\r
132 ICON_SEARCH_NEXT = new ImageIcon(iconurl);
\r
134 iconurl = Jindolf.getResource("resources/image/reload.png");
\r
135 ICON_RELOAD = new ImageIcon(iconurl);
\r
137 iconurl = Jindolf.getResource("resources/image/filter.png");
\r
138 ICON_FILTER = new ImageIcon(iconurl);
\r
140 iconurl = Jindolf.getResource("resources/image/editor.png");
\r
141 ICON_EDITOR = new ImageIcon(iconurl);
\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
151 private final JMenuBar menuBar;
\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
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
166 private final JToolBar browseToolBar;
\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
180 this.menuLook = buildLookAndFeelMenu("ルック&フィール", KeyEvent.VK_L);
\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
191 buildMenuItem(CMD_WEBVILL, "この村をブラウザで表示...", KeyEvent.VK_N);
\r
192 buildMenuItem(CMD_WEBWIKI,
\r
193 "まとめサイトの村ページを表示...", KeyEvent.VK_M);
\r
194 buildMenuItem(CMD_WEBCAST, "キャスト紹介表ジェネレータ...",
\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
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
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
226 registKeyAccelerator();
\r
228 this.menuBar = buildMenuBar();
\r
229 this.browseToolBar = buildBrowseToolBar();
\r
231 appearVillageImpl(false);
\r
232 appearPeriodImpl(false);
\r
239 * @param label メニューラベル
\r
240 * @param nemonic ニモニックキー
\r
243 private JMenu buildMenu(String label, int nemonic){
\r
244 JMenu result = new JMenu();
\r
246 String keyText = label + "(" + KeyEvent.getKeyText(nemonic) + ")";
\r
248 result.setText(keyText);
\r
249 result.setMnemonic(nemonic);
\r
256 * @param command アクションコマンド名
\r
257 * @param label メニューラベル
\r
258 * @param nemonic ニモニックキー
\r
261 private JMenuItem buildMenuItem(String command,
\r
264 JMenuItem result = new JMenuItem();
\r
266 String keyText = label + "(" + KeyEvent.getKeyText(nemonic) + ")";
\r
268 result.setActionCommand(command);
\r
269 result.setText(keyText);
\r
270 result.setMnemonic(nemonic);
\r
272 this.actionItems.add(result);
\r
273 this.namedMenuItems.put(command, result);
\r
280 * @param command アクションコマンド名
\r
281 * @param tooltip ツールチップ文字列
\r
282 * @param icon アイコン画像
\r
285 private JButton buildToolButton(String command,
\r
288 JButton result = new JButton();
\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
295 this.actionItems.add(result);
\r
296 this.namedToolButtons.put(command, result);
\r
303 * @param label メニューラベル
\r
304 * @param nemonic ニモニックキー
\r
305 * @return L&F 一覧メニュー
\r
307 private JMenu buildLookAndFeelMenu(String label, int nemonic){
\r
308 JMenu result = buildMenu(label, nemonic);
\r
310 LookAndFeel currentLookAndFeel = UIManager.getLookAndFeel();
\r
311 String currentName = currentLookAndFeel.getClass().getName();
\r
312 JMenuItem matchedButton = null;
\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
320 JRadioButtonMenuItem button = new JRadioButtonMenuItem(name);
\r
321 button.setActionCommand(CMD_LANDF);
\r
323 if(className.equals(currentName)) matchedButton = button;
\r
325 this.actionItems.add(button);
\r
326 this.landfGroup.add(button);
\r
327 this.landfMap.put(button.getModel(), className);
\r
329 result.add(button);
\r
332 if(matchedButton != null) matchedButton.setSelected(true);
\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
350 * アクションコマンド名からメニューアイテムを探す。
\r
351 * @param command アクションコマンド名
\r
354 private JMenuItem getMenuItem(String command){
\r
355 JMenuItem result = this.namedMenuItems.get(command);
\r
360 * アクションコマンド名からツールボタンを探す。
\r
361 * @param command アクションコマンド名
\r
364 private JButton getToolButton(String command){
\r
365 JButton result = this.namedToolButtons.get(command);
\r
370 * 現在メニューで選択中のL&Fのクラス名を返す。
\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
381 * 全てのボタンにアクションリスナーを登録する。
\r
382 * @param listener アクションリスナー
\r
384 public void addActionListener(ActionListener listener){
\r
385 for(AbstractButton button : this.actionItems){
\r
386 button.addActionListener(listener);
\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
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
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
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
419 this.menuPreference.add(getMenuItem(CMD_OPTION));
\r
420 this.menuPreference.addSeparator();
\r
421 this.menuPreference.add(this.menuLook);
\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
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
432 JMenuBar bar = new JMenuBar();
\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
449 public JMenuBar getMenuBar(){
\r
450 return this.menuBar;
\r
454 * ブラウザ用ツールバーの生成を行う。
\r
457 private JToolBar buildBrowseToolBar(){
\r
458 JToolBar toolBar = new JToolBar();
\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
476 public JToolBar getBrowseToolBar(){
\r
477 return this.browseToolBar;
\r
481 * Periodが表示されているか通知を受ける。
\r
482 * @param appear 表示されているときはtrue
\r
484 private void appearPeriodImpl(boolean appear){
\r
485 if(appear) appearVillageImpl(appear);
\r
487 this.menuEdit.setEnabled(appear);
\r
488 this.menuDay .setEnabled(appear);
\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
499 * Periodが表示されているか通知を受ける。
\r
500 * @param appear 表示されているときはtrue
\r
502 public void appearPeriod(boolean appear){
\r
503 appearPeriodImpl(appear);
\r
508 * 村が表示されているか通知を受ける。
\r
509 * @param appear 表示されているときはtrue
\r
511 private void appearVillageImpl(boolean appear){
\r
512 if( ! appear) appearPeriodImpl(appear);
\r
514 this.menuVillage.setEnabled(appear);
\r
520 * 村が表示されているか通知を受ける。
\r
521 * @param appear 表示されているときはtrue
\r
523 public void appearVillage(boolean appear){
\r
524 appearVillageImpl(appear);
\r