1 package charactermanaj.util;
\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
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
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
23 * デスクトップへのアクセスを提供するユーテリティ.<br>
\r
24 * JDK6の機能を使うため、JDK5以前では何もしない.(エラーにはならない)
\r
27 public class DesktopUtilities {
\r
32 private static final Logger logger = Logger.getLogger(DesktopUtilities.class.getName());
\r
35 * デスクトップオブジェクト。JDK6以降でなければ、もしくはデスクトップをサポートしていなければnull
\r
37 private static Object desktopObj;
\r
42 private static Method methodBrowse;
\r
47 private static Method methodEdit;
\r
52 private static Method methodOpen;
\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
63 } catch (ClassNotFoundException ex) {
\r
65 logger.log(Level.INFO, "AWT Desktop is not suuported.");
\r
68 } catch (Exception ex) {
\r
69 // その他の例外は基本的に発生しないが、発生したとしても
\r
70 // 単にサポートしていないと見なして継続する.
\r
71 logger.log(Level.SEVERE, "AWT Desktop failed.", ex);
\r
77 private DesktopUtilities() {
\r
78 throw new RuntimeException("utilities class.");
\r
81 public static boolean isSupported() {
\r
82 return desktopObj != null;
\r
85 protected static boolean callMethod(Method method, Object arg) throws IOException {
\r
86 if (desktopObj == null) {
\r
90 method.invoke(desktopObj, arg);
\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
98 throw new RuntimeException(ex.getMessage(), ex);
\r
100 } catch (IllegalAccessException ex) {
\r
101 throw new RuntimeException(ex.getMessage(), ex);
\r
108 * @return サポートしていない場合はfalse、実行できればtrue。
\r
109 * @throws IOException 実行できなかった場合
\r
111 public static boolean browse(URI uri) throws IOException {
\r
112 return callMethod(methodBrowse, uri);
\r
116 * 指定したdocBaseの親ディレクトリを開く.
\r
118 * @return サポートしていない場合はfalse、実行できればtrue。
\r
119 * @throws IOException 実行できなかった場合
\r
121 public static boolean browseBaseDir(URI docBase) throws IOException {
\r
122 File baseDir = null;
\r
124 if (docBase != null) {
\r
125 baseDir = new File(docBase).getParentFile();
\r
127 } catch (Exception ex) {
\r
130 if (baseDir == null) {
\r
131 Toolkit tk = Toolkit.getDefaultToolkit();
\r
136 return DesktopUtilities.open(baseDir);
\r
142 * @return サポートしていない場合はfalse、実行できればtrue。
\r
143 * @throws IOException 実行できなかった場合
\r
145 public static boolean edit(File file) throws IOException {
\r
146 return callMethod(methodEdit, file);
\r
152 * @return サポートしていない場合はfalse、実行できればtrue。
\r
153 * @throws IOException 実行できなかった場合
\r
155 public static boolean open(File file) throws IOException {
\r
156 return callMethod(methodOpen, file);
\r
160 * ブラウザでURLを開きます.<br>
\r
161 * JDK1.6未満の場合はブラウザを開く代わりにURLと、それを説明するメッセージボックスが表示されます.<br>
\r
162 * @param parent 親フレーム、またはダイアログ
\r
164 * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文
\r
166 public static void browse(final Component parent, final String url, final String description) {
\r
168 URI helpURI = new URI(url);
\r
170 if (!DesktopUtilities.browse(helpURI) ){
\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
179 JOptionPane.showMessageDialog(parent, panel);
\r
182 } catch (Exception ex) {
\r
183 ErrorMessageHelper.showErrorDialog(parent, ex);
\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
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