OSDN Git Service

OSXのスクリーンメニュー表示タイミングの修正
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / Main.java
index bcff24e..52a0663 100644 (file)
@@ -1,10 +1,12 @@
 package charactermanaj;
 
 import java.awt.Font;
+import java.awt.Frame;
 import java.awt.GraphicsEnvironment;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.lang.Thread.UncaughtExceptionHandler;
-import java.lang.reflect.Method;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Locale;
@@ -24,6 +26,7 @@ import charactermanaj.graphics.io.ImageCacheMBeanImpl;
 import charactermanaj.model.AppConfig;
 import charactermanaj.model.util.StartupSupport;
 import charactermanaj.ui.MainFrame;
+import charactermanaj.ui.MainFramePartialForMacOSX;
 import charactermanaj.ui.MainFramePartialForMacOSX9;
 import charactermanaj.ui.ProfileListManager;
 import charactermanaj.ui.SelectCharatersDirDialog;
@@ -124,7 +127,7 @@ public final class Main implements Runnable {
         * @throws Exception
         *             いろいろな失敗
         */
-       private static void setupUIManager(AppConfig appConfig) throws Exception {
+       private static void setupUIManager(final AppConfig appConfig) throws Exception {
                // System.setProperty("swing.aatext", "true");
                // System.setProperty("awt.useSystemAAFontSettings", "on");
 
@@ -147,6 +150,27 @@ public final class Main implements Runnable {
                // JSpliderのvalueを非表示 (GTKではデフォルトで有効のため)
                UIManager.put("Slider.paintValue", Boolean.FALSE);
 
+               // デフォルトフォントを設定する
+               setupDefaultFont(appConfig);
+
+               // アプリケーション設定でデフォルトフォントサイズが変更された場合は
+               // 現在表示されている、すべてのフレームに再適用を試行する。
+               appConfig.addPropertyChangeListener(AppConfig.DEFAULT_FONT_SIZE, new PropertyChangeListener() {
+                       @Override
+                       public void propertyChange(PropertyChangeEvent evt) {
+                               setupDefaultFont(appConfig);
+                               try {
+                                       for (Frame frame : Frame.getFrames()) {
+                                               SwingUtilities.updateComponentTreeUI(frame);
+                                       }
+                               } catch (Exception ex) {
+                                       logger.log(Level.WARNING, "failed revalidate frames", ex);
+                               }
+                       }
+               });
+       }
+
+       private static void setupDefaultFont(AppConfig appConfig) {
 
                // 優先するフォントファミリ中の実在するフォントファミリのセット(大文字小文字の区別なし)
                TreeSet<String> availablePriorityFontSets = new TreeSet<String>(
@@ -293,6 +317,11 @@ public final class Main implements Runnable {
                                }
                        }
 
+                       // スタートアップ時の初期化
+                       // ver0.999ではキャラクターデータディレクトリに依存しない初期化部しかないので最初に実行する。
+                       // (APPDATAからLOCALAPPDATAへの移動処理などがあるため、先に行う必要がある。)
+                       StartupSupport.getInstance().doStartup();
+
                        // 起動時のシステムプロパティでキャラクターディレクトリが指定されていて実在すれば、それを優先する.
                        File currentCharacterDir = null;
                        String charactersDir = System.getProperty("charactersDir");
@@ -303,15 +332,38 @@ public final class Main implements Runnable {
                                }
                        }
 
+                       // OSXであれば、DockIconを先に設定する
+                       if (isMacOSX()) {
+                               try {
+                                       if (JavaVersionUtils.getJavaVersion() >= 9) {
+                                               // OSXでJava9以降であればOracle実装でDockIconを設定する.
+                                               MainFramePartialForMacOSX9.setupDockIcon();
+
+                                               // スクリーンメニュー類を設定する.
+                                               // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される)
+                                               MainFramePartialForMacOSX9.setupScreenMenu();
+
+                                       } else {
+                                               // Java9未満であればeawtでDockIcon類を設定する.
+                                               MainFramePartialForMacOSX.setupDockIcon();
+
+                                               // スクリーンメニューからのイベントをハンドルできるようにする.
+                                               // (メニュー項目は、その時点でアクティブになっているメインフレームに転送される)
+                                               MainFramePartialForMacOSX.setupScreenMenu();
+                                       }
+
+                               } catch (Throwable ex) {
+                                       logger.log(Level.CONFIG, "Failed to setup the dock icon.", ex);
+                               }
+                       }
+
                        if (currentCharacterDir == null) {
                                // キャラクターセットディレクトリの選択
-                               File defaultCharacterDir = ConfigurationDirUtilities
-                                               .getDefaultCharactersDir();
-                               currentCharacterDir = SelectCharatersDirDialog
-                                               .getCharacterDir(defaultCharacterDir);
+                               File defaultCharacterDir = ConfigurationDirUtilities.getDefaultCharactersDir();
+                               currentCharacterDir = SelectCharatersDirDialog.getCharacterDir(defaultCharacterDir);
                                if (currentCharacterDir == null) {
                                        // キャンセルされたので終了する.
-                                       logger.info("luncher canceled.");
+                                       logger.info("launcher canceled.");
                                        return;
                                }
                        }
@@ -319,35 +371,9 @@ public final class Main implements Runnable {
                        // キャラクターデータフォルダの設定
                        DirectoryConfig.getInstance().setCharactersDir(currentCharacterDir);
 
-                       // スタートアップ時の初期化
-                       StartupSupport.getInstance().doStartup();
-
                        // デフォルトのプロファイルを開く.
                        // (最後に使ったプロファイルがあれば、それが開かれる.)
                        final MainFrame mainFrame = ProfileListManager.openDefaultProfile();
-                       if (isMacOSX()) {
-                               try {
-                                       if (JavaVersionUtils.getJavaVersion() >= 9) {
-                                               // OSXでJava9以降であればOracle実装でスクリーンメニュー類を設定する.
-                                               MainFramePartialForMacOSX9.setupScreenMenu(mainFrame);
-
-                                       } else {
-                                               // Java9未満であればeawtでスクリーンメニュー類を設定する.
-                                               // MacOSXであればスクリーンメニューからのイベントをハンドルできるようにする.
-                                               // OSXにしか存在しないクラスを利用するためリフレクションとしている.
-                                               // ただしJDKによっては、Apple Java Extensionsがないことも予想されるので、
-                                               // その場合はエラーにしない。
-                                               Class<?> clz = Class
-                                                               .forName("charactermanaj.ui.MainFramePartialForMacOSX");
-                                               Method mtd = clz.getMethod("setupScreenMenu",
-                                                               MainFrame.class);
-                                               mtd.invoke(null, mainFrame);
-                                       }
-
-                               } catch (Throwable ex) {
-                                       logger.log(Level.CONFIG, "Failed to setup the screen menu.", ex);
-                               }
-                       }
 
                        // 表示(および位置あわせ)
                        mainFrame.showMainFrame();