001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 package org.openstreetmap.josm.tools;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Desktop;
007 import java.io.IOException;
008 import java.net.MalformedURLException;
009 import java.net.URI;
010
011 import javax.swing.JApplet;
012
013 import org.openstreetmap.josm.Main;
014
015 /**
016 * Helper to open platform web browser on different platforms
017 *
018 * This now delegates the real work to a platform specific class.
019 *
020 * @author Imi
021 */
022 public class OpenBrowser {
023
024 private static void displayUrlFallback(URI uri) throws IOException {
025 if (Main.platform == null)
026 throw new IllegalStateException(tr("Failed to open URL. There is currently no platform set. Please set a platform first."));
027 Main.platform.openUrl(uri.toString());
028 }
029
030 /**
031 * @return <code>null</code> for success or a string in case of an error.
032 * @throws IllegalStateException thrown if no platform is set to which opening the URL can be dispatched,
033 * {@link Main#platform}
034 */
035 public static String displayUrl(URI uri) {
036 if (Main.applet) {
037 try {
038 JApplet applet = (JApplet) Main.parent;
039 applet.getAppletContext().showDocument(uri.toURL());
040 return null;
041 } catch (MalformedURLException mue) {
042 return mue.getMessage();
043 }
044 }
045
046 if (Desktop.isDesktopSupported()) {
047 try {
048 try {
049 Desktop.getDesktop().browse(uri);
050 } catch (IOException e) {
051 // Workaround for KDE (Desktop API is severely flawed)
052 // see http://bugs.sun.com/view_bug.do?bug_id=6486393
053 System.err.println("Warning: Desktop class failed. Platform dependent fall back for open url in browser.");
054 displayUrlFallback(uri);
055 }
056 } catch (Exception e) {
057 e.printStackTrace();
058 return e.getMessage();
059 }
060 } else {
061 try {
062 System.err.println("Warning: Desktop class is not supported. Platform dependent fall back for open url in browser.");
063 displayUrlFallback(uri);
064 } catch (IOException e) {
065 return e.getMessage();
066 }
067 }
068 return null;
069 }
070
071 public static String displayUrl(String url) {
072 try {
073 return displayUrl(new URI(url));
074 } catch (Exception e) {
075 return e.getMessage();
076 }
077 }
078 }