The NSMenu class uses an object implementing the
NSMenuView protocol to do the actual drawing.
Normally there is no good reason to
write your own class implementing this protocol.
However if you want to customize your menus you
should implement this protocol to ensure that it works
nicely together with sub/super menus not using your
custom menu representation.
How menus are drawn
This class implements several menu look and feels at the
same time. The looks and feels implemented are:
Ordinary vertically stacked menus with the NeXT
submenu positioning behavour.
Vertically stacked menus with the WindowMaker
submenu placement. This behaviour is selected by
choosing the
GSWindowMakerInterfaceStyle.
PopupButtons are actually menus. This class
implements also the behaviour for the
NSPopButtons. See for the the class
NSPopButton.
Creates new item cell for the newly created menu
item, marks cell and menu view as needing to be
resized. This method is invoked when
NSMenuDidAddItemNotification
received. The notification parameter
contains index of changed menu item and can be
accessed with NSMenuItemIndex key.
Marks menu item cell associated with the menu item
and menu view as needing to be resized. This method is
invoked when NSMenuDidChangeItemNotification
received. The notification parameter
contains index of changed menu item and can be
accessed with NSMenuItemIndex key.
Removes cell associated with removed menu item,
removes highlighting if removed menu item was
highlighted, marks cell and menu view as
needing to be resized. This method is invoked when
NSMenuDidRemoveItemNotification
received. The notification parameter
contains index of changed menu item and can be
accessed with NSMenuItemIndex key.
Sets menu orientation. If YES menu items
are displayed from left to right, if NO
from top to bottom (vertically). By default, menu
items are displayed vertically.
Sets the menu to be displayed in to
menu. Also this method adds this
menu view to the menu's list of observers,
mark view to force recalculation of layout with
setNeedsSizing:YES, and updates itself
with update method.
Sets the flag whether layout needs to be
resized. Set it to YES if menu
contents changed and layout needs to be
recalculated. This method is used internally.
Yout should not invoke it directly from applications.
Resize menu view frame to be appropriate in size to
attach to screenRect at preferredEdge.
For popup's menu, if selectedItemIndex is
other than -1, position view so selected item covers
the NSPopUpButton.
NOTE: preffered edge positioning doesn't
implemented yet!
This method is responsible for tracking the mouse
while this menu is on the screen and the user is busy
navigating the menu or one of it submenus.
Responsible does not mean that this method does
it all. For submenus for example it will call,
indirectly, itself for submenu under
consideration. It will return
YES if user released mouse, not above a
submenu item. NO in all other
circumstances. Implementation detail:
It use periodic events to update the highlight state
and attach / detach submenus.
The flag justAttachedNewSubmenu is set to
YES when a new submenu is attached.
The effect is that the highlighting / attaching /
detaching is supressed for this menu. This is
done so the user is given a change to move the
mouse pointer into the newly attached submenu.
Otherwise it would immediately be removed as
the mouse pointer move over another item. The logic
for resetting the flag is rather adhoc.
the flag subMenusNeedRemoving means that we will
remove all the submenus after we are done. This
flag is used to clean up the submenus when the
user has opened a submenu by clicking and wants to
close it again by clicking on the hihglighted
item.
When the user released the mouse this method will
cleanup all the transient menus. Not only its
own, but also its attached menu and all its
transient super menus.
The clean up is done BEFORE the action is executed.
This is needed otherwise `hiding' the application
leaves a dangling menu. If this is not
acceptable, there should be another
mechanism of handling the hiding. BTW besides
the `hiding' the application, model panels are also
a problem when the menu is not cleared before
executing the action.
Adds title view for application menu and submenus,
removes title view if menu is owned by
NSPopUpButton, adds close button to title
view for torn off menus and removes it for other type
of menu.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.