Integrated first version of new SWT Browser (MSIE under Windows; Mozilla under Linux)
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / views / browser / PHPBrowser.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/browser/PHPBrowser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/browser/PHPBrowser.java
new file mode 100644 (file)
index 0000000..3374fed
--- /dev/null
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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 Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.views.browser;
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.CloseWindowListener;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.swt.browser.OpenWindowListener;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.browser.ProgressListener;
+import org.eclipse.swt.browser.StatusTextEvent;
+import org.eclipse.swt.browser.StatusTextListener;
+import org.eclipse.swt.browser.TitleEvent;
+import org.eclipse.swt.browser.TitleListener;
+import org.eclipse.swt.browser.VisibilityWindowListener;
+import org.eclipse.swt.browser.WindowEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class PHPBrowser {
+  static ResourceBundle resourceBundle = ResourceBundle
+      .getBundle("net.sourceforge.phpeclipse.views.browser.browser");
+  int index;
+  boolean busy;
+  Image images[];
+  Text location;
+  Browser browser;
+  static final String[] imageLocations = {"eclipse01.bmp", "eclipse02.bmp",
+      "eclipse03.bmp", "eclipse04.bmp", "eclipse05.bmp", "eclipse06.bmp",
+      "eclipse07.bmp", "eclipse08.bmp", "eclipse09.bmp", "eclipse10.bmp",
+      "eclipse11.bmp", "eclipse12.bmp",};
+  static final String iconLocation = "document.gif";
+  /**
+   * Creates an instance of a ControlExample embedded inside the supplied
+   * parent Composite.
+   * 
+   * @param parent
+   *            the container of the example
+   */
+  public PHPBrowser(Composite parent) {
+    initResources();
+    final Display display = parent.getDisplay();
+    FormLayout layout = new FormLayout();
+    parent.setLayout(layout);
+    ToolBar toolbar = new ToolBar(parent, SWT.NONE);
+    final ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH);
+    itemBack.setText(getResourceString("Back"));
+    final ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH);
+    itemForward.setText(getResourceString("Forward"));
+    final ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH);
+    itemStop.setText(getResourceString("Stop"));
+    final ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH);
+    itemRefresh.setText(getResourceString("Refresh"));
+    final ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH);
+    itemGo.setText(getResourceString("Go"));
+    location = new Text(parent, SWT.BORDER);
+    final Canvas canvas = new Canvas(parent, SWT.NO_BACKGROUND);
+    final Rectangle rect = images[0].getBounds();
+    canvas.addListener(SWT.Paint, new Listener() {
+      public void handleEvent(Event e) {
+        Point pt = canvas.getSize();
+        e.gc.drawImage(images[index], 0, 0, rect.width, rect.height, 0, 0,
+            pt.x, pt.y);
+      }
+    });
+    canvas.addListener(SWT.MouseDown, new Listener() {
+      public void handleEvent(Event e) {
+        browser.setUrl(getResourceString("Startup"));
+      }
+    });
+    display.asyncExec(new Runnable() {
+      public void run() {
+        if (canvas.isDisposed())
+          return;
+        if (busy) {
+          index++;
+          if (index == images.length)
+            index = 0;
+          canvas.redraw();
+        }
+        display.timerExec(150, this);
+      }
+    });
+    final Label status = new Label(parent, SWT.NONE);
+    final ProgressBar progressBar = new ProgressBar(parent, SWT.NONE);
+    FormData data = new FormData();
+    data.top = new FormAttachment(0, 5);
+    toolbar.setLayoutData(data);
+    data = new FormData();
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(100, 0);
+    data.top = new FormAttachment(canvas, 5, SWT.DEFAULT);
+    data.bottom = new FormAttachment(status, -5, SWT.DEFAULT);
+    try {
+      browser = new Browser(parent, SWT.NONE);
+      browser.setLayoutData(data);
+    } catch (SWTError e) {
+      /* Browser widget could not be instantiated */
+      Label label = new Label(parent, SWT.CENTER | SWT.WRAP);
+      label.setText(getResourceString("BrowserNotCreated"));
+      label.setLayoutData(data);
+    }
+    data = new FormData();
+    data.width = 24;
+    data.height = 24;
+    data.top = new FormAttachment(0, 5);
+    data.right = new FormAttachment(100, -5);
+    canvas.setLayoutData(data);
+    data = new FormData();
+    data.top = new FormAttachment(toolbar, 0, SWT.TOP);
+    data.left = new FormAttachment(toolbar, 5, SWT.RIGHT);
+    data.right = new FormAttachment(canvas, -5, SWT.DEFAULT);
+    location.setLayoutData(data);
+    data = new FormData();
+    data.left = new FormAttachment(0, 5);
+    data.right = new FormAttachment(progressBar, 0, SWT.DEFAULT);
+    data.bottom = new FormAttachment(100, -5);
+    status.setLayoutData(data);
+    data = new FormData();
+    data.right = new FormAttachment(100, -5);
+    data.bottom = new FormAttachment(100, -5);
+    progressBar.setLayoutData(data);
+    if (browser != null) {
+      itemBack.setEnabled(browser.isBackEnabled());
+      itemForward.setEnabled(browser.isForwardEnabled());
+      Listener listener = new Listener() {
+        public void handleEvent(Event event) {
+          ToolItem item = (ToolItem) event.widget;
+          if (item == itemBack)
+            browser.back();
+          else if (item == itemForward)
+            browser.forward();
+          else if (item == itemStop)
+            browser.stop();
+          else if (item == itemRefresh)
+            browser.refresh();
+          else if (item == itemGo)
+            browser.setUrl(location.getText());
+        }
+      };
+      browser.addLocationListener(new LocationListener() {
+        public void changed(LocationEvent event) {
+          busy = true;
+          if (event.top)
+            location.setText(event.location);
+        }
+        public void changing(LocationEvent event) {
+        }
+      });
+      browser.addProgressListener(new ProgressListener() {
+        public void changed(ProgressEvent event) {
+          if (event.total == 0)
+            return;
+          int ratio = event.current * 100 / event.total;
+          progressBar.setSelection(ratio);
+          busy = event.current != event.total;
+          if (!busy) {
+            index = 0;
+            canvas.redraw();
+          }
+        }
+        public void completed(ProgressEvent event) {
+          itemBack.setEnabled(browser.isBackEnabled());
+          itemForward.setEnabled(browser.isForwardEnabled());
+          progressBar.setSelection(0);
+          busy = false;
+          index = 0;
+          canvas.redraw();
+        }
+      });
+      browser.addStatusTextListener(new StatusTextListener() {
+        public void changed(StatusTextEvent event) {
+          status.setText(event.text);
+        }
+      });
+      if (parent instanceof Shell) {
+        final Shell shell = (Shell) parent;
+        browser.addTitleListener(new TitleListener() {
+          public void changed(TitleEvent event) {
+            shell.setText(event.title + " - "
+                + getResourceString("window.title"));
+          }
+        });
+      }
+      itemBack.addListener(SWT.Selection, listener);
+      itemForward.addListener(SWT.Selection, listener);
+      itemStop.addListener(SWT.Selection, listener);
+      itemRefresh.addListener(SWT.Selection, listener);
+      itemGo.addListener(SWT.Selection, listener);
+      location.addListener(SWT.DefaultSelection, new Listener() {
+        public void handleEvent(Event e) {
+          browser.setUrl(location.getText());
+        }
+      });
+      initialize(display, browser);
+      browser.setUrl(getResourceString("Startup"));
+    }
+  }
+  /**
+   * Gets a string from the resource bundle. We don't want to crash because of
+   * a missing String. Returns the key if not found.
+   */
+  static String getResourceString(String key) {
+    try {
+      return resourceBundle.getString(key);
+    } catch (MissingResourceException e) {
+      return key;
+    } catch (NullPointerException e) {
+      return "!" + key + "!";
+    }
+  }
+  /**
+   * Gets a string from the resource bundle and binds it with the given
+   * arguments. If the key is not found, return the key.
+   */
+  static String getResourceString(String key, Object[] args) {
+    try {
+      return MessageFormat.format(getResourceString(key), args);
+    } catch (MissingResourceException e) {
+      return key;
+    } catch (NullPointerException e) {
+      return "!" + key + "!";
+    }
+  }
+  static void initialize(final Display display, Browser browser) {
+    browser.addOpenWindowListener(new OpenWindowListener() {
+      public void open(WindowEvent event) {
+        Shell shell = new Shell(display);
+        shell.setLayout(new FillLayout());
+        Browser browser = new Browser(shell, SWT.NONE);
+        initialize(display, browser);
+        event.browser = browser;
+      }
+    });
+    browser.addVisibilityWindowListener(new VisibilityWindowListener() {
+      public void hide(WindowEvent event) {
+      }
+      public void show(WindowEvent event) {
+        Browser browser = (Browser) event.widget;
+        Shell shell = browser.getShell();
+        if (event.location != null)
+          shell.setLocation(event.location);
+        if (event.size != null) {
+          Point size = event.size;
+          shell.setSize(shell.computeSize(size.x, size.y));
+        }
+        shell.open();
+      }
+    });
+    browser.addCloseWindowListener(new CloseWindowListener() {
+      public void close(WindowEvent event) {
+        Browser browser = (Browser) event.widget;
+        Shell shell = browser.getShell();
+        shell.close();
+      }
+    });
+  }
+  /**
+   * Disposes of all resources associated with a particular instance of the
+   * BrowserExample.
+   */
+  public void dispose() {
+    freeResources();
+  }
+  /**
+   * Frees the resources
+   */
+  void freeResources() {
+    if (images != null) {
+      for (int i = 0; i < images.length; ++i) {
+        final Image image = images[i];
+        if (image != null)
+          image.dispose();
+      }
+      images = null;
+    }
+  }
+  /**
+   * Grabs input focus.
+   */
+  public void setFocus() {
+    location.setFocus();
+  }
+  /**
+   * Loads the resources
+   */
+  void initResources() {
+    final Class clazz = this.getClass();
+    if (resourceBundle != null) {
+      try {
+        if (images == null) {
+          images = new Image[imageLocations.length];
+          for (int i = 0; i < imageLocations.length; ++i) {
+            ImageData source = new ImageData(clazz
+                .getResourceAsStream(imageLocations[i]));
+            ImageData mask = source.getTransparencyMask();
+            images[i] = new Image(null, source, mask);
+          }
+        }
+        return;
+      } catch (Throwable t) {
+      }
+    }
+    String error = (resourceBundle != null)
+        ? getResourceString("error.CouldNotLoadResources")
+        : "Unable to load resources";
+    freeResources();
+    throw new RuntimeException(error);
+  }
+  public static void main(String[] args) {
+    Display display = new Display();
+    Shell shell = new Shell(display);
+    shell.setLayout(new FillLayout());
+    shell.setText(getResourceString("window.title"));
+    PHPBrowser instance = new PHPBrowser(shell);
+    Image icon = new Image(display, PHPBrowser.class
+        .getResourceAsStream(iconLocation));
+    shell.setImage(icon);
+    shell.open();
+    while (!shell.isDisposed()) {
+      if (!display.readAndDispatch())
+        display.sleep();
+    }
+    icon.dispose();
+    instance.dispose();
+    display.dispose();
+  }
+}
\ No newline at end of file