unification of bug fixes 1198893, 1404228
[phpeclipse.git] / net.sourceforge.phpeclipse.webbrowser / src / net / sourceforge / phpeclipse / webbrowser / internal / WebBrowser.java
index 829d813..1556311 100644 (file)
 /**
- * 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
+ * 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
  */
 
 //TODO 1. Handle the sizing of a popup running in shelled out secondary window.
 //TODO 2. Support printing: waiting on eclipse bug 47937/44823.
-
 package net.sourceforge.phpeclipse.webbrowser.internal;
 
-import java.util.*;
+import java.util.Iterator;
 
 import net.sourceforge.phpeclipse.webbrowser.IURLMap;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
+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.WindowEvent;
 import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.*;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.swt.browser.*;
 
 public class WebBrowser extends Composite {
-       protected Composite toolbarComp;
-       protected Composite statusComp;
-       protected Combo combo;
-       protected Clipboard clipboard;
-       protected boolean showToolbar;
-       protected ToolItem back;
-       protected ToolItem forward;
-       protected ToolItem stop;
-       protected ToolItem favorites;
-       protected ToolItem refresh;
-       protected BusyIndicator busy;
-       protected boolean showStatusbar;
-       protected ProgressBar progress;
-       protected Label status;
-       private static int MAX_HISTORY = 50;
-       protected static java.util.List history;
-       protected Browser browser; 
-       protected Shell shell;
-       protected WebBrowserEditor editor;
-       protected String title;
-       
-       public WebBrowser(Composite parent, final boolean showToolbar, final boolean showStatusbar) {
-               super(parent, SWT.NONE);
-
-               this.showToolbar = showToolbar;
-               this.showStatusbar = showStatusbar;     
-
-               GridLayout layout = new GridLayout();
-               layout.marginHeight = 3;
-               layout.marginWidth = 3;
-               layout.horizontalSpacing = 3;
-               layout.verticalSpacing = 3;
-               layout.numColumns = 1;
-               setLayout(layout);
-               setLayoutData(new GridData(GridData.FILL_BOTH));
-               clipboard = new Clipboard(parent.getDisplay());
-               WorkbenchHelp.setHelp(this, ContextIds.WEB_BROWSER);
-               
-               if (showToolbar) {
-                       toolbarComp = new Composite(this, SWT.NONE);
-                       GridLayout outerLayout = new GridLayout();
-                       outerLayout.numColumns = 2;
-                       outerLayout.marginWidth = 0;
-                       outerLayout.marginHeight = 0;
-                       toolbarComp.setLayout(outerLayout);
-                       toolbarComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
-                       
-                       // create the top line, with a combo box for history and a "go" button
-                       Composite top = new Composite(toolbarComp, SWT.NONE);
-                       GridLayout topLayout = new GridLayout();
-                       topLayout.numColumns = 2;
-                       topLayout.marginWidth = 0;
-                       topLayout.marginHeight = 0;
-                       top.setLayout(topLayout);
-                       top.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.FILL_HORIZONTAL));
-                       
-                       combo = new Combo(top, SWT.DROP_DOWN);
-                       
-                       updateHistory();
-                       
-                       combo.addSelectionListener(new SelectionAdapter() {
-                               public void widgetSelected(SelectionEvent we) {
-                                       try {
-                                               if (combo.getSelectionIndex() != -1)
-                                                       setURL(combo.getItem(combo.getSelectionIndex()));
-                                       } catch (Exception e) { }
-                               }
-                       });
-                       combo.addListener(SWT.DefaultSelection, new Listener() {
-                               public void handleEvent(Event e) {
-                                       setURL(combo.getText());
-                               }
-                       });
-                       combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-                       WorkbenchHelp.setHelp(combo, ContextIds.WEB_BROWSER_URL);
-                       
-                       ToolBar toolbar = new ToolBar(top, SWT.FLAT);
-                       fillToolBar(toolbar);
-                       
-                       new ToolItem(toolbar, SWT.SEPARATOR);
-                       
-                       busy = new BusyIndicator(toolbarComp, SWT.NONE);
-                       busy.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-               }
-
-               // create a new SWT Web browser widget, checking once again to make sure we can use it in this environment
-               if (WebBrowserUtil.canUseInternalWebBrowser() & WebBrowserUtil.isInternalBrowserOperational())
-                       this.browser = new Browser(this, SWT.NONE);
-               else {
-                       WebBrowserUtil.openError(WebBrowserUIPlugin.getResource("%errorCouldNotLaunchInternalWebBrowser"));
-                       return;
-               }
-               
-               if (showToolbar) {
-                       back.setEnabled(browser.isBackEnabled());
-                       forward.setEnabled(browser.isForwardEnabled());
-               }
-
-               WorkbenchHelp.setHelp(browser, ContextIds.WEB_BROWSER_WEB);
-               GridData data = new GridData();
-               data.horizontalAlignment = GridData.FILL;
-               data.verticalAlignment = GridData.FILL;
-               data.horizontalSpan = 3;
-               data.grabExcessHorizontalSpace = true;
-               data.grabExcessVerticalSpace = true;
-               browser.setLayoutData(data);
-               
-               if (showStatusbar)
-                       createStatusArea(this);
-               
-               addBrowserListeners();
-       }
-       /**
-        *
-        */
-       protected void addBrowserListeners() {  
-               if (showStatusbar) {
-                       // respond to Browser StatusTextEvents events by updating the status Text label
-                       browser.addStatusTextListener(new StatusTextListener() {
-                               public void changed(StatusTextEvent event) {
-                                       status.setText(event.text);     
-                               }
-                       });
-               }
-
-               /** Add listener for new window creation so that we can instead of opening a separate
-                *  new window in which the session is lost, we can instead open a new window in a new
-                *  shell within the browser area thereby maintaining the session.
-                */
-               browser.addOpenWindowListener(new OpenWindowListener() {
-                       public void open(WindowEvent event) {
-                               Shell shell2 = new Shell(getDisplay());
-                               shell2.setLayout(new FillLayout());
-                               shell2.setText(WebBrowserUIPlugin.getResource("%viewWebBrowserTitle"));
-                               shell2.setImage(getShell().getImage());
-                               WebBrowser browser2 = new WebBrowser(shell2, showToolbar, showStatusbar);
-                               browser2.shell = shell2;
-                               event.browser = browser2.browser;
-                               shell2.open();
-                       }
-               });
-               
-               browser.addCloseWindowListener(new CloseWindowListener(){
-                       public void close(WindowEvent event) {
-                               // if shell is not null, it must be a secondary popup window, else its an editor window
-                               if (shell != null)
-                                       shell.dispose();
-                               else
-                                       editor.closeEditor();
-                       }
-               });
-               
-               browser.addProgressListener(new ProgressListener() {
-                       public void changed(ProgressEvent event) {
-                               if (event.total == 0)
-                                       return;
-                               
-                               boolean done = (event.current == event.total);
-
-                               int percentProgress = event.current * 100 / event.total;
-                               if (showStatusbar) {
-                                       if (done)
-                                               progress.setSelection(0);
-                                       else
-                                               progress.setSelection(percentProgress);
-                               }
-                               
-                               if (showToolbar) {
-                                       if (!busy.isBusy() && (percentProgress > 0 && percentProgress < 100)) {
-                                               busy.setBusy(true);
-                                       }
-                                       // Once the progress hits 100 percent, done, set busy to false
-                                       else if (busy.isBusy() && done) {
-                                               busy.setBusy(false);
-                                       }
-                               }
-                       }
-                       
-                       public void completed(ProgressEvent event) {
-                               if (showStatusbar)
-                                       progress.setSelection(0);
-                               if (showToolbar) {
-                                       busy.setBusy(false);
-                                       back.setEnabled(browser.isBackEnabled());
-                                       forward.setEnabled(browser.isForwardEnabled());
-                               }
-                       }
-               });
-
-               if (showToolbar) {
-                       browser.addLocationListener(new LocationListener() {
-                               public void changed(LocationEvent event) {
-                                       if (!event.top)
-                                               return;
-                                       if (!isHome()) {
-                                               combo.setText(event.location);
-                                               addToHistory(event.location);
-                                               updateHistory();
-                                       } else
-                                               combo.setText("");
-                               }
-                               
-                               public void changing(LocationEvent event) { }
-                       });
-               }
-               
-               browser.addTitleListener(new TitleListener() {
-                       public void changed(TitleEvent event) {
-                               title = event.title;
-                       }
-               });
-       }
-
-       /**
-        * Return the underlying browser control.
-        * 
-        * @return org.eclipse.swt.browser.Browser
-        */
-       public Browser getBrowser() {
-               return browser;
-       }
-
-       /**
-        * 
-        */
-       protected void forward() {
-               browser.forward();
-       }
-
-       /**
-        * 
-        */
-       protected void back() {
-               browser.back();
-       }
-       
-       /**
-        * 
-        */
-       protected void stop() {
-               browser.stop();
-       }
-
-       /**
-        * 
-        */
-       protected void navigate(String url) {
-               Trace.trace(Trace.FINER, "Navigate: " + url);
-               if (url != null && url.equals(getURL())) {
-                       refresh();
-                       return;
-               }
-               browser.setUrl(url);
-       }
-
-       /**
-        * Refresh the currently viewed page.
-        */
-       public void refresh() {
-               browser.refresh();
-       }
-
-       protected void setURL(String url, boolean browse) {
-               Trace.trace(Trace.FINEST, "setURL: " + url + " " + browse);
-               if (url == null) {
-                       home();
-                       return;
-               }
-               
-               if (url.endsWith(WebBrowserPreference.getHomePageURL().substring(9)))
-                       return;
-
-               // check URL maps
-               Iterator iterator = WebBrowserUtil.getURLMaps().iterator();
-               String newURL = null;
-               while (iterator.hasNext() && newURL == null) {
-                       try {
-                               IURLMap map = (IURLMap) iterator.next();
-                               newURL = map.getMappedURL(url);
-                       } catch (Exception e) { }
-               }
-               if (newURL != null)
-                       url = newURL;
-               
-               if (browse)
-                       navigate(url);
-               
-               addToHistory(url);
-               updateHistory();
-       }
-
-       protected void addToHistory(String url) {
-               if (history == null)
-                       history = WebBrowserPreference.getInternalWebBrowserHistory();
-               int found = -1;
-               int size = history.size();
-               for (int i = 0; i < size; i++){
-                       String s = (String) history.get(i);
-                       if (s.equals(url)) {
-                               found = i;
-                               break;
-                       }
-               }
-               
-               if (found == -1) {
-                       if (size >= MAX_HISTORY)
-                               history.remove(size - 1);
-                       history.add(0, url);
-                       WebBrowserPreference.setInternalWebBrowserHistory(history);
-               } else if (found != 0) {
-                       history.remove(found);
-                       history.add(0, url);
-                       WebBrowserPreference.setInternalWebBrowserHistory(history);
-               }
-       }
-
-       public void setURL(String url) {
-               setURL(url, true);
-       }
-       
-       /**
-        * Creates the Web browser status area.
-        */
-       private void createStatusArea(Composite parent) {
-               Composite composite = new Composite(parent, SWT.NONE);
-               GridLayout layout = new GridLayout();
-               layout.numColumns = 2;
-               layout.marginHeight = 0;
-               layout.marginWidth = 0;
-               layout.horizontalSpacing = 4;
-               layout.verticalSpacing = 0;
-               composite.setLayout(layout);
-               composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-       
-               // Add a label for displaying status messages as they are received from the control
-               status = new Label(composite, SWT.SINGLE | SWT.READ_ONLY);
-               GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
-               gridData.horizontalIndent = 2;
-               status.setLayoutData(gridData);
-       
-               // Add a progress bar to display downloading progress information
-               progress = new ProgressBar(composite, SWT.BORDER);
-               gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_FILL);
-               gridData.widthHint = 100;
-               gridData.heightHint = 10;
-               progress.setLayoutData(gridData);
-       }
-       
-       /**
-        *
-        */
-       public void dispose() {
-               super.dispose();
-
-               showStatusbar = false;
-               showToolbar = false;
-       
-               if (busy != null)
-                       busy.dispose();
-               busy = null;
-
-               browser = null;
-       }
-       
-       /**
-        * Populate the toolbar.
-        * @param toolbar org.eclipse.swt.widgets.ToolBar
-        */
-       private void fillToolBar(final ToolBar toolbar) {
-               ToolItem go = new ToolItem(toolbar, SWT.NONE);
-               go.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_GO));
-               go.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_GO));
-               go.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_GO));
-               go.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserGo"));
-               go.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               setURL(combo.getText());
-                       }
-               });
-       
-               new ToolItem(toolbar, SWT.SEPARATOR);
-               
-               favorites = new ToolItem(toolbar, SWT.DROP_DOWN);
-               favorites.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_FAVORITES));
-               favorites.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_FAVORITES));
-               favorites.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_FAVORITES));
-               favorites.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserFavorites"));
-               
-               favorites.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               if (event.detail == SWT.ARROW) {
-                                       Rectangle r = favorites.getBounds();
-                                       showFavorites(toolbar, toolbar.toDisplay(r.x, r.y + r.height));
-                               } else
-                                       addFavorite();
-                       }
-               });
-       
-               // create back and forward actions
-               back = new ToolItem(toolbar, SWT.NONE);
-               back.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_BACKWARD));
-               back.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_BACKWARD));
-               back.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_BACKWARD));
-               back.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserBack"));
-               back.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               back();
-                       }
-               });
-
-               forward = new ToolItem(toolbar, SWT.NONE);
-               forward.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_FORWARD));
-               forward.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_FORWARD));
-               forward.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_FORWARD));
-               forward.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserForward"));
-               forward.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               forward();
-                       }
-               });
-               
-               // create refresh, stop, and print actions
-               stop = new ToolItem(toolbar, SWT.NONE);
-               stop.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_STOP));
-               stop.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_STOP));
-               stop.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_STOP));
-               stop.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserStop"));
-               stop.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               stop();
-                       }
-               });
-       
-               refresh = new ToolItem(toolbar, SWT.NONE);
-               refresh.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_REFRESH));
-               refresh.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_REFRESH));
-               refresh.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_REFRESH));
-               refresh.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserRefresh"));
-               refresh.addSelectionListener(new SelectionAdapter() {
-                       public void widgetSelected(SelectionEvent event) {
-                               refresh();
-                       }
-               });
-       }
-       
-       protected void addFavorite() {
-               java.util.List list = WebBrowserPreference.getInternalWebBrowserFavorites();
-               Favorite f = new Favorite(title, browser.getUrl());
-               if (!list.contains(f)) {
-                       list.add(f);
-                       WebBrowserPreference.setInternalWebBrowserFavorites(list);
-               }
-       }
-       
-       protected void showFavorites(Control parent, Point p) {
-               Menu perspectiveBarMenu = null;
-               if (perspectiveBarMenu == null) {
-                       Menu menu = new Menu(parent);
-                       
-                       // locked favorites
-                       Iterator iterator = WebBrowserUtil.getLockedFavorites().iterator();
-                       if (iterator.hasNext()) {
-                               while (iterator.hasNext()) {
-                                       final Favorite f = (Favorite) iterator.next();
-                                       MenuItem item = new MenuItem(menu, SWT.NONE);
-                                       item.setText(f.getName());
-                                       item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-                                       item.addSelectionListener(new SelectionAdapter() {
-                                               public void widgetSelected(SelectionEvent event) {
-                                                       setURL(f.getURL());
-                                               }
-                                       });
-                               }
-                               
-                               new MenuItem(menu, SWT.SEPARATOR);
-                       }
-                       
-                       iterator = WebBrowserPreference.getInternalWebBrowserFavorites().iterator();
-                       if (!iterator.hasNext()) {
-                               MenuItem item = new MenuItem(menu, SWT.NONE);
-                               item.setText(WebBrowserUIPlugin.getResource("%actionWebBrowserNoFavorites"));
-                       }
-                       while (iterator.hasNext()) {
-                               final Favorite f = (Favorite) iterator.next();
-                               MenuItem item = new MenuItem(menu, SWT.NONE);
-                               item.setText(f.getName());
-                               item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-                               item.addSelectionListener(new SelectionAdapter() {
-                                       public void widgetSelected(SelectionEvent event) {
-                                               setURL(f.getURL());
-                                       }
-                               });
-                       }
-                       
-                       new MenuItem(menu, SWT.SEPARATOR);
-       
-                       MenuItem item = new MenuItem(menu, SWT.NONE);
-                       item.setText(WebBrowserUIPlugin.getResource("%actionWebBrowserOrganizeFavorites"));
-                       item.addSelectionListener(new SelectionAdapter() {
-                               public void widgetSelected(SelectionEvent event) {
-                                       OrganizeFavoritesDialog dialog = new OrganizeFavoritesDialog(shell);
-                                       dialog.open();
-                               }
-                       });
-                       
-                       perspectiveBarMenu = menu;
-               }
-               
-               if (perspectiveBarMenu != null) {
-                       perspectiveBarMenu.setLocation(p.x, p.y);
-                       perspectiveBarMenu.setVisible(true);
-               }
-       }
-
-       public void home() {
-          navigate(WebBrowserPreference.getHomePageURL());
-       }
-
-       /**
-        * Returns true if the homepage is currently being displayed.
-        * @return boolean
-        */
-       protected boolean isHome() {
-               return getURL() != null && getURL().endsWith(WebBrowserPreference.getHomePageURL().substring(9));
-       }
-
-       protected String getURL() {
-               return browser.getUrl();
-       }
-
-       /**
-        * Update the history list to the global copy.
-        */
-       protected void updateHistory() {
-               if (combo == null)
-                       return;
-       
-               String temp = combo.getText();
-               if (history == null)
-                       history = WebBrowserPreference.getInternalWebBrowserHistory();
-       
-               String[] historyList = new String[history.size()];
-               history.toArray(historyList);
-               combo.setItems(historyList);
-       
-               combo.setText(temp);
-       }
+  protected Composite toolbarComp;
+
+  protected Composite statusComp;
+
+  protected Combo combo;
+
+  protected Clipboard clipboard;
+
+  protected boolean showToolbar;
+
+  protected ToolItem back;
+
+  protected ToolItem forward;
+
+  protected ToolItem stop;
+
+  protected ToolItem favorites;
+
+  protected ToolItem refresh;
+
+  protected BusyIndicator busy;
+
+  protected boolean showStatusbar;
+
+  protected ProgressBar progress;
+
+  protected Label status;
+
+  private static int MAX_HISTORY = 50;
+
+  protected static java.util.List history;
+
+  protected Browser browser;
+
+  protected Shell shell;
+
+  protected WebBrowserEditor editor;
+
+  protected String title;
+
+  public WebBrowser(Composite parent, final boolean showToolbar, final boolean showStatusbar) {
+    super(parent, SWT.NONE);
+
+    this.showToolbar = showToolbar;
+    this.showStatusbar = showStatusbar;
+
+    GridLayout layout = new GridLayout();
+    layout.marginHeight = 3;
+    layout.marginWidth = 3;
+    layout.horizontalSpacing = 3;
+    layout.verticalSpacing = 3;
+    layout.numColumns = 1;
+    setLayout(layout);
+    setLayoutData(new GridData(GridData.FILL_BOTH));
+    clipboard = new Clipboard(parent.getDisplay());
+    WorkbenchHelp.setHelp(this, ContextIds.WEB_BROWSER);
+
+    if (showToolbar) {
+      toolbarComp = new Composite(this, SWT.NONE);
+      GridLayout outerLayout = new GridLayout();
+      outerLayout.numColumns = 2;
+      outerLayout.marginWidth = 0;
+      outerLayout.marginHeight = 0;
+      toolbarComp.setLayout(outerLayout);
+      toolbarComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
+
+      // create the top line, with a combo box for history and a "go" button
+      Composite top = new Composite(toolbarComp, SWT.NONE);
+      GridLayout topLayout = new GridLayout();
+      topLayout.numColumns = 2;
+      topLayout.marginWidth = 0;
+      topLayout.marginHeight = 0;
+      top.setLayout(topLayout);
+      top.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.FILL_HORIZONTAL));
+
+      combo = new Combo(top, SWT.DROP_DOWN);
+
+      updateHistory();
+
+      combo.addSelectionListener(new SelectionAdapter() {
+        public void widgetSelected(SelectionEvent we) {
+          try {
+            if (combo.getSelectionIndex() != -1)
+              setURL(combo.getItem(combo.getSelectionIndex()));
+          } catch (Exception e) {
+          }
+        }
+      });
+      combo.addListener(SWT.DefaultSelection, new Listener() {
+        public void handleEvent(Event e) {
+          setURL(combo.getText());
+        }
+      });
+      combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+      WorkbenchHelp.setHelp(combo, ContextIds.WEB_BROWSER_URL);
+
+      ToolBar toolbar = new ToolBar(top, SWT.FLAT);
+      fillToolBar(toolbar);
+
+      new ToolItem(toolbar, SWT.SEPARATOR);
+
+      busy = new BusyIndicator(toolbarComp, SWT.NONE);
+      busy.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+    }
+
+    // create a new SWT Web browser widget, checking once again to make sure we can use it in this environment
+//    if (WebBrowserUtil.canUseInternalWebBrowser() & WebBrowserUtil.isInternalBrowserOperational())
+    if (WebBrowserUtil.isInternalBrowserOperational())
+      this.browser = new Browser(this, SWT.NONE);
+    else {
+      WebBrowserUtil.openError(WebBrowserUIPlugin.getResource("%errorCouldNotLaunchInternalWebBrowser"));
+      return;
+    }
+
+    if (showToolbar) {
+      back.setEnabled(browser.isBackEnabled());
+      forward.setEnabled(browser.isForwardEnabled());
+    }
+
+    WorkbenchHelp.setHelp(browser, ContextIds.WEB_BROWSER_WEB);
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalSpan = 3;
+    data.grabExcessHorizontalSpace = true;
+    data.grabExcessVerticalSpace = true;
+    browser.setLayoutData(data);
+
+    if (showStatusbar)
+      createStatusArea(this);
+
+    addBrowserListeners();
+  }
+
+  /**
+   *
+   */
+  protected void addBrowserListeners() {
+    if (showStatusbar) {
+      // respond to Browser StatusTextEvents events by updating the status Text label
+      browser.addStatusTextListener(new StatusTextListener() {
+        public void changed(StatusTextEvent event) {
+          status.setText(event.text);
+        }
+      });
+    }
+
+    /**
+     * Add listener for new window creation so that we can instead of opening a separate new window in which the session is lost, we
+     * can instead open a new window in a new shell within the browser area thereby maintaining the session.
+     */
+    browser.addOpenWindowListener(new OpenWindowListener() {
+      public void open(WindowEvent event) {
+        Shell shell2 = new Shell(getDisplay());
+        shell2.setLayout(new FillLayout());
+        shell2.setText(WebBrowserUIPlugin.getResource("%viewWebBrowserTitle"));
+        shell2.setImage(getShell().getImage());
+        WebBrowser browser2 = new WebBrowser(shell2, showToolbar, showStatusbar);
+        browser2.shell = shell2;
+        event.browser = browser2.browser;
+        shell2.open();
+      }
+    });
+
+    browser.addCloseWindowListener(new CloseWindowListener() {
+      public void close(WindowEvent event) {
+        // if shell is not null, it must be a secondary popup window, else its an editor window
+        if (shell != null)
+          shell.dispose();
+        else
+          editor.closeEditor();
+      }
+    });
+
+    browser.addProgressListener(new ProgressListener() {
+      public void changed(ProgressEvent event) {
+        if (event.total == 0)
+          return;
+
+        boolean done = (event.current == event.total);
+
+        int percentProgress = event.current * 100 / event.total;
+        if (showStatusbar) {
+          if (done)
+            progress.setSelection(0);
+          else
+            progress.setSelection(percentProgress);
+        }
+
+        if (showToolbar) {
+          if (!busy.isBusy() && (percentProgress > 0 && percentProgress < 100)) {
+            busy.setBusy(true);
+          }
+          // Once the progress hits 100 percent, done, set busy to false
+          else if (busy.isBusy() && done) {
+            busy.setBusy(false);
+          }
+        }
+      }
+
+      public void completed(ProgressEvent event) {
+        if (showStatusbar)
+          progress.setSelection(0);
+        if (showToolbar) {
+          busy.setBusy(false);
+          back.setEnabled(browser.isBackEnabled());
+          forward.setEnabled(browser.isForwardEnabled());
+        }
+      }
+    });
+
+    if (showToolbar) {
+      browser.addLocationListener(new LocationListener() {
+        public void changed(LocationEvent event) {
+          if (!event.top)
+            return;
+          if (!isHome()) {
+            combo.setText(event.location);
+            addToHistory(event.location);
+            updateHistory();
+          } else
+            combo.setText("");
+        }
+
+        public void changing(LocationEvent event) {
+        }
+      });
+    }
+
+    browser.addTitleListener(new TitleListener() {
+      public void changed(TitleEvent event) {
+        title = event.title;
+      }
+    });
+  }
+
+  /**
+   * Return the underlying browser control.
+   *
+   * @return org.eclipse.swt.browser.Browser
+   */
+  public Browser getBrowser() {
+    return browser;
+  }
+
+  /**
+   *
+   */
+  protected void forward() {
+    browser.forward();
+  }
+
+  /**
+   *
+   */
+  protected void back() {
+    browser.back();
+  }
+
+  /**
+   *
+   */
+  protected void stop() {
+    browser.stop();
+  }
+
+  /**
+   *
+   */
+  protected void navigate(String url) {
+    Trace.trace(Trace.FINER, "Navigate: " + url);
+    if (url != null && url.equals(getURL())) {
+      refresh();
+      return;
+    }
+    browser.setUrl(url);
+  }
+
+  /**
+   * Refresh the currently viewed page.
+   */
+  public void refresh() {
+    browser.refresh();
+  }
+
+  protected void setURL(String url, boolean browse) {
+    Trace.trace(Trace.FINEST, "setURL: " + url + " " + browse);
+    if (url == null) {
+      home();
+      return;
+    }
+
+    if (url.endsWith(WebBrowserPreference.getHomePageURL().substring(9)))
+      return;
+
+    // check URL maps
+    Iterator iterator = WebBrowserUtil.getURLMaps().iterator();
+    String newURL = null;
+    while (iterator.hasNext() && newURL == null) {
+      try {
+        IURLMap map = (IURLMap) iterator.next();
+        newURL = map.getMappedURL(url);
+      } catch (Exception e) {
+      }
+    }
+    if (newURL != null)
+      url = newURL;
+
+    if (browse)
+      navigate(url);
+
+    addToHistory(url);
+    updateHistory();
+  }
+
+  protected void addToHistory(String url) {
+    if (history == null)
+      history = WebBrowserPreference.getInternalWebBrowserHistory();
+    int found = -1;
+    int size = history.size();
+    for (int i = 0; i < size; i++) {
+      String s = (String) history.get(i);
+      if (s.equals(url)) {
+        found = i;
+        break;
+      }
+    }
+
+    if (found == -1) {
+      if (size >= MAX_HISTORY)
+        history.remove(size - 1);
+      history.add(0, url);
+      WebBrowserPreference.setInternalWebBrowserHistory(history);
+    } else if (found != 0) {
+      history.remove(found);
+      history.add(0, url);
+      WebBrowserPreference.setInternalWebBrowserHistory(history);
+    }
+  }
+
+  public void setURL(String url) {
+    setURL(url, true);
+  }
+
+  /**
+   * Creates the Web browser status area.
+   */
+  private void createStatusArea(Composite parent) {
+    Composite composite = new Composite(parent, SWT.NONE);
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 2;
+    layout.marginHeight = 0;
+    layout.marginWidth = 0;
+    layout.horizontalSpacing = 4;
+    layout.verticalSpacing = 0;
+    composite.setLayout(layout);
+    composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+    // Add a label for displaying status messages as they are received from the control
+    status = new Label(composite, SWT.SINGLE | SWT.READ_ONLY);
+    GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+    gridData.horizontalIndent = 2;
+    status.setLayoutData(gridData);
+
+    // Add a progress bar to display downloading progress information
+    progress = new ProgressBar(composite, SWT.BORDER);
+    gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_FILL);
+    gridData.widthHint = 100;
+    gridData.heightHint = 10;
+    progress.setLayoutData(gridData);
+  }
+
+  /**
+   *
+   */
+  public void dispose() {
+    super.dispose();
+
+    showStatusbar = false;
+    showToolbar = false;
+
+    if (busy != null)
+      busy.dispose();
+    busy = null;
+
+    browser = null;
+  }
+
+  /**
+   * Populate the toolbar.
+   *
+   * @param toolbar
+   *          org.eclipse.swt.widgets.ToolBar
+   */
+  private void fillToolBar(final ToolBar toolbar) {
+    ToolItem go = new ToolItem(toolbar, SWT.NONE);
+    go.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_GO));
+    go.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_GO));
+    go.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_GO));
+    go.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserGo"));
+    go.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        setURL(combo.getText());
+      }
+    });
+
+    new ToolItem(toolbar, SWT.SEPARATOR);
+
+    favorites = new ToolItem(toolbar, SWT.DROP_DOWN);
+    favorites.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_FAVORITES));
+    favorites.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_FAVORITES));
+    favorites.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_FAVORITES));
+    favorites.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserFavorites"));
+
+    favorites.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        if (event.detail == SWT.ARROW) {
+          Rectangle r = favorites.getBounds();
+          showFavorites(toolbar, toolbar.toDisplay(r.x, r.y + r.height));
+        } else
+          addFavorite();
+      }
+    });
+
+    // create back and forward actions
+    back = new ToolItem(toolbar, SWT.NONE);
+    back.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_BACKWARD));
+    back.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_BACKWARD));
+    back.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_BACKWARD));
+    back.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserBack"));
+    back.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        back();
+      }
+    });
+
+    forward = new ToolItem(toolbar, SWT.NONE);
+    forward.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_FORWARD));
+    forward.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_FORWARD));
+    forward.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_FORWARD));
+    forward.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserForward"));
+    forward.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        forward();
+      }
+    });
+
+    // create refresh, stop, and print actions
+    stop = new ToolItem(toolbar, SWT.NONE);
+    stop.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_STOP));
+    stop.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_STOP));
+    stop.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_STOP));
+    stop.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserStop"));
+    stop.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        stop();
+      }
+    });
+
+    refresh = new ToolItem(toolbar, SWT.NONE);
+    refresh.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_REFRESH));
+    refresh.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_REFRESH));
+    refresh.setDisabledImage(ImageResource.getImage(ImageResource.IMG_DLCL_NAV_REFRESH));
+    refresh.setToolTipText(WebBrowserUIPlugin.getResource("%actionWebBrowserRefresh"));
+    refresh.addSelectionListener(new SelectionAdapter() {
+      public void widgetSelected(SelectionEvent event) {
+        refresh();
+      }
+    });
+  }
+
+  protected void addFavorite() {
+    java.util.List list = WebBrowserPreference.getInternalWebBrowserFavorites();
+    Favorite f = new Favorite(title, browser.getUrl());
+    if (!list.contains(f)) {
+      list.add(f);
+      WebBrowserPreference.setInternalWebBrowserFavorites(list);
+    }
+  }
+
+  protected void showFavorites(Control parent, Point p) {
+    Menu perspectiveBarMenu = null;
+    if (perspectiveBarMenu == null) {
+      Menu menu = new Menu(parent);
+
+      // locked favorites
+      Iterator iterator = WebBrowserUtil.getLockedFavorites().iterator();
+      if (iterator.hasNext()) {
+        while (iterator.hasNext()) {
+          final Favorite f = (Favorite) iterator.next();
+          MenuItem item = new MenuItem(menu, SWT.NONE);
+          item.setText(f.getName());
+          item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
+          item.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+              setURL(f.getURL());
+            }
+          });
+        }
+
+        new MenuItem(menu, SWT.SEPARATOR);
+      }
+
+      iterator = WebBrowserPreference.getInternalWebBrowserFavorites().iterator();
+      if (!iterator.hasNext()) {
+        MenuItem item = new MenuItem(menu, SWT.NONE);
+        item.setText(WebBrowserUIPlugin.getResource("%actionWebBrowserNoFavorites"));
+      }
+      while (iterator.hasNext()) {
+        final Favorite f = (Favorite) iterator.next();
+        MenuItem item = new MenuItem(menu, SWT.NONE);
+        item.setText(f.getName());
+        item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
+        item.addSelectionListener(new SelectionAdapter() {
+          public void widgetSelected(SelectionEvent event) {
+            setURL(f.getURL());
+          }
+        });
+      }
+
+      new MenuItem(menu, SWT.SEPARATOR);
+
+      MenuItem item = new MenuItem(menu, SWT.NONE);
+      item.setText(WebBrowserUIPlugin.getResource("%actionWebBrowserOrganizeFavorites"));
+      item.addSelectionListener(new SelectionAdapter() {
+        public void widgetSelected(SelectionEvent event) {
+          OrganizeFavoritesDialog dialog = new OrganizeFavoritesDialog(shell);
+          dialog.open();
+        }
+      });
+
+      perspectiveBarMenu = menu;
+    }
+
+    if (perspectiveBarMenu != null) {
+      perspectiveBarMenu.setLocation(p.x, p.y);
+      perspectiveBarMenu.setVisible(true);
+    }
+  }
+
+  public void home() {
+    navigate(WebBrowserPreference.getHomePageURL());
+  }
+
+  /**
+   * Returns true if the homepage is currently being displayed.
+   *
+   * @return boolean
+   */
+  protected boolean isHome() {
+    return getURL() != null && getURL().endsWith(WebBrowserPreference.getHomePageURL().substring(9));
+  }
+
+  protected String getURL() {
+    return browser.getUrl();
+  }
+
+  /**
+   * Update the history list to the global copy.
+   */
+  protected void updateHistory() {
+    if (combo == null)
+      return;
+
+    String temp = combo.getText();
+    if (history == null)
+      history = WebBrowserPreference.getInternalWebBrowserHistory();
+
+    String[] historyList = new String[history.size()];
+    history.toArray(historyList);
+    combo.setItems(historyList);
+
+    combo.setText(temp);
+  }
+
+  public void addProgressListener(ProgressListener listener) {
+    browser.addProgressListener(listener);
+  }
+
+  public void addStatusTextListener(StatusTextListener listener) {
+    browser.addStatusTextListener(listener);
+  }
+
+  public void addTitleListener(TitleListener listener) {
+    browser.addTitleListener(listener);
+  }
 }
\ No newline at end of file