OSDN Git Service

eed6032ee95594ee6b1a13b2e55f7edefd51e7a7
[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.CONFIG, "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                         if (logger.isLoggable(Level.FINER)) {\r
91                                 logger.log(Level.FINER, "invoke: " + method + "/arg=" + arg);\r
92                         }\r
93                         method.invoke(desktopObj, arg);\r
94                         return true;\r
95 \r
96                 } catch (InvocationTargetException ex) {\r
97                         Throwable iex = ex.getCause();\r
98                         if (iex != null && iex instanceof IOException) {\r
99                                 throw (IOException) iex;\r
100                         }\r
101                         throw new RuntimeException(ex.getMessage(), ex);\r
102 \r
103                 } catch (IllegalAccessException ex) {\r
104                         throw new RuntimeException(ex.getMessage(), ex);\r
105                 }\r
106         }\r
107 \r
108         /**\r
109          * ファイルを開く.\r
110          * @param uri ファイル\r
111          * @return サポートしていない場合はfalse、実行できればtrue。\r
112          * @throws IOException 実行できなかった場合\r
113          */\r
114         public static boolean browse(URI uri) throws IOException {\r
115                 return callMethod(methodBrowse, uri);\r
116         }\r
117         \r
118         /**\r
119          * 指定したdocBaseの親ディレクトリを開く.\r
120          * @param docBase\r
121          * @return サポートしていない場合はfalse、実行できればtrue。\r
122          * @throws IOException 実行できなかった場合\r
123          */\r
124         public static boolean browseBaseDir(URI docBase) throws IOException {\r
125                 File baseDir = null;\r
126                 try {\r
127                         if (docBase != null) {\r
128                                 baseDir = new File(docBase).getParentFile();\r
129                         }\r
130                 } catch (Exception ex) {\r
131                         baseDir = null;\r
132                 }\r
133                 if (baseDir == null) {\r
134                         Toolkit tk = Toolkit.getDefaultToolkit();\r
135                         tk.beep();\r
136                         return false;\r
137                 }\r
138 \r
139                 return DesktopUtilities.open(baseDir);\r
140         }\r
141 \r
142         /**\r
143          * ファイルを編集する.\r
144          * @param file ファイル\r
145          * @return サポートしていない場合はfalse、実行できればtrue。\r
146          * @throws IOException 実行できなかった場合\r
147          */\r
148         public static boolean edit(File file) throws IOException {\r
149                 return callMethod(methodEdit, file);\r
150         }\r
151 \r
152         /**\r
153          * ファイルを編集する.\r
154          * @param file ファイル\r
155          * @return サポートしていない場合はfalse、実行できればtrue。\r
156          * @throws IOException 実行できなかった場合\r
157          */\r
158         public static boolean open(File file) throws IOException {\r
159                 return callMethod(methodOpen, file);\r
160         }\r
161 \r
162         /**\r
163          * ブラウザでURLを開きます.<br>\r
164          * JDK1.6未満の場合はブラウザを開く代わりにURLと、それを説明するメッセージボックスが表示されます.<br>\r
165          * @param parent 親フレーム、またはダイアログ\r
166          * @param url URL\r
167          * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文\r
168          */\r
169         public static void browse(final Component parent, final String url, final String description) {\r
170                 try {\r
171                         URI helpURI = new URI(url);\r
172 \r
173                         if (!DesktopUtilities.browse(helpURI) ){\r
174                                 // JDK5で実行中の場合\r
175 \r
176                                 JPanel panel = new JPanel();\r
177                                 BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);\r
178                                 panel.setLayout(layout);\r
179                                 panel.add(new JLabel(description));\r
180                                 JTextField txtURL = new JTextField(url);\r
181                                 panel.add(txtURL);\r
182                                 JOptionPane.showMessageDialog(parent, panel);\r
183                         }\r
184 \r
185                 } catch (Exception ex) {\r
186                         ErrorMessageHelper.showErrorDialog(parent, ex);\r
187                 }\r
188         }\r
189         \r
190         \r
191         /**\r
192          * ブラウザでURLを開くアクションの生成.<br>\r
193          * エラー時はエラーダイアログが開かれる.<br>\r
194          * 返されるアクションがとるアクションイベントは無視されるため、nullを渡しても問題ありません.<br>\r
195          * @param parent 親フレーム、またはダイアログ\r
196          * @param url URLの文字列\r
197          * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文\r
198          * @return アクション\r
199          */\r
200         public static ActionListener createBrowseAction(final Component parent, final String url, final String description) {\r
201                 return new ActionListener() {\r
202                         public void actionPerformed(ActionEvent e) {\r
203                                 browse(parent, url, description);\r
204                         }\r
205                 };\r
206         }\r
207         \r
208 }\r