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.CONFIG, "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 if (logger.isLoggable(Level.FINER)) {
\r
91 logger.log(Level.FINER, "invoke: " + method + "/arg=" + arg);
\r
93 method.invoke(desktopObj, arg);
\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
101 throw new RuntimeException(ex.getMessage(), ex);
\r
103 } catch (IllegalAccessException ex) {
\r
104 throw new RuntimeException(ex.getMessage(), ex);
\r
111 * @return サポートしていない場合はfalse、実行できればtrue。
\r
112 * @throws IOException 実行できなかった場合
\r
114 public static boolean browse(URI uri) throws IOException {
\r
115 return callMethod(methodBrowse, uri);
\r
119 * 指定したdocBaseの親ディレクトリを開く.
\r
121 * @return サポートしていない場合はfalse、実行できればtrue。
\r
122 * @throws IOException 実行できなかった場合
\r
124 public static boolean browseBaseDir(URI docBase) throws IOException {
\r
125 File baseDir = null;
\r
127 if (docBase != null) {
\r
128 baseDir = new File(docBase).getParentFile();
\r
130 } catch (Exception ex) {
\r
133 if (baseDir == null) {
\r
134 Toolkit tk = Toolkit.getDefaultToolkit();
\r
139 return DesktopUtilities.open(baseDir);
\r
145 * @return サポートしていない場合はfalse、実行できればtrue。
\r
146 * @throws IOException 実行できなかった場合
\r
148 public static boolean edit(File file) throws IOException {
\r
149 return callMethod(methodEdit, file);
\r
155 * @return サポートしていない場合はfalse、実行できればtrue。
\r
156 * @throws IOException 実行できなかった場合
\r
158 public static boolean open(File file) throws IOException {
\r
159 return callMethod(methodOpen, file);
\r
163 * ブラウザでURLを開きます.<br>
\r
164 * JDK1.6未満の場合はブラウザを開く代わりにURLと、それを説明するメッセージボックスが表示されます.<br>
\r
165 * @param parent 親フレーム、またはダイアログ
\r
167 * @param description ブラウズがサポートされていない場合に表示するダイアログでのURLの説明文
\r
169 public static void browse(final Component parent, final String url, final String description) {
\r
171 URI helpURI = new URI(url);
\r
173 if (!DesktopUtilities.browse(helpURI) ){
\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
182 JOptionPane.showMessageDialog(parent, panel);
\r
185 } catch (Exception ex) {
\r
186 ErrorMessageHelper.showErrorDialog(parent, ex);
\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
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