Merging code from trunk that fixes #774, this work was done by incastrix
[phpeclipse.git] / net.sourceforge.phpeclipse.webbrowser / src / net / sourceforge / phpeclipse / webbrowser / views / BrowserView.java
index 8edbbc5..bb4c837 100644 (file)
  *******************************************************************************/
 package net.sourceforge.phpeclipse.webbrowser.views;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
 import net.sourceforge.phpeclipse.webbrowser.internal.WebBrowser;
 import net.sourceforge.phpeclipse.webbrowser.internal.WebBrowserUtil;
 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.CloseWindowListener;
 import org.eclipse.swt.browser.ProgressListener;
 import org.eclipse.swt.browser.StatusTextListener;
 import org.eclipse.swt.browser.TitleListener;
+import org.eclipse.swt.browser.WindowEvent;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.part.IShowInTarget;
 import org.eclipse.ui.part.ShowInContext;
@@ -27,7 +31,7 @@ import org.eclipse.ui.part.ViewPart;
  * <code>BrowserView</code> is a simple demonstration of the SWT Browser
  * widget. It consists of a workbench view and tab folder where each tab in the
  * folder allows the user to interact with a control.
- *
+ * 
  * @see ViewPart
  */
 public class BrowserView extends ViewPart implements IShowInTarget {
@@ -39,13 +43,22 @@ public class BrowserView extends ViewPart implements IShowInTarget {
 
        /**
         * Create the example
-        *
+        * 
         * @see ViewPart#createPartControl
         */
        public void createPartControl(Composite frame) {
                try {
                        if (WebBrowserUtil.isInternalBrowserOperational()) {
                                fInstance = new WebBrowser(frame, true, true);
+                               // #1365431 (toshihiro) start
+                               fInstance.getBrowser().addCloseWindowListener(
+                                               new CloseWindowListener() {
+                                                       public void close(WindowEvent event) {
+                                                               getViewSite().getPage().hideView(
+                                                                               BrowserView.this);
+                                                       }
+                                               });
+                               // #1365431 (toshihiro) end
                        }
                } catch (Exception e) {
                        fInstance = null;
@@ -54,7 +67,7 @@ public class BrowserView extends ViewPart implements IShowInTarget {
 
        /**
         * Called when we must grab focus.
-        *
+        * 
         * @see org.eclipse.ui.part.ViewPart#setFocus
         */
        public void setFocus() {
@@ -74,10 +87,18 @@ public class BrowserView extends ViewPart implements IShowInTarget {
                super.dispose();
        }
 
+       public String getUrl() {
+               if (fInstance != null) {
+                       return fInstance.getURL();
+               } else {
+                       return null;
+               }
+       }
+
        public void setUrl(final String url) {
                if (fInstance != null) {
-                       fUrl = url;
-                       fInstance.setURL(url);
+                               fUrl = url;
+                               fInstance.setURL(url);
                        // try {
                        // ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
                        // public void run(IProgressMonitor monitor) throws CoreException {
@@ -85,7 +106,7 @@ public class BrowserView extends ViewPart implements IShowInTarget {
                        // }
                        // }, null);
                        // } catch (CoreException e) {
-                       // // TODO Auto-generated catch block
+                       // // TO DO Auto-generated catch block
                        // e.printStackTrace();
                        // }
                }
@@ -101,18 +122,31 @@ public class BrowserView extends ViewPart implements IShowInTarget {
                        // }
                        // }, null);
                        // } catch (CoreException e) {
-                       // // TODO Auto-generated catch block
+                       // // TO DO Auto-generated catch block
                        // e.printStackTrace();
                        // }
                }
        }
 
+       
+       
        public void refresh(String url) {
-               if (fInstance != null) {
-                       if (fUrl == null || !fUrl.equals(url)) {
+               if (fInstance != null && url != null) {
+                       if (fUrl == null) {
                                setUrl(url);
                        } else {
-                               refresh();
+                               Browser browser = fInstance.getBrowser();
+                               if (browser != null) {
+                                       String browserUrl = browser.getUrl();
+                                       try {
+                                               browserUrl = URLDecoder.decode(browserUrl, J5CharsetEmulator.defaultCharset().name());
+                                       } catch (UnsupportedEncodingException e) {
+                                               // e.printStackTrace();
+                                       }
+                                       if (!url.equals(browserUrl)) {
+                                               setUrl(url);
+                                       }
+                               }
                        }
                }
        }
@@ -136,17 +170,27 @@ public class BrowserView extends ViewPart implements IShowInTarget {
        }
 
        public boolean show(ShowInContext context) {
-               if (context.getSelection() instanceof IStructuredSelection) {
-                       IStructuredSelection ss = (IStructuredSelection) context.getSelection();
-                       if (ss.getFirstElement() instanceof IFile) {
-                               IFile file = (IFile) ss.getFirstElement();
-                               String localhostURL;
-                               localhostURL = file.getLocation().toString();
+               if (context instanceof ShowInContextBrowser) {
+                       ShowInContextBrowser contextBrowser = (ShowInContextBrowser) context;
+                       String localhostURL = contextBrowser.getLocalhostUrl();
+                       if (localhostURL != null) {
                                setUrl(localhostURL);
-//                             bringToTop(this);
                                return true;
                        }
                }
+               // *WARNING*
+               // This causes unexpected behaviour such as downloading (save file).
+               // It depends on mime-types setting and native browser, it isn't under control of eclipse.
+               // (IE shows script as plain text since .php is unknown type by default.
+               //  Mozilla downloads script file since .php is defined in mimeTypes.rdf as such.)
+               //
+               //if (context.getInput() instanceof IFile) {
+               //      IFile file = (IFile) context.getInput();
+               //      String localhostURL;
+               //      localhostURL = "file:///" + file.getLocation().toString();
+               //      setUrl(localhostURL);
+               //      return true;
+               //}
                return false;
        }
 }
\ No newline at end of file