Statistiques
| Révision :

root / TXM / trunk / org.txm.libs.javafx / swt / JFXBrowserViewer.java @ 3521

Historique | Voir | Annoter | Télécharger (25,42 ko)

1 3108 mdecorde
package snippet;
2 3108 mdecorde
3 3108 mdecorde
import java.beans.PropertyChangeEvent;
4 3108 mdecorde
import java.beans.PropertyChangeListener;
5 3108 mdecorde
import java.io.File;
6 3108 mdecorde
import java.util.ArrayList;
7 3108 mdecorde
import java.util.List;
8 3108 mdecorde
9 3108 mdecorde
import org.eclipse.core.runtime.IProgressMonitor;
10 3108 mdecorde
import org.eclipse.jface.action.IStatusLineManager;
11 3108 mdecorde
import org.eclipse.swt.SWT;
12 3108 mdecorde
import org.eclipse.swt.SWTError;
13 3108 mdecorde
import org.eclipse.swt.SWTException;
14 3108 mdecorde
import org.eclipse.swt.browser.Browser;
15 3108 mdecorde
import org.eclipse.swt.browser.LocationAdapter;
16 3108 mdecorde
import org.eclipse.swt.browser.LocationEvent;
17 3108 mdecorde
import org.eclipse.swt.browser.LocationListener;
18 3108 mdecorde
import org.eclipse.swt.browser.ProgressEvent;
19 3108 mdecorde
import org.eclipse.swt.browser.ProgressListener;
20 3108 mdecorde
import org.eclipse.swt.browser.VisibilityWindowAdapter;
21 3108 mdecorde
import org.eclipse.swt.browser.WindowEvent;
22 3108 mdecorde
import org.eclipse.swt.dnd.Clipboard;
23 3108 mdecorde
import org.eclipse.swt.events.MouseAdapter;
24 3108 mdecorde
import org.eclipse.swt.events.MouseEvent;
25 3108 mdecorde
import org.eclipse.swt.events.SelectionListener;
26 3108 mdecorde
import org.eclipse.swt.layout.FillLayout;
27 3108 mdecorde
import org.eclipse.swt.layout.GridData;
28 3108 mdecorde
import org.eclipse.swt.layout.GridLayout;
29 3108 mdecorde
import org.eclipse.swt.widgets.Combo;
30 3108 mdecorde
import org.eclipse.swt.widgets.Composite;
31 3108 mdecorde
import org.eclipse.swt.widgets.Display;
32 3108 mdecorde
import org.eclipse.swt.widgets.Shell;
33 3108 mdecorde
import org.eclipse.swt.widgets.ToolBar;
34 3108 mdecorde
import org.eclipse.swt.widgets.ToolItem;
35 3108 mdecorde
import org.eclipse.ui.PlatformUI;
36 3108 mdecorde
import org.eclipse.ui.internal.browser.BusyIndicator;
37 3108 mdecorde
import org.eclipse.ui.internal.browser.ContextIds;
38 3108 mdecorde
import org.eclipse.ui.internal.browser.IBrowserViewerContainer;
39 3108 mdecorde
import org.eclipse.ui.internal.browser.ImageResource;
40 3108 mdecorde
import org.eclipse.ui.internal.browser.ToolbarLayout;
41 3108 mdecorde
import org.eclipse.ui.internal.browser.Trace;
42 3108 mdecorde
import org.eclipse.ui.internal.browser.WebBrowserPreference;
43 3108 mdecorde
import org.eclipse.ui.internal.browser.WebBrowserUtil;
44 3108 mdecorde
import org.txm.rcp.commands.OpenLocalizedWebPage;
45 3108 mdecorde
import org.txm.rcp.swt.JFXBrowser;
46 3108 mdecorde
47 3108 mdecorde
/**
48 3108 mdecorde
 * A Web browser widget. It extends the Eclipse SWT Browser widget by adding an
49 3108 mdecorde
 * optional toolbar complete with a URL combo box, history, back & forward, and
50 3108 mdecorde
 * refresh buttons.
51 3108 mdecorde
 * <p>
52 3108 mdecorde
 * Use the style bits to choose which toolbars are available within the browser
53 3108 mdecorde
 * composite. You can access the embedded SWT Browser directly using the
54 3108 mdecorde
 * getBrowser() method.
55 3108 mdecorde
 * </p>
56 3108 mdecorde
 * <p>
57 3108 mdecorde
 * Additional capabilities are available when used as the internal Web browser,
58 3108 mdecorde
 * including status text and progress on the Eclipse window's status line, or
59 3108 mdecorde
 * moving the toolbar capabilities up into the main toolbar.
60 3108 mdecorde
 * </p>
61 3108 mdecorde
 * <dl>
62 3108 mdecorde
 * <dt><b>Styles:</b></dt>
63 3108 mdecorde
 * <dd>LOCATION_BAR, BUTTON_BAR</dd>
64 3108 mdecorde
 * <dt><b>Events:</b></dt>
65 3108 mdecorde
 * <dd>None</dd>
66 3108 mdecorde
 * </dl>
67 3108 mdecorde
 *
68 3108 mdecorde
 * @since 1.0
69 3108 mdecorde
 */
