OSDN Git Service

c80609cea0c60f854a6567724190d0a81b42dcf5
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / util / DesktopUtilities.java
1 package charactermanaj.util;\r
2 \r
3 import java.awt.Component;\r
4 import java.awt.Toolkit;\r
5 import java.awt.event.ActionEvent;\r
6 import java.awt.event.ActionListener;\r
7 import java.io.File;\r
8 import java.io.IOException;\r
9 import java.lang.reflect.InvocationTargetException;\r
10 import java.lang.reflect.Method;\r
11 import java.net.URI;\r
12 import java.util.logging.Level;\r
13 import java.util.logging.Logger;\r
14 \r
15 import javax.swing.BoxLayout;\r
16 import javax.swing.JLabel;\r
17 import javax.swing.JOptionPane;\r
18 import javax.swing.JPanel;\r
19 import javax.swing.JTextField;\r
20 \r
21 \r
22 /**\r
23  * デスクトップへのアクセスを提供するユーテリティ.<br>\r
24  * JDK6の機能を使うため、JDK5以前では何もしない.(エラーにはならない)\r
25  * @author seraphy\r
26  */\r
27 public class DesktopUtilities {\r
28 \r
29         /**\r
30          * ロガー \r
31          */\r
32         private static final Logger logger = Logger.getLogger(DesktopUtilities.class.getName());\r
33 \r
34         /**\r
35          * デスクトップオブジェクト。JDK6以降でなければ、もしくはデスクトップをサポートしていなければnull\r
36          */\r
37         private static Object desktopObj;\r
38 \r
39         /**\r
40          * ブラウズメソッド\r
41          */\r
42         private static Method methodBrowse;\r
43         \r
44         /**\r
45          * 編集メソッド\r
46          */\r
47         private static Method methodEdit;\r
48 \r
49         /**\r
50          * 開くメソッド\r
51          */\r
52         private static Method methodOpen;\r
53 \r
54         static {\r
55                 try {\r
56                         Class<?> clz = Class.forName("java.awt.Desktop");\r
57                         Method mtdGetDesktop = clz.getMethod("getDesktop");\r
58                         methodBrowse = clz.getMethod("browse", URI.class);\r
59                         methodEdit = clz.getMethod("edit", File.class);\r
60                         methodOpen = clz.getMethod("open", File.class);\r
61                         desktopObj = mtdGetDesktop.invoke(null);\r
62 \r
63                 } catch (ClassNotFoundException ex) {\r
64                         // JDK6以降でない場合\r
65                         logger.log(Level.INFO, "AWT Desktop is not suuported.");\r
66                         desktopObj = null;\r
67                         \r
68                 } catch (Exception ex) {\r
69                         // その他の例外は基本的に発生しないが、発生したとしても\r
70                         // 単にサポートしていないと見なして継続する.\r
71                         logger.log(Level.SEVERE, "AWT Desktop failed.", ex);\r
72                         desktopObj = null;\r
73                 }\r
74         }\r
75         \r
76 \r
77         private DesktopUtilities() {\r
78                 throw new RuntimeException("utilities class.");\r
79         }\r
80         \r
81         public static boolean isSupported() {\r
82                 return desktopObj != null;\r
83         }\r
84         \r
85         protected static boolean callMethod(Method method, Object arg) throws IOException {\r
86                 if (desktopObj == null) {\r
87                         return false;\r
88                 }\r
89                 try {\r
90                         method.invoke(desktopObj, arg);\r
91                         return true;\r
92 \r
93                 } catch (InvocationTargetException ex) {\r
94                         Throwable iex = ex.getCause();\r
95                         if (iex != null && iex instanceof IOException) {\r
96                                 throw (IOException) iex;\r
97                         }\r
98                         throw new RuntimeException(ex.getMessage(), ex);\r
99 \r
100                 } catch (IllegalAccessException ex) {\r
101                         throw new RuntimeException(ex.getMessage(), ex);\r
102                 }\r
103         }\r
104 \r
105         /**\r
106          * ファイルを開く.\r
107          * @param uri ファイル\r
108          * @return サポートしていない場合はfalse、実行できればtrue。\r
109          * @throws IOException 実行できなかった場合\r
110          */\r
111         public static boolean browse(URI uri) throws IOException {\r
112                 return callMethod(methodBrowse, uri);\r
113         }\r
114         \r
115         /**\r
116          * 指定したdocBaseの親ディレクトリを開く.\r
117          * @param docBase\r
118          * @return サポートしていない場合はfalse、実行できればtrue。\r
119          * @throws IOException 実行できなかった場合\r
120          */\r
121         public static boolean browseBaseDir(URI docBase) throws IOException {\r
122                 File baseDir = null;\r
123                 try {\r
124                         if (docBase != null) {\r
125                                 baseDir = new File(docBase).getParentFile();\r
126                         }\r
127                 } catch (Exception ex) {\r
128                         baseDir = null;\r
129                 }\r
130                 if (baseDir == null) {\r
131                         Toolkit tk = Toolkit.getDefaultToolkit();\r
132                         tk.beep();\r
133                         return false;\r
134                 }\r
135 \r
136                 return DesktopUtilities.open(baseDir);\r
137         }\r
138 \r
139         /**\r
140          * ファイルを編集する.\r
141          * @param file ファイル\r
142          * @return サポートしていない場合はfalse、実行できればtrue。\r
143          * @throws IOException 実行できなかった場合\r
144          */\r
145         public static boolean edit(File file) throws IOException {\r
146                 return callMethod(methodEdit, file);\r
147         }\r
148 \r
149         /**\r
150          * ファイルを編集する.\r
151          * @param file ファイル\r
152          * @return サポートしていない場合はfalse、実行できればtrue。\r
153          * @throws IOException 実行できなかった場合\r
154          */\r
155         public static boolean open(File file) throws IOException {\r
156                 return callMethod(methodOpen, file);\r
157         }\r
158 \r
159         /**\r
160          * ブラウザでURLを開きます.<br>\r
161          * JDK1.6未満の場合はブラウザを開く代わりにURLと、それを説明するメッセージボックスが表示されます.<br>\r
162          * @param parent 親フレーム、またはダイアログ\r
163          * @param url URL\r
164          * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文\r
165          */\r
166         public static void browse(final Component parent, final String url, final String description) {\r
167                 try {\r
168                         URI helpURI = new URI(url);\r
169 \r
170                         if (!DesktopUtilities.browse(helpURI) ){\r
171                                 // JDK5で実行中の場合\r
172 \r
173                                 JPanel panel = new JPanel();\r
174                                 BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);\r
175                                 panel.setLayout(layout);\r
176                                 panel.add(new JLabel(description));\r
177                                 JTextField txtURL = new JTextField(url);\r
178                                 panel.add(txtURL);\r
179                                 JOptionPane.showMessageDialog(parent, panel);\r
180                         }\r
181 \r
182                 } catch (Exception ex) {\r
183                         ErrorMessageHelper.showErrorDialog(parent, ex);\r
184                 }\r
185         }\r
186         \r
187         \r
188         /**\r
189          * ブラウザでURLを開くアクションの生成.<br>\r
190          * エラー時はエラーダイアログが開かれる.<br>\r
191          * 返されるアクションがとるアクションイベントは無視されるため、nullを渡しても問題ありません.<br>\r
192          * @param parent 親フレーム、またはダイアログ\r
193          * @param url URLの文字列\r
194          * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文\r
195          * @return アクション\r
196          */\r
197         public static ActionListener createBrowseAction(final Component parent, final String url, final String description) {\r
198                 return new ActionListener() {\r
199                         public void actionPerformed(ActionEvent e) {\r
200                                 browse(parent, url, description);\r
201                         }\r
202                 };\r
203         }\r
204         \r
205 }\r