root / tmp / org.txm.libs.javafx / swt / JFXBrowserViewer.java @ 3132
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 | } |