70 3108 mdecorde
public class JFXBrowserViewer extends Composite {
71 3108 mdecorde
72 3108 mdecorde
        /**
73 3108 mdecorde
         * Style parameter (value 1) indicating that the URL and Go button will be
74 3108 mdecorde
         * on the local toolbar.
75 3108 mdecorde
         */
76 3108 mdecorde
        public static final int LOCATION_BAR = 1 << 1;
77 3108 mdecorde
78 3108 mdecorde
        /**
79 3108 mdecorde
         * Style parameter (value 2) indicating that the toolbar will be available
80 3108 mdecorde
         * on the web browser. This style parameter cannot be used without the
81 3108 mdecorde
         * LOCATION_BAR style.
82 3108 mdecorde
         */
83 3108 mdecorde
        public static final int BUTTON_BAR = 1 << 2;
84 3108 mdecorde
85 3108 mdecorde
        protected static final String PROPERTY_TITLE = "title"; //$NON-NLS-1$
86 3108 mdecorde
87 3108 mdecorde
        private static final int MAX_HISTORY = 50;
88 3108 mdecorde
89 3108 mdecorde
        public Clipboard clipboard;
90 3108 mdecorde
91 3108 mdecorde
        public Combo combo;
92 3108 mdecorde
93 3108 mdecorde
        protected boolean showToolbar;
94 3108 mdecorde
95 3108 mdecorde
        protected boolean showURLbar;
96 3108 mdecorde
97 3108 mdecorde
        protected ToolItem back;
98 3108 mdecorde
99 3108 mdecorde
        protected ToolItem forward;
100 3108 mdecorde
101 3108 mdecorde
        protected BusyIndicator busy;
102 3108 mdecorde
103 3108 mdecorde
        protected boolean loading;
104 3108 mdecorde
105 3108 mdecorde
        protected static java.util.List<String> history;
106 3108 mdecorde
107 3108 mdecorde
        protected JFXBrowser browser;
108 3108 mdecorde
109 3108 mdecorde
        protected JFXBrowserText text;
110 3108 mdecorde
111 3108 mdecorde
        protected boolean newWindow;
112 3108 mdecorde
113 3108 mdecorde
        protected IBrowserViewerContainer container;
114 3108 mdecorde
115 3108 mdecorde
        protected String title;
116 3108 mdecorde
117 3108 mdecorde
        protected int progressWorked = 0;
118 3108 mdecorde
119 3108 mdecorde
        protected List<PropertyChangeListener> propertyListeners;
120 3108 mdecorde
121 3108 mdecorde
        /**
122 3108 mdecorde
         * Under development - do not use
123 3108 mdecorde
         */
124 3108 mdecorde
        public static interface ILocationListener {
125 3108 mdecorde
126 3108 mdecorde
                public void locationChanged(String url);
127 3108 mdecorde
128 3108 mdecorde
                public void historyChanged(String[] history2);
129 3108 mdecorde
        }
130 3108 mdecorde
131 3108 mdecorde
        public ILocationListener locationListener;
132 3108 mdecorde
133 3108 mdecorde
        /**
134 3108 mdecorde
         * Under development - do not use
135 3108 mdecorde
         */
136 3108 mdecorde
        public static interface IBackNextListener {
137 3108 mdecorde
138 3108 mdecorde
                public void updateBackNextBusy();
139 3108 mdecorde
        }
140 3108 mdecorde
141 3108 mdecorde
        public IBackNextListener backNextListener;
142 3108 mdecorde
143 3108 mdecorde
        /**
144 3108 mdecorde
         * Creates a new Web browser given its parent and a style value describing
145 3108 mdecorde
         * its behavior and appearance.
146 3108 mdecorde
         * <p>
147 3108 mdecorde
         * The style value is either one of the style constants defined in the class
148 3108 mdecorde
         * header or class <code>SWT</code> which is applicable to instances of
149 3108 mdecorde
         * this class, or must be built by <em>bitwise OR</em>'ing together (that
150 3108 mdecorde
         * is, using the <code>int</code> "|" operator) two or more of those
151 3108 mdecorde
         * <code>SWT</code> style constants. The class description lists the style
152 3108 mdecorde
         * constants that are applicable to the class. Style bits are also inherited
153 3108 mdecorde
         * from superclasses.
154 3108 mdecorde
         * </p>
155 3108 mdecorde
         *
156 3108 mdecorde
         * @param parent
157 3108 mdecorde
         *            a composite control which will be the parent of the new
158 3108 mdecorde
         *            instance (cannot be null)
159 3108 mdecorde
         * @param style
160 3108 mdecorde
         *            the style of control to construct
161 3108 mdecorde
         */
162 3108 mdecorde
        public JFXBrowserViewer(Composite parent, int style) {
163 3108 mdecorde
                super(parent, SWT.NONE);
164 3108 mdecorde
165 3108 mdecorde
                if ((style & LOCATION_BAR) != 0)
166 3108 mdecorde
                        showURLbar = true;
167 3108 mdecorde
168 3108 mdecorde
                if ((style & BUTTON_BAR) != 0)
169 3108 mdecorde
                        showToolbar = true;
170 3108 mdecorde
171 3108 mdecorde
                GridLayout layout = new GridLayout();
172 3108 mdecorde
                layout.marginHeight = 0;
173 3108 mdecorde
                layout.marginWidth = 0;
174 3108 mdecorde
                layout.horizontalSpacing = 0;
175 3108 mdecorde
                layout.verticalSpacing = 0;
176 3108 mdecorde
                layout.numColumns = 1;
177 3108 mdecorde
                setLayout(layout);
178 3108 mdecorde
                setLayoutData(new GridData(GridData.FILL_BOTH));
179 3108 mdecorde
                clipboard = new Clipboard(parent.getDisplay());
180 3108 mdecorde
181 3108 mdecorde
                if (showToolbar || showURLbar) {
182 3108 mdecorde
                        Composite toolbarComp = new Composite(this, SWT.NONE);
183 3108 mdecorde
                        toolbarComp.setLayout(new ToolbarLayout());
184 3108 mdecorde
                        toolbarComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
185 3108 mdecorde
186 3108 mdecorde
                        if (showToolbar)
187 3108 mdecorde
                                createToolbar(toolbarComp);
188 3108 mdecorde
189 3108 mdecorde
                        if (showURLbar)
190 3108 mdecorde
                                createLocationBar(toolbarComp);
191 3108 mdecorde
192 3108 mdecorde
                        if (showToolbar | showURLbar) {
193 3108 mdecorde
                                busy = new BusyIndicator(toolbarComp, SWT.NONE);
194 3108 mdecorde
                                busy.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
195 3108 mdecorde
                                busy.addMouseListener(new MouseAdapter() {
196 3108 mdecorde
197 3108 mdecorde
                                        @Override
198 3108 mdecorde
                                        public void mouseDown(MouseEvent e) {
199 3108 mdecorde
                                                setURL(OpenLocalizedWebPage.URL_TEXTOMETRIE);
200 3108 mdecorde
                                        }
201 3108 mdecorde
                                });
202 3108 mdecorde
                        }
203 3108 mdecorde
                        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, ContextIds.WEB_BROWSER);
204 3108 mdecorde
                }
205 3108 mdecorde
206 3108 mdecorde
                // create a new SWT Web browser widget, checking once again to make sure
207 3108 mdecorde
                // we can use it in this environment
208 3108 mdecorde
                // if (WebBrowserUtil.canUseInternalWebBrowser())
209 3108 mdecorde
                try {
210 3108 mdecorde
                        this.browser = new JFXBrowser(this, SWT.NONE);
211 3108 mdecorde
                }
212 3108 mdecorde
                catch (SWTError e) {
213 3108 mdecorde
                        if (e.code != SWT.ERROR_NO_HANDLES) {
214 3108 mdecorde
                                WebBrowserUtil.openError(org.eclipse.ui.internal.browser.Messages.errorCouldNotLaunchInternalWebBrowser);
215 3108 mdecorde
                                return;
216 3108 mdecorde
                        }
217 3108 mdecorde
                        text = new JFXBrowserText(this, this, e);
218 3108 mdecorde
                }
219 3108 mdecorde
220 3108 mdecorde
                if (showURLbar)
221 3108 mdecorde
                        updateHistory();
222 3108 mdecorde
                if (showToolbar)
223 3108 mdecorde
                        updateBackNextBusy();
224 3108 mdecorde
225 3108 mdecorde
                if (browser != null) {
226 3108 mdecorde
                        browser.setLayoutData(new GridData(GridData.FILL_BOTH));
227 3108 mdecorde
                        PlatformUI.getWorkbench().getHelpSystem().setHelp(browser,
228 3108 mdecorde
                                        ContextIds.WEB_BROWSER);
229 3108 mdecorde
                }
230 3108 mdecorde
                else
231 3108 mdecorde
                        text.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
232 3108 mdecorde
233 3108 mdecorde
                addBrowserListeners();
234 3108 mdecorde
                // listen();
235 3108 mdecorde
        }
