KiSSセルデータと透過PNGファイルへの相互変換
修订版 | acb175ff2de95f8d4817e2e393a31428761726be (tree) |
---|---|
时间 | 2011-09-17 00:00:08 |
作者 | seraphy <seraphy@user...> |
Commiter | seraphy |
MacOSXスクリーンメニュー対応
@@ -9,5 +9,6 @@ | ||
9 | 9 | <classpathentry kind="lib" path="lib/archivedfile-if.jar" sourcepath="/jlha/src2"/> |
10 | 10 | <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> |
11 | 11 | <classpathentry kind="lib" path="lib/jh.jar"/> |
12 | + <classpathentry kind="lib" path="extlib/AppleJavaExtensions.jar"/> | |
12 | 13 | <classpathentry kind="output" path="bin"/> |
13 | 14 | </classpath> |
@@ -1,5 +1,7 @@ | ||
1 | 1 | package kisscelltopng; |
2 | 2 | |
3 | +import java.lang.reflect.Method; | |
4 | + | |
3 | 5 | import javax.swing.SwingUtilities; |
4 | 6 | import javax.swing.UIManager; |
5 | 7 |
@@ -11,12 +13,24 @@ import kisscelltopng.ui.MainFrame; | ||
11 | 13 | */ |
12 | 14 | public class Main implements Runnable { |
13 | 15 | |
16 | + private boolean isMacOSX; | |
17 | + | |
14 | 18 | /** |
15 | 19 | * UIをセットアップする.<br> |
16 | 20 | * 失敗しても継続する.<br> |
17 | 21 | */ |
18 | 22 | protected void setupLookAndFeel() { |
19 | 23 | try { |
24 | + // Macの判定 | |
25 | + String lcOS = System.getProperty("os.name").toLowerCase(); | |
26 | + this.isMacOSX = lcOS.startsWith("mac os x"); | |
27 | + if (isMacOSX) { | |
28 | + System.setProperty("apple.laf.useScreenMenuBar", "true"); | |
29 | + System.setProperty( | |
30 | + "com.apple.mrj.application.apple.menu.about.name", | |
31 | + "KiSSCellToPNG"); // Lionでは効かない. | |
32 | + } | |
33 | + | |
20 | 34 | // 実行プラットフォームのネイティブな外観にする. |
21 | 35 | UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); |
22 | 36 |
@@ -33,6 +47,19 @@ public class Main implements Runnable { | ||
33 | 47 | setupLookAndFeel(); |
34 | 48 | |
35 | 49 | MainFrame mainFrame = new MainFrame(); |
50 | + | |
51 | + if (isMacOSX) { | |
52 | + try { | |
53 | + Class<?> clz = Class.forName("kisscelltopng.SetupMacScreenMenu"); | |
54 | + Method method = clz.getMethod("connect", MainFrame.class); | |
55 | + method.invoke(null, mainFrame); | |
56 | + | |
57 | + } catch (Exception ex) { | |
58 | + ex.printStackTrace(); | |
59 | + // 致命的とはいえないので、継続する. | |
60 | + } | |
61 | + } | |
62 | + | |
36 | 63 | mainFrame.setVisible(true); |
37 | 64 | } |
38 | 65 |
@@ -0,0 +1,61 @@ | ||
1 | +package kisscelltopng; | |
2 | + | |
3 | +import kisscelltopng.ui.MainFrame; | |
4 | + | |
5 | +import com.apple.eawt.Application; | |
6 | +import com.apple.eawt.ApplicationAdapter; | |
7 | +import com.apple.eawt.ApplicationEvent; | |
8 | + | |
9 | +/** | |
10 | + * Mac OS X用のメインフレームサポートクラス.<br> | |
11 | + * スクリーンメニューのハンドラなどを接続している.<br> | |
12 | + * @author seraphy | |
13 | + */ | |
14 | +public class SetupMacScreenMenu { | |
15 | + | |
16 | + public static void connect(final MainFrame mainFrame) { | |
17 | + if (mainFrame == null) { | |
18 | + throw new IllegalArgumentException(); | |
19 | + } | |
20 | + | |
21 | + Application app = Application.getApplication(); | |
22 | + | |
23 | + app.setEnabledAboutMenu(true); | |
24 | + app.setEnabledPreferencesMenu(false); | |
25 | + | |
26 | + ApplicationAdapter listener = new ApplicationAdapter() { | |
27 | + public void handleAbout(ApplicationEvent arg0) { | |
28 | + mainFrame.onAbout(); | |
29 | + arg0.setHandled(true); | |
30 | + } | |
31 | + | |
32 | + public void handleQuit(ApplicationEvent arg0) { | |
33 | + mainFrame.onClose(); | |
34 | + arg0.setHandled(true); | |
35 | + // JVMを明示的にシャットダウンする. (何もしないと強制終了になるため。) | |
36 | + System.exit(0); | |
37 | + } | |
38 | + | |
39 | + public void handlePreferences(ApplicationEvent arg0) { | |
40 | + arg0.setHandled(true); | |
41 | + } | |
42 | + }; | |
43 | + app.addApplicationListener(listener); | |
44 | + | |
45 | +// try { | |
46 | +// Class<?> clz = app.getClass(); | |
47 | +// Method mtd = clz.getMethod("setDockIconImage", | |
48 | +// new Class[] { Image.class }); | |
49 | +// mtd.invoke(app, new Object[] { mainFrame.icon }); | |
50 | +// | |
51 | +// } catch (NoSuchMethodException ex) { | |
52 | +// // メソッドがない = Tiger以前の失敗であろうから、単に無視するだけで良い. | |
53 | +// logger.log(Level.CONFIG, "dockIcon not supported.", ex); | |
54 | +// | |
55 | +// } catch (Exception ex) { | |
56 | +// // 実行時の失敗だが、DockIconが設定できないだけなので継続する. | |
57 | +// logger.log(Level.WARNING, "dockIcon failed.", ex); | |
58 | +// } | |
59 | + } | |
60 | + | |
61 | +} |
@@ -184,7 +184,7 @@ public class MainFrame extends JFrame { | ||
184 | 184 | mnuAbout.setMnemonic(res.getString("menu.help.aboutThis.mnemonic").charAt(0)); |
185 | 185 | mnuAbout.addActionListener(new ActionListener() { |
186 | 186 | public void actionPerformed(ActionEvent e) { |
187 | - onAboutThis(); | |
187 | + onAbout(); | |
188 | 188 | } |
189 | 189 | }); |
190 | 190 | mnuHelp.add(mnuAbout); |
@@ -235,7 +235,7 @@ public class MainFrame extends JFrame { | ||
235 | 235 | updateSaveButton(); |
236 | 236 | } |
237 | 237 | |
238 | - protected void onClose() { | |
238 | + public void onClose() { | |
239 | 239 | try { |
240 | 240 | if (dataConverter != null) { |
241 | 241 | dataConverter.release(null); |
@@ -254,7 +254,7 @@ public class MainFrame extends JFrame { | ||
254 | 254 | System.out.println("help"); |
255 | 255 | } |
256 | 256 | |
257 | - protected void onAboutThis() { | |
257 | + public void onAbout() { | |
258 | 258 | // TODO: |
259 | 259 | System.out.println("about"); |
260 | 260 | } |
@@ -505,4 +505,3 @@ public class MainFrame extends JFrame { | ||
505 | 505 | } |
506 | 506 | } |
507 | 507 | } |
508 | - |