]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/browser/WebUIDelegate.java
Remove invalid SHA-256-Digests
[simantics/platform.git] / bundles / org.eclipse.swt.win32.win32.x86_64 / src / org / eclipse / swt / browser / WebUIDelegate.java
1 /*******************************************************************************
2  * Copyright (c) 2010, 2017 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.swt.browser;
15
16
17 import org.eclipse.swt.*;
18 import org.eclipse.swt.events.*;
19 import org.eclipse.swt.graphics.*;
20 import org.eclipse.swt.internal.*;
21 import org.eclipse.swt.internal.ole.win32.*;
22 import org.eclipse.swt.internal.webkit.*;
23 import org.eclipse.swt.internal.win32.*;
24 import org.eclipse.swt.layout.*;
25 import org.eclipse.swt.widgets.*;
26
27 class WebUIDelegate {
28         COMObject iWebUIDelegate;
29         int refCount = 0;
30
31         String lastHoveredLinkURL;
32         Browser browser;
33         Point size;
34         Point location;
35         boolean menuBar = true, toolBar = true, statusBar = true;
36         boolean prompt = true;
37
38 WebUIDelegate (Browser browser) {
39         createCOMInterfaces ();
40         this.browser = browser;
41 }
42
43 int AddRef () {
44         refCount++;
45         return refCount;
46 }
47
48 int canTakeFocus (long sender, int forward, long result) {
49         OS.MoveMemory (result, new int[] {1}, 4); /* BOOL */
50         return COM.S_OK;
51 }
52
53 int contextMenuItemsForElement (long sender, long element, long defaultItemsHMenu, long resultHMenu) {
54         Point pt = browser.getDisplay ().getCursorLocation ();
55         Event event = new Event ();
56         event.x = pt.x;
57         event.y = pt.y;
58         browser.notifyListeners (SWT.MenuDetect, event);
59         if (event.doit) {
60                 Menu menu = browser.getMenu ();
61                 if (menu != null && !menu.isDisposed ()) {
62                         if (event.x != pt.x || event.y != pt.y) {
63                                 menu.setLocation (event.x, event.y);
64                         }
65                         menu.setVisible (true);
66                 } else {
67                         OS.MoveMemory (resultHMenu, new long[] {defaultItemsHMenu}, C.PTR_SIZEOF);
68                         return COM.S_OK;
69                 }
70         }
71         OS.MoveMemory (resultHMenu, new long[] {0}, C.PTR_SIZEOF);
72         return COM.S_OK;
73 }
74
75 void createCOMInterfaces () {
76         iWebUIDelegate = new COMObject (new int[] {2, 0, 0, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 2, 3, 4, 4, 3, 3, 3, 3, 5, 3, 1, 3, 2, 2, 2, 2, 3, 2, 3, 1, 1, 0, 0, 1, 1, 2, 2, 2, 2, 3, 5, 2, 2, 3, 1, 2, 2, 4, 10, 3}) {
77                 @Override
78                 public long method0 (long[] args) {return QueryInterface (args[0], args[1]);}
79                 @Override
80                 public long method1 (long[] args) {return AddRef ();}
81                 @Override
82                 public long method2 (long[] args)  {return Release ();}
83                 @Override
84                 public long method3 (long[] args)  {return createWebViewWithRequest (args[0], args[1], args[2]);}
85                 @Override
86                 public long method4 (long[] args)  {return webViewShow (args[0]);}
87                 @Override
88                 public long method5 (long[] args)  {return webViewClose (args[0]);}
89                 @Override
90                 public long method6 (long[] args)  {return COM.E_NOTIMPL;}
91                 @Override
92                 public long method7 (long[] args)  {return COM.E_NOTIMPL;}
93                 @Override
94                 public long method8 (long[] args)  {return COM.E_NOTIMPL;}
95                 @Override
96                 public long method9 (long[] args)  {return COM.E_NOTIMPL;}
97                 @Override
98                 public long method10 (long[] args) {return setStatusText (args[0], args[1]);}
99                 @Override
100                 public long method11 (long[] args) {return COM.E_NOTIMPL;}
101                 @Override
102                 public long method12 (long[] args) {return COM.E_NOTIMPL;}
103                 @Override
104                 public long method13 (long[] args) {return setToolbarsVisible (args[0], (int)args[1]);}
105                 @Override
106                 public long method14 (long[] args) {return COM.E_NOTIMPL;}
107                 @Override
108                 public long method15 (long[] args) {return setStatusBarVisible (args[0], (int)args[1]);}
109                 @Override
110                 public long method16 (long[] args) {return COM.E_NOTIMPL;}
111                 @Override
112                 public long method17 (long[] args) {return COM.E_NOTIMPL;}
113                 @Override
114                 public long method18 (long[] args) {return setFrame (args[0], args[1]);}
115                 @Override
116                 public long method19 (long[] args) {return COM.E_NOTIMPL;}
117                 @Override
118                 public long method20 (long[] args) {return COM.E_NOTIMPL;}
119                 @Override
120                 public long method21 (long[] args) {return COM.E_NOTIMPL;}
121                 @Override
122                 public long method22 (long[] args) {return runJavaScriptAlertPanelWithMessage (args[0], args[1]);}
123                 @Override
124                 public long method23 (long[] args) {return runJavaScriptConfirmPanelWithMessage (args[0], args[1], args[2]);}
125                 @Override
126                 public long method24 (long[] args) {return runJavaScriptTextInputPanelWithPrompt (args[0], args[1], args[2], args[3]);}
127                 @Override
128                 public long method25 (long[] args) {return runBeforeUnloadConfirmPanelWithMessage (args[0], args[1], args[2], args[3]);}
129                 @Override
130                 public long method26 (long[] args) {return runOpenPanelForFileButtonWithResultListener (args[0], args[1]);}
131                 @Override
132                 public long method27 (long[] args) {return mouseDidMoveOverElement (args[0], args[1], (int)args[2]);}
133                 @Override
134                 public long method28 (long[] args) {return contextMenuItemsForElement (args[0], args[1], args[2], args[3]);}
135                 @Override
136                 public long method29 (long[] args) {return COM.E_NOTIMPL;}
137                 @Override
138                 public long method30 (long[] args) {return COM.E_NOTIMPL;}
139                 @Override
140                 public long method31 (long[] args) {return COM.E_NOTIMPL;}
141                 @Override
142                 public long method32 (long[] args) {return COM.E_NOTIMPL;}
143                 @Override
144                 public long method33 (long[] args) {return COM.E_NOTIMPL;}
145                 @Override
146                 public long method34 (long[] args) {return COM.E_NOTIMPL;}
147                 @Override
148                 public long method35 (long[] args) {return COM.E_NOTIMPL;}
149                 @Override
150                 public long method36 (long[] args) {return COM.E_NOTIMPL;}
151                 @Override
152                 public long method37 (long[] args) {return COM.E_NOTIMPL;}
153                 @Override
154                 public long method38 (long[] args) {return COM.E_NOTIMPL;}
155                 @Override
156                 public long method39 (long[] args) {return COM.E_NOTIMPL;}
157                 @Override
158                 public long method40 (long[] args) {return COM.E_NOTIMPL;}
159                 @Override
160                 public long method41 (long[] args) {return COM.E_NOTIMPL;}
161                 @Override
162                 public long method42 (long[] args) {return canTakeFocus (args[0], (int)args[1], args[2]);}
163                 @Override
164                 public long method43 (long[] args) {return takeFocus (args[0], (int)args[1]);}
165                 @Override
166                 public long method44 (long[] args) {return COM.E_NOTIMPL;}
167                 @Override
168                 public long method45 (long[] args) {return COM.S_OK;}
169                 @Override
170                 public long method46 (long[] args) {return COM.E_NOTIMPL;}
171                 @Override
172                 public long method47 (long[] args) {return COM.E_NOTIMPL;}
173                 @Override
174                 public long method48 (long[] args) {return COM.E_NOTIMPL;}
175                 @Override
176                 public long method49 (long[] args) {return COM.E_NOTIMPL;}
177                 @Override
178                 public long method50 (long[] args) {return COM.E_NOTIMPL;}
179                 @Override
180                 public long method51 (long[] args) {return printFrame (args[0], args[1]);}
181                 @Override
182                 public long method52 (long[] args) {return COM.E_NOTIMPL;}
183                 @Override
184                 public long method53 (long[] args) {return COM.E_NOTIMPL;}
185                 @Override
186                 public long method54 (long[] args) {return COM.E_NOTIMPL;}
187                 @Override
188                 public long method55 (long[] args) {return COM.E_NOTIMPL;}
189                 @Override
190                 public long method56 (long[] args) {return COM.E_NOTIMPL;}
191                 @Override
192                 public long method57 (long[] args) {return COM.E_NOTIMPL;}
193                 @Override
194                 public long method58 (long[] args) {return COM.E_NOTIMPL;}
195                 @Override
196                 public long method59 (long[] args) {return COM.E_NOTIMPL;}
197                 @Override
198                 public long method60 (long[] args) {return COM.E_NOTIMPL;}
199                 @Override
200                 public long method61 (long[] args) {return COM.E_NOTIMPL;}
201                 @Override
202                 public long method62 (long[] args) {return setMenuBarVisible (args[0], (int)args[1]);}
203                 @Override
204                 public long method63 (long[] args) {return COM.E_NOTIMPL;}
205                 @Override
206                 public long method64 (long[] args) {return COM.E_NOTIMPL;}
207                 @Override
208                 public long method65 (long[] args) {return COM.E_NOTIMPL;}
209         };
210 }
211
212 int createWebViewWithRequest (long sender, long request, long webView) {
213         WindowEvent newEvent = new WindowEvent (browser);
214         newEvent.display = browser.getDisplay ();
215         newEvent.widget = browser;
216         newEvent.required = true;
217         OpenWindowListener[] openWindowListeners = browser.webBrowser.openWindowListeners;
218         for (int i = 0; i < openWindowListeners.length; i++) {
219                 openWindowListeners[i].open (newEvent);
220         }
221         IWebView iwebview = null;
222         Browser browser = null;
223         if (newEvent.browser != null && newEvent.browser.webBrowser instanceof WebKit) {
224                 browser = newEvent.browser;
225         }
226         if (browser != null && !browser.isDisposed ()) {
227                 iwebview = ((WebKit)browser.webBrowser).webView;
228                 OS.MoveMemory (webView, new long[] {iwebview.getAddress ()}, C.PTR_SIZEOF);
229                 if (request != 0) {
230                         IWebURLRequest req = new IWebURLRequest (request);
231                         long[] result = new long[1];
232                         int hr = req.URL (result);
233                         if (hr != COM.S_OK || result[0] == 0) {
234                                 return COM.S_OK;
235                         }
236                         String sUrl = WebKit.extractBSTR (result[0]);
237                         COM.SysFreeString (result[0]);
238                         if (sUrl.length () != 0) {
239                                 result[0] = 0;
240                                 hr = iwebview.mainFrame (result);
241                                 if (hr != COM.S_OK || result[0] == 0) {
242                                         return COM.S_OK;
243                                 }
244                                 IWebFrame mainFrame = new IWebFrame (result[0]);
245                                 mainFrame.loadRequest (req.getAddress ());
246                                 mainFrame.Release ();
247                         }
248                 }
249                 return COM.S_OK;
250         }
251         return COM.E_NOTIMPL;
252 }
253
254 protected void disposeCOMInterfaces () {
255         if (iWebUIDelegate != null) {
256                 iWebUIDelegate.dispose ();
257                 iWebUIDelegate = null;
258         }
259 }
260
261 long getAddress () {
262         return iWebUIDelegate.getAddress ();
263 }
264
265 int mouseDidMoveOverElement (long sender, long elementInformation, int modifierFlags) {
266         if (elementInformation == 0) return COM.S_OK;
267
268         IPropertyBag info = new IPropertyBag (elementInformation);
269         long key = WebKit.createBSTR ("WebElementLinkURLKey"); //$NON-NLS-N$
270         long hHeap = OS.GetProcessHeap ();
271         long resultPtr = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, VARIANT.sizeof);
272         int hr = info.Read (key, resultPtr, null);
273         if (hr != COM.S_OK || resultPtr == 0) {
274                 return COM.S_OK;
275         }
276         String value = null;
277         VARIANT v = new VARIANT ();
278         COM.MoveMemory (v, resultPtr, VARIANT.sizeof);
279         if (v.vt == COM.VT_BSTR) value = WebKit.extractBSTR (v.lVal);
280         OS.HeapFree (hHeap, 0, resultPtr);
281         StatusTextListener[] statusTextListeners = browser.webBrowser.statusTextListeners;
282         if (value == null || value.length () == 0) {
283                 /* not currently over a link */
284                 if (lastHoveredLinkURL == null) return COM.S_OK;
285                 lastHoveredLinkURL = null;
286                 StatusTextEvent statusText = new StatusTextEvent (browser);
287                 statusText.display = browser.getDisplay ();
288                 statusText.widget = browser;
289                 statusText.text = "";   //$NON-NLS-1$
290                 for (int i = 0; i < statusTextListeners.length; i++) {
291                         statusTextListeners[i].changed (statusText);
292                 }
293                 return COM.S_OK;
294         }
295         if (value.equals (lastHoveredLinkURL)) return COM.S_OK;
296         lastHoveredLinkURL = value;
297         StatusTextEvent statusText = new StatusTextEvent (browser);
298         statusText.display = browser.getDisplay ();
299         statusText.widget = browser;
300         statusText.text = value;
301         for (int i = 0; i < statusTextListeners.length; i++) {
302                 statusTextListeners[i].changed (statusText);
303         }
304         return COM.S_OK;
305 }
306
307 int printFrame (long webView, long frame) {
308         IWebFrame iwebFrame = new IWebFrame (frame);
309         PRINTDLG pd = new PRINTDLG ();
310         pd.lStructSize = PRINTDLG.sizeof;
311         pd.Flags = OS.PD_RETURNDC;
312         Display display = browser.getDisplay ();
313         String externalLoopKey = "org.eclipse.swt.internal.win32.externalEventLoop";
314         display.setData(externalLoopKey, Boolean.TRUE);
315         display.sendPreExternalEventDispatchEvent ();
316         boolean success = OS.PrintDlg (pd);
317         display.setData(externalLoopKey, Boolean.FALSE);
318         display.sendPostExternalEventDispatchEvent ();
319         if (!success) return COM.S_OK;
320         long printDC = pd.hDC;
321
322         long[] result = new long[1];
323         int hr = iwebFrame.QueryInterface (WebKit_win32.IID_IWebFramePrivate, result);
324         if (hr != COM.S_OK || result[0] == 0) {
325                 return COM.S_OK;
326         }
327         IWebFramePrivate privateFrame = new IWebFramePrivate (result[0]);
328         privateFrame.setInPrintingMode (1, printDC);
329         int[] count = new int[1];
330         hr = privateFrame.getPrintedPageCount (printDC, count);
331         if (hr != COM.S_OK || count[0] == 0) {
332                 privateFrame.Release ();
333                 return COM.S_OK;
334         }
335         int pageCount = count[0];
336         String jobName = null;
337         result[0] = 0;
338         hr = iwebFrame.dataSource (result);
339         if (hr == COM.S_OK && result[0] != 0) {
340                 IWebDataSource dataSource = new IWebDataSource (result[0]);
341                 result[0] = 0;
342                 hr = dataSource.pageTitle (result);
343                 dataSource.Release ();
344                 if (hr == COM.S_OK && result[0] != 0) {
345                         jobName = WebKit.extractBSTR (result[0]);
346                         COM.SysFreeString (result[0]);
347                 }
348         }
349         DOCINFO di = new DOCINFO ();
350         di.cbSize = DOCINFO.sizeof;
351         long hHeap = OS.GetProcessHeap ();
352         long lpszDocName = 0;
353         if (jobName != null && jobName.length () != 0) {
354                 /* Use the character encoding for the default locale */
355                 TCHAR buffer = new TCHAR (0, jobName, true);
356                 int byteCount = buffer.length () * TCHAR.sizeof;
357                 lpszDocName = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
358                 OS.MoveMemory (lpszDocName, buffer, byteCount);
359                 di.lpszDocName = lpszDocName;
360         }
361         int rc = OS.StartDoc (printDC, di);
362         if (lpszDocName != 0) OS.HeapFree (hHeap, 0, lpszDocName);
363         if (rc >= 0) {
364                 for (int i = 0; i < pageCount; i++) {
365                         OS.StartPage (printDC);
366                         privateFrame.spoolPages (printDC, i, i, null);
367                         OS.EndPage (printDC);
368                 }
369                 privateFrame.setInPrintingMode (0, printDC);
370                 OS.EndDoc (printDC);
371         }
372         privateFrame.Release ();
373         return COM.S_OK;
374 }
375
376 int QueryInterface (long riid, long ppvObject) {
377         if (riid == 0 || ppvObject == 0) return COM.E_INVALIDARG;
378         GUID guid = new GUID ();
379         COM.MoveMemory (guid, riid, GUID.sizeof);
380
381         if (COM.IsEqualGUID (guid, COM.IIDIUnknown)) {
382                 OS.MoveMemory (ppvObject, new long[] {iWebUIDelegate.getAddress ()}, C.PTR_SIZEOF);
383                 new IUnknown (iWebUIDelegate.getAddress ()).AddRef ();
384                 return COM.S_OK;
385         }
386         if (COM.IsEqualGUID (guid, WebKit_win32.IID_IWebUIDelegate)) {
387                 OS.MoveMemory (ppvObject, new long[] {iWebUIDelegate.getAddress ()}, C.PTR_SIZEOF);
388                 new IUnknown (iWebUIDelegate.getAddress ()).AddRef ();
389                 return COM.S_OK;
390         }
391
392         OS.MoveMemory (ppvObject, new long[] {0}, C.PTR_SIZEOF);
393         return COM.E_NOINTERFACE;
394 }
395
396 int Release () {
397         refCount--;
398         if (refCount == 0) {
399                 disposeCOMInterfaces ();
400         }
401         return refCount;
402 }
403
404 int runBeforeUnloadConfirmPanelWithMessage (long sender, long message, long initiatedByFrame, long result) {
405         if (!prompt) return COM.S_OK;
406
407         Shell parent = browser.getShell ();
408         String string = WebKit.extractBSTR (message);
409         StringBuilder text = new StringBuilder (Compatibility.getMessage ("SWT_OnBeforeUnload_Message1")); //$NON-NLS-1$
410         text.append ("\n\n"); //$NON-NLS-1$
411         text.append (string);
412         text.append ("\n\n"); //$NON-NLS-1$
413         text.append (Compatibility.getMessage ("SWT_OnBeforeUnload_Message2")); //$NON-NLS-1$
414         MessageBox box = new MessageBox (parent, SWT.OK | SWT.CANCEL | SWT.ICON_QUESTION);
415         box.setMessage (text.toString ());
416         int[] response = new int[1];
417         response[0] = box.open () == SWT.OK ? 1 : 0;
418         OS.MoveMemory (result, response, 4); /* BOOL */
419         return COM.S_OK;
420 }
421
422 int runJavaScriptAlertPanelWithMessage (long sender, long message) {
423         String messageString = WebKit.extractBSTR (message);
424         showAlertMessage ("Javascript", messageString); //$NON-NLS-1$
425         return COM.S_OK;
426 }
427
428 int runJavaScriptConfirmPanelWithMessage (long sender, long message, long result) {
429         String messageString = WebKit.extractBSTR (message);
430         int[] response = new int[1];
431         response[0] = showConfirmPanel ("Javascript", messageString) == SWT.OK ? 1 : 0; //$NON-NLS-1$
432         OS.MoveMemory (result, response, 4); /* BOOL */
433         return COM.S_OK;
434 }
435
436 int runJavaScriptTextInputPanelWithPrompt (long sender, long message, long defaultText, long result) {
437         String messageString = WebKit.extractBSTR (message);
438         String defaultTextString = WebKit.extractBSTR (defaultText);
439         String resultString = showTextPrompter ("Javascript", messageString, defaultTextString); //$NON-NLS-1$
440         long[] response = new long[1];
441         if (resultString != null) {
442                 response[0] = WebKit.createBSTR (resultString);
443         }
444         OS.MoveMemory (result, response, C.PTR_SIZEOF);
445         return COM.S_OK;
446 }
447
448 int runOpenPanelForFileButtonWithResultListener (long sender, long resultListener) {
449         Shell parent = browser.getShell ();
450         FileDialog dialog = new FileDialog (parent, SWT.NONE);
451         String result = dialog.open ();
452         IWebOpenPanelResultListener listener = new IWebOpenPanelResultListener (resultListener);
453         if (result == null) {
454                 listener.cancel ();
455         } else {
456                 listener.chooseFilename (WebKit.createBSTR (result));
457         }
458         return COM.S_OK;
459 }
460
461 int setFrame (long sender, long frame) {
462         RECT rect = new RECT ();
463         COM.MoveMemory (rect, frame, RECT.sizeof);
464         /* convert to SWT system coordinates */
465         location = DPIUtil.autoScaleUp(browser.getDisplay ().map (browser, null, DPIUtil.autoScaleDown(new Point(rect.left, rect.top)))); // To Pixels
466         int x = rect.right - rect.left;
467         int y = rect.bottom - rect.top;
468         if (y < 0 || x < 0 || (x == 0 && y == 0)) return COM.S_OK;
469         size = new Point (x, y);
470         return COM.S_OK;
471 }
472
473 int setMenuBarVisible (long sender, int visible) {
474         /* Note.  Webkit only emits the notification when the status bar should be hidden. */
475         menuBar = visible == 1;
476         return COM.S_OK;
477 }
478
479 int setStatusBarVisible (long sender, int visible) {
480         /* Note.  Webkit only emits the notification when the status bar should be hidden. */
481         statusBar = visible == 1;
482         return COM.S_OK;
483 }
484
485 int setStatusText (long sender, long text) {
486         String statusText = WebKit.extractBSTR (text);
487         if (statusText.length () == 0) return COM.S_OK;
488         StatusTextEvent statusTextEvent = new StatusTextEvent (browser);
489         statusTextEvent.display = browser.getDisplay ();
490         statusTextEvent.widget = browser;
491         statusTextEvent.text = statusText;
492         StatusTextListener[] statusTextListeners = browser.webBrowser.statusTextListeners;
493         for (int i = 0; i < statusTextListeners.length; i++) {
494                 statusTextListeners[i].changed (statusTextEvent);
495         }
496         return COM.S_OK;
497 }
498
499 int setToolbarsVisible (long sender, int visible) {
500         /* Note.  Webkit only emits the notification when the status bar should be hidden. */
501         toolBar = visible == 1;
502         return COM.S_OK;
503 }
504
505 void showAlertMessage (String title, String message) {
506         Shell parent = browser.getShell ();
507         final Shell dialog = new Shell (parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
508         GridLayout layout = new GridLayout (2, false);
509         layout.horizontalSpacing = 10;
510         layout.verticalSpacing = 20;
511         layout.marginWidth = layout.marginHeight = 10;
512         dialog.setLayout (layout);
513         dialog.setText (title);
514
515         Label label = new Label (dialog, SWT.NONE);
516         Image image = dialog.getDisplay ().getSystemImage (SWT.ICON_WARNING);
517         label.setImage (image);
518
519         label = new Label (dialog, SWT.WRAP);
520         label.setText (message);
521         Monitor monitor = parent.getMonitor ();
522         int maxWidth = monitor.getBounds().width * 2 / 3;
523         int width = label.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
524         GridData data = new GridData (SWT.FILL, SWT.CENTER, true, false);
525         data.widthHint = Math.min (width, maxWidth);
526         label.setLayoutData (data);
527
528         Button ok = new Button (dialog, SWT.PUSH);
529         ok.setText (SWT.getMessage ("SWT_OK")); //$NON-NLS-1$
530         width = ok.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
531         GridData layoutData = new GridData ();
532         layoutData.horizontalAlignment = SWT.CENTER;
533         layoutData.verticalAlignment = SWT.CENTER;
534         layoutData.horizontalSpan = 2;
535         layoutData.widthHint = Math.max (width, 75);
536         ok.setLayoutData (layoutData);
537
538         ok.addSelectionListener (new SelectionAdapter () {
539                 @Override
540                 public void widgetSelected (SelectionEvent e) {
541                         dialog.dispose ();
542                 }
543         });
544
545         dialog.setDefaultButton (ok);
546         dialog.pack ();
547         Rectangle parentSize = parent.getBounds ();
548         Rectangle dialogSize = dialog.getBounds ();
549         int x = parent.getLocation ().x + (parentSize.width - dialogSize.width) / 2;
550         int y = parent.getLocation ().y + (parentSize.height - dialogSize.height) / 2;
551         dialog.setLocation (x, y);
552         dialog.open ();
553         Display display = browser.getDisplay ();
554         while (!dialog.isDisposed ()) {
555                 if (!display.readAndDispatch ()) display.sleep ();
556         }
557 }
558
559 int showConfirmPanel (String title, String message) {
560         Shell parent = browser.getShell ();
561         final Shell dialog = new Shell (parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
562         GridLayout layout = new GridLayout (2, false);
563         layout.horizontalSpacing = 10;
564         layout.verticalSpacing = 20;
565         layout.marginWidth = layout.marginHeight = 10;
566         dialog.setLayout (layout);
567         dialog.setText (title);
568
569         Label label = new Label (dialog, SWT.NONE);
570         Image image = dialog.getDisplay ().getSystemImage (SWT.ICON_QUESTION);
571         label.setImage (image);
572         label.setLayoutData (new GridData ());
573
574         label = new Label (dialog, SWT.WRAP);
575         label.setText (message);
576         Monitor monitor = parent.getMonitor ();
577         int maxWidth = monitor.getBounds ().width * 2 / 3;
578         int width = label.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
579         GridData data = new GridData (SWT.FILL, SWT.CENTER, true, false);
580         data.widthHint = Math.min (width, maxWidth);
581         label.setLayoutData (data);
582
583         Composite buttons = new Composite (dialog, SWT.NONE);
584         data = new GridData (SWT.CENTER, SWT.CENTER, true, true, 2, 1);
585         buttons.setLayoutData (data);
586         buttons.setLayout (new GridLayout (2, true));
587
588         Button ok = new Button (buttons, SWT.PUSH);
589         ok.setText (SWT.getMessage ("SWT_OK")); //$NON-NLS-1$
590         GridData layoutData = new GridData ();
591         layoutData.horizontalAlignment = SWT.CENTER;
592         layoutData.verticalAlignment = SWT.CENTER;
593         ok.setLayoutData (layoutData);
594
595         Button cancel = new Button (buttons, SWT.PUSH);
596         cancel.setText (SWT.getMessage ("SWT_Cancel")); //$NON-NLS-1$
597         cancel.setLayoutData (layoutData);
598         width = cancel.computeSize (SWT.DEFAULT, SWT.DEFAULT).x;
599         layoutData.widthHint = Math.max (width, 75);
600
601         final int[] result = new int[1];
602         ok.addSelectionListener (new SelectionAdapter () {
603                 @Override
604                 public void widgetSelected (SelectionEvent e) {
605                         result[0] = SWT.OK;
606                         dialog.dispose ();
607                 }
608         });
609         cancel.addSelectionListener (new SelectionAdapter () {
610                 @Override
611                 public void widgetSelected (SelectionEvent e) {
612                         result[0] = SWT.CANCEL;
613                         dialog.dispose ();
614                 }
615         });
616
617         dialog.setDefaultButton (ok);
618         dialog.pack ();
619         Rectangle parentSize = parent.getBounds ();
620         Rectangle dialogSize = dialog.getBounds ();
621         int x = parent.getLocation ().x + (parentSize.width - dialogSize.width) / 2;
622         int y = parent.getLocation ().y + (parentSize.height - dialogSize.height) / 2;
623         dialog.setLocation (x, y);
624         dialog.open ();
625         Display display = browser.getDisplay ();
626         while (!dialog.isDisposed ()) {
627                 if (!display.readAndDispatch ()) display.sleep ();
628         }
629         return result[0];
630 }
631
632 String showTextPrompter (String title, String message, String defaultText) {
633         Shell parent = browser.getShell ();
634         final Shell dialog = new Shell (parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
635         dialog.setLayout (new GridLayout ());
636         dialog.setText (title);
637
638         Label label = new Label (dialog, SWT.NONE);
639         label.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
640         label.setText (message);
641
642         final Text textBox = new Text (dialog, SWT.SINGLE | SWT.BORDER);
643         GridData data = new GridData (GridData.FILL_HORIZONTAL);
644         data.widthHint = 300;
645         textBox.setLayoutData (data);
646         textBox.setText (defaultText);
647
648         Composite buttons = new Composite (dialog, SWT.NONE);
649         buttons.setLayout (new GridLayout (2, true));
650         buttons.setLayoutData (new GridData (GridData.HORIZONTAL_ALIGN_CENTER));
651         Button ok = new Button (buttons, SWT.PUSH);
652         ok.setText (SWT.getMessage ("SWT_OK")); //$NON-NLS-1$
653         ok.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
654
655         final String[] result = new String[1];
656         ok.addSelectionListener (new SelectionAdapter () {
657                 @Override
658                 public void widgetSelected (SelectionEvent e) {
659                         result[0] = textBox.getText ();
660                         dialog.dispose ();
661                 }
662         });
663         Button cancel = new Button (buttons, SWT.PUSH);
664         cancel.setText (SWT.getMessage ("SWT_Cancel")); //$NON-NLS-1$
665         cancel.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
666         cancel.addSelectionListener (new SelectionAdapter () {
667                 @Override
668                 public void widgetSelected (SelectionEvent e) {
669                         dialog.dispose ();
670                 }
671         });
672
673         dialog.setDefaultButton (ok);
674         dialog.pack ();
675         Rectangle parentSize = parent.getBounds ();
676         Rectangle dialogSize = dialog.getBounds ();
677         int x = parent.getLocation ().x + (parentSize.width - dialogSize.width) / 2;
678         int y = parent.getLocation ().y + (parentSize.height - dialogSize.height) / 2;
679         dialog.setLocation (x, y);
680         dialog.open ();
681         Display display = browser.getDisplay ();
682         while (!dialog.isDisposed ()) {
683                 if (!display.readAndDispatch ()) display.sleep ();
684         }
685         return result[0];
686 }
687
688 int takeFocus (long sender, int forward) {
689         int traveralCode = forward == 0 ? SWT.TRAVERSE_TAB_PREVIOUS : SWT.TRAVERSE_TAB_NEXT;
690         ((WebKit)browser.webBrowser).traverseOut = true;
691         browser.traverse (traveralCode);
692         return COM.S_OK;
693 }
694
695 int webViewClose (long sender) {
696         WindowEvent newEvent = new WindowEvent (browser);
697         newEvent.display = browser.getDisplay ();
698         newEvent.widget = browser;
699         CloseWindowListener[] closeWindowListeners = browser.webBrowser.closeWindowListeners;
700         for (int i = 0; i < closeWindowListeners.length; i++) {
701                 closeWindowListeners[i].close (newEvent);
702         }
703         browser.dispose ();
704         return COM.S_OK;
705 }
706
707 int webViewFrame (long sender, long frame) {
708         RECT rect = new RECT ();
709         OS.MoveMemory (frame, rect, RECT.sizeof);
710         return COM.S_OK;
711 }
712
713 int webViewShow (long sender) {
714         WindowEvent newEvent = new WindowEvent (browser);
715         newEvent.display = browser.getDisplay ();
716         newEvent.widget = browser;
717         if (location != null) newEvent.location = location;
718         if (size != null) newEvent.size = size;
719         /*
720         * Feature in WebKit.  WebKit's tool bar contains
721         * the address bar.  The address bar is displayed
722         * if the tool bar is displayed. There is no separate
723         * notification for the address bar.
724         */
725         newEvent.addressBar = toolBar;
726         newEvent.menuBar = menuBar;
727         newEvent.statusBar = statusBar;
728         newEvent.toolBar = toolBar;
729         VisibilityWindowListener[] visibilityWindowListeners = browser.webBrowser.visibilityWindowListeners;
730         for (int i = 0; i < visibilityWindowListeners.length; i++) {
731                 visibilityWindowListeners[i].show (newEvent);
732         }
733         location = null;
734         size = null;
735         return COM.S_OK;
736 }
737
738 }