236 3108 mdecorde
237 3108 mdecorde
        /**
238 3108 mdecorde
         * Returns the underlying SWT browser widget.
239 3108 mdecorde
         *
240 3108 mdecorde
         * @return the underlying browser
241 3108 mdecorde
         */
242 3108 mdecorde
        public JFXBrowser getBrowser() {
243 3108 mdecorde
                return browser;
244 3108 mdecorde
        }
245 3108 mdecorde
246 3108 mdecorde
        /**
247 3108 mdecorde
         * Navigate to the home URL.
248 3108 mdecorde
         */
249 3108 mdecorde
        public void home() {
250 3108 mdecorde
                System.out.println("JFXBrowserViewer.home()");
251 3108 mdecorde
                // browser.getWebView().setH.set.setText(""); //$NON-NLS-1$
252 3108 mdecorde
        }
253 3108 mdecorde
254 3108 mdecorde
        /**
255 3108 mdecorde
         * Loads a URL.
256 3108 mdecorde
         *
257 3108 mdecorde
         * @param url
258 3108 mdecorde
         *            the URL to be loaded
259 3108 mdecorde
         * @return true if the operation was successful and false otherwise.
260 3108 mdecorde
         * @exception IllegalArgumentException
261 3108 mdecorde
         *                <ul>
262 3108 mdecorde
         *                <li>ERROR_NULL_ARGUMENT - if the url is null</li>
263 3108 mdecorde
         *                </ul>
264 3108 mdecorde
         * @exception SWTException
265 3108 mdecorde
         *                <ul>
266 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
267 3108 mdecorde
         *                wrong thread</li>
268 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
269 3108 mdecorde
         *                disposed</li>
270 3108 mdecorde
         *                </ul>
271 3108 mdecorde
         * @see #getURL()
272 3108 mdecorde
         */
273 3108 mdecorde
        public void setURL(String url) {
274 3108 mdecorde
                setURL(url, true);
275 3108 mdecorde
        }
276 3108 mdecorde
277 3108 mdecorde
        protected void updateBackNextBusy() {
278 3108 mdecorde
                if (!back.isDisposed()) {
279 3108 mdecorde
                        back.setEnabled(isBackEnabled());
280 3108 mdecorde
                }
281 3108 mdecorde
                if (!forward.isDisposed()) {
282 3108 mdecorde
                        forward.setEnabled(isForwardEnabled());
283 3108 mdecorde
                }
284 3108 mdecorde
                if (!busy.isDisposed()) {
285 3108 mdecorde
                        busy.setBusy(loading);
286 3108 mdecorde
                }
287 3108 mdecorde
288 3108 mdecorde
                if (backNextListener != null)
289 3108 mdecorde
                        backNextListener.updateBackNextBusy();
290 3108 mdecorde
        }
291 3108 mdecorde
292 3108 mdecorde
        protected void updateLocation() {
293 3108 mdecorde
                if (locationListener != null)
294 3108 mdecorde
                        locationListener.historyChanged(null);
295 3108 mdecorde
296 3108 mdecorde
                if (locationListener != null)
297 3108 mdecorde
                        locationListener.locationChanged(null);
298 3108 mdecorde
        }
299 3108 mdecorde
300 3108 mdecorde
        /**
301 3108 mdecorde
         *
302 3108 mdecorde
         */
