1 11 package org.eclipse.ui.internal.browser; 12 13 import java.io.IOException ; 14 import java.net.URL ; 15 16 import org.eclipse.jface.dialogs.MessageDialog; 17 import org.eclipse.swt.SWT; 18 import org.eclipse.swt.program.Program; 19 import org.eclipse.swt.widgets.Display; 20 import org.eclipse.ui.PartInitException; 21 import org.eclipse.ui.browser.AbstractWebBrowser; 22 import org.eclipse.ui.internal.WorkbenchMessages; 23 24 29 public class DefaultWebBrowser extends AbstractWebBrowser { 30 private DefaultWorkbenchBrowserSupport support; 31 32 private String webBrowser; 33 34 private boolean webBrowserOpened; 35 36 42 public DefaultWebBrowser(DefaultWorkbenchBrowserSupport support, String id) { 43 super(id); 44 this.support = support; 45 } 46 47 52 public void openURL(URL url) throws PartInitException { 53 String href = url.toString(); 56 if (href.startsWith("file:")) { href = href.substring(5); 58 while (href.startsWith("/")) { href = href.substring(1); 60 } 61 href = "file:///" + href; } 63 final String localHref = href; 64 65 final Display d = Display.getCurrent(); 66 String platform = SWT.getPlatform(); 67 68 if ("win32".equals(platform)) { Program.launch(localHref); 70 } else if ("carbon".equals(platform)) { try { 72 Runtime.getRuntime().exec("/usr/bin/open " + localHref); } catch (IOException e) { 74 throw new PartInitException( 75 WorkbenchMessages.ProductInfoDialog_unableToOpenWebBrowser, 76 e); 77 } 78 } else { 79 Thread launcher = new Thread ("About Link Launcher") { public void run() { 81 try { 82 86 String encodedLocalHref = urlEncodeForSpaces(localHref 87 .toCharArray()); 88 if (webBrowserOpened) { 89 Runtime 90 .getRuntime() 91 .exec( 92 webBrowser 93 + " -remote openURL(" + encodedLocalHref + ")"); } else { 95 Process p = openWebBrowser(encodedLocalHref); 96 webBrowserOpened = true; 97 try { 98 if (p != null) { 99 p.waitFor(); 100 } 101 } catch (InterruptedException e) { 102 openWebBrowserError(d); 103 } finally { 104 webBrowserOpened = false; 105 } 106 } 107 } catch (IOException e) { 108 openWebBrowserError(d); 109 } 110 } 111 }; 112 launcher.start(); 113 } 114 } 115 116 121 public boolean close() { 122 support.unregisterBrowser(this); 123 return super.close(); 124 } 125 126 132 private String urlEncodeForSpaces(char[] input) { 133 StringBuffer retu = new StringBuffer (input.length); 134 for (int i = 0; i < input.length; i++) { 135 if (input[i] == ' ') { 136 retu.append("%20"); } else { 138 retu.append(input[i]); 139 } 140 } 141 return retu.toString(); 142 } 143 144 private Process openWebBrowser(String href) throws IOException { 146 Process p = null; 147 if (webBrowser == null) { 148 try { 149 webBrowser = "firefox"; p = Runtime.getRuntime().exec(webBrowser + " " + href); } catch (IOException e) { 152 p = null; 153 webBrowser = "mozilla"; } 155 } 156 157 if (p == null) { 158 try { 159 p = Runtime.getRuntime().exec(webBrowser + " " + href); } catch (IOException e) { 161 p = null; 162 webBrowser = "netscape"; } 164 } 165 166 if (p == null) { 167 try { 168 p = Runtime.getRuntime().exec(webBrowser + " " + href); } catch (IOException e) { 170 p = null; 171 throw e; 172 } 173 } 174 175 return p; 176 } 177 178 181 private void openWebBrowserError(Display display) { 182 display.asyncExec(new Runnable () { 183 public void run() { 184 MessageDialog 185 .openError( 186 null, 187 WorkbenchMessages.ProductInfoDialog_errorTitle, 188 WorkbenchMessages.ProductInfoDialog_unableToOpenWebBrowser); 189 } 190 }); 191 } 192 } 193 | Popular Tags |