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;
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;
}
}
+ // OSXであれば、DockIconを先に設定する
+ if (isMacOSX()) {
+ try {
+ if (JavaVersionUtils.getJavaVersion() >= 9) {
+ // OSXでJava9以降であればOracle実装でDockIconを設定する.
+ MainFramePartialForMacOSX9.setupDockIcon();
+
+ } else {
+ // Java9未満であればeawtでDockIcon類を設定する.
+ MainFramePartialForMacOSX.setupDockIcon();
+ }
+
+ } catch (Throwable ex) {
+ logger.log(Level.CONFIG, "Failed to setup the dock icon.", ex);
+ }
+ }
+
if (currentCharacterDir == null) {
// キャラクターセットディレクトリの選択
File defaultCharacterDir = ConfigurationDirUtilities.getDefaultCharactersDir();
} 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);
+ MainFramePartialForMacOSX.setupScreenMenu(mainFrame);
}
} catch (Throwable ex) {
/**
* メインフレームのアイコン.<br>
*/
- protected BufferedImage icon;
+ private BufferedImage icon;
/**
package charactermanaj.ui;
import java.awt.Image;
+import java.awt.image.BufferedImage;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
-
-import charactermanaj.util.SystemUtil;
-
import com.apple.eawt.Application;
import com.apple.eawt.ApplicationAdapter;
import com.apple.eawt.ApplicationEvent;
+import charactermanaj.util.SystemUtil;
+import charactermanaj.util.UIHelper;
+
/**
* Mac OS X用のメインフレームサポートクラス.<br>
* スクリーンメニューのハンドラなどを接続している.<br>
*
*/
public class MainFramePartialForMacOSX {
-
+
/**
* ロガー
*/
if (mainFrame == null) {
throw new IllegalArgumentException();
}
-
+
Application app = Application.getApplication();
-
+
app.setEnabledAboutMenu(true);
app.setEnabledPreferencesMenu(true);
}
};
app.addApplicationListener(listener);
-
+ }
+
+ public static void setupDockIcon() {
try {
+ Application app = Application.getApplication();
Class<?> clz = app.getClass();
+
+ BufferedImage icon = UIHelper.getInstance().getImage("icons/icon.png");
+
Method mtd = clz.getMethod("setDockIconImage", new Class[] {Image.class});
- mtd.invoke(app, new Object[] {mainFrame.icon});
+ mtd.invoke(app, new Object[] { icon });
} catch (NoSuchMethodException ex) {
// メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い.
logger.log(Level.WARNING, "dockIcon failed.", ex);
}
}
-
}
super();
}
- public static void setupScreenMenu(final MainFrame mainFrame) throws Exception {
- // Java9以降であればOracle実装でスクリーンメニュー類を設定する.
- // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている)
-
+ public static void setupDockIcon() throws Exception {
Class<?> taskbarCls = Class.forName("java.awt.Taskbar");
Object taskbar = taskbarCls.getMethod("getTaskbar").invoke(null);
Method setIconImageMethod = taskbarCls.getMethod("setIconImage", Image.class);
Image icon = ImageIO.read(Main.class.getResource("/icons/icon.png"));
setIconImageMethod.invoke(taskbar, icon);
+ }
+ public static void setupScreenMenu(final MainFrame mainFrame) throws Exception {
+ // Java9以降であればOracle実装でスクリーンメニュー類を設定する.
+ // (jdk5でコンパイルする都合上、無理矢理リフレクション経由のDynamicProxyでハンドラを作っている)
Desktop desktop = Desktop.getDesktop();
Class<?> aboutHandlerCls = Class.forName("java.awt.desktop.AboutHandler");