303 3108 mdecorde
        private void addBrowserListeners() {
304 3108 mdecorde
                if (browser == null) return;
305 3108 mdecorde
                // respond to ExternalBrowserInstance StatusTextEvents events by
306 3108 mdecorde
                // updating the status line
307 3108 mdecorde
                browser.addStatusTextListener(event -> {
308 3108 mdecorde
                        // System.out.println("status: " + event.text); //$NON-NLS-1$
309 3108 mdecorde
                        if (container != null) {
310 3108 mdecorde
                                IStatusLineManager status = container.getActionBars().getStatusLineManager();
311 3108 mdecorde
                                status.setMessage(event.text);
312 3108 mdecorde
                        }
313 3108 mdecorde
                });
314 3108 mdecorde
315 3108 mdecorde
                // Add listener for new window creation so that we can instead of
316 3108 mdecorde
                // opening a separate
317 3108 mdecorde
                // new window in which the session is lost, we can instead open a new
318 3108 mdecorde
                // window in a new
319 3108 mdecorde
                // shell within the browser area thereby maintaining the session.
320 3108 mdecorde
                browser.addOpenWindowListener(event -> {
321 3108 mdecorde
                        Shell shell2 = new Shell(getShell(), SWT.SHELL_TRIM);
322 3108 mdecorde
                        shell2.setLayout(new FillLayout());
323 3108 mdecorde
                        shell2.setText(org.eclipse.ui.internal.browser.Messages.viewWebBrowserTitle);
324 3108 mdecorde
                        shell2.setImage(getShell().getImage());
325 3108 mdecorde
                        if (event.location != null)
326 3108 mdecorde
                                shell2.setLocation(event.location);
327 3108 mdecorde
                        if (event.size != null)
328 3108 mdecorde
                                shell2.setSize(event.size);
329 3108 mdecorde
                        int style = 0;
330 3108 mdecorde
                        if (showURLbar)
331 3108 mdecorde
                                style += LOCATION_BAR;
332 3108 mdecorde
                        if (showToolbar)
333 3108 mdecorde
                                style += BUTTON_BAR;
334 3108 mdecorde
                        JFXBrowserViewer browser2 = new JFXBrowserViewer(shell2, style);
335 3108 mdecorde
                        browser2.newWindow = true;
336 3108 mdecorde
                        event.browser = null; // TODO should be browser2
337 3108 mdecorde
                });
338 3108 mdecorde
339 3108 mdecorde
                browser.addVisibilityWindowListener(new VisibilityWindowAdapter() {
340 3108 mdecorde
341 3108 mdecorde
                        @Override
342 3108 mdecorde
                        public void show(WindowEvent e) {
343 3108 mdecorde
                                Browser browser2 = (Browser) e.widget;
344 3108 mdecorde
                                if (browser2.getParent().getParent() instanceof Shell) {
345 3108 mdecorde
                                        Shell shell = (Shell) browser2.getParent().getParent();
346 3108 mdecorde
                                        if (e.location != null)
347 3108 mdecorde
                                                shell.setLocation(e.location);
348 3108 mdecorde
                                        if (e.size != null)
349 3108 mdecorde
                                                shell.setSize(shell.computeSize(e.size.x, e.size.y));
350 3108 mdecorde
                                        shell.open();
351 3108 mdecorde
                                }
352 3108 mdecorde
                        }
353 3108 mdecorde
                });
354 3108 mdecorde
355 3108 mdecorde
                browser.addCloseWindowListener(event -> {
356 3108 mdecorde
                        // if shell is not null, it must be a secondary popup window,
357 3108 mdecorde
                        // else its an editor window
358 3108 mdecorde
                        if (newWindow)
359 3108 mdecorde
                                getShell().dispose();
360 3108 mdecorde
                        else
361 3108 mdecorde
                                container.close();
362 3108 mdecorde
                });
363 3108 mdecorde
364 3108 mdecorde
                browser.addProgressListener(new ProgressListener() {
365 3108 mdecorde
366 3108 mdecorde
                        @Override
367 3108 mdecorde
                        public void changed(ProgressEvent event) {
368 3108 mdecorde
                                // System.out.println("progress: " + event.current + ", " + event.total); //$NON-NLS-1$ //$NON-NLS-2$
369 3108 mdecorde
                                if (event.total == 0)
370 3108 mdecorde
                                        return;
371 3108 mdecorde
372 3108 mdecorde
                                boolean done = (event.current == event.total);
373 3108 mdecorde
374 3108 mdecorde
                                int percentProgress = event.current * 100 / event.total;
375 3108 mdecorde
                                if (container != null) {
376 3108 mdecorde
                                        IProgressMonitor monitor = container.getActionBars()
377 3108 mdecorde
                                                        .getStatusLineManager().getProgressMonitor();
378 3108 mdecorde
                                        if (done) {
379 3108 mdecorde
                                                monitor.done();
380 3108 mdecorde
                                                progressWorked = 0;
381 3108 mdecorde
                                        }
382 3108 mdecorde
                                        else if (progressWorked == 0) {
383 3108 mdecorde
                                                monitor.beginTask("", event.total); //$NON-NLS-1$
384 3108 mdecorde
                                                progressWorked = percentProgress;
385 3108 mdecorde
                                        }
386 3108 mdecorde
                                        else {
387 3108 mdecorde
                                                monitor.worked(event.current - progressWorked);
388 3108 mdecorde
                                                progressWorked = event.current;
389 3108 mdecorde
                                        }
390 3108 mdecorde
                                }
391 3108 mdecorde
392 3108 mdecorde
                                if (showToolbar) {
393 3108 mdecorde
                                        if (!busy.isBusy() && !done)
394 3108 mdecorde
                                                loading = true;
395 3108 mdecorde
                                        else if (busy.isBusy() && done) // once the progress hits
396 3108 mdecorde
                                                // 100 percent, done, set
397 3108 mdecorde
                                                // busy to false
398 3108 mdecorde
                                                loading = false;
399 3108 mdecorde
400 3108 mdecorde
                                        // System.out.println("loading: " + loading); //$NON-NLS-1$
401 3108 mdecorde
                                        updateBackNextBusy();
402 3108 mdecorde
                                        updateHistory();
403 3108 mdecorde
                                }
404 3108 mdecorde
                        }
405 3108 mdecorde
406 3108 mdecorde
                        @Override
407 3108 mdecorde
                        public void completed(ProgressEvent event) {
408 3108 mdecorde
                                if (container != null) {
409 3108 mdecorde
                                        IProgressMonitor monitor = container.getActionBars()
410 3108 mdecorde
                                                        .getStatusLineManager().getProgressMonitor();
411 3108 mdecorde
                                        monitor.done();
412 3108 mdecorde
                                }
413 3108 mdecorde
                                if (showToolbar) {
414 3108 mdecorde
                                        loading = false;
415 3108 mdecorde
                                        updateBackNextBusy();
416 3108 mdecorde
                                        updateHistory();
417 3108 mdecorde
                                }
418 3108 mdecorde
                        }
419 3108 mdecorde
                });
420 3108 mdecorde
421 3108 mdecorde
                if (showURLbar) {
422 3108 mdecorde
                        browser.addLocationListener(new LocationAdapter() {
423 3108 mdecorde
424 3108 mdecorde
                                @Override
425 3108 mdecorde
                                public void changed(LocationEvent event) {
426 3108 mdecorde
                                        if (!event.top)
427 3108 mdecorde
                                                return;
428 3108 mdecorde
                                        if (combo != null) {
429 3108 mdecorde
                                                if (!"about:blank".equals(event.location)) { //$NON-NLS-1$
430 3108 mdecorde
                                                        combo.setText(event.location);
431 3108 mdecorde
                                                        addToHistory(event.location);
432 3108 mdecorde
                                                        updateHistory();
433 3108 mdecorde
                                                }// else
434 3108 mdecorde
                                                        // combo.setText(""); //$NON-NLS-1$
435 3108 mdecorde
                                        }
436 3108 mdecorde
                                }
437 3108 mdecorde
                        });
438 3108 mdecorde
                }
439 3108 mdecorde
440 3108 mdecorde
                browser.addTitleListener(event -> {
441 3108 mdecorde
                        String oldTitle = title;
442 3108 mdecorde
                        title = event.title;
443 3108 mdecorde
                        firePropertyChangeEvent(PROPERTY_TITLE, oldTitle, title);
444 3108 mdecorde
                });
445 3108 mdecorde
        }
