summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java1592
1 files changed, 345 insertions, 1247 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
index eef67768be..2db10cf070 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
@@ -7,228 +7,38 @@ package org.eclipse.swt.widgets;
* http://www.eclipse.org/legal/cpl-v10.html
*/
-import org.eclipse.swt.*;
-import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.internal.carbon.OS;
+import org.eclipse.swt.internal.carbon.Rect;
+
+import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
-import org.eclipse.swt.internal.carbon.*;
-
-/**
- * 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
- * <code>Display</code> as the argument) are described
- * as <em>top level</em> shells. Instances that do have
- * a parent are described as <em>secondary</em> or
- * <em>dialog</em> shells.
- * <p>
- * Instances are always displayed in one of the maximized,
- * minimized or normal states:
- * <ul>
- * <li>
- * When an instance is marked as <em>maximized</em>, the
- * window manager will typically resize it to fill the
- * entire visible area of the display, and the instance
- * is usually put in a state where it can not be resized
- * (even if it has style <code>RESIZE</code>) until it is
- * no longer maximized.
- * </li><li>
- * When an instance is in the <em>normal</em> state (neither
- * maximized or minimized), its appearance is controlled by
- * the style constants which were specified when it was created
- * and the restrictions of the window manager (see below).
- * </li><li>
- * When an instance has been marked as <em>minimized</em>,
- * its contents (client area) will usually not be visible,
- * and depending on the window manager, it may be
- * "iconified" (that is, replaced on the desktop by a small
- * simplified representation of itself), relocated to a
- * distinguished area of the screen, or hidden. Combinations
- * of these changes are also possible.
- * </li>
- * </ul>
- * </p>
- * <p>
- * Note: The styles supported by this class must be treated
- * as <em>HINT</em>s, 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 <code>PRIMARY_MODAL</code> is not supported,
- * it would be upgraded to <code>APPLICATION_MODAL</code>.
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE</dd>
- * <dd>APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL</dd>
- * <dt><b>Events:</b></dt>
- * <dd>Activate, Close, Deactivate, Deiconify, Iconify</dd>
- * </dl>
- * Class <code>SWT</code> provides two "convenience constants"
- * for the most commonly required style combinations:
- * <dl>
- * <dt><code>SHELL_TRIM</code></dt>
- * <dd>
- * the result of combining the constants which are required
- * to produce a typical application top level shell: (that
- * is, <code>CLOSE | TITLE | MIN | MAX | RESIZE</code>)
- * </dd>
- * <dt><code>DIALOG_TRIM</code></dt>
- * <dd>
- * the result of combining the constants which are required
- * to produce a typical application dialog shell: (that
- * is, <code>TITLE | CLOSE | BORDER</code>)
- * </dd>
- * </dl>
- * </p>
- * <p>
- * Note: Only one of the styles APPLICATION_MODAL, MODELESS,
- * PRIMARY_MODAL and SYSTEM_MODAL may be specified.
- * </p><p>
- * IMPORTANT: This class is not intended to be subclassed.
- * </p>
- *
- * @see Decorations
- * @see SWT
- */
-public /*final*/ class Shell extends Decorations {
- Display display;
- int shellHandle;
- /* AW
- boolean reparented, realized;
- */
- boolean realized;
+import org.eclipse.swt.graphics.*;
- int oldX, oldY, oldWidth, oldHeight;
+public class Shell extends Decorations {
+ Display display;
+ int shellHandle, windowGroup;
+ boolean resized;
Control lastActive;
- // AW
- private boolean fIsEnabled= true;
- // AW
-
-/**
- * Constructs a new instance of this class. This is equivalent
- * to calling <code>Shell((Display) null)</code>.
- *
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- */
+
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 <code>Shell((Display) null, style)</code>.
- * <p>
- * The style value is either one of the style constants defined in
- * class <code>SWT</code> which is applicable to instances of this
- * class, or must be built by <em>bitwise OR</em>'ing together
- * (that is, using the <code>int</code> "|" operator) two or more
- * of those <code>SWT</code> style constants. The class description
- * lists the style constants that are applicable to the class.
- * Style bits are also inherited from superclasses.
- * </p>
- *
- * @param style the style of control to construct
- *
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @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 <code>SWT.SHELL_TRIM</code>.
- * <p>
- * 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. <b>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.</b>
- * </p>
- *
- * @param display the display to create the shell on
- *
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- */
+
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.
- * <p>
- * The style value is either one of the style constants defined in
- * class <code>SWT</code> which is applicable to instances of this
- * class, or must be built by <em>bitwise OR</em>'ing together
- * (that is, using the <code>int</code> "|" operator) two or more
- * of those <code>SWT</code> style constants. The class description
- * lists the style constants that are applicable to the class.
- * Style bits are also inherited from superclasses.
- * </p><p>
- * 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. <b>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.</b>
- * </p>
- *
- * @param display the display to create the shell on
- * @param style the style of control to construct
- *
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @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);
}
+
Shell (Display display, Shell parent, int style, int handle) {
super ();
-
+ checkSubclass ();
if (display == null) display = Display.getCurrent ();
if (display == null) display = Display.getDefault ();
if (!display.isValidThread ()) {
@@ -238,75 +48,13 @@ Shell (Display display, Shell parent, int style, int handle) {
this.parent = parent;
this.display = display;
this.handle = handle;
- createWidget (0);
+ createWidget ();
}
-/**
- * Constructs a new instance of this class given only its
- * parent. It is created with style <code>SWT.DIALOG_TRIM</code>.
- * <p>
- * 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. <b>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.</b>
- * </p>
- *
- * @param parent a shell which will be the parent of the new instance
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- */
+
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.
- * <p>
- * The style value is either one of the style constants defined in
- * class <code>SWT</code> which is applicable to instances of this
- * class, or must be built by <em>bitwise OR</em>'ing together
- * (that is, using the <code>int</code> "|" operator) two or more
- * of those <code>SWT</code> style constants. The class description
- * lists the style constants that are applicable to the class.
- * Style bits are also inherited from superclasses.
- * </p><p>
- * 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. <b>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.</b>
- * </p>
- *
- * @param parent a shell which will be the parent of the new instance
- * @param style the style of control to construct
- *
- * @exception SWTException <ul>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
- * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @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 (Shell parent, int style) {
this (parent != null ? parent.getDisplay () : null, parent, style, 0);
}
@@ -321,29 +69,6 @@ static int checkStyle (int style) {
return bits;
}
-public static Shell macosx_new (Display display, int handle) {
- return new Shell (display, null, SWT.NO_TRIM, handle);
-}
-
-/**
- * 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
- * <code>ShellListener</code> interface.
- *
- * @param listener the listener which should be notified
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see ShellListener
- * @see #removeShellListener
- */
public void addShellListener(ShellListener listener) {
checkWidget();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
@@ -354,520 +79,167 @@ public void addShellListener(ShellListener listener) {
addListener(SWT.Iconify,typedListener);
addListener(SWT.Deiconify,typedListener);
}
-void adjustTrim () {
- /* AW
- if (OS.XtIsSubclass (shellHandle, OS.OverrideShellWidgetClass ())) {
- return;
- }
- */
-
- /* Query the trim insets */
- /* AW
- int shellWindow = OS.XtWindow (shellHandle);
- if (shellWindow == 0) return;
- int xDisplay = OS.XtDisplay (shellHandle);
- if (xDisplay == 0) return;
- */
-
- /* Find the direct child of the root window */
- /* AW
- int [] unused = new int [1];
- int [] rootWindow = new int [1];
- int [] parent = new int [1];
- int [] ptr = new int [1];
- int trimWindow = shellWindow;
- OS.XQueryTree (xDisplay, trimWindow, rootWindow, parent, ptr, unused);
- if (ptr [0] != 0) OS.XFree (ptr [0]);
- if (parent [0] == 0) return;
- while (parent [0] != rootWindow [0]) {
- trimWindow = parent [0];
- OS.XQueryTree (xDisplay, trimWindow, unused, parent, ptr, unused);
- if (ptr [0] != 0) OS.XFree (ptr [0]);
- if (parent [0] == 0) return;
- }
- */
- /*
- * Translate the coordinates of the shell window to the
- * coordinates of the direct child of the root window
- */
- /* AW
- if (shellWindow == trimWindow) return;
- */
-
- /* Query the border width of the direct child of the root window */
- /*
- int [] trimBorder = new int [1];
- int [] trimWidth = new int [1];
- int [] trimHeight = new int [1];
- OS.XGetGeometry (xDisplay, trimWindow, unused, unused, unused, trimWidth, trimHeight, trimBorder, unused);
- */
-
- /* Query the border width of the direct child of the shell window */
- /*
- int [] shellBorder = new int [1];
- int [] shellWidth = new int [1];
- int [] shellHeight = new int [1];
- OS.XGetGeometry (xDisplay, shellWindow, unused, unused, unused, shellWidth, shellHeight, shellBorder, unused);
- */
-
- /* Calculate the trim */
- /*
- int width = (trimWidth [0] + (trimBorder [0] * 2)) - (shellWidth [0] + (shellBorder [0] * 2));
- int height = (trimHeight [0] + (trimBorder [0] * 2)) - (shellHeight [0] + (shellBorder [0] * 2));
- */
-
- /* Update the trim guesses to match the query */
- /*
- boolean hasTitle = false, hasResize = false, hasBorder = false;
- if ((style & SWT.NO_TRIM) == 0) {
- hasTitle = (style & (SWT.MIN | SWT.MAX | SWT.TITLE | SWT.MENU)) != 0;
- hasResize = (style & SWT.RESIZE) != 0;
- hasBorder = (style & SWT.BORDER) != 0;
- }
- if (hasTitle) {
- if (hasResize) {
- display.titleResizeTrimWidth = width;
- display.titleResizeTrimHeight = height;
- return;
- }
- if (hasBorder) {
- display.titleBorderTrimWidth = width;
- display.titleBorderTrimHeight = height;
- return;
- }
- display.titleTrimWidth = width;
- display.titleTrimHeight = height;
- return;
- }
- if (hasResize) {
- display.resizeTrimWidth = width;
- display.resizeTrimHeight = height;
- return;
- }
- if (hasBorder) {
- display.borderTrimWidth = width;
- display.borderTrimHeight = height;
- return;
- }
- */
-}
-/**
- * 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 <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see #dispose
- */
public void close () {
checkWidget();
closeWidget ();
}
+
void closeWidget () {
-
- // remove focus
- getDisplay().setMacFocusHandle(shellHandle, 0);
-
- if (!isEnabled ()) return;
- Control widget = parent;
- while (widget != null && !(widget.getShell ().isModal ())) {
- widget = widget.parent;
- }
- if (widget == null) {
- Shell [] shells = getShells ();
- for (int i=0; i<shells.length; i++) {
- Shell shell = shells [i];
- if (shell != this && shell.isModal () && shell.isVisible ()) {
- shell.bringToTop ();
- return;
- }
- }
- }
Event event = new Event ();
sendEvent (SWT.Close, event);
if (event.doit && !isDisposed ()) dispose ();
}
+
public Rectangle computeTrim (int x, int y, int width, int height) {
checkWidget();
Rectangle trim = super.computeTrim (x, y, width, height);
- int trimWidth = trimWidth (), trimHeight = trimHeight ();
- trim.x -= trimWidth / 2; trim.y -= trimHeight - (trimWidth / 2);
- trim.width += trimWidth; trim.height += trimHeight + imeHeight ();
+ Rect rect = new Rect ();
+ OS.GetWindowStructureWidths (shellHandle, rect);
+ trim.x -= rect.left;
+ trim.y -= rect.top;
+ trim.width += rect.left + rect.right;
+ trim.height += rect.top + rect.bottom;
return trim;
}
-void createHandle (int index) {
- state |= HANDLE | CANVAS;
-
- int decorations = 0;
- /* AW
+
+void createHandle () {
+ state |= CANVAS | GRAB | HIDDEN;
+ int attributes = OS.kWindowStandardHandlerAttribute; // | OS.kWindowCompositingAttribute;
if ((style & SWT.NO_TRIM) == 0) {
- if ((style & SWT.MIN) != 0) decorations |= NSWindow.MiniaturizableWindowMask;
- if ((style & SWT.MAX) != 0) decorations |= OS.MWM_DECOR_MAXIMIZE;
- if ((style & SWT.RESIZE) != 0) decorations |= NSWindow.ResizableWindowMask;
- if ((style & SWT.BORDER) != 0) decorations |= NSWindow.BorderlessWindowMask;
- if ((style & SWT.MENU) != 0) decorations |= OS.MWM_DECOR_MENU;
- if ((style & SWT.TITLE) != 0) decorations |= NSWindow.TitledWindowMask;
- }
- */
-
- if (MacUtil.HIVIEW)
- decorations |= OS.kWindowCompositingAttribute;
-
- if (style == SWT.NONE) {
- } else if ((style & SWT.NO_TRIM) == 0) {
- if ((style & SWT.CLOSE) != 0) decorations |= OS.kWindowCloseBoxAttribute;
- if ((style & SWT.MIN) != 0) decorations |= OS.kWindowCollapseBoxAttribute;
- if ((style & SWT.MAX) != 0) decorations |= OS.kWindowFullZoomAttribute;
- if ((style & SWT.RESIZE) != 0) decorations |= OS.kWindowResizableAttribute | OS.kWindowLiveResizeAttribute;
- //if ((style & SWT.BORDER) == 0) decorations |= OS.kWindowNoShadowAttribute;
- //} else {
- // decorations |= OS.kWindowNoShadowAttribute;
- }
-
- /* AW
- int inputMode = OS.MWM_INPUT_MODELESS;
- if ((style & SWT.PRIMARY_MODAL) != 0) inputMode = OS.MWM_INPUT_PRIMARY_APPLICATION_MODAL;
- if ((style & SWT.APPLICATION_MODAL) != 0) inputMode = OS.MWM_INPUT_FULL_APPLICATION_MODAL;
- if ((style & SWT.SYSTEM_MODAL) != 0) inputMode = OS.MWM_INPUT_SYSTEM_MODAL;
- */
- int inputMode = OS.kWindowModalityNone;
- if ((style & SWT.PRIMARY_MODAL) != 0) inputMode = OS.kWindowModalityWindowModal;
- if ((style & SWT.APPLICATION_MODAL) != 0) inputMode = OS.kWindowModalityAppModal;
- if ((style & SWT.SYSTEM_MODAL) != 0) inputMode = OS.kWindowModalitySystemModal;
-
- /* AW
- int [] argList1 = {
- OS.XmNmwmInputMode, inputMode,
- OS.XmNmwmDecorations, decorations,
- OS.XmNoverrideRedirect, (style & SWT.ON_TOP) != 0 ? 1 : 0,
- OS.XmNtitle, ptr,
- };
- byte [] appClass = display.appClass;
- */
-
- MacRect bounds= new MacRect(100, 100, 100, 100);
- int windowClass= 0;
- short themeBrush= OS.kThemeBrushDialogBackgroundActive;
- if (parent == null && (style & SWT.ON_TOP) == 0) {
- /* AW
- int xDisplay = display.xDisplay;
- int widgetClass = OS.TopLevelShellWidgetClass ();
- shellHandle = OS.XtAppCreateShell (display.appName, appClass, widgetClass, xDisplay, argList1, argList1.length / 2);
- */
- if ((style & SWT.NO_TRIM) != 0)
- windowClass= OS.kHelpWindowClass;
- else {
- windowClass= OS.kDocumentWindowClass;
- //themeBrush= OS.kThemeBrushDocumentWindowBackground;
- }
- } else {
- /* AW
- int widgetClass = OS.TransientShellWidgetClass ();
-// if ((style & SWT.ON_TOP) != 0) {
-// widgetClass = OS.OverrideShellWidgetClass ();
-// }
- */
- /* AW
- int parentHandle = display.shellHandle;
- if (parent != null) parentHandle = parent.handle;
- shellHandle = OS.XtCreatePopupShell (appClass, widgetClass, parentHandle, argList1, argList1.length / 2);
- */
- if (style == SWT.NONE) {
- //System.out.println("Shell.createHandle: SWT.NONE");
- windowClass= OS.kHelpWindowClass;
- } else if ((style & SWT.NO_TRIM) != 0 && (style & SWT.ON_TOP) != 0) {
- //System.out.println("Shell.createHandle: SWT.NO_TRIM | SWT.ON_TOP");
- windowClass= OS.kHelpWindowClass;
- } else if ((style & SWT.NO_TRIM) != 0) {
- //System.out.println("Shell.createHandle: SWT.NO_TRIM");
- windowClass= OS.kHelpWindowClass;
- } else if (inputMode == OS.kWindowModalityAppModal) {
- //System.out.println("Shell.createHandle: kMovableModalWindowClass");
- windowClass= OS.kMovableModalWindowClass;
- } else if (inputMode == OS.kWindowModalitySystemModal) {
- //System.out.println("Shell.createHandle: kModalWindowClass");
- windowClass= OS.kModalWindowClass;
- } else if ((style & SWT.ON_TOP) != 0) {
- //System.out.println("Shell.createHandle: SWT.ON_TOP");
- //windowClass= OS.kFloatingWindowClass;
- windowClass= OS.kHelpWindowClass;
- decorations= 0;
- } else {
- //System.out.println("Shell.createHandle: kDocumentWindowClass");
- windowClass= OS.kDocumentWindowClass;
+ if ((style & SWT.CLOSE) != 0) attributes |= OS.kWindowCloseBoxAttribute;
+ if ((style & SWT.MIN) != 0) attributes |= OS.kWindowCollapseBoxAttribute;
+ if ((style & SWT.MAX) != 0) attributes |= OS.kWindowFullZoomAttribute;
+ if ((style & SWT.RESIZE) != 0) {
+ attributes |= OS.kWindowResizableAttribute | OS.kWindowLiveResizeAttribute;
}
}
-
- // check whether window class supports a given decoration
- if ((decorations & OS.kWindowCloseBoxAttribute) != 0 &&
- windowClass != OS.kDocumentWindowClass &&
- windowClass != OS.kFloatingWindowClass &&
- windowClass != OS.kUtilityWindowClass) {
- decorations&= ~OS.kWindowCloseBoxAttribute;
- }
- if ((decorations & OS.kWindowFullZoomAttribute) != 0 &&
- windowClass != OS.kDocumentWindowClass &&
- windowClass != OS.kFloatingWindowClass &&
- windowClass != OS.kUtilityWindowClass) {
- decorations&= ~OS.kWindowFullZoomAttribute;
- }
- if ((decorations & OS.kWindowCollapseBoxAttribute) != 0 &&
- windowClass != OS.kDocumentWindowClass) {
- decorations&= ~OS.kWindowCollapseBoxAttribute;
- }
- if ((decorations & OS.kWindowCollapseBoxAttribute) != 0 &&
- windowClass != OS.kDocumentWindowClass &&
- windowClass != OS.kMovableModalWindowClass &&
- windowClass != OS.kFloatingWindowClass &&
- windowClass != OS.kUtilityWindowClass &&
- windowClass != OS.kSheetWindowClass) {
- decorations&= ~OS.kWindowCollapseBoxAttribute;
- }
-
- int[] wHandle= new int[1];
- if (OS.CreateNewWindow(windowClass, decorations | OS.kWindowStandardHandlerAttribute, bounds.getData(), wHandle) == OS.kNoErr)
- shellHandle= wHandle[0];
- else {
- System.out.println("Shell.createHandle: can't create window with these attributes; creating default window");
- if (OS.CreateNewWindow(OS.kDocumentWindowClass, OS.kWindowStandardHandlerAttribute, bounds.getData(), wHandle) == OS.kNoErr)
- shellHandle= wHandle[0];
+ int windowClass = OS.kDocumentWindowClass;
+ if ((style & (SWT.CLOSE | SWT.TITLE)) == 0) windowClass = OS.kSheetWindowClass;
+// int windowClass = parent == null ? OS.kDocumentWindowClass : OS.kSheetWindowClass;
+// if ((style & SWT.APPLICATION_MODAL) != 0) windowClass = OS.kMovableModalWindowClass;
+// if ((style & SWT.SYSTEM_MODAL) != 0) windowClass = OS.kModalWindowClass;
+ Rect rect = new Rect ();
+ OS.GetAvailableWindowPositioningBounds (OS.GetMainDevice (), rect);
+ int width = (rect.right - rect.left) * 5 / 8;
+ int height = (rect.bottom - rect.top) * 5 / 8;
+ OS.SetRect (rect, (short) 0, (short) 0, (short) width, (short) height);
+ int [] outWindow = new int [1];
+ attributes &= OS.GetAvailableWindowAttributes (windowClass);
+ OS.CreateNewWindow (windowClass, attributes, rect, outWindow);
+ if (outWindow [0] == 0) error (SWT.ERROR_NO_HANDLES);
+ shellHandle = outWindow [0];
+ if ((style & SWT.ON_TOP) != 0) {
+ OS.SetWindowActivationScope (shellHandle, OS.kWindowActivationScopeNone);
+ }
+ OS.RepositionWindow (shellHandle, 0, OS.kWindowCascadeOnMainScreen);
+ OS.SetThemeWindowBackground (shellHandle, (short) OS.kThemeBrushDialogBackgroundActive, false);
+ int [] theRoot = new int [1];
+ OS.CreateRootControl (shellHandle, theRoot);
+ OS.GetRootControl (shellHandle, theRoot);
+ if (theRoot [0] == 0) error (SWT.ERROR_NO_HANDLES);
+ if ((style & (SWT.H_SCROLL | SWT.V_SCROLL)) != 0) {
+ createScrolledHandle (theRoot [0]);
+ } else {
+ createHandle (theRoot [0]);
}
-
- if (shellHandle == 0) error (SWT.ERROR_NO_HANDLES);
-
- if (themeBrush != 0)
- OS.SetThemeWindowBackground(shellHandle, themeBrush, false);
-
- // set modality
- if (inputMode != OS.kWindowModalityNone) {
- int parentShellHandle= 0;
- if (parent != null) parentShellHandle = parent.handle;
- //System.out.println("Shell.createHandle: OS.SetWindowModality: " + inputMode);
- OS.SetWindowModality(shellHandle, inputMode, parentShellHandle);
+ int [] outGroup = new int [1];
+ OS.CreateWindowGroup (OS.kWindowGroupAttrHideOnCollapse, outGroup);
+ if (outGroup [0] == 0) error (SWT.ERROR_NO_HANDLES);
+ windowGroup = outGroup [0];
+ if (parent != null) {
+ Shell shell = parent.getShell ();
+ int parentGroup = shell.windowGroup;
+ OS.SetWindowGroup (shellHandle, parentGroup);
+ OS.SetWindowGroupParent (windowGroup, parentGroup);
+ } else {
+ int parentGroup = OS.GetWindowGroupOfClass (windowClass);
+ OS.SetWindowGroupParent (windowGroup, parentGroup);
}
+ OS.SetWindowGroupOwner (windowGroup, shellHandle);
+}
- /* Create scrolled handle */
- createScrolledHandle (shellHandle);
-
- /*
- * Feature in Motif. There is no way to get the single pixel
- * border surrounding a TopLevelShell or a TransientShell.
- * Also, attempts to set a border on either the shell handle
- * or the main window handle fail. The fix is to set the border
- * on the client area.
- */
- /* AW
- if ((style & (SWT.NO_TRIM | SWT.BORDER | SWT.RESIZE)) == 0) {
- int [] argList2 = {OS.XmNborderWidth, 1};
- OS.XtSetValues (handle, argList2, argList2.length / 2);
- }
- */
+void createWidget () {
+ super.createWidget ();
+ layoutControl ();
}
+
void deregister () {
super.deregister ();
- WidgetTable.remove (shellHandle);
-}
-void destroyWidget () {
- /*
- * Hide the shell before calling XtDestroyWidget ()
- * so that the shell will disappear without having
- * to dispatch events. Otherwise, the user will be
- * able to interact with the trimmings between the
- * time that the shell is destroyed and the next
- * event is dispatched.
- */
- /* AW
- if (OS.XtIsRealized (shellHandle)) {
- if (OS.XtIsTopLevelShell (shellHandle)) {
- OS.XtUnmapWidget (shellHandle);
- } else {
- OS.XtPopdown (shellHandle);
- }
- }
- */
- OS.HideWindow(shellHandle);
- super.destroyWidget ();
+ int [] theRoot = new int [1];
+ OS.GetRootControl (shellHandle, theRoot);
+ WidgetTable.remove (theRoot [0]);
}
public void dispose () {
- /*
- * Note: It is valid to attempt to dispose a widget
- * more than once. If this happens, fail silently.
- */
if (isDisposed()) return;
-
- /*
- * This code is intentionally commented. On some
- * platforms, the owner window is repainted right
- * away when the dialog window exits. This behavior
- * is currently unspecified.
- */
-// if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
-// Display oldDisplay = display;
-
- /*
- * Feature in Motif. When an override-redirected shell
- * is disposed, Motif does not assign a new active top
- * level shell. The parent shell appears to be active,
- * but XGetInputFocus returns the root window, not the
- * parent. The fix is to make the parent be the active
- * top level shell when the child shell is disposed.
- */
- /* AW
- Composite parent = this.parent;
- int [] argList = {OS.XmNoverrideRedirect, 0};
- OS.XtGetValues (shellHandle, argList, argList.length / 2);
- */
super.dispose ();
- /* AW
- if (parent != null && argList [1] != 0) {
- Shell shell = parent.getShell ();
- shell.bringToTop ();
- }
- */
+}
- /*
- * This code intentionally commented.
- */
-// if (oldDisplay != null) oldDisplay.update ();
+void destroyWidget () {
+ int theWindow = shellHandle;
+// OS.HideWindow (shellHandle);
+ releaseHandle ();
+ if (theWindow != 0) OS.DisposeWindow (theWindow);
}
-void enableWidget (boolean enabled) {
- super.enableWidget (enabled);
- enableHandle (enabled, shellHandle);
+
+Cursor findCursor () {
+ return cursor;
}
-/**
- * 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) and forces the window
- * manager to make the shell active.
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @since 2.0
- * @see Control#moveAbove
- * @see Control#setFocus
- * @see Control#setVisible
- * @see Display#getActiveShell
- * @see Decorations#setDefaultButton
- * @see Shell#open
- * @see Shell#setActive
- */
+
public void forceActive () {
checkWidget ();
- OS.SelectWindow(shellHandle);
+ OS.SetFrontProcess (new int [] {0, OS.kCurrentProcess});
+ OS.SelectWindow (shellHandle);
}
-public int getBorderWidth () {
+
+public Rectangle getClientArea () {
checkWidget();
- /* AW
- int [] argList = {OS.XmNborderWidth, 0};
- OS.XtGetValues (scrolledHandle, argList, argList.length / 2);
- return argList [1];
- */
- return 0;
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowContentRgn, rect);
+ return new Rectangle (0, 0, rect.right - rect.left, rect.bottom - rect.top);
}
+
public Rectangle getBounds () {
checkWidget();
- /* AW
- short [] root_x = new short [1], root_y = new short [1];
- OS.XtTranslateCoords (scrolledHandle, (short) 0, (short) 0, root_x, root_y);
- int [] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0};
- OS.XtGetValues (scrolledHandle, argList, argList.length / 2);
- int border = argList [5];
- */
-
- MacRect contentBounds= new MacRect();
- OS.GetWindowBounds(shellHandle, OS.kWindowContentRgn, contentBounds.getData());
-
- MacRect bounds= new MacRect();
- OS.GetControlBounds(scrolledHandle, bounds.getData());
- int trimWidth = trimWidth (), trimHeight = trimHeight ();
- int border= 0;
- /* AW
- int width = argList [1] + trimWidth + (border * 2);
- int height = argList [3] + trimHeight + (border * 2);
- return new Rectangle (root_x [0], root_y [0], width, height);
- */
- int width = bounds.getWidth() + trimWidth + (border * 2);
- int height = bounds.getHeight() + trimHeight + (border * 2);
- Rectangle r= new Rectangle (contentBounds.getX(), contentBounds.getY(), width, height);
- return r;
-
- /*
- OS.GetWindowBounds(shellHandle, OS.kWindowContentRgn, bounds.getData());
- Rectangle r= bounds.toRectangle();
- System.out.println("Shell.getBounds: fixme " + r); // should be the contentView
- return r;
- */
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
+ return new Rectangle (rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
}
+
public Display getDisplay () {
if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
return display;
}
-// AW
-public boolean getEnabled () {
- checkWidget();
- return fIsEnabled;
-}
-// AW
-/**
- * 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
- * <code>SWT</code>:
- * <code>NONE</code>, <code>ROMAN</code>, <code>DBCS</code>,
- * <code>PHONETIC</code>, <code>NATIVE</code>, <code>ALPHA</code>.
- *
- * @return the IME mode
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see SWT
- */
+
public int getImeInputMode () {
checkWidget();
return SWT.NONE;
}
+
public Point getLocation () {
checkWidget();
- /* AW
- short [] root_x = new short [1], root_y = new short [1];
- OS.XtTranslateCoords (scrolledHandle, (short) 0, (short) 0, root_x, root_y);
- return new Point (root_x [0], root_y [0]);
- */
- // returns the location of the contentArea
- MacRect bounds= new MacRect();
- OS.GetWindowBounds(shellHandle, OS.kWindowContentRgn, bounds.getData());
- return bounds.getLocation();
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
+ return new Point (rect.left, rect.top);
+}
+
+public boolean getMaximized () {
+ checkWidget();
+ //NOT DONE
+ return super.getMaximized ();
}
+
+public boolean getMinimized () {
+ checkWidget();
+ return OS.IsWindowCollapsed (shellHandle);
+}
+
public Shell getShell () {
checkWidget();
return this;
}
-/**
- * Returns an array containing all shells which are
- * descendents of the receiver.
- * <p>
- * @return the dialog shells
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- */
+
public Shell [] getShells () {
checkWidget();
int count = 0;
@@ -892,348 +264,198 @@ public Shell [] getShells () {
}
return result;
}
+
public Point getSize () {
checkWidget();
- //System.out.println("Shell.getSize: " + shellHandle);
- /* AW
- int [] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0};
- OS.XtGetValues (scrolledHandle, argList, argList.length / 2);
- int border = argList [5];
- */
- MacRect bounds= new MacRect();
- OS.GetControlBounds(scrolledHandle, bounds.getData());
- int trimWidth = trimWidth (), trimHeight = trimHeight ();
- int border = 0;
- /* AW
- int width = argList [1] + trimWidth + (border * 2);
- int height = argList [3] + trimHeight + (border * 2);
- return new Point (width, height);
- */
- int width = bounds.getWidth() + trimWidth + (border * 2);
- int height = bounds.getHeight() + trimHeight + (border * 2);
- Point p= new Point (width, height);
- //System.out.println(" Shell.getSize: " + p);
- return p;
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
+ return new Point (rect.right - rect.left, rect.bottom - rect.top);
}
+
public boolean getVisible () {
checkWidget();
- /* AW
- if (!OS.XtIsRealized (handle)) return false;
- int xDisplay = OS.XtDisplay (handle);
- if (xDisplay == 0) return false;
- int xWindow = OS.XtWindow (handle);
- if (xWindow == 0) return false;
- XWindowAttributes attributes = new XWindowAttributes ();
- OS.XGetWindowAttributes (xDisplay, xWindow, attributes);
- if (attributes.map_state == OS.IsViewable) return true;
- int [] argList = {OS.XmNmappedWhenManaged, 0};
- OS.XtGetValues (shellHandle, argList, argList.length / 2);
- return minimized && attributes.map_state == OS.IsUnviewable && argList [1] != 0;
- */
- return OS.IsWindowVisible(shellHandle);
+ return OS.IsWindowVisible (shellHandle);
+}
+
+boolean hasBorder () {
+ return false;
}
+
void hookEvents () {
super.hookEvents ();
- /* AW
+ int mouseProc = display.mouseProc;
int windowProc = display.windowProc;
- OS.XtAddEventHandler (shellHandle, OS.StructureNotifyMask, false, windowProc, SWT.Resize);
- if (OS.XtIsSubclass (shellHandle, OS.OverrideShellWidgetClass ())) return;
- OS.XtAddEventHandler (shellHandle, OS.FocusChangeMask, false, windowProc, SWT.FocusIn);
- int [] argList = {OS.XmNdeleteResponse, OS.XmDO_NOTHING};
- OS.XtSetValues (shellHandle, argList, argList.length / 2);
- int xDisplay = OS.XtDisplay (shellHandle);
- if (xDisplay != 0) {
- int atom = OS.XmInternAtom (xDisplay, WM_DELETE_WINDOW, false);
- OS.XmAddWMProtocolCallback (shellHandle, atom, windowProc, SWT.Dispose);
- }
- */
- Display display= getDisplay();
- int ref= OS.GetWindowEventTarget(shellHandle);
- int[] mask= new int[] {
+ int[] mask1 = new int [] {
OS.kEventClassWindow, OS.kEventWindowActivated,
- OS.kEventClassWindow, OS.kEventWindowDeactivated,
OS.kEventClassWindow, OS.kEventWindowBoundsChanged,
OS.kEventClassWindow, OS.kEventWindowClose,
- OS.kEventClassWindow, OS.kEventWindowDrawContent,
-
- // the window only tracks the down and mouse wheel events;
- // up, dragged, and move events are handled by the application because
- // we need to get these events even if the mouse is outside of the window.
+ OS.kEventClassWindow, OS.kEventWindowCollapsed,
+ OS.kEventClassWindow, OS.kEventWindowDeactivated,
+ OS.kEventClassWindow, OS.kEventWindowExpanded,
+ OS.kEventClassWindow, OS.kEventWindowHidden,
+ OS.kEventClassWindow, OS.kEventWindowShown,
+ };
+ int windowTarget = OS.GetWindowEventTarget (shellHandle);
+ OS.InstallEventHandler (windowTarget, windowProc, mask1.length / 2, mask1, shellHandle, null);
+ int [] mask2 = new int [] {
OS.kEventClassMouse, OS.kEventMouseDown,
+ OS.kEventClassMouse, OS.kEventMouseDragged,
+// OS.kEventClassMouse, OS.kEventMouseEntered,
+// OS.kEventClassMouse, OS.kEventMouseExited,
+ OS.kEventClassMouse, OS.kEventMouseMoved,
+ OS.kEventClassMouse, OS.kEventMouseUp,
OS.kEventClassMouse, OS.kEventMouseWheelMoved,
};
- OS.InstallEventHandler(ref, display.fWindowProc, mask, shellHandle);
-}
-int imeHeight () {
- /* AW
- if (!IsDBLocale) return 0;
-// realizeWidget ();
- int [] argList1 = {OS.XmNheight, 0};
- OS.XtGetValues (shellHandle, argList1, argList1.length / 2);
- int [] argList2 = {OS.XmNheight, 0};
- OS.XtGetValues (scrolledHandle, argList2, argList2.length / 2);
- return argList1 [1] - argList2 [];
- */
- return 0;
+ OS.InstallEventHandler (windowTarget, mouseProc, mask2.length / 2, mask2, shellHandle, null);
}
+
public boolean isEnabled () {
checkWidget();
return getEnabled ();
}
-boolean isModal () {
- checkWidget();
- /* AW
- int [] argList = {OS.XmNmwmInputMode, 0};
- OS.XtGetValues (shellHandle, argList, argList.length / 2);
- return (argList [1] != -1 && argList [1] != OS.MWM_INPUT_MODELESS);
- */
- int[] modalityKind= new int[1];
- if (OS.GetWindowModality(shellHandle, modalityKind, null) == OS.kNoErr)
- return modalityKind[0] != OS.kWindowModalityNone;
- return false;
-}
+
public boolean isVisible () {
checkWidget();
- return getVisible ();
+ if (getVisible ()) return true;
+ return parent != null && parent.isVisible ();
}
-void manageChildren () {
- /* AW
- OS.XtSetMappedWhenManaged (shellHandle, false);
- */
- super.manageChildren ();
- int width = MacUtil.getDisplayWidth() * 5 / 8;
- int height = MacUtil.getDisplayHeight() * 5 / 8;
- OS.SizeWindow(shellHandle, (short)width, (short)height, true);
+
+int kEventWindowActivated (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowActivated (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ Display display = getDisplay ();
+ display.updateMenuBar (this);
+ sendEvent (SWT.Activate);
+ restoreFocus ();
+ return result;
}
-/**
- * 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,
- * and sets focus to its default button (if it has one)
- * and asks the window manager to make the shell active.
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see Control#moveAbove
- * @see Control#setFocus
- * @see Control#setVisible
- * @see Display#getActiveShell
- * @see Decorations#setDefaultButton
- * @see Shell#setActive
- * @see Shell#forceActive
- */
-public void open () {
- checkWidget();
- setVisible (true);
+
+int kEventWindowBoundsChanged (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowBoundsChanged (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ int [] attributes = new int [1];
+ OS.GetEventParameter (theEvent, OS.kEventParamAttributes, OS.typeUInt32, null, attributes.length * 4, null, attributes);
+ if ((attributes [0] & OS.kWindowBoundsChangeOriginChanged) != 0) {
+ sendEvent (SWT.Move);
+ }
+ if ((attributes [0] & OS.kWindowBoundsChangeSizeChanged) != 0) {
+ resized = true;
+ layoutControl ();
+ sendEvent (SWT.Resize);
+ if (layout != null) layout.layout (this, false);
+ }
+ return result;
}
-int processDispose (Object callData) {
+
+int kEventWindowClose (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowClose (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
closeWidget ();
- return 0;
+ return OS.noErr;
}
-int processResize (Object callData) {
-
- MacRect bounds= new MacRect();
-
- // outside bounds and location
- OS.GetWindowBounds(shellHandle, OS.kWindowStructureRgn, bounds.getData());
- int x= bounds.getX();
- int y= bounds.getY();
+int kEventWindowCollapsed (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowCollapsed (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ sendEvent (SWT.Iconify);
+ return result;
+}
- // inside bounds and location
- OS.GetWindowBounds(shellHandle, OS.kWindowContentRgn, bounds.getData());
- int w= bounds.getWidth();
- int h= bounds.getHeight();
-
- boolean positionChanged= (oldX != x || oldY != y);
- boolean sizeChanged= (oldWidth != w || oldHeight != h);
+int kEventWindowDeactivated (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowDeactivated (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ sendEvent (SWT.Deactivate);
+ saveFocus ();
+ if (savedFocus != null) {
+ /*
+ * Bug in the Macintosh. When ClearKeyboardFocus() is called,
+ * the control that has focus gets two kEventControlSetFocus
+ * events indicating that focus was lost. The fix is to ignore
+ * both of these and send the focus lost event explicitly. */
+ display.ignoreFocus = true;
+ OS.ClearKeyboardFocus (shellHandle);
+ display.ignoreFocus = false;
+ savedFocus.sendFocusEvent (false);
+ }
+ Display display = getDisplay ();
+ display.updateMenuBar (null);
+ return result;
+}
- if (scrolledHandle != 0 && sizeChanged) {
- handleResize(scrolledHandle, new MacRect(0, 0, w, h));
- }
-
- if (positionChanged) {
- //System.out.println("Shell.send: SWT.Move");
- sendEvent(SWT.Move);
- }
-
- if (sizeChanged) {
- //System.out.println("Shell.send: SWT.Resize");
- sendEvent (SWT.Resize);
- if (layout != null)
- layout (false);
- }
-
- if (!OS.IsWindowVisible(shellHandle))
- return 0;
+int kEventWindowExpanded (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowExpanded (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ sendEvent (SWT.Deiconify);
+ return result;
+}
-
- if (x != 0) oldX = x;
- if (y != 0) oldY = y;
- oldWidth = w;
- oldHeight = h;
-
- /* AW
- XConfigureEvent xEvent = new XConfigureEvent ();
- OS.memmove (xEvent, callData, XConfigureEvent.sizeof);
- switch (xEvent.type) {
- case OS.ReparentNotify: {
- if (reparented) return 0;
- reparented = true;
- short [] root_x = new short [1], root_y = new short [1];
- OS.XtTranslateCoords (scrolledHandle, (short) 0, (short) 0, root_x, root_y);
- int [] argList = {OS.XmNwidth, 0, OS.XmNheight, 0};
- OS.XtGetValues (scrolledHandle, argList, argList.length / 2);
- xEvent.x = root_x [0]; xEvent.y = root_y [0];
- xEvent.width = argList [1]; xEvent.height = argList [3];
- // fall through
- }
- case OS.ConfigureNotify:
- if (!reparented) return 0;
- if (oldX != xEvent.x || oldY != xEvent.y) sendEvent (SWT.Move);
- if (oldWidth != xEvent.width || oldHeight != xEvent.height) {
- sendEvent (SWT.Resize);
- if (layout != null) layout (false);
- }
- if (xEvent.x != 0) oldX = xEvent.x;
- if (xEvent.y != 0) oldY = xEvent.y;
- oldWidth = xEvent.width;
- oldHeight = xEvent.height;
- return 0;
- case OS.UnmapNotify:
- int [] argList = {OS.XmNmappedWhenManaged, 0};
- OS.XtGetValues (shellHandle, argList, argList.length / 2);
- if (argList [1] != 0) {
- minimized = true;
- sendEvent (SWT.Iconify);
- }
- return 0;
- case OS.MapNotify:
- if (minimized) {
- minimized = false;
- sendEvent (SWT.Deiconify);
- }
- return 0;
+int kEventWindowHidden (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowHidden (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ Shell [] shells = getShells ();
+ for (int i=0; i<shells.length; i++) {
+ Shell shell = shells [i];
+ if (!shell.isDisposed ()) shell.setWindowVisible (false);
}
- */
- return 0;
+ return OS.eventNotHandledErr;
}
-int processSetFocus (Object callData) {
- /* AW
- XFocusChangeEvent xEvent = new XFocusChangeEvent ();
- OS.memmove (xEvent, callData, XFocusChangeEvent.sizeof);
- int handle = OS.XtWindowToWidget (xEvent.display, xEvent.window);
- */
- int handle = shellHandle; // AW FIXME fake
- if (handle != shellHandle) return super.processSetFocus (callData);
-
- /* AW
- if (xEvent.mode != OS.NotifyNormal) return 0;
- if (xEvent.detail != OS.NotifyNonlinear) return 0;
- switch (xEvent.type) {
- case OS.FocusIn:
- postEvent (SWT.Activate);
- break;
- case OS.FocusOut:
- postEvent (SWT.Deactivate);
- break;
- }
- */
-
- Menu menuBar= getMenuBar();
- Boolean b= (Boolean) callData;
-
- /*
- if (OS.IsWindowActive(shellHandle) != b.booleanValue()) {
- System.out.println("Shell.processSetFocus: " + b);
- return 0;
- }
- */
-
- if (b.booleanValue()) {
- if (menuBar != null) {
- OS.SetRootMenu(menuBar.handle);
+int kEventWindowShown (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventWindowShown (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ Shell [] shells = getShells ();
+ for (int i=0; i<shells.length; i++) {
+ Shell shell = shells [i];
+ if (!shell.isDisposed () && shell.getVisible ()) {
+ shell.setWindowVisible (true);
}
- postEvent (SWT.Activate);
- /*
- if (!isDisposed())
- restoreFocus ();
- */
- } else {
- //if (menuBar != null)
- // OS.ReleaseMenu(menuBar.handle);
-
- /*
- setActiveControl (null);
-
- if (isDisposed()) return 0;
- */
- postEvent (SWT.Deactivate);
- /*
- if (!isDisposed())
- saveFocus ();
- */
}
- return 0;
+ return OS.eventNotHandledErr;
}
-void propagateWidget (boolean enabled) {
- super.propagateWidget (enabled);
- propagateHandle (enabled, shellHandle);
+
+void layoutControl () {
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowContentRgn, rect);
+ int control = scrolledHandle != 0 ? scrolledHandle : handle;
+ setBounds (control, 0, 0, rect.right - rect.left, rect.bottom - rect.top, false, true, false);
+ super.layoutControl ();
}
-void realizeWidget () {
- if (realized) return;
- /* AW
- OS.XtRealizeWidget (shellHandle);
- */
- realizeChildren ();
- realized = true;
+
+public void open () {
+ checkWidget();
+ OS.SelectWindow (shellHandle);
+ setVisible (true);
+ if (!restoreFocus ()) traverseGroup (true);
}
+
void register () {
super.register ();
- WidgetTable.put (shellHandle, this);
+ int [] theRoot = new int [1];
+ OS.GetRootControl (shellHandle, theRoot);
+ WidgetTable.put (theRoot [0], this);
}
+
void releaseHandle () {
super.releaseHandle ();
shellHandle = 0;
}
+
void releaseShells () {
Shell [] shells = getShells ();
for (int i=0; i<shells.length; i++) {
Shell shell = shells [i];
- if (!shell.isDisposed ()) {
- shell.releaseWidget ();
- shell.releaseHandle ();
- }
+ if (!shell.isDisposed ()) shell.dispose ();
}
}
+
void releaseWidget () {
releaseShells ();
super.releaseWidget ();
- display = null;
+ if (windowGroup != 0) OS.ReleaseWindowGroup (windowGroup);
+ windowGroup = 0;
lastActive = null;
}
-/**
- * Removes the listener from the collection of listeners who will
- * be notified when operations are performed on the receiver.
- *
- * @param listener the listener which should no longer be notified
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see ShellListener
- * @see #addShellListener
- */
+
public void removeShellListener(ShellListener listener) {
checkWidget();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
@@ -1244,27 +466,17 @@ public void removeShellListener(ShellListener listener) {
eventTable.unhook(SWT.Iconify,listener);
eventTable.unhook(SWT.Deiconify,listener);
}
-void saveBounds () {
-/*
- MacRect bounds= new MacRect();
-
- // outside bounds and location
- OS.GetWindowBounds(shellHandle, OS.kWindowStructureRgn, bounds.getData());
- oldX = bounds.getX();
- oldY = bounds.getY();
-
- // inside bounds and location
- OS.GetWindowBounds(shellHandle, OS.kWindowContentRgn, bounds.getData());
- oldWidth = bounds.getWidth();
- oldHeight = bounds.getHeight();
-*/
+
+public void setActive () {
+ checkWidget ();
+ OS.SelectWindow (shellHandle);
}
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
@@ -1278,7 +490,7 @@ void setActiveControl (Control control) {
if (activate [index] != deactivate [index]) break;
index++;
}
-
+
/*
* It is possible (but unlikely), that application
* code could have destroyed some of the widgets. If
@@ -1298,229 +510,115 @@ void setActiveControl (Control control) {
}
public void setBounds (int x, int y, int width, int height) {
- checkWidget();
- /*
- * Feature in Motif. Motif will not allow a window
- * to have a zero width or zero height. The fix is
- * to ensure these values are never zero.
- */
- saveBounds ();
- int newWidth = Math.max (width - trimWidth (), 1);
- int newHeight = Math.max (height - trimHeight (), 1);
-
- boolean isFocus = caret != null && caret.isFocusCaret ();
- if (isFocus) caret.killFocus ();
-
- OS.MoveWindow(shellHandle, (short)x, (short)y, false);
- OS.SizeWindow(shellHandle, (short)newWidth, (short)newHeight, true);
- //processResize (null);
-
- if (isFocus) caret.setFocus ();
-}
-// AW
-public void setEnabled (boolean enabled) {
- fIsEnabled= enabled;
- super.setEnabled(enabled);
+ checkWidget ();
+ width = Math.max (0, width);
+ height = Math.max (0, height);
+ Rect rect = new Rect ();
+ OS.SetRect (rect, (short) x, (short) y, (short) (x + width), (short) (y + height));
+ OS.SetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
}
-// AW
-/**
- * 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 <code>SWT</code>:
- * <code>NONE</code>, <code>ROMAN</code>, <code>DBCS</code>,
- * <code>PHONETIC</code>, <code>NATIVE</code>, <code>ALPHA</code>.
- *
- * @param mode the new IME mode
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see SWT
- */
+
public void setImeInputMode (int mode) {
checkWidget();
}
+
public void setLocation (int x, int y) {
checkWidget();
- saveBounds ();
- boolean isFocus = caret != null && caret.isFocusCaret ();
- if (isFocus) caret.killFocus ();
- OS.MoveWindow(shellHandle, (short)x, (short)y, true);
- //processResize(null);
- if (isFocus) caret.setFocus ();
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
+ int width = rect.right - rect.left;
+ int height = rect.bottom - rect.top;
+ OS.SetRect (rect, (short) x, (short) y, (short) (x + width), (short) (y + height));
+ OS.SetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
}
-public void setMinimized (boolean minimized) {
+
+public void setMaximized (boolean maximized) {
checkWidget();
+ super.setMaximized (maximized);
+ org.eclipse.swt.internal.carbon.Point pt = new org.eclipse.swt.internal.carbon.Point ();
+ short inPartCode = (short) (maximized ? OS.inZoomOut : OS.inZoomIn);
+ //FIXME - returns -50 errParam
+ OS.ZoomWindowIdeal (shellHandle, inPartCode, pt);
+}
- /*
- * Bug in MOTIF. For some reason, the receiver does not keep the
- * value of the XmNiconic resource up to date when the user minimizes
- * and restores the window. As a result, a window that is minimized
- * by the user and then restored by the programmer is not restored.
- * This happens because the XmNiconic resource is unchanged when the
- * window is minimized by the user and subsequent attempts to set the
- * resource fail because the new value of the resource is the same as
- * the old value. The fix is to force XmNiconic to be up to date
- * before setting the desired value.
- */
- /* AW
- int [] argList = {OS.XmNiconic, 0};
- OS.XtGetValues (shellHandle, argList, argList.length / 2);
- if ((argList [1] != 0) != this.minimized) {
- argList [1] = this.minimized ? 1 : 0;
- OS.XtSetValues (shellHandle, argList, argList.length / 2);
- }
- */
-
- /* Minimize or restore the shell */
- /* AW
- argList [1] = (this.minimized = minimized) ? 1 : 0;
- OS.XtSetValues (shellHandle, argList, argList.length / 2);
- */
-
- /* Force the XWindowAttributes to be up to date */
- /*
- int xDisplay = OS.XtDisplay (handle);
- if (xDisplay != 0) OS.XSync (xDisplay, false);
- */
-
- OS.CollapseWindow(shellHandle, true);
+public void setMinimized (boolean minimized) {
+ checkWidget();
+ super.setMinimized (minimized);
+ OS.CollapseWindow (shellHandle, true);
}
public void setSize (int width, int height) {
checkWidget();
- saveBounds ();
- int newWidth = Math.max (width - trimWidth (), 1);
- int newHeight = Math.max (height - trimHeight (), 1);
- boolean isFocus = caret != null && caret.isFocusCaret ();
- if (isFocus) caret.killFocus ();
- OS.SizeWindow(shellHandle, (short)newWidth, (short)newHeight, true);
- //processResize (null);
- if (isFocus) caret.setFocus ();
+ width = Math.max (0, width);
+ height = Math.max (0, height);
+ Rect rect = new Rect ();
+ OS.GetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
+ OS.SetRect (rect, rect.left, rect.top, (short)(rect.left + width), (short)(rect.top + height));
+ OS.SetWindowBounds (shellHandle, (short) OS.kWindowStructureRgn, rect);
}
+
public void setText (String string) {
checkWidget();
if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
super.setText (string);
- int sHandle= 0;
- try {
- sHandle= OS.CFStringCreateWithCharacters(string);
- OS.SetWindowTitleWithCFString(shellHandle, sHandle);
- } finally {
- if (sHandle != 0)
- OS.CFRelease(sHandle);
- }
+ char [] buffer = new char [string.length ()];
+ string.getChars (0, buffer.length, buffer, 0);
+ int ptr = OS.CFStringCreateWithCharacters (OS.kCFAllocatorDefault, buffer, buffer.length);
+ if (ptr == 0) error (SWT.ERROR_CANNOT_SET_TEXT);
+ OS.SetWindowTitleWithCFString (shellHandle, ptr);
+ OS.CFRelease (ptr);
}
+
public void setVisible (boolean visible) {
checkWidget();
- realizeWidget ();
-
- /* Show the shell */
if (visible) {
-
- sendEvent (SWT.Show);
- if (isDisposed ()) return;
+ if ((state & HIDDEN) == 0) return;
+ state &= ~HIDDEN;
+ } else {
+ if ((state & HIDDEN) != 0) return;
+ state |= HIDDEN;
+ }
+ if (parent != null && !parent.isVisible ()) return;
+ setWindowVisible (visible);
+}
- /* Map the widget */
- /* AW
- OS.XtSetMappedWhenManaged (shellHandle, true);
- if (OS.XtIsTopLevelShell (shellHandle)) {
- OS.XtMapWidget (shellHandle);
- } else {
- OS.XtPopup (shellHandle, OS.XtGrabNone);
+void setWindowVisible (boolean visible) {
+ if (OS.IsWindowVisible (shellHandle) == visible) return;
+ if (visible) {
+ if (!resized) {
+ sendEvent (SWT.Resize);
+ if (layout != null) layout.layout (this, false);
}
- */
- OS.ShowWindow(shellHandle);
- //OS.SelectWindow(shellHandle);
- OS.BringToFront(shellHandle);
-
- processResize (null);
-
- // find focus
- //if (savedFocus == null)
- // setFocus();
-
- /*
- * Force the shell to be fully exposed before returning.
- * This ensures that the shell coordinates are correct
- * when queried directly after showing the shell.
- */
- do {
- display.update ();
- } while (!isVisible ());
-
- //adjustTrim ();
-
- /* Set the saved focus widget */
- /*
- if (savedFocus != null && !savedFocus.isDisposed ()) {
- savedFocus.setFocus ();
+ sendEvent (SWT.Show);
+ if (isDisposed ()) return;
+ int inModalKind = OS.kWindowModalityNone;
+ if ((style & SWT.PRIMARY_MODAL) != 0) inModalKind = OS.kWindowModalityWindowModal;
+ if ((style & SWT.APPLICATION_MODAL) != 0) inModalKind = OS.kWindowModalityAppModal;
+ if ((style & SWT.SYSTEM_MODAL) != 0) inModalKind = OS.kWindowModalitySystemModal;
+ if (inModalKind != OS.kWindowModalityNone) {
+ int inUnavailableWindow = 0;
+ if (parent != null) inUnavailableWindow = OS.GetControlOwner (parent.handle);
+ OS.SetWindowModality (shellHandle, inModalKind, inUnavailableWindow);
}
- savedFocus = null;
- */
-
- //sendEvent (SWT.Show);
-
- return;
- }
-
- Shell[] shells= getShells();
- for (int i= 0; i < shells.length; i++) {
- Shell shell= shells[i];
- if (shell.isVisible())
- shell.setVisible(false);
- }
-
- /* Hide the shell */
- /* AW
- OS.XtSetMappedWhenManaged (shellHandle, false);
- if (OS.XtIsTopLevelShell (shellHandle)) {
- OS.XtUnmapWidget (shellHandle);
+ OS.ShowWindow (shellHandle);
} else {
- OS.XtPopdown (shellHandle);
+ OS.HideWindow (shellHandle);
+ sendEvent (SWT.Hide);
}
- */
- OS.HideWindow(shellHandle);
-
- sendEvent (SWT.Hide);
}
-int topHandle () {
- return shellHandle;
-}
-int trimHeight () {
- if ((style & SWT.NO_TRIM) != 0) return 0;
- /* AW
- boolean hasTitle = false, hasResize = false, hasBorder = false;
- hasTitle = (style & (SWT.MIN | SWT.MAX | SWT.TITLE | SWT.MENU)) != 0;
- hasResize = (style & SWT.RESIZE) != 0;
- hasBorder = (style & SWT.BORDER) != 0;
- if (hasTitle) {
- if (hasResize) return display.titleResizeTrimHeight;
- if (hasBorder) return display.titleBorderTrimHeight;
- return display.titleTrimHeight;
- }
- if (hasResize) return display.resizeTrimHeight;
- if (hasBorder) return display.borderTrimHeight;
- */
- return 0;
+
+void setZOrder () {
+ if (scrolledHandle != 0) OS.HIViewAddSubview (scrolledHandle, handle);
}
-int trimWidth () {
- if ((style & SWT.NO_TRIM) != 0) return 0;
- /* AW
- boolean hasTitle = false, hasResize = false, hasBorder = false;
- hasTitle = (style & (SWT.MIN | SWT.MAX | SWT.TITLE | SWT.MENU)) != 0;
- hasResize = (style & SWT.RESIZE) != 0;
- hasBorder = (style & SWT.BORDER) != 0;
- if (hasTitle) {
- if (hasResize) return display.titleResizeTrimWidth;
- if (hasBorder) return display.titleBorderTrimWidth;
- return display.titleTrimWidth;
+
+void setZOrder (Control control, boolean above) {
+ if (above) {
+ //NOT DONE - move one window above another
+ OS.BringToFront (shellHandle);
+ } else {
+ int window = control == null ? 0 : OS.GetControlOwner (control.handle);
+ OS.SendBehind (shellHandle, window);
}
- if (hasResize) return display.resizeTrimWidth;
- if (hasBorder) return display.borderTrimWidth;
- */
- return 0;
}
+
}