OSDN Git Service

*修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / Main.java
1 package charactermanaj;\r
2 \r
3 import java.lang.reflect.Method;\r
4 import java.util.logging.Level;\r
5 import java.util.logging.Logger;\r
6 \r
7 import javax.swing.UIManager;\r
8 \r
9 import charactermanaj.model.AppConfig;\r
10 import charactermanaj.model.util.StartupSupport;\r
11 import charactermanaj.ui.MainFrame;\r
12 import charactermanaj.ui.ProfileListManager;\r
13 import charactermanaj.util.ErrorMessageHelper;\r
14 import charactermanaj.util.ApplicationLoggerConfigurator;\r
15 \r
16 /**\r
17  * エントリポイント用クラス\r
18  * @author seraphy\r
19  *\r
20  */\r
21 public final class Main {\r
22         \r
23         /**\r
24          * ロガー.<br>\r
25          */\r
26         private static Logger logger;\r
27 \r
28         /**\r
29          * Mac OS Xであるか?\r
30          */\r
31         private static final boolean isMacOSX;\r
32         \r
33         /**\r
34          * クラスイニシャライザ\r
35          */\r
36         static {\r
37                 // Mac OS Xでの実行判定\r
38                 // システムプロパティos.nameは、すべてのJVM実装に存在する.\r
39                 // 基本ディレクトリの位置の決定に使うため、\r
40                 // なによりも、まず、これを判定しないとダメ.(順序が重要)\r
41                 String lcOS = System.getProperty("os.name").toLowerCase();\r
42                 isMacOSX = lcOS.startsWith("mac os x");\r
43 \r
44                 // ロガーの準備\r
45                 try {\r
46                         // ローカルファイルシステム上のユーザ定義ディレクトリから\r
47                         // ログの設定を読み取る.(OSにより、設定ファイルの位置が異なることに注意)\r
48                         ApplicationLoggerConfigurator.configure();\r
49                         logger = Logger.getLogger(Main.class.getName());\r
50 \r
51                 } catch (Throwable ex) {\r
52                         ex.printStackTrace();\r
53                         logger = null;\r
54                 }\r
55 \r
56                 if (logger != null) {\r
57                         logger.log(Level.INFO, "os.name=" + lcOS + "/isMacOSX=" + isMacOSX);\r
58                 }\r
59         }\r
60         \r
61         /**\r
62          * エントリポイント.<br>\r
63          * 最初のメインフレームを開いたときにMac OS Xであればスクリーンメニューの登録も行う.<br>\r
64          * @param args 引数(未使用)\r
65          */\r
66         public static void main(String[] args) {\r
67                 try {\r
68                         //System.setProperty("swing.aatext", "true");\r
69                         //System.setProperty("awt.useSystemAAFontSettings", "on");\r
70                         \r
71                         // MacOSXであれば、スクリーンメニューを有効化\r
72                         if (isMacOSX()) {\r
73                                 System.setProperty("apple.laf.useScreenMenuBar", "true");\r
74                                 System.setProperty(\r
75                                                 "com.apple.mrj.application.apple.menu.about.name",\r
76                                                 "CharacterManaJ");\r
77                         }\r
78 \r
79                         // 実行プラットフォームのネイティブな外観にする.\r
80                         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\r
81                         \r
82                         // アプリケーション設定の読み込み\r
83                         AppConfig appConfig = AppConfig.getInstance();\r
84                         appConfig.loadConfig();\r
85         \r
86                         // スタートアップ時の初期化\r
87                         StartupSupport.getInstance().doStartup();\r
88                         \r
89                         // デフォルトのプロファイルを開く.\r
90                         // (最後に使ったプロファイルがあれば、それが開かれる.)\r
91                         MainFrame mainFrame = ProfileListManager.openDefaultProfile();\r
92                         if (isMacOSX()) {\r
93                                 // MacOSXであればスクリーンメニューからのイベントをハンドルできるようにする.\r
94                                 // OSXにしか存在しないクラスを利用するためリフレクションとしている.\r
95                                 Class<?> clz = Class.forName("charactermanaj.ui.MainFramePartialForMacOSX");\r
96                                 Method mtd = clz.getMethod("setupScreenMenu", MainFrame.class);\r
97                                 mtd.invoke(null, mainFrame);\r
98                         }\r
99 \r
100                         // メインウィンドウを表示.\r
101                         // (Mainメソッドは、このあと終了するが、Swingはアクティブなウィンドウがいるかぎりアプリケーションを終了しない.)\r
102                         mainFrame.setVisible(true);\r
103 \r
104                 } catch (Throwable ex) {\r
105                         // なんらかの致命的な初期化エラーがあった場合、ログとコンソールに表示\r
106                         // ダイアログが表示されるかどうかは状況次第.\r
107                         ex.printStackTrace();\r
108                         if (logger != null) {\r
109                                 logger.log(Level.SEVERE, "Application initiation failed.", ex);\r
110                         }\r
111                         ErrorMessageHelper.showErrorDialog(null, ex);\r
112                         System.exit(1);\r
113                 }\r
114         }\r
115         \r
116         /**\r
117          * Mac OS Xで動作しているか?\r
118          * @return Max OS X上であればtrue\r
119          */\r
120         public static boolean isMacOSX() {\r
121                 return isMacOSX;\r
122         }\r
123         \r
124 }\r