446 3108 mdecorde
447 3108 mdecorde
        /**
448 3108 mdecorde
         * Add a property change listener to this instance.
449 3108 mdecorde
         *
450 3108 mdecorde
         * @param listener java.beans.PropertyChangeListener
451 3108 mdecorde
         */
452 3108 mdecorde
        public void addPropertyChangeListener(PropertyChangeListener listener) {
453 3108 mdecorde
                if (propertyListeners == null)
454 3108 mdecorde
                        propertyListeners = new ArrayList<>();
455 3108 mdecorde
                propertyListeners.add(listener);
456 3108 mdecorde
        }
457 3108 mdecorde
458 3108 mdecorde
        /**
459 3108 mdecorde
         * Remove a property change listener from this instance.
460 3108 mdecorde
         *
461 3108 mdecorde
         * @param listener java.beans.PropertyChangeListener
462 3108 mdecorde
         */
463 3108 mdecorde
        public void removePropertyChangeListener(PropertyChangeListener listener) {
464 3108 mdecorde
                if (propertyListeners != null)
465 3108 mdecorde
                        propertyListeners.remove(listener);
466 3108 mdecorde
        }
467 3108 mdecorde
468 3108 mdecorde
        /**
469 3108 mdecorde
         * Fire a property change event.
470 3108 mdecorde
         */
471 3108 mdecorde
        protected void firePropertyChangeEvent(String propertyName, Object oldValue, Object newValue) {
472 3108 mdecorde
                if (propertyListeners == null)
473 3108 mdecorde
                        return;
474 3108 mdecorde
475 3108 mdecorde
                PropertyChangeEvent event = new PropertyChangeEvent(this, propertyName, oldValue, newValue);
476 3108 mdecorde
                // Trace.trace("Firing: " + event + " " + oldValue);
477 3108 mdecorde
                try {
478 3108 mdecorde
                        int size = propertyListeners.size();
479 3108 mdecorde
                        PropertyChangeListener[] pcl = new PropertyChangeListener[size];
480 3108 mdecorde
                        propertyListeners.toArray(pcl);
481 3108 mdecorde
482 3108 mdecorde
                        for (int i = 0; i < size; i++)
483 3108 mdecorde
                                try {
484 3108 mdecorde
                                        pcl[i].propertyChange(event);
485 3108 mdecorde
                                }
486 3108 mdecorde
                                catch (Exception e) {
487 3108 mdecorde
                                        // ignore
488 3108 mdecorde
                                }
489 3108 mdecorde
                }
490 3108 mdecorde
                catch (Exception e) {
491 3108 mdecorde
                        // ignore
492 3108 mdecorde
                }
493 3108 mdecorde
        }
494 3108 mdecorde
495 3108 mdecorde
        /**
496 3108 mdecorde
         * Navigate to the next session history item. Convenience method that calls
497 3108 mdecorde
         * the underlying SWT browser.
498 3108 mdecorde
         *
499 3108 mdecorde
         * @return <code>true</code> if the operation was successful and
500 3108 mdecorde
         *         <code>false</code> otherwise
501 3108 mdecorde
         * @exception SWTException
502 3108 mdecorde
         *                <ul>
503 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
504 3108 mdecorde
         *                wrong thread</li>
505 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
506 3108 mdecorde
         *                disposed</li>
507 3108 mdecorde
         *                </ul>
508 3108 mdecorde
         * @see #back
509 3108 mdecorde
         */
510 3108 mdecorde
        public boolean forward() {
511 3108 mdecorde
                if (browser == null)
512 3108 mdecorde
                        return false;
513 3108 mdecorde
                return browser.forward();
514 3108 mdecorde
        }
515 3108 mdecorde
516 3108 mdecorde
        /**
517 3108 mdecorde
         * Navigate to the previous session history item. Convenience method that
518 3108 mdecorde
         * calls the underlying SWT browser.
519 3108 mdecorde
         *
520 3108 mdecorde
         * @return <code>true</code> if the operation was successful and
521 3108 mdecorde
         *         <code>false</code> otherwise
522 3108 mdecorde
         * @exception SWTException
523 3108 mdecorde
         *                <ul>
524 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
525 3108 mdecorde
         *                wrong thread</li>
526 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
527 3108 mdecorde
         *                disposed</li>
528 3108 mdecorde
         *                </ul>
529 3108 mdecorde
         * @see #forward
530 3108 mdecorde
         */
531 3108 mdecorde
        public boolean back() {
532 3108 mdecorde
                if (browser == null)
533 3108 mdecorde
                        return false;
534 3108 mdecorde
                return browser.back();
535 3108 mdecorde
        }
536 3108 mdecorde
537 3108 mdecorde
        /**
538 3108 mdecorde
         * Returns <code>true</code> if the receiver can navigate to the previous
539 3108 mdecorde
         * session history item, and <code>false</code> otherwise. Convenience
540 3108 mdecorde
         * method that calls the underlying SWT browser.
541 3108 mdecorde
         *
542 3108 mdecorde
         * @return the receiver's back command enabled state
543 3108 mdecorde
         * @exception SWTException
544 3108 mdecorde
         *                <ul>
545 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
546 3108 mdecorde
         *                disposed</li>
547 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
548 3108 mdecorde
         *                thread that created the receiver</li>
549 3108 mdecorde
         *                </ul>
550 3108 mdecorde
         * @see #back
551 3108 mdecorde
         */
552 3108 mdecorde
        public boolean isBackEnabled() {
553 3108 mdecorde
                if (browser == null)
554 3108 mdecorde
                        return false;
555 3108 mdecorde
                return browser.isBackEnabled();
556 3108 mdecorde
        }
