/******************************************************************************* * Copyright (c) 2000, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.widgets; import org.eclipse.swt.internal.wpf.*; import org.eclipse.swt.internal.win32.*; import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.events.*; /** * Instances of this class represent the "windows" * which the desktop or "window manager" is managing. * Instances that do not have a parent (that is, they * are built using the constructor, which takes a * Display as the argument) are described * as top level shells. Instances that do have * a parent are described as secondary or * dialog shells. *

* Instances are always displayed in one of the maximized, * minimized or normal states: *

*

* The modality of an instance may be specified using * style bits. The modality style bits are used to determine * whether input is blocked for other shells on the display. * The PRIMARY_MODAL style allows an instance to block * input to its parent. The APPLICATION_MODAL style * allows an instance to block input to every other shell in the * display. The SYSTEM_MODAL style allows an instance * to block input to all shells, including shells belonging to * different applications. *

* Note: The styles supported by this class are treated * as HINTs, since the window manager for the * desktop on which the instance is visible has ultimate * control over the appearance and behavior of decorations * and modality. For example, some window managers only * support resizable windows and will always assume the * RESIZE style, even if it is not set. In addition, if a * modality style is not supported, it is "upgraded" to a * more restrictive modality style that is supported. For * example, if PRIMARY_MODAL is not supported, * it would be upgraded to APPLICATION_MODAL. * A modality style may also be "downgraded" to a less * restrictive style. For example, most operating systems * no longer support SYSTEM_MODAL because * it can freeze up the desktop, so this is typically * downgraded to APPLICATION_MODAL. *

*
Styles:
*
BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, ON_TOP, TOOL
*
APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL
*
Events:
*
Activate, Close, Deactivate, Deiconify, Iconify
*
* Class SWT provides two "convenience constants" * for the most commonly required style combinations: *
*
SHELL_TRIM
*
* the result of combining the constants which are required * to produce a typical application top level shell: (that * is, CLOSE | TITLE | MIN | MAX | RESIZE) *
*
DIALOG_TRIM
*
* the result of combining the constants which are required * to produce a typical application dialog shell: (that * is, TITLE | CLOSE | BORDER) *
*
*

*

* Note: Only one of the styles APPLICATION_MODAL, MODELESS, * PRIMARY_MODAL and SYSTEM_MODAL may be specified. *

* IMPORTANT: This class is not intended to be subclassed. *

* * @see Decorations * @see SWT * @see Shell snippets * @see SWT Example: ControlExample * @see Sample code and further information */ public class Shell extends Decorations { Control lastActive; boolean closing; boolean moved, resized, opened, fullScreen; int oldX, oldY, oldWidth, oldHeight; int oldWindowStyle, oldWindowState; /** * Constructs a new instance of this class. This is equivalent * to calling Shell((Display) null). * * @exception SWTException */ public Shell () { this ((Display) null); } /** * Constructs a new instance of this class given only the style * value describing its behavior and appearance. This is equivalent * to calling Shell((Display) null, style). *

* The style value is either one of the style constants defined in * class SWT which is applicable to instances of this * class, or must be built by bitwise OR'ing together * (that is, using the int "|" operator) two or more * of those SWT style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. *

* * @param style the style of control to construct * * @exception SWTException * * @see SWT#BORDER * @see SWT#CLOSE * @see SWT#MIN * @see SWT#MAX * @see SWT#RESIZE * @see SWT#TITLE * @see SWT#NO_TRIM * @see SWT#SHELL_TRIM * @see SWT#DIALOG_TRIM * @see SWT#MODELESS * @see SWT#PRIMARY_MODAL * @see SWT#APPLICATION_MODAL * @see SWT#SYSTEM_MODAL */ public Shell (int style) { this ((Display) null, style); } /** * Constructs a new instance of this class given only the display * to create it on. It is created with style SWT.SHELL_TRIM. *

* Note: Currently, null can be passed in for the display argument. * This has the effect of creating the shell on the currently active * display if there is one. If there is no current display, the * shell is created on a "default" display. Passing in null as * the display argument is not considered to be good coding style, * and may not be supported in a future release of SWT. *

* * @param display the display to create the shell on * * @exception SWTException */ public Shell (Display display) { this (display, SWT.SHELL_TRIM); } /** * Constructs a new instance of this class given the display * to create it on and a style value describing its behavior * and appearance. *

* The style value is either one of the style constants defined in * class SWT which is applicable to instances of this * class, or must be built by bitwise OR'ing together * (that is, using the int "|" operator) two or more * of those SWT style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. *

* Note: Currently, null can be passed in for the display argument. * This has the effect of creating the shell on the currently active * display if there is one. If there is no current display, the * shell is created on a "default" display. Passing in null as * the display argument is not considered to be good coding style, * and may not be supported in a future release of SWT. *

* * @param display the display to create the shell on * @param style the style of control to construct * * @exception SWTException * * @see SWT#BORDER * @see SWT#CLOSE * @see SWT#MIN * @see SWT#MAX * @see SWT#RESIZE * @see SWT#TITLE * @see SWT#NO_TRIM * @see SWT#SHELL_TRIM * @see SWT#DIALOG_TRIM * @see SWT#MODELESS * @see SWT#PRIMARY_MODAL * @see SWT#APPLICATION_MODAL * @see SWT#SYSTEM_MODAL */ public Shell (Display display, int style) { this (display, null, style, 0, false); } Shell (Display display, Shell parent, int style, int handle, boolean embedded) { super (); checkSubclass (); if (display == null) display = Display.getCurrent (); if (display == null) display = Display.getDefault (); if (!display.isValidThread ()) { error (SWT.ERROR_THREAD_INVALID_ACCESS); } if (parent != null && parent.isDisposed ()) { error (SWT.ERROR_INVALID_ARGUMENT); } this.style = checkStyle (style); this.parent = parent; this.display = display; if (handle != 0) { if (embedded) { this.handle = handle; } else { shellHandle = handle; } } createWidget (); } /** * Constructs a new instance of this class given only its * parent. It is created with style SWT.DIALOG_TRIM. *

* Note: Currently, null can be passed in for the parent. * This has the effect of creating the shell on the currently active * display if there is one. If there is no current display, the * shell is created on a "default" display. Passing in null as * the parent is not considered to be good coding style, * and may not be supported in a future release of SWT. *

* * @param parent a shell which will be the parent of the new instance * * @exception IllegalArgumentException * @exception SWTException */ public Shell (Shell parent) { this (parent, SWT.DIALOG_TRIM); } /** * Constructs a new instance of this class given its parent * and a style value describing its behavior and appearance. *

* The style value is either one of the style constants defined in * class SWT which is applicable to instances of this * class, or must be built by bitwise OR'ing together * (that is, using the int "|" operator) two or more * of those SWT style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. *

* Note: Currently, null can be passed in for the parent. * This has the effect of creating the shell on the currently active * display if there is one. If there is no current display, the * shell is created on a "default" display. Passing in null as * the parent is not considered to be good coding style, * and may not be supported in a future release of SWT. *

* * @param parent a shell which will be the parent of the new instance * @param style the style of control to construct * * @exception IllegalArgumentException * @exception SWTException * * @see SWT#BORDER * @see SWT#CLOSE * @see SWT#MIN * @see SWT#MAX * @see SWT#RESIZE * @see SWT#TITLE * @see SWT#NO_TRIM * @see SWT#SHELL_TRIM * @see SWT#DIALOG_TRIM * @see SWT#ON_TOP * @see SWT#TOOL * @see SWT#MODELESS * @see SWT#PRIMARY_MODAL * @see SWT#APPLICATION_MODAL * @see SWT#SYSTEM_MODAL */ public Shell (Shell parent, int style) { this (parent != null ? parent.display : null, parent, style, 0, false); } /** * Invokes platform specific functionality to allocate a new shell. *

* IMPORTANT: This method is not part of the public * API for Shell. It is marked public only so that it * can be shared within the packages provided by SWT. It is not * available on all platforms, and should never be called from * application code. *

* * @param display the display for the shell * @param handle the handle for the shell * @return a new shell object containing the specified display and handle */ public static Shell wpf_new (Display display, int handle) { return new Shell (display, null, SWT.NO_TRIM, handle, true); } /** * Invokes platform specific functionality to allocate a new shell * that is not embedded. *

* IMPORTANT: This method is not part of the public * API for Shell. It is marked public only so that it * can be shared within the packages provided by SWT. It is not * available on all platforms, and should never be called from * application code. *

* * @param display the display for the shell * @param handle the handle for the shell * @return a new shell object containing the specified display and handle * * @since 3.3 */ public static Shell internal_new (Display display, int handle) { handle = OS.GCHandle_ToHandle (handle); return new Shell (display, null, SWT.NO_TRIM, handle, false); } static int checkStyle (int style) { style = Decorations.checkStyle (style); style &= ~SWT.TRANSPARENT; int mask = SWT.SYSTEM_MODAL | SWT.APPLICATION_MODAL | SWT.PRIMARY_MODAL; int bits = style & ~mask; if ((style & SWT.SYSTEM_MODAL) != 0) return bits | SWT.SYSTEM_MODAL; if ((style & SWT.APPLICATION_MODAL) != 0) return bits | SWT.APPLICATION_MODAL; if ((style & SWT.PRIMARY_MODAL) != 0) return bits | SWT.PRIMARY_MODAL; return bits; } /** * Adds the listener to the collection of listeners who will * be notified when operations are performed on the receiver, * by sending the listener one of the messages defined in the * ShellListener interface. * * @param listener the listener which should be notified * * @exception IllegalArgumentException * @exception SWTException * * @see ShellListener * @see #removeShellListener */ public void addShellListener (ShellListener listener) { checkWidget (); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); TypedListener typedListener = new TypedListener (listener); addListener (SWT.Close,typedListener); addListener (SWT.Iconify,typedListener); addListener (SWT.Deiconify,typedListener); addListener (SWT.Activate, typedListener); addListener (SWT.Deactivate, typedListener); } void addWidget () { if ((style & SWT.ON_TOP) != 0) return; if (parent != null) { if ((parent.style & SWT.ON_TOP) != 0) return; OS.Window_Owner (shellHandle, ((Shell)parent).shellHandle); } } void bringToTop () { if ((style & SWT.ON_TOP) != 0) return; OS.Window_Activate (shellHandle); } void checkOpened () { if (!opened) resized = false; } /** * Requests that the window manager close the receiver in * the same way it would be closed when the user clicks on * the "close box" or performs some other platform specific * key or mouse combination that indicates the window * should be removed. * * @exception SWTException * * @see SWT#Close * @see #dispose */ public void close () { checkWidget (); closeWidget (); } void createHandle () { if (shellHandle != 0) { scrolledHandle = OS.ContentControl_Content (shellHandle); if (scrolledHandle == 0) error (SWT.ERROR_NO_HANDLES); int children = OS.Panel_Children (scrolledHandle); handle = OS.UIElementCollection_default (children, 0); if (handle == 0) error (SWT.ERROR_NO_HANDLES); OS.GCHandle_Free (children); return; } state |= CANVAS; if ((style & SWT.ON_TOP) != 0) { shellHandle = OS.gcnew_Popup (); if (shellHandle == 0) error (SWT.ERROR_NO_HANDLES); if ((style & SWT.NO_TRIM) != 0) OS.Popup_AllowsTransparency (shellHandle, true); OS.KeyboardNavigation_SetTabNavigation (shellHandle, OS.KeyboardNavigationMode_None); boolean scrolled = (style & (SWT.H_SCROLL | SWT.V_SCROLL)) != 0; createHandle (scrolled, true); OS.Popup_Child (shellHandle, super.topHandle()); OS.Popup_IsOpen (shellHandle, true); OS.Popup_IsOpen (shellHandle, false); return; } shellHandle = OS.gcnew_Window(); if (shellHandle == 0) error(SWT.ERROR_NO_HANDLES); if ((style & SWT.NO_TRIM) != 0) OS.Window_AllowsTransparency (shellHandle, true); /* * Feature in WPF. ... */ OS.Window_ShowInTaskbar (shellHandle, false); OS.Window_ResizeMode (shellHandle, OS.ResizeMode_NoResize); OS.Window_WindowStyle (shellHandle, OS.WindowStyle_None); OS.FrameworkElement_Width (shellHandle, 0); OS.FrameworkElement_Height (shellHandle, 0); OS.Window_Show (shellHandle); OS.Window_Hide (shellHandle); Rectangle bounds = getMonitor ().getBounds (); OS.FrameworkElement_Width (shellHandle, bounds.width * 5 / 8); OS.FrameworkElement_Height (shellHandle, bounds.height * 5 / 8); int windowStyle = OS.WindowStyle_None, resizeMode = OS.ResizeMode_NoResize; if ((style & SWT.NO_TRIM) == 0) { if ((style & SWT.TOOL) != 0) { windowStyle = OS.WindowStyle_ToolWindow; } else if ((style & SWT.SHELL_TRIM) != 0) { windowStyle = OS.WindowStyle_SingleBorderWindow; } if ((style & SWT.RESIZE) != 0) { resizeMode |= OS.ResizeMode_CanResize; } } OS.Window_ShowInTaskbar (shellHandle, parent == null); OS.Window_ResizeMode (shellHandle, resizeMode); OS.Window_WindowStyle (shellHandle, windowStyle); OS.KeyboardNavigation_SetTabNavigation (shellHandle, OS.KeyboardNavigationMode_None); boolean scrolled = (style & (SWT.H_SCROLL | SWT.V_SCROLL)) != 0; createHandle (scrolled, true); OS.ContentControl_Content (shellHandle, super.topHandle()); } void createWidget() { super.createWidget (); display.addShell (this); } public Rectangle computeTrim (int x, int y, int width, int height) { checkWidget (); if ((style & SWT.ON_TOP) != 0) return new Rectangle (x, y, width, height); updateLayout (shellHandle); int clientX = (int) OS.Window_Left (shellHandle); int clientY = (int) OS.Window_Top (shellHandle); int w = (int) OS.FrameworkElement_ActualWidth (shellHandle); int h = (int) OS.FrameworkElement_ActualHeight (shellHandle); int clientWidth = (int) OS.FrameworkElement_ActualWidth (handle); int clientHeight = (int) OS.FrameworkElement_ActualHeight (handle); int point = OS.gcnew_Point (clientX, clientY); int result = OS.Visual_PointFromScreen (shellHandle, point); OS.GCHandle_Free (point); clientX = -(int) OS.Point_X (result); clientY = -(int) OS.Point_Y (result); OS.GCHandle_Free (result); x -= clientX; y -= clientY; width += (w - clientWidth); height += (h - clientHeight); return new Rectangle (x, y, width, height); } void deregister () { super.deregister (); display.removeWidget (shellHandle); } void destroyWidget () { if (shellHandle != 0 && !closing) { if ((style & SWT.ON_TOP) != 0) { OS.Popup_IsOpen (shellHandle, false); } else { OS.Window_Close (shellHandle); } } releaseHandle (); } public void dispose () { /* * This code is intentionally commented. On some * platforms, the owner window is repainted right * away when a dialog window exits. This behavior * is currently unspecified. */ // /* // * Note: It is valid to attempt to dispose a widget // * more than once. If this happens, fail silently. // */ // if (!isValidWidget ()) return; // if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); // Display oldDisplay = display; super.dispose (); // widget is disposed at this point // if (oldDisplay != null) oldDisplay.update (); } Control findBackgroundControl () { return background != -1 || backgroundImage != null ? this : null; } Control findThemeControl () { return null; } /** * If the receiver is visible, moves it to the top of the * drawing order for the display on which it was created * (so that all other shells on that display, which are not * the receiver's children will be drawn behind it) and forces * the window manager to make the shell active. * * @exception SWTException * * @since 2.0 * @see Control#moveAbove * @see Control#setFocus * @see Control#setVisible * @see Display#getActiveShell * @see Decorations#setDefaultButton(Button) * @see Shell#open * @see Shell#setActive */ public void forceActive () { checkWidget (); if(!isVisible()) return; if ((style & SWT.ON_TOP) != 0) return; // OS.SetForegroundWindow (handle); OS.Window_Activate (shellHandle); } /** * Returns the receiver's alpha value. The alpha value * is between 0 (transparent) and 255 (opaque). * * @return the alpha value * * @exception SWTException * * @since 3.4 */ public int getAlpha () { checkWidget (); return 255; } public Rectangle getBounds () { checkWidget (); int x, y; if ((style & SWT.ON_TOP) != 0) { x = (int) OS.Popup_HorizontalOffset (shellHandle); y = (int) OS.Popup_VerticalOffset (shellHandle); } else { x = (int) OS.Window_Left (shellHandle); y = (int) OS.Window_Top (shellHandle); } int renderSize = OS.UIElement_RenderSize (shellHandle); int width = (int) OS.Size_Width (renderSize); int height = (int) OS.Size_Height (renderSize); OS.GCHandle_Free (renderSize); return new Rectangle (x, y, width, height); } /** * Returns true if the receiver is currently * in fullscreen state, and false otherwise. *

* * @return the fullscreen state * * @exception SWTException

* * @since 3.4 */ public boolean getFullScreen() { checkWidget (); return fullScreen; } /** * Returns the receiver's input method editor mode. This * will be the result of bitwise OR'ing together one or * more of the following constants defined in class * SWT: * NONE, ROMAN, DBCS, * PHONETIC, NATIVE, ALPHA. * * @return the IME mode * * @exception SWTException * * @see SWT */ public int getImeInputMode () { checkWidget (); //TODO return SWT.ROMAN; } public Point getLocation () { checkWidget (); int x, y; if ((style & SWT.ON_TOP) != 0) { x = (int) OS.Popup_HorizontalOffset (shellHandle); y = (int) OS.Popup_VerticalOffset (shellHandle); } else { x = (int) OS.Window_Left (shellHandle); y = (int) OS.Window_Top (shellHandle); } return new Point (x, y); } public boolean getMaximized () { checkWidget (); return !fullScreen && super.getMaximized (); } /** * Returns a point describing the minimum receiver's size. The * x coordinate of the result is the minimum width of the receiver. * The y coordinate of the result is the minimum height of the * receiver. * * @return the receiver's size * * @exception SWTException * * @since 3.1 */ public Point getMinimumSize () { checkWidget (); // int width = Math.max (0, minWidth); // int trim = SWT.TITLE | SWT.CLOSE | SWT.MIN | SWT.MAX; // if ((style & SWT.NO_TRIM) == 0 && (style & trim) != 0) { // width = Math.max (width, OS.GetSystemMetrics (OS.SM_CXMINTRACK)); // } // int height = Math.max (0, minHeight); // if ((style & SWT.NO_TRIM) == 0 && (style & trim) != 0) { // if ((style & SWT.RESIZE) != 0) { // height = Math.max (height, OS.GetSystemMetrics (OS.SM_CYMINTRACK)); // } else { // RECT rect = new RECT (); // int bits1 = OS.GetWindowLong (handle, OS.GWL_STYLE); // int bits2 = OS.GetWindowLong (handle, OS.GWL_EXSTYLE); // OS.AdjustWindowRectEx (rect, bits1, false, bits2); // height = Math.max (height, rect.bottom - rect.top); // } // } int width = (int) OS.FrameworkElement_MinWidth (shellHandle); int height = (int) OS.FrameworkElement_MinHeight (shellHandle); return new Point (width, height); } /** * Returns the region that defines the shape of the shell, * or null if the shell has the default shape. * * @return the region that defines the shape of the shell (or null) * * @exception SWTException * * @since 3.0 * */ public Region getRegion () { /* This method is needed for the @since 3.0 Javadoc tag*/ checkWidget (); return region; } public Shell getShell () { checkWidget (); return this; } public boolean getVisible () { checkWidget (); if ((style & SWT.ON_TOP) != 0)return OS.Popup_IsOpen (shellHandle); return super.getVisible (); } /** * Returns an array containing all shells which are * descendants of the receiver. *

* @return the dialog shells * * @exception SWTException

*/ public Shell [] getShells () { checkWidget (); int count = 0; Shell [] shells = display.getShells (); for (int i=0; i 0 ? this : null; } public boolean isEnabled () { checkWidget (); return getEnabled (); } void hookEvents () { super.hookEvents (); int handler = OS.gcnew_SizeChangedEventHandler (jniRef, "HandleSizeChanged"); OS.FrameworkElement_SizeChanged (shellHandle, handler); OS.GCHandle_Free (handler); if ((style & SWT.ON_TOP) != 0) { handler = OS.gcnew_EventHandler (jniRef, "HandleClosed"); OS.Popup_Closed (shellHandle, handler); OS.GCHandle_Free (handler); handler = OS.gcnew_KeyboardFocusChangedEventHandler (jniRef, "HandlePreviewGotKeyboardFocusActivate"); OS.UIElement_PreviewGotKeyboardFocus (shellHandle, handler); OS.GCHandle_Free (handler); handler = OS.gcnew_KeyboardFocusChangedEventHandler (jniRef, "HandleLostKeyboardFocusDeactivate"); OS.UIElement_LostKeyboardFocus (shellHandle, handler); OS.GCHandle_Free (handler); } else { handler = OS.gcnew_CancelEventHandler (jniRef, "HandleClosing"); OS.Window_Closing (shellHandle, handler); OS.GCHandle_Free (handler); handler = OS.gcnew_EventHandler (jniRef, "HandleActivated"); OS.Window_Activated (shellHandle, handler); OS.GCHandle_Free (handler); handler = OS.gcnew_EventHandler (jniRef, "HandleDeactivated"); OS.Window_Deactivated (shellHandle, handler); OS.GCHandle_Free (handler); handler = OS.gcnew_EventHandler (jniRef, "HandleLocationChanged"); OS.Window_LocationChanged (shellHandle, handler); OS.GCHandle_Free (handler); } } void HandleActivated (int sender, int e) { if (!checkEvent (e)) return; sendEvent (SWT.Activate); if (isDisposed ()) return; restoreFocus (); } void HandleClosed (int sender, int e) { if (!checkEvent (e)) return; closing = true; sendEvent (SWT.Close); closing = false; } void HandleClosing (int sender, int e) { if (!checkEvent (e)) return; closing = true; boolean doit = false; if (isEnabled ()) { Event event = new Event (); sendEvent (SWT.Close, event); doit = event.doit || isDisposed (); } if (doit) { /** * Bug in WPF. When a window has more than * two child windows, and all the the child * windows are closed, the parent window is not * brought to the front. The work around is to * null out the Owner property of the child window * before disposing it. */ if (shellHandle != 0) OS.Window_Owner (shellHandle, 0); if (!isDisposed ()) release (false); } else { OS.CancelEventArgs_Cancel (e, true); } closing = false; } void HandleDeactivated (int sender, int e) { if (!checkEvent (e)) return; sendEvent (SWT.Deactivate); if (isDisposed ()) return; saveFocus (); } void HandleLocationChanged (int sender, int e) { if (!checkEvent (e)) return; int x = (int) OS.Window_Left (shellHandle); int y = (int) OS.Window_Top (shellHandle); if (!moved || oldX != x || oldY != y) { moved = true; oldX = x; oldY = y; sendEvent (SWT.Move); } } void HandleLostKeyboardFocusDeactivate (int sender, int e) { if (isDisposed ()) return; if (OS.UIElement_IsKeyboardFocusWithin (handle)) return; sendEvent (SWT.Deactivate); } void HandleMouseLeave (int sender, int e) { super.HandleMouseLeave (sender, e); if (!checkEvent (e)) return; display.mouseControl = null; } void HandlePreviewGotKeyboardFocusActivate (int sender, int e) { if (isDisposed ()) return; if (!OS.UIElement_IsKeyboardFocusWithin (handle)) return; sendEvent (SWT.Activate); } void HandleSizeChanged (int sender, int e) { if (!checkEvent (e)) return; int width = (int) OS.FrameworkElement_ActualWidth (shellHandle); int height = (int) OS.FrameworkElement_ActualHeight (shellHandle); if (!resized || oldWidth != width || oldHeight != height) { resized = true; oldWidth = width; oldHeight = height; sendEvent (SWT.Resize); if (isDisposed ()) return; if (layout != null) { markLayout (false, false); updateLayout (false, false); } } } /** * Moves the receiver to the top of the drawing order for * the display on which it was created (so that all other * shells on that display, which are not the receiver's * children will be drawn behind it), marks it visible, * sets the focus and asks the window manager to make the * shell active. * * @exception SWTException * * @see Control#moveAbove * @see Control#setFocus * @see Control#setVisible * @see Display#getActiveShell * @see Decorations#setDefaultButton(Button) * @see Shell#setActive * @see Shell#forceActive */ public void open () { checkWidget (); bringToTop (); if (isDisposed ()) return; setVisible (true); if (isDisposed ()) return; if (!restoreFocus () && !traverseGroup (true)) setFocus (); } public boolean print (GC gc) { checkWidget (); if (gc == null) error (SWT.ERROR_NULL_ARGUMENT); if (gc.isDisposed ()) error (SWT.ERROR_INVALID_ARGUMENT); return false; } void register () { super.register (); display.addWidget (shellHandle, this); } void releaseChildren (boolean destroy) { Shell [] shells = getShells (); for (int i=0; i *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • * * @exception SWTException * * @see ShellListener * @see #addShellListener */ public void removeShellListener (ShellListener listener) { checkWidget (); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); if (eventTable == null) return; eventTable.unhook (SWT.Close, listener); eventTable.unhook (SWT.Iconify,listener); eventTable.unhook (SWT.Deiconify,listener); eventTable.unhook (SWT.Activate, listener); eventTable.unhook (SWT.Deactivate, listener); } /** * If the receiver is visible, moves it to the top of the * drawing order for the display on which it was created * (so that all other shells on that display, which are not * the receiver's children will be drawn behind it) and asks * the window manager to make the shell active * * @exception SWTException * * @since 2.0 * @see Control#moveAbove * @see Control#setFocus * @see Control#setVisible * @see Display#getActiveShell * @see Decorations#setDefaultButton(Button) * @see Shell#open * @see Shell#setActive */ public void setActive () { checkWidget (); if(!isVisible()) return; bringToTop (); // widget could be disposed at this point } void setActiveControl (Control control) { if (control != null && control.isDisposed ()) control = null; if (lastActive != null && lastActive.isDisposed ()) lastActive = null; if (lastActive == control) return; /* * Compute the list of controls to be activated and * deactivated by finding the first common parent * control. */ Control [] activate = (control == null) ? new Control [0] : control.getPath (); Control [] deactivate = (lastActive == null) ? new Control [0] : lastActive.getPath (); lastActive = control; int index = 0, length = Math.min (activate.length, deactivate.length); while (index < length) { if (activate [index] != deactivate [index]) break; index++; } /* * It is possible (but unlikely), that application * code could have destroyed some of the widgets. If * this happens, keep processing those widgets that * are not disposed. */ for (int i=deactivate.length-1; i>=index; --i) { if (!deactivate [i].isDisposed ()) { deactivate [i].sendEvent (SWT.Deactivate); } } for (int i=activate.length-1; i>=index; --i) { if (!activate [i].isDisposed ()) { activate [i].sendEvent (SWT.Activate); } } } /** * Sets the receiver's alpha value which must be * between 0 (transparent) and 255 (opaque). *

    * This operation requires the operating system's advanced * widgets subsystem which may not be available on some * platforms. *

    * @param alpha the alpha value * * @exception SWTException * * @since 3.4 */ public void setAlpha (int alpha) { checkWidget (); /* Not implemented */ } int setBounds (int x, int y, int width, int height, int flags) { if (fullScreen) setFullScreen (false); int result = 0; if ((flags & MOVED) != 0) { int currentX, currentY; if ((style & SWT.ON_TOP) != 0) { currentX = (int) OS.Popup_HorizontalOffset (shellHandle); currentY = (int) OS.Popup_VerticalOffset (shellHandle); } else { currentX = (int) OS.Window_Left (shellHandle); currentY = (int) OS.Window_Top (shellHandle); } if (currentX != x || currentY != y) { moved = true; oldX = x; oldY = currentY; if ((style & SWT.ON_TOP) != 0) { OS.Popup_HorizontalOffset (shellHandle, x); oldY = y; OS.Popup_VerticalOffset (shellHandle, y); } else { OS.Window_Left (shellHandle, x); oldY = y; OS.Window_Top (shellHandle, y); } sendEvent (SWT.Move); if (isDisposed ()) return 0; result |= MOVED; } } if ((flags & RESIZED) != 0) { int currentWidth = (int) OS.FrameworkElement_ActualWidth (shellHandle); int currentHeight = (int) OS.FrameworkElement_ActualHeight (shellHandle); if (currentWidth != width || currentHeight != height) { resized = true; oldWidth = width; oldHeight = currentHeight; OS.FrameworkElement_Width (shellHandle, width); oldHeight = height; OS.FrameworkElement_Height (shellHandle, height); sendEvent (SWT.Resize); if (isDisposed ()) return 0; result |= RESIZED; if (layout != null) { markLayout (false, false); updateLayout (false, false); } } } return result; } void setClipping () { } public void setEnabled (boolean enabled) { checkWidget (); if (enabled == getEnabled ()) return; super.setEnabled (enabled); if ((style & SWT.ON_TOP) != 0) return; if (enabled && OS.Window_IsActive (shellHandle)) { if (!restoreFocus ()) traverseGroup (true); } } /** * Sets the full screen state of the receiver. * If the argument is true causes the receiver * to switch to the full screen state, and if the argument is * false and the receiver was previously switched * into full screen state, causes the receiver to switch back * to either the maximmized or normal states. *

    * Note: The result of intermixing calls to setFullScreen(true), * setMaximized(true) and setMinimized(true) will * vary by platform. Typically, the behavior will match the platform user's * expectations, but not always. This should be avoided if possible. *

    * * @param fullScreen the new fullscreen state * * @exception SWTException * * @since 3.4 */ public void setFullScreen (boolean fullScreen) { checkWidget (); if (this.fullScreen == fullScreen) return; if(fullScreen) { oldWindowStyle = OS.Window_WindowStyle (shellHandle); oldWindowState = OS.Window_WindowState (shellHandle); boolean visible = getVisible (); OS.Window_Hide (shellHandle); OS.Window_WindowStyle (shellHandle, OS.WindowStyle_None); if (visible) OS.Window_Show (shellHandle); OS.Window_WindowState (shellHandle, OS.WindowState_Maximized); } else { OS.Window_WindowStyle (shellHandle, oldWindowStyle); OS.Window_WindowState (shellHandle, oldWindowState); oldWindowState = 0; oldWindowStyle = 0; } this.fullScreen = fullScreen; } /** * Sets the input method editor mode to the argument which * should be the result of bitwise OR'ing together one or more * of the following constants defined in class SWT: * NONE, ROMAN, DBCS, * PHONETIC, NATIVE, ALPHA. * * @param mode the new IME mode * * @exception SWTException * * @see SWT */ public void setImeInputMode (int mode) { checkWidget (); //TODO } /** * Sets the receiver's minimum size to the size specified by the arguments. * If the new minimum size is larger than the current size of the receiver, * the receiver is resized to the new minimum size. * * @param width the new minimum width for the receiver * @param height the new minimum height for the receiver * * @exception SWTException * * @since 3.1 */ public void setMinimumSize (int width, int height) { checkWidget (); int widthLimit = 0, heightLimit = 0; int trim = SWT.TITLE | SWT.CLOSE | SWT.MIN | SWT.MAX; if ((style & SWT.NO_TRIM) == 0 && (style & trim) != 0) { // widthLimit = OS.GetSystemMetrics (OS.SM_CXMINTRACK); // if ((style & SWT.RESIZE) != 0) { // heightLimit = OS.GetSystemMetrics (OS.SM_CYMINTRACK); // } else { // RECT rect = new RECT (); // int bits1 = OS.GetWindowLong (handle, OS.GWL_STYLE); // int bits2 = OS.GetWindowLong (handle, OS.GWL_EXSTYLE); // OS.AdjustWindowRectEx (rect, bits1, false, bits2); // heightLimit = rect.bottom - rect.top; // } } int minWidth = Math.max (widthLimit, width); int minHeight = Math.max (heightLimit, height); OS.FrameworkElement_MinWidth(shellHandle, minWidth); OS.FrameworkElement_MinHeight(shellHandle, minHeight); } /** * Sets the receiver's minimum size to the size specified by the argument. * If the new minimum size is larger than the current size of the receiver, * the receiver is resized to the new minimum size. * * @param size the new minimum size for the receiver * * @exception IllegalArgumentException * @exception SWTException * * @since 3.1 */ public void setMinimumSize (Point size) { checkWidget (); if (size == null) error (SWT.ERROR_NULL_ARGUMENT); setMinimumSize (size.x, size.y); } void setParent () { /* Do nothing. Not necessary for Shells */ } /** * Sets the shape of the shell to the region specified * by the argument. When the argument is null, the * default shape of the shell is restored. The shell * must be created with the style SWT.NO_TRIM in order * to specify a region. * * @param region the region that defines the shape of the shell (or null) * * @exception IllegalArgumentException * @exception SWTException * * @since 3.0 * */ public void setRegion (Region region) { checkWidget (); if ((style & SWT.NO_TRIM) == 0) return; super.setRegion (region); } public void setVisible (boolean visible) { checkWidget (); if (getVisible () == visible) return; int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL; if ((style & mask) != 0) { if (visible) { display.setModalShell (this); // Control control = display._getFocusControl (); // if (control != null && !control.isActive ()) { // bringToTop (); // if (isDisposed ()) return; // } // int hwndShell = OS.GetActiveWindow (); // if (hwndShell == 0) { // if (parent != null) hwndShell = parent.handle; // } // if (hwndShell != 0) { // OS.SendMessage (hwndShell, OS.WM_CANCELMODE, 0, 0); // } // OS.ReleaseCapture (); } else { display.clearModal (this); } } else { updateModal (); } if (visible) { if ((style & SWT.ON_TOP) != 0) { OS.Popup_IsOpen (shellHandle, visible); } else { OS.Window_Show (shellHandle); } opened = true; if (!moved) { moved = true; Point location = getLocation(); oldX = location.x; oldY = location.y; sendEvent (SWT.Move); if (isDisposed ()) return; } if (!resized) { resized = true; Point size = getSize (); oldWidth = size.x;// - trimWidth (); oldHeight = size.y;// - trimHeight (); sendEvent (SWT.Resize); if (isDisposed ()) return; if (layout != null) { markLayout (false, false); updateLayout (false, false); } } } else { if (!closing) { if ((style & SWT.ON_TOP) != 0) { OS.Popup_IsOpen (shellHandle, visible); } else { OS.Window_Hide (shellHandle); } } } } int topHandle () { return shellHandle; } //boolean translateAccelerator (MSG msg) { // if (!isEnabled () || !isActive ()) return false; // if (menuBar != null && !menuBar.isEnabled ()) return false; // return translateMDIAccelerator (msg) || translateMenuAccelerator (msg); //} boolean traverseEscape () { if (parent == null) return false; if (!isVisible () || !isEnabled ()) return false; close (); return true; } void updateModal () { int source = OS.PresentationSource_FromVisual (handle); if (source != 0) { int hwnd = OS.HwndSource_Handle (source); Win32.EnableWindow (OS.IntPtr_ToInt32 (hwnd), isActive ()); OS.GCHandle_Free (hwnd); OS.GCHandle_Free (source); } } }