This is Menu.m in view mode; [Download] [Up]
/* Implementation of Menu class
*
* Copyright (C) 1993 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Authors: Scott Francis, Paul Kunz, Tom Pavel, Imran Qureshi,
* and Libing Wang (SLAC)
* Mike Kienenberger (Alaska)
*
* This file is part of an Objective-C class library a window system
*
* Menu.m,v 1.47 1995/12/13 22:33:06 fedor Exp
*
*/
#include "Menu.h"
/* Required for implementation: */
#include "MenuCell.h"
#include "Application.h"
#include "Matrix.h"
#include <objc/List.h>
extern char *MenuInstanceName(void);
static NSZone *menuZone = NS_NOZONE;
@implementation Menu:Panel
+ setMenuZone:(NSZone *)aZone
{
menuZone = aZone;
return self;
}
+ (NSZone *)menuZone
{
menuZone = NSCreateZone(vm_page_size,vm_page_size,YES);
NSNameZone(menuZone,"Menus");
return menuZone;
}
+ alloc
{
return [super allocFromZone:menuZone];
}
- init
{
return [self initTitle:"Menu"];
}
- initTitle:(const char *)aTitle
{
NXRect frameRect = {{0,0}, {0,0}};
// [super init]; /* We don't want Window's init method */
[self _init];
instancename = MenuInstanceName();
[self setTitle:aTitle];
matrix = [[Matrix alloc] initFrame:&frameRect mode:NX_TRACKMODE
cellClass:[MenuCell class] numRows:0 numCols:1];
autoUpdate = NO;
return self;
}
- addItem:(const char *)aString action:(SEL)aSelector
keyEquivalent:(unsigned short)charCode
{
MenuCell *cell;
[matrix addRow];
cell = [[matrix cellList] lastObject];
[cell setStringValue:aString];
[cell setAction:aSelector];
[cell setTarget:nil];
[cell setKeyEquivalent:charCode];
return self;
}
- addItem:(const char*)aString action:anObject sel:(SEL)aSelector
{
MenuCell *cell;
List *cellList = [matrix cellList];
[matrix addRow];
cell = [cellList lastObject];
[cell setStringValue:aString];
[cell setTarget:anObject];
[cell setAction:aSelector];
[cell _setControlView:matrix];
return cell;
}
- setSubmenu: aMenu forItem: aCell
{
List *cellList = [matrix cellList];
[matrix addRow];
[aCell setSubmenu:aMenu];
[cellList replaceObject: [cellList lastObject] with: aCell];
return aCell;
}
- itemList
{
return matrix;
}
- setItemList: aMatrix
{
id old = matrix;
matrix = aMatrix;
return old;
}
- display
{
return self;
}
- sizeToFit
{
return [self notImplemented: _cmd];
}
- moveTopLeftTo: (NXCoord)x : (NXCoord)y
{
return [self notImplemented: _cmd];
}
- windowMoved: (NXEvent *)theEvent
{
return [self notImplemented: _cmd];
}
- close
{
return [self notImplemented: _cmd];
}
- free
{
[matrix free];
return [super free];
}
- setSubmenu: aMenu forItemName: (const char*)aString
{
MenuCell *cell;
List *cellList = [matrix cellList];
[matrix addRow];
cell = [cellList lastObject];
[cell setStringValue:aString];
[cell setSubmenu:aMenu];
return cell;
}
- setHelpSubmenu:aMenu
{
MenuCell *cell = [self setSubmenu:aMenu forItemName:"Help"];
_helpSubmenu = cell;
return cell;
}
- setAutoupdate:(BOOL)flag
{
autoUpdate = flag;
return self;
}
/* Update isn't quite finished... but here's a first brush at it.
Tried to emulate the NeXT docs here...:
if autoUpdate is on, checks each item for an update action.
If they have the action, then figure out which, delegate, NXApp
or [NXApp delegate] has the means for responding to the updateacton.
*/
- update
{
List *cellList = [matrix cellList];
// SEL action;
int i,count;
if (autoUpdate) {
count = [cellList count];
for (i=0; i < count; i++)
{
// if ( (action = [[cellList objectAt:i] updateAction]) )
// {
// if (((delegate) && ([delegate respondsTo:action])) &&
// ([delegate perform:action with:[cellList objectAt:i]]))
// [[cellList objectAt:i <<method to draw goes here>>] ;
// ;
// else if (([NXApp respondsTo:action]) &&
// [NXApp perform:action with:[cellList objectAt:i]])
// [[cellList objectAt:i ];
// ;
// else if (([NXApp delegate] &&
// [[NXApp delegate] respondsTo:action]) &&
// [[NXApp delegate] perform:action
// with:[cellList objectAt:i]])
// [[cellList objecAt:i ];
// ;
// }
}
}
return self;
}
- findCellWithTag: (int)aTag
{
return [self notImplemented: _cmd];
}
- getLocation: (NXPoint *)theLocation forSubmenu: aSubmenu
{
return [self notImplemented: _cmd];
}
- mouseDown: (NXEvent *)theEvent
{
return [self notImplemented: _cmd];
}
- rightMouseDown: (NXEvent *)theEvent
{
return [self notImplemented: _cmd];
}
- (BOOL)_isMain
/*
Returns YES if this is the applications main menu.
*/
{
return self == [NXApp mainMenu];
}
- _managedBy:parent
{
void *widget = [parent _widget];
if (!widget) {
fprintf(stderr, "Menu: parent widget not found\n");
return nil;
}
return [self _managedBy:parent wid:widget];
}
- write: (NXTypedStream *)typedStream
{
return [self notImplemented:_cmd];
}
- read: (NXTypedStream *)typedStream
{
/*
* Since we'll not use the Window of the menu, the buck stops
* here for archiving, i.e. no [super read:stream];
*/
#ifdef DEBUG
fprintf(stderr, "reading Menu\n");
#endif
objc_read_object(typedStream, &matrix);
return self;
}
- awake
{
/*
* Since we'll not use the Window of the menu, we don't want to
* invoke Window's awake method
*/
[self _init];
instancename = MenuInstanceName();
/* should be removed later when these are archived */
[self setTitle:"Menu"];
autoUpdate = NO;
return self;
}
- awakeFromNib
{
/*
* Since we'll not use the Window of the menu, we don't want to
* invoke Window's awake method
*/
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.