557 3108 mdecorde
558 3108 mdecorde
        /**
559 3108 mdecorde
         * Returns <code>true</code> if the receiver can navigate to the next
560 3108 mdecorde
         * session history item, and <code>false</code> otherwise. Convenience
561 3108 mdecorde
         * method that calls the underlying SWT browser.
562 3108 mdecorde
         *
563 3108 mdecorde
         * @return the receiver's forward command enabled state
564 3108 mdecorde
         * @exception SWTException
565 3108 mdecorde
         *                <ul>
566 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
567 3108 mdecorde
         *                disposed</li>
568 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
569 3108 mdecorde
         *                thread that created the receiver</li>
570 3108 mdecorde
         *                </ul>
571 3108 mdecorde
         * @see #forward
572 3108 mdecorde
         */
573 3108 mdecorde
        public boolean isForwardEnabled() {
574 3108 mdecorde
                if (browser == null)
575 3108 mdecorde
                        return false;
576 3108 mdecorde
                return browser.isForwardEnabled();
577 3108 mdecorde
        }
578 3108 mdecorde
579 3108 mdecorde
        /**
580 3108 mdecorde
         * Stop any loading and rendering activity. Convenience method that calls
581 3108 mdecorde
         * the underlying SWT browser.
582 3108 mdecorde
         *
583 3108 mdecorde
         * @exception SWTException
584 3108 mdecorde
         *                <ul>
585 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
586 3108 mdecorde
         *                wrong thread</li>
587 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
588 3108 mdecorde
         *                disposed</li>
589 3108 mdecorde
         *                </ul>
590 3108 mdecorde
         */
591 3108 mdecorde
        public void stop() {
592 3108 mdecorde
                if (browser != null)
593 3108 mdecorde
                        browser.stop();
594 3108 mdecorde
        }
595 3108 mdecorde
596 3108 mdecorde
        /**
597 3108 mdecorde
         *
598 3108 mdecorde
         */
599 3108 mdecorde
        private boolean navigate(String url) {
600 3108 mdecorde
                Trace.trace(Trace.FINER, "Navigate: " + url); //$NON-NLS-1$
601 3108 mdecorde
                if (url != null && url.equals(getURL())) {
602 3108 mdecorde
                        refresh();
603 3108 mdecorde
                        return true;
604 3108 mdecorde
                }
605 3108 mdecorde
                if (browser != null)
606 3108 mdecorde
                        return browser.setUrl(url, null, new String[] { "Cache-Control: no-cache" }); //$NON-NLS-1$
607 3108 mdecorde
                return text.setUrl(url);
608 3108 mdecorde
        }
609 3108 mdecorde
610 3108 mdecorde
        /**
611 3108 mdecorde
         * Refresh the current page. Convenience method that calls the underlying
612 3108 mdecorde
         * SWT browser.
613 3108 mdecorde
         *
614 3108 mdecorde
         * @exception SWTException
615 3108 mdecorde
         *                <ul>
616 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
617 3108 mdecorde
         *                wrong thread</li>
618 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
619 3108 mdecorde
         *                disposed</li>
620 3108 mdecorde
         *                </ul>
621 3108 mdecorde
         */
622 3108 mdecorde
        public void refresh() {
623 3108 mdecorde
                if (browser != null)
624 3108 mdecorde
                        browser.refresh();
625 3108 mdecorde
                else
626 3108 mdecorde
                        text.refresh();
627 3108 mdecorde
                try {
628 3108 mdecorde
                        Thread.sleep(50);
629 3108 mdecorde
                }
630 3108 mdecorde
                catch (Exception e) {
631 3108 mdecorde
                        // ignore
632 3108 mdecorde
                }
633 3108 mdecorde
        }
634 3108 mdecorde
635 3108 mdecorde
        private void setURL(String url, boolean browse) {
636 3108 mdecorde
                Trace.trace(Trace.FINEST, "setURL: " + url + " " + browse); //$NON-NLS-1$ //$NON-NLS-2$
637 3108 mdecorde
                if (url == null) {
638 3108 mdecorde
                        home();
639 3108 mdecorde
                        return;
640 3108 mdecorde
                }
641 3108 mdecorde
642 3108 mdecorde
                if (browse)
643 3108 mdecorde
                        navigate(url);
644 3108 mdecorde
645 3108 mdecorde
                addToHistory(url);
646 3108 mdecorde
                updateHistory();
647 3108 mdecorde
        }
648 3108 mdecorde
649 3108 mdecorde
        protected void addToHistory(String url) {
650 3108 mdecorde
                if (history == null)
651 3108 mdecorde
                        history = WebBrowserPreference.getInternalWebBrowserHistory();
652 3108 mdecorde
                int found = -1;
653 3108 mdecorde
                int size = history.size();
654 3108 mdecorde
                for (int i = 0; i < size; i++) {
655 3108 mdecorde
                        String s = history.get(i);
656 3108 mdecorde
                        if (s.equals(url)) {
657 3108 mdecorde
                                found = i;
658 3108 mdecorde
                                break;
659 3108 mdecorde
                        }
660 3108 mdecorde
                }
661 3108 mdecorde
662 3108 mdecorde
                if (found == -1) {
663 3108 mdecorde
                        if (size >= MAX_HISTORY)
664 3108 mdecorde
                                history.remove(size - 1);
665 3108 mdecorde
                        history.add(0, url);
666 3108 mdecorde
                        WebBrowserPreference.setInternalWebBrowserHistory(history);
667 3108 mdecorde
                }
668 3108 mdecorde
                else if (found != 0) {
669 3108 mdecorde
                        history.remove(found);
670 3108 mdecorde
                        history.add(0, url);
671 3108 mdecorde
                        WebBrowserPreference.setInternalWebBrowserHistory(history);
672 3108 mdecorde
                }
673 3108 mdecorde
        }
674 3108 mdecorde
675 3108 mdecorde
        /**
676 3108 mdecorde
         *
677 3108 mdecorde
         */
678 3108 mdecorde
        @Override
679 3108 mdecorde
        public void dispose() {
680 3108 mdecorde
                super.dispose();
681 3108 mdecorde
682 3108 mdecorde
                showToolbar = false;
683 3108 mdecorde
684 3108 mdecorde
                if (busy != null)
685 3108 mdecorde
                        busy.dispose();
686 3108 mdecorde
                busy = null;
687 3108 mdecorde
688 3108 mdecorde
                browser = null;
689 3108 mdecorde
                text = null;
690 3108 mdecorde
                if (clipboard != null)
691 3108 mdecorde
                        clipboard.dispose();
692 3108 mdecorde
                clipboard = null;
693 3108 mdecorde
694 3108 mdecorde
                removeSynchronizationListener();
695 3108 mdecorde
        }
