1 package charactermanaj.ui;
\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
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
15 import charactermanaj.ui.scrollablemenu.JScrollableMenu;
\r
16 import charactermanaj.util.LocalizedResourcePropertyLoader;
\r
23 public class MenuBuilder {
\r
28 protected static final String MENU_STRINGS_RESOURCE = "menu/menu";
\r
33 private static final boolean needAntiAlias = isNeedAntialias();
\r
36 * メニュー項目のアンチエイリアスが必要か判定する.<br>
\r
37 * java.specification.versionが1.5で始まる場合は必要とみなす.<br>
\r
39 * @return アンチエイリアスが必要であればtrue
\r
41 private static boolean isNeedAntialias() {
\r
42 return System.getProperty("java.specification.version").startsWith("1.5");
\r
48 private final HashMap<String, JMenu> menuMap = new HashMap<String, JMenu>();
\r
53 private final HashMap<String, JMenuItem> menuItemMap = new HashMap<String, JMenuItem>();
\r
56 * 生成されたメニューを名前を指定して取得します.<br>
\r
57 * 存在しない場合は実行時例外が発生します.<br>
\r
63 public JMenu getJMenu(String name) {
\r
64 JMenu menu = menuMap.get(name);
\r
66 throw new RuntimeException("登録されていないメニューです. " + name);
\r
72 * 生成されたメニュー項目を名前を指定して取得します.<br>
\r
73 * 存在しない場合は実行時例外が発生します.<br>
\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
88 * メニュー設定に従いメニューバーを構築して返します.<br>
\r
89 * 生成したメニューとメニュー項目は、{@link #getJMenu(String)}, {@link #getJMenuItem(String)}
\r
94 * @return 構築されたメニューバー
\r
96 public JMenuBar createMenuBar(MenuDataFactory[] menus) {
\r
99 Properties menuProps = LocalizedResourcePropertyLoader.getCachedInstance()
\r
100 .getLocalizedProperties(MENU_STRINGS_RESOURCE);
\r
103 final JMenuBar menuBar = createJMenuBar();
\r
105 // 現在のメニュー設定をクリアする.
\r
107 menuItemMap.clear();
\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
116 }, menuData, menuProps);
\r
122 private interface MenuAppender {
\r
124 void addMenu(JMenu menu);
\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
134 for (MenuData child : menuData) {
\r
135 if (child == null) {
\r
137 menu.add(new JSeparator());
\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
145 }, child, menuProps);
\r
148 // メニュー項目(チェックボックスつきメニュー項目を含む)
\r
149 JMenuItem menuItem;
\r
150 if (child.isCheckbox()) {
\r
151 menuItem = createJCheckBoxMenuItem();
\r
153 menuItem = createJMenuItem();
\r
155 if (child.makeMenu(menuItem)) {
\r
156 menu.add(menuItem);
\r
157 menuItemMap.put(child.getName(), menuItem);
\r
165 * JMenuBarを構築します.<br>
\r
166 * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>
\r
170 public JMenuBar createJMenuBar() {
\r
171 return new JMenuBar() {
\r
172 private static final long serialVersionUID = 1L;
\r
174 public void paint(Graphics g) {
\r
183 * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>
\r
187 public JMenu createJMenu() {
\r
188 if (JScrollableMenu.isScreenMenu()) {
\r
189 return new JMenu() {
\r
190 private static final long serialVersionUID = 1L;
\r
192 public void paint(Graphics g) {
\r
198 return new JScrollableMenu() {
\r
199 private static final long serialVersionUID = 1L;
\r
201 public void paint(Graphics g) {
\r
210 * JCheckBoxMenuItemを構築します.<br>
\r
211 * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>
\r
213 * @return JCheckBoxMenuItem
\r
215 public JCheckBoxMenuItem createJCheckBoxMenuItem() {
\r
216 return new JCheckBoxMenuItem() {
\r
217 private static final long serialVersionUID = 1L;
\r
219 public void paint(Graphics g) {
\r
227 * JMenuItemを構築します.<br>
\r
228 * アンチエイリアスが必要な場合はアンチエイリアスが設定されます.<br>
\r
230 * @return JMenuItem
\r
232 public JMenuItem createJMenuItem() {
\r
233 return new JMenuItem() {
\r
234 private static final long serialVersionUID = 1L;
\r
236 public void paint(Graphics g) {
\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