summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java801
1 files changed, 150 insertions, 651 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java
index a18b206563..396e1dd8ef 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Menu.java
@@ -11,189 +11,32 @@ import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.internal.carbon.*;
-/**
- * Instances of this class are user interface objects that contain
- * menu items.
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>BAR, DROP_DOWN, POP_UP</dd>
- * <dt><b>Events:</b></dt>
- * <dd>Help, Hide, Show </dd>
- * </dl>
- * <p>
- * Note: Only one of BAR, DROP_DOWN and POP_UP may be specified.
- * </p><p>
- * IMPORTANT: This class is <em>not</em> intended to be subclassed.
- * </p>
- */
public class Menu extends Widget {
+ int handle;
+ short id, lastIndex;
int x, y;
- short lastIndex;
boolean hasLocation;
MenuItem cascade, defaultItem;
Decorations parent;
-/**
- * Constructs a new instance of this class given its parent,
- * and sets the style for the instance so that the instance
- * will be a popup menu on the given parent's shell.
- *
- * @param parent a control which will be the parent of the new instance (cannot be null)
- *
- * @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>
- *
- * @see SWT#POP_UP
- * @see Widget#checkSubclass
- * @see Widget#getStyle
- */
public Menu (Control parent) {
this (checkNull (parent).getShell (), SWT.POP_UP);
}
-/**
- * Constructs a new instance of this class given its parent
- * (which must be a <code>Decorations</code>) 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>
- *
- * @param parent a decorations control which will be the parent of the new instance (cannot be null)
- * @param style the style of menu to construct
- *
- * @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>
- *
- * @see SWT#BAR
- * @see SWT#DROP_DOWN
- * @see SWT#POP_UP
- * @see Widget#checkSubclass
- * @see Widget#getStyle
- */
public Menu (Decorations parent, int style) {
super (parent, checkStyle (style));
this.parent = parent;
createWidget ();
}
-/**
- * Constructs a new instance of this class given its parent
- * (which must be a <code>Menu</code>) and sets the style
- * for the instance so that the instance will be a drop-down
- * menu on the given parent's parent.
- *
- * @param parent a menu which will be the parent of the new instance (cannot be null)
- *
- * @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>
- *
- * @see SWT#DROP_DOWN
- * @see Widget#checkSubclass
- * @see Widget#getStyle
- */
public Menu (Menu parentMenu) {
this (checkNull (parentMenu).parent, SWT.DROP_DOWN);
}
-/**
- * Constructs a new instance of this class given its parent
- * (which must be a <code>MenuItem</code>) and sets the style
- * for the instance so that the instance will be a drop-down
- * menu on the given parent's parent menu.
- *
- * @param parent a menu item which will be the parent of the new instance (cannot be null)
- *
- * @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>
- *
- * @see SWT#DROP_DOWN
- * @see Widget#checkSubclass
- * @see Widget#getStyle
- */
public Menu (MenuItem parentItem) {
this (checkNull (parentItem).parent);
}
-/**
- * Adds the listener to the collection of listeners who will
- * be notified when help events are generated for the control,
- * by sending it one of the messages defined in the
- * <code>HelpListener</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 HelpListener
- * @see #removeHelpListener
- */
-public void addHelpListener (HelpListener listener) {
- checkWidget ();
- if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
- TypedListener typedListener = new TypedListener (listener);
- addListener (SWT.Help, typedListener);
-}
-
-/**
- * Adds the listener to the collection of listeners who will
- * be notified when menus are hidden or shown, by sending it
- * one of the messages defined in the <code>MenuListener</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 MenuListener
- * @see #removeMenuListener
- */
-public void addMenuListener (MenuListener listener) {
- checkWidget ();
- if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
- TypedListener typedListener = new TypedListener (listener);
- addListener (SWT.Hide,typedListener);
- addListener (SWT.Show,typedListener);
-}
-
static Control checkNull (Control control) {
if (control == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
return control;
@@ -213,119 +56,97 @@ static int checkStyle (int style) {
return checkBits (style, SWT.POP_UP, SWT.BAR, SWT.DROP_DOWN, 0, 0, 0);
}
+public void _setVisible (boolean visible) {
+ if ((style & (SWT.BAR | SWT.DROP_DOWN)) != 0) return;
+ if (!visible) return;
+ int left = x, top = y;
+ if (!hasLocation) {
+ org.eclipse.swt.internal.carbon.Point where = new org.eclipse.swt.internal.carbon.Point ();
+ OS.GetGlobalMouse (where);
+ left = where.h; top = where.v;
+ }
+ int index = defaultItem != null ? indexOf (defaultItem) + 1 : lastIndex;
+ int result = OS.PopUpMenuSelect (handle, (short)top, (short)left, (short)(index));
+ lastIndex = OS.LoWord (result);
+}
+
+public void addHelpListener (HelpListener listener) {
+ checkWidget ();
+ if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener (listener);
+ addListener (SWT.Help, typedListener);
+}
+
+public void addMenuListener (MenuListener listener) {
+ checkWidget ();
+ if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener (listener);
+ addListener (SWT.Hide,typedListener);
+ addListener (SWT.Show,typedListener);
+}
+
void createHandle () {
- state |= HIDDEN;
- Display display= getDisplay();
- int menuHandle[]= new int[1];
- if (OS.CreateNewMenu(display.nextMenuId(), 0, menuHandle) == OS.kNoErr)
- handle= menuHandle[0];
- if (handle == 0) error (SWT.ERROR_NO_HANDLES);
- OS.RetainMenu(handle);
- int[] mask = new int[] {
- OS.kEventClassMenu, OS.kEventMenuOpening,
- OS.kEventClassMenu, OS.kEventMenuClosed
- };
- //OS.InstallEventHandler(OS.GetMenuEventTarget(handle), display.fMenuProc, mask.length / 2, mask, handle, null);
- OS.InstallEventHandler(OS.GetMenuEventTarget(handle), display.fMenuProc, mask, handle);
+ Display display = getDisplay ();
+ int menuProc = display.menuProc;
+ display.addMenu (this);
+ int outMenuRef [] = new int [1];
+ OS.CreateNewMenu (id, 0, outMenuRef);
+ if (outMenuRef [0] == 0) {
+ display.removeMenu (this);
+ error (SWT.ERROR_NO_HANDLES);
+ }
+ handle = outMenuRef [0];
}
void createItem (MenuItem item, int index) {
checkWidget ();
int count = OS.CountMenuItems (handle);
if (!(0 <= index && index <= count)) error (SWT.ERROR_INVALID_RANGE);
- parent.add (item);
- boolean success = false;
- /*
- if (OS.IsWinCE) {
- int flags = OS.MF_BYPOSITION;
- if ((style & SWT.SEPARATOR) != 0) flags |= OS.MF_SEPARATOR;
- success = OS.InsertMenu (handle, index, flags, item.id, null);
- } else {
- int hHeap = OS.GetProcessHeap ();
- int pszText = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, TCHAR.sizeof);
- MENUITEMINFO info = new MENUITEMINFO ();
- info.cbSize = MENUITEMINFO.sizeof;
- info.fMask = OS.MIIM_ID | OS.MIIM_TYPE;
- info.wID = item.id;
- info.fType = item.widgetStyle ();
- info.dwTypeData = pszText;
- success = OS.InsertMenuItem (handle, index, true, info);
- if (pszText != 0) OS.HeapFree (hHeap, 0, pszText);
- }
- */
-
- /*
- if ((style & SWT.SEPARATOR) != 0) return OS.MFT_SEPARATOR;
- if ((style & SWT.RADIO) != 0) return OS.MFT_RADIOCHECK;
- return OS.MFT_STRING;
- */
-
- int attributes= 0;
- if ((item.style & SWT.SEPARATOR) != 0)
- attributes= OS.kMenuItemAttrSeparator;
- if (OS.InsertMenuItemTextWithCFString(handle, 0, (short) index, attributes, item.id) == OS.kNoErr)
- success= true;
-
- if (!success) {
- parent.remove (item);
+ Display display = getDisplay ();
+ display.addMenuItem (item);
+ int attributes = 0;
+ if ((item.style & SWT.SEPARATOR) != 0) attributes = OS.kMenuItemAttrSeparator;
+ int result = OS.InsertMenuItemTextWithCFString (handle, 0, (short) index, attributes, item.id);
+ if (result != OS.noErr) {
+ display.removeMenuItem (item);
error (SWT.ERROR_ITEM_NOT_ADDED);
}
- /* AW
- redraw ();
- */
-}
-
-void createWidget () {
- createHandle ();
- parent.add (this);
- register ();
-}
-
-void destroyAcceleratorTable () {
- /* AW
- parent.destroyAcceleratorTable ();
- */
+ if ((style & SWT.BAR) != 0) {
+// Display display = getDisplay ();
+// short menuID = display.nextMenuId ();
+// int outMenuRef [] = new int [1];
+// if (OS.CreateNewMenu (menuID, 0, outMenuRef) != OS.noErr) {
+// error (SWT.ERROR_NO_HANDLES);
+// }
+// OS.SetMenuItemHierarchicalMenu (handle, (short) (index + 1), outMenuRef [0]);
+ }
}
void destroyItem (MenuItem item) {
- /* AW
- if (!OS.RemoveMenu (handle, item.id, OS.MF_BYCOMMAND)) {
+ short [] outIndex = new short [1];
+ if (OS.GetIndMenuItemWithCommandID (handle, item.id, 1, null, outIndex) != OS.noErr) {
error (SWT.ERROR_ITEM_NOT_REMOVED);
}
- */
- short[] index= new short[1];
- OS.GetIndMenuItemWithCommandID(handle, item.id, 1, null, index);
- if (index[0] >= 1) {
- OS.DeleteMenuItem(handle, index[0]);
- } else
- error (SWT.ERROR_ITEM_NOT_REMOVED);
-
- redraw ();
+ if ((style & SWT.BAR) != 0) {
+// int [] outMenuRef = new int [1];
+// OS.GetMenuItemHierarchicalMenu (handle, outIndex [0], outMenuRef);
+// if (outMenuRef [0] != 0) {
+// OS.DeleteMenu (OS.GetMenuID (outMenuRef [0]));
+// OS.DisposeMenu (outMenuRef [0]);
+// }
+ }
+ OS.DeleteMenuItem (handle, outIndex [0]);
}
void destroyWidget () {
- int hMenu = handle;
+ int theMenu = handle;
releaseHandle ();
- if (hMenu != 0) {
- /* AW
- OS.DestroyMenu (hMenu);
- */
- OS.DisposeMenu (hMenu);
+ if (theMenu != 0) {
+ OS.DeleteMenu (OS.GetMenuID (theMenu));
+ OS.DisposeMenu (theMenu);
}
}
-/**
- * Returns the default menu item or null if none has
- * been previously set.
- *
- * @return the default menu item.
- *
- * </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>
- */
public MenuItem getDefaultItem () {
checkWidget();
return defaultItem;
@@ -337,107 +158,39 @@ public Display getDisplay () {
return parent.getDisplay ();
}
-/**
- * Returns <code>true</code> if the receiver is enabled, and
- * <code>false</code> otherwise. A disabled control is typically
- * not selectable from the user interface and draws with an
- * inactive or "grayed" look.
- *
- * @return the receiver's enabled state
- *
- * @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 boolean getEnabled () {
- checkWidget ();
- /* AW
+ checkWidget();
return (state & DISABLED) == 0;
- */
- return OS.IsMenuItemEnabled(handle, (short)0);
-}
-
-/**
- * Returns the item at the given, zero-relative index in the
- * receiver. Throws an exception if the index is out of range.
- *
- * @param index the index of the item to return
- * @return the item at the given index
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</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>
- */
+}
+
public MenuItem getItem (int index) {
checkWidget ();
- int[] commandID= new int[1];
- if (OS.GetMenuItemCommandID(handle, (short)(index+1), commandID) != OS.kNoErr)
+ int [] outCommandID= new int [1];
+ if (OS.GetMenuItemCommandID (handle, (short)(index+1), outCommandID) != OS.noErr) {
error (SWT.ERROR_INVALID_RANGE);
- return parent.findMenuItem (commandID[0]);
-}
-
-/**
- * Returns the number of items contained in the receiver.
- *
- * @return the number of items
- *
- * @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>
- */
+ }
+ Display display = getDisplay ();
+ return display.findMenuItem (outCommandID[0]);
+}
+
public int getItemCount () {
checkWidget ();
return OS.CountMenuItems (handle);
}
-/**
- * Returns an array of <code>MenuItem</code>s which are the items
- * in the receiver.
- * <p>
- * Note: This is not the actual structure used by the receiver
- * to maintain its list of items, so modifying the array will
- * not affect the receiver.
- * </p>
- *
- * @return the items in the receiver
- *
- * @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 MenuItem [] getItems () {
checkWidget ();
- int index = 0;
- int length = OS.CountMenuItems(handle);
+ Display display = getDisplay ();
+ int length = OS.CountMenuItems (handle);
MenuItem [] items = new MenuItem [length];
- /* AW
- MENUITEMINFO info = new MENUITEMINFO ();
- info.cbSize = MENUITEMINFO.sizeof;
- info.fMask = OS.MIIM_ID;
- while (OS.GetMenuItemInfo (handle, index, true, info)) {
- */
- int[] commandID= new int[1];
- while (OS.GetMenuItemCommandID(handle, (short)(index+1), commandID) == OS.kNoErr) {
- if (index == items.length) {
- MenuItem [] newItems = new MenuItem [index + 4];
- System.arraycopy (newItems, 0, items, 0, index);
- items = newItems;
+ int [] outCommandID= new int [1];
+ for (int i=0; i<items.length; i++) {
+ if (OS.GetMenuItemCommandID (handle, (short)(i+1), outCommandID) != OS.noErr) {
+ error (SWT.ERROR_CANNOT_GET_ITEM);
}
- items [index] = parent.findMenuItem (commandID [0]);
- if (items [index] != null)
- index++;
+ items [i] = display.findMenuItem (outCommandID [0]);
}
- if (index == items.length) return items;
- MenuItem [] result = new MenuItem [index];
- System.arraycopy (result, 0, items, 0, index);
- return result;
+ return items;
}
String getNameText () {
@@ -453,157 +206,77 @@ String getNameText () {
return result;
}
-/**
- * Returns the receiver's parent, which must be a <code>Decorations</code>.
- *
- * @return the receiver's parent
- *
- * @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 Decorations getParent () {
checkWidget ();
return parent;
}
-/**
- * Returns the receiver's parent item, which must be a
- * <code>MenuItem</code> or null when the receiver is a
- * root.
- *
- * @return the receiver's parent item
- *
- * @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 MenuItem getParentItem () {
checkWidget ();
return cascade;
}
-/**
- * Returns the receiver's parent item, which must be a
- * <code>Menu</code> or null when the receiver is a
- * root.
- *
- * @return the receiver's parent item
- *
- * @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 Menu getParentMenu () {
checkWidget ();
if (cascade != null) return cascade.parent;
return null;
}
-/**
- * Returns the receiver's shell. For all controls other than
- * shells, this simply returns the control's nearest ancestor
- * shell. Shells return themselves, even if they are children
- * of other shells.
- *
- * @return the receiver's shell
- *
- * @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 #getParent
- */
public Shell getShell () {
checkWidget ();
return parent.getShell ();
}
-/**
- * Returns <code>true</code> if the receiver is visible, and
- * <code>false</code> otherwise.
- * <p>
- * If one of the receiver's ancestors is not visible or some
- * other condition makes the receiver not visible, this method
- * may still indicate that it is considered visible even though
- * it may not actually be showing.
- * </p>
- *
- * @return the receiver's visibility state
- *
- * @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 boolean getVisible () {
checkWidget ();
if ((style & SWT.BAR) != 0) {
return this == parent.menuShell ().menuBar;
}
- return (state & HIDDEN) == 0;
-}
-
-/**
- * Searches the receiver's list starting at the first item
- * (index 0) until an item is found that is equal to the
- * argument, and returns the index of that item. If no item
- * is found, returns -1.
- *
- * @param item the search item
- * @return the index of the item
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the string 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>
- */
+ if ((style & SWT.POP_UP) != 0) {
+ Display display = getDisplay ();
+ Menu [] popups = display.popups;
+ if (popups == null) return false;
+ for (int i=0; i<popups.length; i++) {
+ if (popups [i] == this) return true;
+ }
+ }
+ MenuTrackingData outData = new MenuTrackingData ();
+ return OS.GetMenuTrackingData (handle, outData) == OS.noErr;
+}
+
+void hookEvents () {
+ super.hookEvents ();
+ Display display = getDisplay ();
+ int menuProc = display.menuProc;
+ int [] mask = new int [] {
+ OS.kEventClassMenu, OS.kEventMenuOpening,
+ OS.kEventClassMenu, OS.kEventMenuClosed,
+ };
+ int menuTarget = OS.GetMenuEventTarget (handle);
+ OS.InstallEventHandler (menuTarget, menuProc, mask.length / 2, mask, 0, null);
+}
+
+int kEventMenuClosed (int nextHandler, int theEvent, int userData) {
+ sendEvent (SWT.Hide);
+ return OS.eventNotHandledErr;
+}
+
+int kEventMenuOpening (int nextHandler, int theEvent, int userData) {
+ sendEvent (SWT.Show);
+ return OS.eventNotHandledErr;
+}
+
public int indexOf (MenuItem item) {
checkWidget ();
if (item == null) error (SWT.ERROR_NULL_ARGUMENT);
-
- /* AW
- int index = 0;
- MENUITEMINFO info = new MENUITEMINFO ();
- info.cbSize = MENUITEMINFO.sizeof;
- info.fMask = OS.MIIM_ID;
- while (OS.GetMenuItemInfo (handle, index, true, info)) {
- if (info.wID == item.id) return index;
- index++;
- }
- */
-
- int[] menu= new int[1];
- short[] index= new short[1];
- if (OS.GetIndMenuItemWithCommandID(handle, item.id, 1, menu, index) == OS.kNoErr) {
- if (handle == menu[0]) // ensure that we found item not in submenu
- return index[0];
- }
+ int [] outMenu = new int [1];
+ short [] outIndex = new short [1];
+ if (OS.GetIndMenuItemWithCommandID (handle, item.id, 1, outMenu, outIndex) == OS.noErr) {
+ return handle == outMenu [0] ? outIndex [0] - 1 : 0;
+ }
return -1;
}
-/**
- * Returns <code>true</code> if the receiver is enabled and all
- * of the receiver's ancestors are enabled, and <code>false</code>
- * otherwise. A disabled control is typically not selectable from the
- * user interface and draws with an inactive or "grayed" look.
- *
- * @return the receiver's enabled state
- *
- * @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 #getEnabled
- */
public boolean isEnabled () {
checkWidget ();
Menu parentMenu = getParentMenu ();
@@ -611,72 +284,11 @@ public boolean isEnabled () {
return getEnabled () && parentMenu.isEnabled ();
}
-/**
- * Returns <code>true</code> if the receiver is visible and all
- * of the receiver's ancestors are visible and <code>false</code>
- * otherwise.
- *
- * @return the receiver's visibility state
- *
- * @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 #getVisible
- */
public boolean isVisible () {
checkWidget ();
return getVisible ();
}
-int processHide (Object callData) {
- //sendEvent (SWT.Hide);
- state |= HIDDEN;
- postEvent (SWT.Hide); // fix for #23947
- return 0;
-}
-
-int processShow (Object callData) {
- state &= ~HIDDEN;
- sendEvent (SWT.Show);
- return 0;
-}
-
-void redraw () {
- if ((style & SWT.BAR) != 0) {
- //AW OS.DrawMenuBar (parent.handle);
- return;
- }
- /* AW
- if ((OS.WIN32_MAJOR << 16 | OS.WIN32_MINOR) < (4 << 16 | 10)) {
- return;
- }
- boolean hasCheck = false, hasImage = false;
- MenuItem [] items = getItems ();
- for (int i=0; i<items.length; i++) {
- MenuItem item = items [i];
- if (item.getImage () != null) {
- if ((hasImage = true) && hasCheck) break;
- }
- if ((item.getStyle () & (SWT.CHECK | SWT.RADIO)) != 0) {
- if ((hasCheck = true) && hasImage) break;
- }
- }
- if (OS.IsWinCE) return;
- MENUINFO lpcmi = new MENUINFO ();
- lpcmi.cbSize = MENUINFO.sizeof;
- lpcmi.fMask = OS.MIM_STYLE;
- OS.GetMenuInfo (handle, lpcmi);
- if (hasImage && !hasCheck) {
- lpcmi.dwStyle |= OS.MNS_CHECKORBMP;
- } else {
- lpcmi.dwStyle &= ~OS.MNS_CHECKORBMP;
- }
- OS.SetMenuInfo (handle, lpcmi);
- */
-}
-
void releaseChild () {
super.releaseChild ();
if (cascade != null) cascade.setMenu (null);
@@ -689,34 +301,15 @@ void releaseWidget () {
MenuItem [] items = getItems ();
for (int i=0; i<items.length; i++) {
MenuItem item = items [i];
- if (!item.isDisposed ()) {
- item.releaseWidget ();
- item.releaseHandle ();
- }
+ if (!item.isDisposed ()) item.releaseResources ();
}
super.releaseWidget ();
- if (parent != null) parent.remove (this);
+ Display display = getDisplay ();
+ display.removeMenu (this);
parent = null;
cascade = null;
}
-/**
- * Removes the listener from the collection of listeners who will
- * be notified when the help events are generated for the control.
- *
- * @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 HelpListener
- * @see #addHelpListener
- */
public void removeHelpListener (HelpListener listener) {
checkWidget ();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
@@ -724,23 +317,6 @@ public void removeHelpListener (HelpListener listener) {
eventTable.unhook (SWT.Help, listener);
}
-/**
- * Removes the listener from the collection of listeners who will
- * be notified when the menu events are generated for the control.
- *
- * @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 MenuListener
- * @see #addMenuListener
- */
public void removeMenuListener (MenuListener listener) {
checkWidget ();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
@@ -749,117 +325,40 @@ public void removeMenuListener (MenuListener listener) {
eventTable.unhook (SWT.Show, listener);
}
-/**
- * Sets the default menu item to the argument or removes
- * the default emphasis when the argument is <code>null</code>.
- *
- * @param item the default menu item or null
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_INVALID_ARGUMENT - if the menu item has been disposed</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>
- */
public void setDefaultItem (MenuItem item) {
checkWidget();
if (item != null && item.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT);
defaultItem = item;
}
-/**
- * Enables the receiver if the argument is <code>true</code>,
- * and disables it otherwise. A disabled control is typically
- * not selectable from the user interface and draws with an
- * inactive or "grayed" look.
- *
- * @param enabled the new enabled state
- *
- * @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 void setEnabled (boolean enabled) {
- checkWidget ();
- /* AW
- state &= ~DISABLED;
- if (!enabled) state |= DISABLED;
- */
- if (enabled)
- OS.EnableMenuItem(handle, (short)0);
- else
- OS.DisableMenuItem(handle, (short)0);
-}
-
-/**
- * Sets the receiver's location to the point specified by
- * the arguments which are relative to the display.
- * <p>
- * Note: This is different from most widgets where the
- * location of the widget is relative to the parent.
- * </p>
- *
- * @param x the new x coordinate for the receiver
- * @param y the new y coordinate for the receiver
- *
- * @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>
- */
+ checkWidget();
+ if (enabled) {
+ state &= ~DISABLED;
+ OS.EnableMenuItem (handle, (short)0);
+ } else {
+ state |= DISABLED;
+ OS.DisableMenuItem (handle, (short)0);
+ }
+}
+
public void setLocation (int x, int y) {
checkWidget ();
- this.x = x; this.y = y;
+ this.x = x;
+ this.y = y;
hasLocation = true;
}
-/**
- * Marks the receiver as visible if the argument is <code>true</code>,
- * and marks it invisible otherwise.
- * <p>
- * If one of the receiver's ancestors is not visible or some
- * other condition makes the receiver not visible, marking
- * it visible may not actually cause it to be displayed.
- * </p>
- *
- * @param visible the new visibility state
- *
- * @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 void setVisible (boolean visible) {
checkWidget ();
if ((style & (SWT.BAR | SWT.DROP_DOWN)) != 0) return;
- if (!visible) return;
- int nX = x, nY = y;
- if (!hasLocation) {
- MacPoint where= new MacPoint();
- OS.GetGlobalMouse (where.getData());
- nX = where.getX(); nY = where.getY();
+ Display display = getDisplay ();
+ if (visible) {
+ display.addPopup (this);
+ } else {
+ display.removePopup (this);
+ _setVisible (false);
}
- int index = defaultItem != null ? indexOf (defaultItem) + 1 : lastIndex;
- Display d= getDisplay();
- d.fInContextMenu= true;
- int result = OS.PopUpMenuSelect (handle, (short)nY, (short)nX, (short)(index));
- d.fInContextMenu= false;
- lastIndex = OS.LoWord (result);
}
-///////////////////////////////////////////////////
-// Mac stuff
-///////////////////////////////////////////////////
-
- void handleMenu(int menuResult) {
- int index= OS.LoWord(menuResult)-1;
- if (index >= 0 && index < getItemCount()) {
- MenuItem item= getItem(index);
- if (item != null)
- item.handleMenuSelect();
- }
- }
}