696 3108 mdecorde
697 3108 mdecorde
        private ToolBar createLocationBar(Composite parent) {
698 3108 mdecorde
                combo = new Combo(parent, SWT.DROP_DOWN);
699 3108 mdecorde
700 3108 mdecorde
                updateHistory();
701 3108 mdecorde
702 3108 mdecorde
                combo.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
703 3108 mdecorde
                        try {
704 3108 mdecorde
                                if (combo.getSelectionIndex() != -1 && !combo.getListVisible()) {
705 3108 mdecorde
                                        setURL(combo.getItem(combo.getSelectionIndex()));
706 3108 mdecorde
                                }
707 3108 mdecorde
                        }
708 3108 mdecorde
                        catch (Exception e1) {
709 3108 mdecorde
                                // ignore
710 3108 mdecorde
                        }
711 3108 mdecorde
                }));
712 3108 mdecorde
                combo.addListener(SWT.DefaultSelection, e -> setURL(combo.getText()));
713 3108 mdecorde
714 3108 mdecorde
                ToolBar toolbar = new ToolBar(parent, SWT.FLAT);
715 3108 mdecorde
716 3108 mdecorde
                ToolItem go = new ToolItem(toolbar, SWT.NONE);
717 3108 mdecorde
                go.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_GO));
718 3108 mdecorde
                go.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_GO));
719 3108 mdecorde
                go.setDisabledImage(ImageResource
720 3108 mdecorde
                                .getImage(ImageResource.IMG_DLCL_NAV_GO));
721 3108 mdecorde
                go.setToolTipText(org.eclipse.ui.internal.browser.Messages.actionWebBrowserGo);
722 3108 mdecorde
                go.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setURL(combo.getText())));
723 3108 mdecorde
724 3108 mdecorde
                return toolbar;
725 3108 mdecorde
        }
726 3108 mdecorde
727 3108 mdecorde
        private ToolBar createToolbar(Composite parent) {
728 3108 mdecorde
                ToolBar toolbar = new ToolBar(parent, SWT.FLAT);
729 3108 mdecorde
730 3108 mdecorde
                // create back and forward actions
731 3108 mdecorde
                back = new ToolItem(toolbar, SWT.NONE);
732 3108 mdecorde
                back.setImage(ImageResource
733 3108 mdecorde
                                .getImage(ImageResource.IMG_ELCL_NAV_BACKWARD));
734 3108 mdecorde
                back.setHotImage(ImageResource
735 3108 mdecorde
                                .getImage(ImageResource.IMG_CLCL_NAV_BACKWARD));
736 3108 mdecorde
                back.setDisabledImage(ImageResource
737 3108 mdecorde
                                .getImage(ImageResource.IMG_DLCL_NAV_BACKWARD));
738 3108 mdecorde
                back.setToolTipText(org.eclipse.ui.internal.browser.Messages.actionWebBrowserBack);
739 3108 mdecorde
                back.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> back()));
740 3108 mdecorde
741 3108 mdecorde
                forward = new ToolItem(toolbar, SWT.NONE);
742 3108 mdecorde
                forward.setImage(ImageResource
743 3108 mdecorde
                                .getImage(ImageResource.IMG_ELCL_NAV_FORWARD));
744 3108 mdecorde
                forward.setHotImage(ImageResource
745 3108 mdecorde
                                .getImage(ImageResource.IMG_CLCL_NAV_FORWARD));
746 3108 mdecorde
                forward.setDisabledImage(ImageResource
747 3108 mdecorde
                                .getImage(ImageResource.IMG_DLCL_NAV_FORWARD));
748 3108 mdecorde
                forward.setToolTipText(org.eclipse.ui.internal.browser.Messages.actionWebBrowserForward);
749 3108 mdecorde
                forward.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> forward()));
750 3108 mdecorde
751 3108 mdecorde
                // create refresh, stop, and print actions
752 3108 mdecorde
                ToolItem stop = new ToolItem(toolbar, SWT.NONE);
753 3108 mdecorde
                stop.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_STOP));
754 3108 mdecorde
                stop.setHotImage(ImageResource
755 3108 mdecorde
                                .getImage(ImageResource.IMG_CLCL_NAV_STOP));
756 3108 mdecorde
                stop.setDisabledImage(ImageResource
757 3108 mdecorde
                                .getImage(ImageResource.IMG_DLCL_NAV_STOP));
758 3108 mdecorde
                stop.setToolTipText(org.eclipse.ui.internal.browser.Messages.actionWebBrowserStop);
759 3108 mdecorde
                stop.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> stop()));
760 3108 mdecorde
761 3108 mdecorde
                ToolItem refresh = new ToolItem(toolbar, SWT.NONE);
762 3108 mdecorde
                refresh.setImage(ImageResource
763 3108 mdecorde
                                .getImage(ImageResource.IMG_ELCL_NAV_REFRESH));
764 3108 mdecorde
                refresh.setHotImage(ImageResource
765 3108 mdecorde
                                .getImage(ImageResource.IMG_CLCL_NAV_REFRESH));
766 3108 mdecorde
                refresh.setDisabledImage(ImageResource
767 3108 mdecorde
                                .getImage(ImageResource.IMG_DLCL_NAV_REFRESH));
768 3108 mdecorde
                refresh.setToolTipText(org.eclipse.ui.internal.browser.Messages.actionWebBrowserRefresh);
769 3108 mdecorde
                refresh.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> refresh()));
770 3108 mdecorde
771 3108 mdecorde
                return toolbar;
772 3108 mdecorde
        }
773 3108 mdecorde
774 3108 mdecorde
        /**
775 3108 mdecorde
         * Returns the current URL. Convenience method that calls the underlying SWT
776 3108 mdecorde
         * browser.
777 3108 mdecorde
         *
778 3108 mdecorde
         * @return the current URL or an empty <code>String</code> if there is no
779 3108 mdecorde
         *         current URL
780 3108 mdecorde
         * @exception SWTException
781 3108 mdecorde
         *                <ul>
782 3108 mdecorde
         *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
783 3108 mdecorde
         *                wrong thread</li>
784 3108 mdecorde
         *                <li>ERROR_WIDGET_DISPOSED when the widget has been
785 3108 mdecorde
         *                disposed</li>
786 3108 mdecorde
         *                </ul>
787 3108 mdecorde
         * @see #setURL(String)
788 3108 mdecorde
         */
