intial source from http://www.sf.net/projects/wdte
[phpeclipse.git] / net.sourceforge.phpeclipse.webbrowser / src / net / sourceforge / phpeclipse / webbrowser / internal / WebBrowserUtil.java
diff --git a/net.sourceforge.phpeclipse.webbrowser/src/net/sourceforge/phpeclipse/webbrowser/internal/WebBrowserUtil.java b/net.sourceforge.phpeclipse.webbrowser/src/net/sourceforge/phpeclipse/webbrowser/internal/WebBrowserUtil.java
new file mode 100644 (file)
index 0000000..372058f
--- /dev/null
@@ -0,0 +1,377 @@
+/**
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ *    IBM - Initial API and implementation
+ */
+package net.sourceforge.phpeclipse.webbrowser.internal;
+
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.webbrowser.IExternalWebBrowser;
+import net.sourceforge.phpeclipse.webbrowser.IExternalWebBrowserWorkingCopy;
+import net.sourceforge.phpeclipse.webbrowser.IURLMap;
+import net.sourceforge.phpeclipse.webbrowser.IWebBrowser;
+
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+/**
+ * Utility class for the Web browser tooling.
+ */
+public class WebBrowserUtil {
+       private static List urlMaps;
+       private static List lockedFavorites;
+       private static List unlockedFavorites;
+       private static final String BROWSER_PACKAGE_NAME = "org.eclipse.swt.browser.Browser";
+       public static Boolean isInternalBrowserOperational;
+       
+       private static List defaultBrowsers2;
+
+       static class DefaultBrowser {
+               String name;
+               String params;
+               String executable;
+               String[] locations;
+               
+               public DefaultBrowser(String name, String executable, String params, String[] locations) {
+                       if (name == null)
+                               name = "<unknown>";
+                       else if (name.startsWith("%"))
+                               name = WebBrowserUIPlugin.getResource(name);
+
+                       this.name = name;
+                       this.executable = executable;
+                       this.params = params;
+                       this.locations = locations;
+               }
+               
+               public String toString() {
+                       String s = "Browser: " + name + ", " + executable + ", " + params + ", ";
+                       if (locations != null) {
+                               int size = locations.length;
+                               for (int i = 0; i < size; i++) {
+                                       s += locations[i] + ";";
+                               }
+                       }
+                       return s;
+               }
+       }
+
+       /**
+        * WebBrowserUtil constructor comment.
+        */
+       public WebBrowserUtil() {
+               super();
+       }
+
+       /**
+        * Returns true if we're running on Windows.
+        *
+        * @return boolean
+        */
+       public static boolean isWindows() {
+               String os = System.getProperty("os.name");
+               if (os != null && os.toLowerCase().indexOf("win") >= 0)
+                       return true;
+               else
+                       return false;
+       }
+
+       /**
+        * Returns true if we're running on linux.
+        *
+        * @return boolean
+        */
+       public static boolean isLinux() {
+               String os = System.getProperty("os.name");
+               if (os != null && os.toLowerCase().indexOf("lin") >= 0)
+                       return true;
+               else
+                       return false;
+       }
+
+       /**
+        * Open a dialog window.
+        *
+        * @param title java.lang.String
+        * @param message java.lang.String
+        */
+       public static void openError(String message) {
+               Display d = Display.getCurrent();
+               if (d == null)
+                       d = Display.getDefault();
+       
+               Shell shell = d.getActiveShell();
+               MessageDialog.openError(shell, WebBrowserUIPlugin.getResource("%errorDialogTitle"), message);
+       }
+       
+       /**
+        * Open a dialog window.
+        *
+        * @param title java.lang.String
+        * @param message java.lang.String
+        */
+       public static void openMessage(String message) {
+               Display d = Display.getCurrent();
+               if (d == null)
+                       d = Display.getDefault();
+       
+               Shell shell = d.getActiveShell();
+               MessageDialog.openInformation(shell, WebBrowserUIPlugin.getResource("%searchingTaskName"), message);
+       }
+       
+       /**
+        * Returns a List of all URL maps.
+        *
+        * @return java.util.List
+        */
+       public static List getURLMaps() {
+               if (urlMaps == null)
+                       loadURLMaps();
+               return urlMaps;
+       }
+       
+       /**
+        * Load the url map extension point.
+        */
+       private static void loadURLMaps() {
+               Trace.trace(Trace.FINEST, "->- Loading .urlMap extension point ->-");
+               IExtensionRegistry registry = Platform.getExtensionRegistry();
+               IConfigurationElement[] cf = registry.getConfigurationElementsFor(WebBrowserUIPlugin.PLUGIN_ID, "urlMap");
+
+               int size = cf.length;
+               urlMaps = new ArrayList(size);
+               for (int i = 0; i < size; i++) {
+                       try {
+                               IURLMap mapper = (IURLMap) cf[i].createExecutableExtension("class");
+                               urlMaps.add(mapper);
+                               Trace.trace(Trace.FINEST, "  Loaded url map: " + cf[i].getAttribute("id"));
+                       } catch (Throwable t) {
+                               Trace.trace(Trace.SEVERE, "  Could not load url map: " + cf[i].getAttribute("id"), t);
+                       }
+               }
+               
+               Trace.trace(Trace.FINEST, "-<- Done loading .urlMap extension point -<-");
+       }
+       
+       /**
+        * Returns a List of all unlocked favorites.
+        *
+        * @return java.util.List
+        */
+       public static List getUnlockedFavorites() {
+               if (unlockedFavorites == null)
+                       loadFavorites();
+               return unlockedFavorites;
+       }
+       
+       /**
+        * Returns a List of all locked favorites.
+        *
+        * @return java.util.List
+        */
+       public static List getLockedFavorites() {
+               if (lockedFavorites == null)
+                       loadFavorites();
+               return lockedFavorites;
+       }
+       
+       /**
+        * Load the favorites extension point.
+        */
+       private static void loadFavorites() {
+               Trace.trace(Trace.FINEST, "->- Loading .favorites extension point ->-");
+               IExtensionRegistry registry = Platform.getExtensionRegistry();
+               IConfigurationElement[] cf = registry.getConfigurationElementsFor(WebBrowserUIPlugin.PLUGIN_ID, "favorites");
+
+               int size = cf.length;
+               unlockedFavorites = new ArrayList(size);
+               lockedFavorites = new ArrayList(size);
+               for (int i = 0; i < size; i++) {
+                       try {
+                               Favorite f = new Favorite(cf[i].getAttribute("name"), cf[i].getAttribute("url"));
+                               String locked = cf[i].getAttribute("locked");
+                               if (!"true".equals(locked))
+                                       unlockedFavorites.add(f);
+                               else
+                                       lockedFavorites.add(f);
+                               Trace.trace(Trace.FINEST, "  Loaded favorite: " + cf[i].getAttribute("id"));
+                       } catch (Throwable t) {
+                               Trace.trace(Trace.SEVERE, "  Could not load favorite: " + cf[i].getAttribute("id"), t);
+                       }
+               }
+               
+               Trace.trace(Trace.FINEST, "-<- Done loading .favorites extension point -<-");
+       }
+       
+       /**
+        * Returns whether it should be possible to use the internal browser or not, based on whether or not
+        * the org.eclipse.swt.Browser class can be found/loaded. If it can it means is is supported on the platform in which
+        * this plugin is running. If not, disable the ability to use the internal browser.
+        *
+        * @return boolean
+        */
+       public static boolean canUseInternalWebBrowser() {
+               try {
+                       Class clazz = Class.forName(BROWSER_PACKAGE_NAME);
+                       if (clazz != null)
+                               return true;
+               } catch (ClassNotFoundException e) { }
+               return false;
+       }
+
+       /**
+        * This method checks to see if it can new up a new Browser. If the SWT widget can not be bound
+        * to the particular operating system it throws an SWTException. We catch that and set a boolean
+        * flag which represents whether or not we were successfully able to create a Browser instance or not.
+        * If not, don't bother adding the Internal Web Browser that uses this widget. Designed to be attemped
+        * only once and the flag set used throughout.
+        * 
+        * @return boolean
+        */
+       protected static boolean isInternalBrowserOperational() {
+               // if we have already figured this out, don't do it again.
+               if (isInternalBrowserOperational != null)
+                       return isInternalBrowserOperational.booleanValue();
+               
+               try {
+                       new Browser(new Shell(Display.getCurrent()), SWT.NONE);
+                       isInternalBrowserOperational = new Boolean(true);                                       
+               } catch (Throwable t) {
+                       WebBrowserUIPlugin.getInstance().getLog().log(new Status(IStatus.WARNING,
+                               WebBrowserUIPlugin.PLUGIN_ID, 0, "Internal browser is not operational", t));
+                       isInternalBrowserOperational = new Boolean(false);
+               }
+               return isInternalBrowserOperational.booleanValue();
+       }
+       
+       public static List getExternalBrowserPaths() {
+               List paths = new ArrayList();
+               Iterator iterator = BrowserManager.getInstance().getWebBrowsers().iterator();
+               while (iterator.hasNext()) {
+                       IWebBrowser wb = (IWebBrowser) iterator.next();
+                       if (wb instanceof IExternalWebBrowser) {
+                               IExternalWebBrowser ext = (IExternalWebBrowser) wb;
+                               paths.add(ext.getLocation().toLowerCase());
+                       }
+               }
+               return paths;
+       }
+
+       // Add any supported EXTERNAL web browsers found after an arbitrary check in specific paths
+       public static void addFoundBrowsers(List list) {
+               List paths = getExternalBrowserPaths();
+
+               Iterator iterator = getDefaultBrowsers().iterator();
+               while (iterator.hasNext()) {
+                       DefaultBrowser browser2 = (DefaultBrowser) iterator.next();
+                       if (browser2.locations != null) {
+                               int size = browser2.locations.length;
+                               for (int j = 0; j < size; j++) {
+                                       String location = browser2.locations[j];
+                                       if (!paths.contains(location.toLowerCase())) {
+                                               try {
+                                                       File f = new File(location);
+                                                       if (f.exists()) {
+                                                               ExternalWebBrowser browser = new ExternalWebBrowser();
+                                                               browser.name = browser2.name;
+                                                               browser.location = location;
+                                                               browser.parameters = browser2.params;
+                                                               list.add(browser);
+                                                               //Add browser here so that it get added to the table
+                                                               BrowserManager.getInstance().addBrowser(browser);
+                                                               j += size;
+                                                       }
+                                               } catch (Exception e) { }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Create an external Web browser if the file matches the default (known) browsers.
+        * @param file
+        * @return
+        */
+       public static IExternalWebBrowserWorkingCopy createExternalBrowser(File file) {
+               if (file == null || !file.isFile())
+                       return null;
+               
+               String executable = file.getName();
+               Iterator iterator = getDefaultBrowsers().iterator();
+               while (iterator.hasNext()) {
+                       DefaultBrowser db = (DefaultBrowser) iterator.next();
+                       if (executable.equals(db.executable)) {
+                               IExternalWebBrowserWorkingCopy browser = BrowserManager.getInstance().createExternalWebBrowser();
+                               browser.setName(db.name);
+                               browser.setLocation(file.getAbsolutePath());
+                               browser.setParameters(db.params);
+                               return browser;
+                       }
+               }
+               
+               return null;
+       }
+
+       protected static List getDefaultBrowsers() {
+               if (defaultBrowsers2 != null)
+                       return defaultBrowsers2;
+               
+               Reader reader = null;
+               defaultBrowsers2 = new ArrayList();
+               try {
+                       URL url = WebBrowserUIPlugin.getInstance().getBundle().getEntry("defaultBrowsers.xml");
+                       URL url2 = Platform.resolve(url);
+                       reader = new InputStreamReader(url2.openStream());
+                       IMemento memento = XMLMemento.createReadRoot(reader);
+                       IMemento[] children = memento.getChildren("browser");
+                       if (children != null) {
+                               int size = children.length;
+                               for (int i = 0; i < size; i++) {
+                                       IMemento child = children[i];
+                                       String name = child.getString("name");
+                                       String executable = child.getString("executable");
+                                       String params = child.getString("params");
+                                       List locations = new ArrayList();
+                                       
+                                       IMemento[] locat = child.getChildren("location");
+                                       if (locat != null) {
+                                               int size2 = locat.length;
+                                               for (int j = 0; j < size2; j++)
+                                                       locations.add(locat[j].getTextData());
+                                       }
+                                       
+                                       String[] loc = new String[locations.size()];
+                                       locations.toArray(loc);
+                                       DefaultBrowser db = new DefaultBrowser(name, executable, params, loc);
+                                       Trace.trace(Trace.CONFIG, "Default browser: " + db);
+                                       defaultBrowsers2.add(db);
+                               }
+                       }
+               } catch (Exception e) {
+                       Trace.trace(Trace.SEVERE, "Error loading default browsers", e);
+               } finally {
+                       try {
+                               reader.close();
+                       } catch (Exception e) { }
+               }
+               return defaultBrowsers2;
+       }
+}
\ No newline at end of file