Workaround for feature request #1154254 (sticky browser URL) that solves bug #1827766...
[phpeclipse.git] / net.sourceforge.phpeclipse.webbrowser / src / net / sourceforge / phpeclipse / webbrowser / views / BrowserView.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpeclipse.webbrowser.views;
12
13 import java.io.UnsupportedEncodingException;
14 import java.net.URLDecoder;
15 import java.nio.charset.Charset;
16
17 import net.sourceforge.phpeclipse.webbrowser.internal.WebBrowser;
18 import net.sourceforge.phpeclipse.webbrowser.internal.WebBrowserUtil;
19
20 import org.eclipse.swt.browser.Browser;
21 import org.eclipse.swt.browser.CloseWindowListener;
22 import org.eclipse.swt.browser.ProgressListener;
23 import org.eclipse.swt.browser.StatusTextListener;
24 import org.eclipse.swt.browser.TitleListener;
25 import org.eclipse.swt.browser.WindowEvent;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.ui.part.IShowInTarget;
28 import org.eclipse.ui.part.ShowInContext;
29 import org.eclipse.ui.part.ViewPart;
30
31 /**
32  * <code>BrowserView</code> is a simple demonstration of the SWT Browser
33  * widget. It consists of a workbench view and tab folder where each tab in the
34  * folder allows the user to interact with a control.
35  * 
36  * @see ViewPart
37  */
38 public class BrowserView extends ViewPart implements IShowInTarget {
39         public final static String ID_BROWSER = "net.sourceforge.phpeclipse.webbrowser.views";
40
41         WebBrowser fInstance = null;
42
43         String fUrl = null;
44
45         /**
46          * Create the example
47          * 
48          * @see ViewPart#createPartControl
49          */
50         public void createPartControl(Composite frame) {
51                 try {
52                         if (WebBrowserUtil.isInternalBrowserOperational()) {
53                                 fInstance = new WebBrowser(frame, true, true);
54                                 // #1365431 (toshihiro) start
55                                 fInstance.getBrowser().addCloseWindowListener(
56                                                 new CloseWindowListener() {
57                                                         public void close(WindowEvent event) {
58                                                                 getViewSite().getPage().hideView(
59                                                                                 BrowserView.this);
60                                                         }
61                                                 });
62                                 // #1365431 (toshihiro) end
63                         }
64                 } catch (Exception e) {
65                         fInstance = null;
66                 }
67         }
68
69         /**
70          * Called when we must grab focus.
71          * 
72          * @see org.eclipse.ui.part.ViewPart#setFocus
73          */
74         public void setFocus() {
75                 if (fInstance != null) {
76                         fInstance.setFocus();
77                 }
78         }
79
80         /**
81          * Called when the View is to be disposed
82          */
83         public void dispose() {
84                 if (fInstance != null) {
85                         fInstance.dispose();
86                         fInstance = null;
87                 }
88                 super.dispose();
89         }
90
91         public String getUrl() {
92                 if (fInstance != null) {
93                         return fInstance.getURL();
94                 } else {
95                         return null;
96                 }
97         }
98
99         public void setUrl(final String url) {
100                 if (fInstance != null) {
101                                 fUrl = url;
102                                 fInstance.setURL(url);
103                         // try {
104                         // ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
105                         // public void run(IProgressMonitor monitor) throws CoreException {
106                         // instance.setURL(url);
107                         // }
108                         // }, null);
109                         // } catch (CoreException e) {
110                         // // TO DO Auto-generated catch block
111                         // e.printStackTrace();
112                         // }
113                 }
114         }
115
116         public void refresh() {
117                 if (fInstance != null) {
118                         fInstance.refresh();
119                         // try {
120                         // ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
121                         // public void run(IProgressMonitor monitor) throws CoreException {
122                         // instance.refresh();
123                         // }
124                         // }, null);
125                         // } catch (CoreException e) {
126                         // // TO DO Auto-generated catch block
127                         // e.printStackTrace();
128                         // }
129                 }
130         }
131
132         
133         
134         public void refresh(String url) {
135                 if (fInstance != null && url != null) {
136                         if (fUrl == null) {
137                                 setUrl(url);
138                         } else {
139                                 Browser browser = fInstance.getBrowser();
140                                 if (browser != null) {
141                                         String browserUrl = browser.getUrl();
142                                         try {
143                                                 browserUrl = URLDecoder.decode(browserUrl, J5CharsetEmulator.defaultCharset().name());
144                                         } catch (UnsupportedEncodingException e) {
145                                                 // e.printStackTrace();
146                                         }
147                                         if (!url.equals(browserUrl)) {
148                                                 setUrl(url);
149                                         }
150                                 }
151                         }
152                 }
153         }
154
155         public void addProgressListener(ProgressListener listener) {
156                 if (fInstance != null) {
157                         fInstance.addProgressListener(listener);
158                 }
159         }
160
161         public void addStatusTextListener(StatusTextListener listener) {
162                 if (fInstance != null) {
163                         fInstance.addStatusTextListener(listener);
164                 }
165         }
166
167         public void addTitleListener(TitleListener listener) {
168                 if (fInstance != null) {
169                         fInstance.addTitleListener(listener);
170                 }
171         }
172
173         public boolean show(ShowInContext context) {
174                 if (context instanceof ShowInContextBrowser) {
175                         ShowInContextBrowser contextBrowser = (ShowInContextBrowser) context;
176                         String localhostURL = contextBrowser.getLocalhostUrl();
177                         if (localhostURL != null) {
178                                 setUrl(localhostURL);
179                                 return true;
180                         }
181                 }
182                 // *WARNING*
183                 // This causes unexpected behaviour such as downloading (save file).
184                 // It depends on mime-types setting and native browser, it isn't under control of eclipse.
185                 // (IE shows script as plain text since .php is unknown type by default.
186                 //  Mozilla downloads script file since .php is defined in mimeTypes.rdf as such.)
187                 //
188                 //if (context.getInput() instanceof IFile) {
189                 //      IFile file = (IFile) context.getInput();
190                 //      String localhostURL;
191                 //      localhostURL = "file:///" + file.getLocation().toString();
192                 //      setUrl(localhostURL);
193                 //      return true;
194                 //}
195                 return false;
196         }
197 }