789 3108 mdecorde
        public String getURL() {
790 3108 mdecorde
                if (browser != null)
791 3108 mdecorde
                        return browser.getUrl();
792 3108 mdecorde
                return text.getUrl();
793 3108 mdecorde
        }
794 3108 mdecorde
795 3108 mdecorde
        @Override
796 3108 mdecorde
        public boolean setFocus() {
797 3108 mdecorde
                if (browser != null) {
798 3108 mdecorde
                        browser.setFocus();
799 3108 mdecorde
                        updateHistory();
800 3108 mdecorde
                        return true;
801 3108 mdecorde
                }
802 3108 mdecorde
                return super.setFocus();
803 3108 mdecorde
        }
804 3108 mdecorde
805 3108 mdecorde
        /**
806 3108 mdecorde
         * Update the history list to the global/shared copy.
807 3108 mdecorde
         */
808 3108 mdecorde
        protected void updateHistory() {
809 3108 mdecorde
                if (combo == null || combo.isDisposed())
810 3108 mdecorde
                        return;
811 3108 mdecorde
812 3108 mdecorde
                String temp = combo.getText();
813 3108 mdecorde
                if (history == null)
814 3108 mdecorde
                        history = WebBrowserPreference.getInternalWebBrowserHistory();
815 3108 mdecorde
816 3108 mdecorde
                String[] historyList = new String[history.size()];
817 3108 mdecorde
                history.toArray(historyList);
818 3108 mdecorde
                combo.setItems(historyList);
819 3108 mdecorde
820 3108 mdecorde
                combo.setText(temp);
821 3108 mdecorde
        }
822 3108 mdecorde
823 3108 mdecorde
        public IBrowserViewerContainer getContainer() {
824 3108 mdecorde
                return container;
825 3108 mdecorde
        }
826 3108 mdecorde
827 3108 mdecorde
        public void setContainer(IBrowserViewerContainer container) {
828 3108 mdecorde
                if (container == null && this.container != null) {
829 3108 mdecorde
                        IStatusLineManager manager = this.container.getActionBars().getStatusLineManager();
830 3108 mdecorde
                        if (manager != null)
831 3108 mdecorde
                                manager.getProgressMonitor().done();
832 3108 mdecorde
                }
833 3108 mdecorde
                this.container = container;
834 3108 mdecorde
        }
835 3108 mdecorde
836 3108 mdecorde
        protected File file;
837 3108 mdecorde
838 3108 mdecorde
        protected long timestamp;
839 3108 mdecorde
840 3108 mdecorde
        protected Thread fileListenerThread;
841 3108 mdecorde
842 3108 mdecorde
        protected LocationListener locationListener2;
843 3108 mdecorde
844 3108 mdecorde
        protected Object syncObject = new Object();
845 3108 mdecorde
846 3108 mdecorde
        protected void addSynchronizationListener() {
847 3108 mdecorde
                if (fileListenerThread != null)
848 3108 mdecorde
                        return;
849 3108 mdecorde
850 3108 mdecorde
                fileListenerThread = new Thread("Browser file synchronization") { //$NON-NLS-1$
851 3108 mdecorde
852 3108 mdecorde
                        @Override
853 3108 mdecorde
                        public void run() {
854 3108 mdecorde
                                while (fileListenerThread != null) {
855 3108 mdecorde
                                        try {
856 3108 mdecorde
                                                Thread.sleep(2000);
857 3108 mdecorde
                                        }
858 3108 mdecorde
                                        catch (Exception e) {
859 3108 mdecorde
                                                // ignore
860 3108 mdecorde
                                        }
861 3108 mdecorde
                                        synchronized (syncObject) {
862 3108 mdecorde
                                                if (file != null && file.lastModified() != timestamp) {
863 3108 mdecorde
                                                        timestamp = file.lastModified();
864 3108 mdecorde
                                                        Display.getDefault().syncExec(() -> refresh());
865 3108 mdecorde
                                                }
866 3108 mdecorde
                                        }
867 3108 mdecorde
                                }
868 3108 mdecorde
                        }
869 3108 mdecorde
                };
870 3108 mdecorde
                fileListenerThread.setDaemon(true);
871 3108 mdecorde
                fileListenerThread.setPriority(Thread.MIN_PRIORITY);
872 3108 mdecorde
873 3108 mdecorde
                locationListener2 = new LocationAdapter() {
874 3108 mdecorde
875 3108 mdecorde
                        @Override
876 3108 mdecorde
                        public void changed(LocationEvent event) {
877 3108 mdecorde
                                File temp = getFile(event.location);
878 3108 mdecorde
                                if (temp != null && temp.exists()) {
879 3108 mdecorde
                                        synchronized (syncObject) {
880 3108 mdecorde
                                                file = temp;
881 3108 mdecorde
                                                timestamp = file.lastModified();
882 3108 mdecorde
                                        }
883 3108 mdecorde
                                }
884 3108 mdecorde
                                else
885 3108 mdecorde
                                        file = null;
886 3108 mdecorde
                        }
887 3108 mdecorde
                };
888 3108 mdecorde
                browser.addLocationListener(locationListener2);
889 3108 mdecorde
890 3108 mdecorde
                File temp = getFile(browser.getUrl());
891 3108 mdecorde
                if (temp != null && temp.exists()) {
892 3108 mdecorde
                        file = temp;
893 3108 mdecorde
                        timestamp = file.lastModified();
894 3108 mdecorde
                }
895 3108 mdecorde
                fileListenerThread.start();
896 3108 mdecorde
        }
897 3108 mdecorde
898 3108 mdecorde
        protected static File getFile(String location) {
899 3108 mdecorde
                if (location == null)
900 3108 mdecorde
                        return null;
901 3108 mdecorde
                if (location.startsWith("file:/")) //$NON-NLS-1$
902 3108 mdecorde
                        location = location.substring(6);
903 3108 mdecorde
904 3108 mdecorde
                return new File(location);
905 3108 mdecorde
        }
906 3108 mdecorde
907 3108 mdecorde
        protected void removeSynchronizationListener() {
908 3108 mdecorde
                if (fileListenerThread == null)
909 3108 mdecorde
                        return;
910 3108 mdecorde
911 3108 mdecorde
                fileListenerThread = null;
912 3108 mdecorde
                browser.removeLocationListener(locationListener2);
913 3108 mdecorde
                locationListener2 = null;
914 3108 mdecorde
        }
915 3108 mdecorde
}