1 /*******************************************************************************
2 * Copyright (c) 2010, 2017 IBM Corporation and others.
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/
9 * SPDX-License-Identifier: EPL-2.0
12 * IBM Corporation - initial API and implementation
13 *******************************************************************************/
14 package org.eclipse.swt.browser;
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.*;
28 COMObject iWebUIDelegate;
31 String lastHoveredLinkURL;
35 boolean menuBar = true, toolBar = true, statusBar = true;
36 boolean prompt = true;
38 WebUIDelegate (Browser browser) {
39 createCOMInterfaces ();
40 this.browser = browser;
48 int canTakeFocus (long sender, int forward, long result) {
49 OS.MoveMemory (result, new int[] {1}, 4); /* BOOL */
53 int contextMenuItemsForElement (long sender, long element, long defaultItemsHMenu, long resultHMenu) {
54 Point pt = browser.getDisplay ().getCursorLocation ();
55 Event event = new Event ();
58 browser.notifyListeners (SWT.MenuDetect, event);
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);
65 menu.setVisible (true);
67 OS.MoveMemory (resultHMenu, new long[] {defaultItemsHMenu}, C.PTR_SIZEOF);
71 OS.MoveMemory (resultHMenu, new long[] {0}, C.PTR_SIZEOF);
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}) {
78 public long method0 (long[] args) {return QueryInterface (args[0], args[1]);}
80 public long method1 (long[] args) {return AddRef ();}
82 public long method2 (long[] args) {return Release ();}
84 public long method3 (long[] args) {return createWebViewWithRequest (args[0], args[1], args[2]);}
86 public long method4 (long[] args) {return webViewShow (args[0]);}
88 public long method5 (long[] args) {return webViewClose (args[0]);}
90 public long method6 (long[] args) {return COM.E_NOTIMPL;}
92 public long method7 (long[] args) {return COM.E_NOTIMPL;}
94 public long method8 (long[] args) {return COM.E_NOTIMPL;}
96 public long method9 (long[] args) {return COM.E_NOTIMPL;}
98 public long method10 (long[] args) {return setStatusText (args[0], args[1]);}
100 public long method11 (long[] args) {return COM.E_NOTIMPL;}
102 public long method12 (long[] args) {return COM.E_NOTIMPL;}
104 public long method13 (long[] args) {return setToolbarsVisible (args[0], (int)args[1]);}
106 public long method14 (long[] args) {return COM.E_NOTIMPL;}
108 public long method15 (long[] args) {return setStatusBarVisible (args[0], (int)args[1]);}
110 public long method16 (long[] args) {return COM.E_NOTIMPL;}
112 public long method17 (long[] args) {return COM.E_NOTIMPL;}
114 public long method18 (long[] args) {return setFrame (args[0], args[1]);}
116 public long method19 (long[] args) {return COM.E_NOTIMPL;}
118 public long method20 (long[] args) {return COM.E_NOTIMPL;}
120 public long method21 (long[] args) {return COM.E_NOTIMPL;}
122 public long method22 (long[] args) {return runJavaScriptAlertPanelWithMessage (args[0], args[1]);}
124 public long method23 (long[] args) {return runJavaScriptConfirmPanelWithMessage (args[0], args[1], args[2]);}
126 public long method24 (long[] args) {return runJavaScriptTextInputPanelWithPrompt (args[0], args[1], args[2], args[3]);}
128 public long method25 (long[] args) {return runBeforeUnloadConfirmPanelWithMessage (args[0], args[1], args[2], args[3]);}
130 public long method26 (long[] args) {return runOpenPanelForFileButtonWithResultListener (args[0], args[1]);}
132 public long method27 (long[] args) {return mouseDidMoveOverElement (args[0], args[1], (int)args[2]);}
134 public long method28 (long[] args) {return contextMenuItemsForElement (args[0], args[1], args[2], args[3]);}
136 public long method29 (long[] args) {return COM.E_NOTIMPL;}
138 public long method30 (long[] args) {return COM.E_NOTIMPL;}
140 public long method31 (long[] args) {return COM.E_NOTIMPL;}
142 public long method32 (long[] args) {return COM.E_NOTIMPL;}
144 public long method33 (long[] args) {return COM.E_NOTIMPL;}
146 public long method34 (long[] args) {return COM.E_NOTIMPL;}
148 public long method35 (long[] args) {return COM.E_NOTIMPL;}
150 public long method36 (long[] args) {return COM.E_NOTIMPL;}
152 public long method37 (long[] args) {return COM.E_NOTIMPL;}
154 public long method38 (long[] args) {return COM.E_NOTIMPL;}
156 public long method39 (long[] args) {return COM.E_NOTIMPL;}
158 public long method40 (long[] args) {return COM.E_NOTIMPL;}
160 public long method41 (long[] args) {return COM.E_NOTIMPL;}
162 public long method42 (long[] args) {return canTakeFocus (args[0], (int)args[1], args[2]);}
164 public long method43 (long[] args) {return takeFocus (args[0], (int)args[1]);}
166 public long method44 (long[] args) {return COM.E_NOTIMPL;}
168 public long method45 (long[] args) {return COM.S_OK;}
170 public long method46 (long[] args) {return COM.E_NOTIMPL;}
172 public long method47 (long[] args) {return COM.E_NOTIMPL;}
174 public long method48 (long[] args) {return COM.E_NOTIMPL;}
176 public long method49 (long[] args) {return COM.E_NOTIMPL;}
178 public long method50 (long[] args) {return COM.E_NOTIMPL;}
180 public long method51 (long[] args) {return printFrame (args[0], args[1]);}
182 public long method52 (long[] args) {return COM.E_NOTIMPL;}
184 public long method53 (long[] args) {return COM.E_NOTIMPL;}
186 public long method54 (long[] args) {return COM.E_NOTIMPL;}
188 public long method55 (long[] args) {return COM.E_NOTIMPL;}
190 public long method56 (long[] args) {return COM.E_NOTIMPL;}
192 public long method57 (long[] args) {return COM.E_NOTIMPL;}
194 public long method58 (long[] args) {return COM.E_NOTIMPL;}
196 public long method59 (long[] args) {return COM.E_NOTIMPL;}
198 public long method60 (long[] args) {return COM.E_NOTIMPL;}
200 public long method61 (long[] args) {return COM.E_NOTIMPL;}
202 public long method62 (long[] args) {return setMenuBarVisible (args[0], (int)args[1]);}
204 public long method63 (long[] args) {return COM.E_NOTIMPL;}
206 public long method64 (long[] args) {return COM.E_NOTIMPL;}
208 public long method65 (long[] args) {return COM.E_NOTIMPL;}
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);
221 IWebView iwebview = null;
222 Browser browser = null;
223 if (newEvent.browser != null && newEvent.browser.webBrowser instanceof WebKit) {
224 browser = newEvent.browser;
226 if (browser != null && !browser.isDisposed ()) {
227 iwebview = ((WebKit)browser.webBrowser).webView;
228 OS.MoveMemory (webView, new long[] {iwebview.getAddress ()}, C.PTR_SIZEOF);
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) {
236 String sUrl = WebKit.extractBSTR (result[0]);
237 COM.SysFreeString (result[0]);
238 if (sUrl.length () != 0) {
240 hr = iwebview.mainFrame (result);
241 if (hr != COM.S_OK || result[0] == 0) {
244 IWebFrame mainFrame = new IWebFrame (result[0]);
245 mainFrame.loadRequest (req.getAddress ());
246 mainFrame.Release ();
251 return COM.E_NOTIMPL;
254 protected void disposeCOMInterfaces () {
255 if (iWebUIDelegate != null) {
256 iWebUIDelegate.dispose ();
257 iWebUIDelegate = null;
262 return iWebUIDelegate.getAddress ();
265 int mouseDidMoveOverElement (long sender, long elementInformation, int modifierFlags) {
266 if (elementInformation == 0) return COM.S_OK;
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) {
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);
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);
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;
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) {
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 ();
335 int pageCount = count[0];
336 String jobName = null;
338 hr = iwebFrame.dataSource (result);
339 if (hr == COM.S_OK && result[0] != 0) {
340 IWebDataSource dataSource = new IWebDataSource (result[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]);
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;
361 int rc = OS.StartDoc (printDC, di);
362 if (lpszDocName != 0) OS.HeapFree (hHeap, 0, lpszDocName);
364 for (int i = 0; i < pageCount; i++) {
365 OS.StartPage (printDC);
366 privateFrame.spoolPages (printDC, i, i, null);
367 OS.EndPage (printDC);
369 privateFrame.setInPrintingMode (0, printDC);
372 privateFrame.Release ();
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);
381 if (COM.IsEqualGUID (guid, COM.IIDIUnknown)) {
382 OS.MoveMemory (ppvObject, new long[] {iWebUIDelegate.getAddress ()}, C.PTR_SIZEOF);
383 new IUnknown (iWebUIDelegate.getAddress ()).AddRef ();
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 ();
392 OS.MoveMemory (ppvObject, new long[] {0}, C.PTR_SIZEOF);
393 return COM.E_NOINTERFACE;
399 disposeCOMInterfaces ();
404 int runBeforeUnloadConfirmPanelWithMessage (long sender, long message, long initiatedByFrame, long result) {
405 if (!prompt) return COM.S_OK;
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 */
422 int runJavaScriptAlertPanelWithMessage (long sender, long message) {
423 String messageString = WebKit.extractBSTR (message);
424 showAlertMessage ("Javascript", messageString); //$NON-NLS-1$
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 */
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);
444 OS.MoveMemory (result, response, C.PTR_SIZEOF);
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) {
456 listener.chooseFilename (WebKit.createBSTR (result));
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);
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;
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;
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);
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;
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);
515 Label label = new Label (dialog, SWT.NONE);
516 Image image = dialog.getDisplay ().getSystemImage (SWT.ICON_WARNING);
517 label.setImage (image);
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);
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);
538 ok.addSelectionListener (new SelectionAdapter () {
540 public void widgetSelected (SelectionEvent e) {
545 dialog.setDefaultButton (ok);
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);
553 Display display = browser.getDisplay ();
554 while (!dialog.isDisposed ()) {
555 if (!display.readAndDispatch ()) display.sleep ();
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);
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 ());
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);
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));
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);
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);
601 final int[] result = new int[1];
602 ok.addSelectionListener (new SelectionAdapter () {
604 public void widgetSelected (SelectionEvent e) {
609 cancel.addSelectionListener (new SelectionAdapter () {
611 public void widgetSelected (SelectionEvent e) {
612 result[0] = SWT.CANCEL;
617 dialog.setDefaultButton (ok);
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);
625 Display display = browser.getDisplay ();
626 while (!dialog.isDisposed ()) {
627 if (!display.readAndDispatch ()) display.sleep ();
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);
638 Label label = new Label (dialog, SWT.NONE);
639 label.setLayoutData (new GridData (GridData.FILL_HORIZONTAL));
640 label.setText (message);
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);
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));
655 final String[] result = new String[1];
656 ok.addSelectionListener (new SelectionAdapter () {
658 public void widgetSelected (SelectionEvent e) {
659 result[0] = textBox.getText ();
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 () {
668 public void widgetSelected (SelectionEvent e) {
673 dialog.setDefaultButton (ok);
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);
681 Display display = browser.getDisplay ();
682 while (!dialog.isDisposed ()) {
683 if (!display.readAndDispatch ()) display.sleep ();
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);
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);
707 int webViewFrame (long sender, long frame) {
708 RECT rect = new RECT ();
709 OS.MoveMemory (frame, rect, RECT.sizeof);
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;
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.
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);