OSDN Git Service

dmg作成バージョンの取得方法の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / MenuBuilder.java
1 package charactermanaj.ui;\r
2 \r
3 import java.awt.Graphics;\r
4 import java.awt.Graphics2D;\r
5 import java.awt.RenderingHints;\r
6 import java.util.HashMap;\r
7 import java.util.Properties;\r
8 \r
9 import javax.swing.JCheckBoxMenuItem;\r
10 import javax.swing.JMenu;\r
11 import javax.swing.JMenuBar;\r
12 import javax.swing.JMenuItem;\r
13 import javax.swing.JSeparator;\r
14 \r
15 import charactermanaj.ui.scrollablemenu.JScrollableMenu;\r
16 import charactermanaj.util.LocalizedResourcePropertyLoader;\r
17 \r
18 /**\r
19  * メニューを構築します.\r
20  * \r
21  * @author seraphy\r
22  */\r
23 public class MenuBuilder {\r
24 \r
25         /**\r
26          * メニュー項目のリソース\r
27          */\r
28         protected static final String MENU_STRINGS_RESOURCE = "menu/menu";\r
29 \r
30         /**\r
31          * アンチエイリアスの設定が必要か?\r
32          */\r
33         private static final boolean needAntiAlias = isNeedAntialias();\r
34 \r
35         /**\r
36          * メニュー項目のアンチエイリアスが必要か判定する.<br>\r
37          * java.specification.versionが1.5で始まる場合は必要とみなす.<br>\r
38          * \r
39          * @return アンチエイリアスが必要であればtrue\r
40          */\r
41         private static boolean isNeedAntialias() {\r
42                 return System.getProperty("java.specification.version").startsWith("1.5");\r
43         }\r
44 \r
45         /**\r
46          * 生成したメニューのマップ\r
47          */\r
48         private final HashMap<String, JMenu> menuMap = new HashMap<String, JMenu>();\r
49 \r
50         /**\r
51          * 生成したメニュー項目のマップ\r
52          */\r
53         private final HashMap<String, JMenuItem> menuItemMap = new HashMap<String, JMenuItem>();\r
54 \r
55         /**\r
56          * 生成されたメニューを名前を指定して取得します.<br>\r
57          * 存在しない場合は実行時例外が発生します.<br>\r
58          * \r
59          * @param name\r
60          *            メニュー名\r
61          * @return メニュー\r
62          */\r
63         public JMenu getJMenu(String name) {\r
64                 JMenu menu = menuMap.get(name);\r
65                 if (menu == null) {\r
66                         throw new RuntimeException("登録されていないメニューです. " + name);\r
67                 }\r
68                 return menu;\r
69         }\r
70         \r
71         /**\r
72          * 生成されたメニュー項目を名前を指定して取得します.<br>\r
73          * 存在しない場合は実行時例外が発生します.<br>\r
74          * \r
75          * @param name\r
76          *            メニュー項目名\r
77          * @return メニュー項目\r
78          */\r
79         public JMenuItem getJMenuItem(String name) {\r
80                 JMenuItem menuItem = menuItemMap.get(name);\r
81                 if (menuItem == null) {\r
82                         throw new RuntimeException("登録されていないメニュー項目です. " + name);\r
83                 }\r
84                 return menuItem;\r
85         }\r
86         \r
87         /**\r
88          * メニュー設定に従いメニューバーを構築して返します.<br>\r
89          * 生成したメニューとメニュー項目は、{@link #getJMenu(String)}, {@link #getJMenuItem(String)}\r
90          * で取得できます.<br>\r
91          * \r
92          * @param menus\r
93          *            メニュー設定\r
94          * @return 構築されたメニューバー\r
95          */\r
96         public JMenuBar createMenuBar(MenuDataFactory[] menus) {\r
97                 \r
98                 // メニューリソース\r
99                 Properties menuProps = LocalizedResourcePropertyLoader.getCachedInstance()\r
100                         .getLocalizedProperties(MENU_STRINGS_RESOURCE);\r
101 \r
102                 // メニューバー\r
103                 final JMenuBar menuBar = createJMenuBar();\r
104 \r
105                 // 現在のメニュー設定をクリアする.\r
106                 menuMap.clear();\r
107                 menuItemMap.clear();\r
108                 \r
109                 // メニュー設定に従いメニューを構築する.\r
110                 for (MenuDataFactory menuDataFactory : menus) {\r
111                         MenuData menuData = menuDataFactory.createMenuData(menuProps);\r
112                         createMenu(new MenuAppender() {\r
113                                 public void addMenu(JMenu menu) {\r
114                                         menuBar.add(menu);\r
115                                 }\r
116                         }, menuData, menuProps);\r
117                 }\r
118                 \r
119                 return menuBar;\r
120         }\r
121         \r
122         private interface MenuAppender {\r
123                 \r
124                 void addMenu(JMenu menu);\r
125                 \r
126         }\r
127         \r
128         protected void createMenu(MenuAppender parentMenu, MenuData menuData, Properties menuProps) {\r
129                 final JMenu menu = createJMenu();\r
130                 if (menuData.makeMenu(menu)) {\r
131                         parentMenu.addMenu(menu);\r
132                         menuMap.put(menuData.getName(), menu);\r
133                         \r
134                         for (MenuData child : menuData) {\r
135                                 if (child == null) {\r
136                                         // セパレータ\r
137                                         menu.add(new JSeparator());\r
138 \r
139                                 } else if (child.getActionListener() == null) {\r
140                                         // アクションリスナなしの場合はサブメニューと見なす\r
141                                         createMenu(new MenuAppender() {\r
142                                                 public void addMenu(JMenu childMenu) {\r
143                                                         menu.add(childMenu);\r
144                                                 }\r
145                                         }, child, menuProps);\r
146                                 \r
147                                 } else {\r
148                                         // メニュー項目(チェックボックスつきメニュー項目を含む)\r
149                                         JMenuItem menuItem;\r
150                                         if (child.isCheckbox()) {\r
151                                                 menuItem = createJCheckBoxMenuItem();\r
152                                         } else {\r
153                                                 menuItem = createJMenuItem();\r
154                                         }\r
155                                         if (child.makeMenu(menuItem)) {\r
156                                                 menu.add(menuItem);\r
157                                                 menuItemMap.put(child.getName(), menuItem);\r
158                                         }\r
159                                 }\r
160                         }\r
161                 }\r
162         }\r
163         \r
164         /**\r
165          * JMenuBarを構築します.<br>\r
166          * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>\r
167          * \r
168          * @return JMenuBar\r
169          */\r
170         public JMenuBar createJMenuBar() {\r
171                 return new JMenuBar() {\r
172                         private static final long serialVersionUID = 1L;\r
173                         @Override\r
174                         public void paint(Graphics g) {\r
175                                 setAntiAlias(g);\r
176                                 super.paint(g);\r
177                         }\r
178                 };\r
179         }\r
180         \r
181         /**\r
182          * JMenuを構築します.<br>\r
183          * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>\r
184          * \r
185          * @return JMenu\r
186          */\r
187         public JMenu createJMenu() {\r
188                 if (JScrollableMenu.isScreenMenu()) {\r
189                         return new JMenu() {\r
190                                 private static final long serialVersionUID = 1L;\r
191                                 @Override\r
192                                 public void paint(Graphics g) {\r
193                                         setAntiAlias(g);\r
194                                         super.paint(g);\r
195                                 }\r
196                         };\r
197                 } else {\r
198                         return new JScrollableMenu() {\r
199                                 private static final long serialVersionUID = 1L;\r
200                                 @Override\r
201                                 public void paint(Graphics g) {\r
202                                         setAntiAlias(g);\r
203                                         super.paint(g);\r
204                                 }\r
205                         };\r
206                 }\r
207         }\r
208         \r
209         /**\r
210          * JCheckBoxMenuItemを構築します.<br>\r
211          * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>\r
212          * \r
213          * @return JCheckBoxMenuItem\r
214          */\r
215         public JCheckBoxMenuItem createJCheckBoxMenuItem() {\r
216                 return new JCheckBoxMenuItem() {\r
217                         private static final long serialVersionUID = 1L;\r
218                         @Override\r
219                         public void paint(Graphics g) {\r
220                                 setAntiAlias(g);\r
221                                 super.paint(g);\r
222                         }\r
223                 };\r
224         }\r
225         \r
226         /**\r
227          * JMenuItemを構築します.<br>\r
228          * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>\r
229          * \r
230          * @return JMenuItem\r
231          */\r
232         public JMenuItem createJMenuItem() {\r
233                 return new JMenuItem() {\r
234                         private static final long serialVersionUID = 1L;\r
235                         @Override\r
236                         public void paint(Graphics g) {\r
237                                 setAntiAlias(g);\r
238                                 super.paint(g);\r
239                         }\r
240                 };\r
241         }\r
242         \r
243         /**\r
244          * アンチエイリアスを有効にする.\r
245          * \r
246          * @param g\r
247          */\r
248         private static void setAntiAlias(Graphics g) {\r
249                 if (needAntiAlias) {\r
250                         ((Graphics2D) g).setRenderingHint(\r
251                                         RenderingHints.KEY_TEXT_ANTIALIASING,\r
252                                         RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\r
253                 }\r
254         }\r
255 }\r