Bug 10385 fixed: it was not possible to configure default web browser
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / utils / WebBrowser.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.utils;
14
15 import java.awt.Desktop;
16 import java.io.IOException;
17 import java.net.URI;
18 import java.net.URISyntaxException;
19 import java.net.URL;
20 import java.util.Set;
21
22 import javax.swing.JOptionPane;
23
24 import org.w3c.dom.Document;
25
26 import static org.scilab.modules.commons.xml.XConfiguration.XConfAttribute;
27 import org.scilab.modules.commons.xml.XConfiguration;
28 import org.scilab.modules.commons.xml.XConfigurationEvent;
29 import org.scilab.modules.commons.xml.XConfigurationListener;
30 import org.scilab.modules.localization.Messages;
31
32
33 /**
34  * Class used to launch a Web Browser from Scilab
35  * @author Vincent COUVERT
36  */
37 public final class WebBrowser implements XConfigurationListener {
38
39     private static final String ERROR_MSG = Messages.gettext("Could not open: ");
40     public static final String WEBPATH = "//web/body/web";
41
42     private static WebPreferences webprefs;
43     private static Document doc;
44
45     static {
46         XConfiguration.addXConfigurationListener(new WebBrowser());
47     }
48
49     /**
50      * Constructor
51      */
52     private WebBrowser() { }
53
54     /**
55      * Prevent the listener that configuration has changed
56      *
57      * @param e the event
58      */
59     public void configurationChanged(XConfigurationEvent e) {
60         Set<String> path = e.getModifiedPaths();
61         if (path.contains("ALL") || path.contains(WEBPATH)) {
62             webprefs = null;
63             doc = null;
64         }
65     }
66
67     /**
68      * Open the Browser/Mailer with Given URL
69      * @param url the URL to open
70      * @param descrition the link as String
71      */
72     public static void openUrl(URL url, String description) {
73         if (url == null) {
74             JOptionPane.showMessageDialog(null, ERROR_MSG + description);
75         } else {
76             openUrl(url.toString());
77         }
78     }
79
80     /**
81      * Open the Browser/Mailer with Given URL
82      * @param url the URL to open
83      */
84     public static void openUrl(String url) {
85         if (url == null || url.length() == 0) {
86             return;
87         }
88
89         if (webprefs == null) {
90             if (doc == null) {
91                 doc = XConfiguration.getXConfigurationDocument();
92             }
93             webprefs = XConfiguration.get(WebBrowser.WebPreferences.class, doc, WEBPATH)[0];
94         }
95
96         try {
97             if (url.charAt(0) == 'h' || url.charAt(0) == 'f') {
98                 // We have something like http://... or file://
99                 if (webprefs.defaultBrowser) {
100                     Desktop.getDesktop().browse(new URI(url));
101                 } else {
102                     Runtime.getRuntime().exec(webprefs.cmdBrowser + " " + new URI(url).toString());
103                 }
104             } else {
105                 // We have <pierre.marechal@scilab.org>
106                 String mail = "mailto:" + url.substring(1, url.length() - 1);
107                 if (webprefs.defaultMailer) {
108                     Desktop.getDesktop().mail(new URI(mail));
109                 } else {
110                     Runtime.getRuntime().exec(webprefs.cmdMailer + " " + new URI(mail).toString());
111                 }
112             }
113         } catch (Exception e) {
114             JOptionPane.showMessageDialog(null, ERROR_MSG + url);
115         }
116     }
117
118     /* web */
119     @XConfAttribute
120     static class WebPreferences {
121
122         boolean defaultBrowser;
123         boolean defaultMailer;
124         String cmdBrowser;
125         String cmdMailer;
126
127         private WebPreferences() { }
128
129         @XConfAttribute(tag = "web", attributes = {"default-browser", "default-mailer", "command-browser", "command-mailer"})
130         private void set(boolean defaultBrowser, boolean defaultMailer, String cmdBrowser, String cmdMailer) {
131             this.defaultBrowser = defaultBrowser;
132             this.defaultMailer = defaultMailer;
133             this.cmdBrowser = cmdBrowser;
134             this.cmdMailer = cmdMailer;
135         }
136     }
137 }