This is Controller.m in view mode; [Download] [Up]
#import "Controller.h"
@implementation Controller
- init
{
	[super init];
	undoManager = [[MiscUndoManager alloc] init];
	testValue = 0;
	return self;
}
- (void)dealloc
{
	[undoManager release];
	return [super dealloc];
}
- (void)dec:(id)sender
{	
	// start a new group 
	[undoManager startUndo:@"Undo Dec" :@"Redo Inc"];
	// set target for undo message
	[undoManager setCurrentTarget:self];
	// send the undo message
	[(id)undoManager inc:sender];
	
	// commit group (group consists only of this record)
	[undoManager commitUndo];
	
	// do the actual action
	testValue--;
	[textField setIntValue:testValue];
	[textField display];
}
- (void)inc:(id)sender
{	
	// start a new group 
	[undoManager startUndo:@"Undo Inc" :@"Redo Dec"];
	
	// set target for undo message
	[undoManager setCurrentTarget:self];
	// send the undo message
	[(id)undoManager dec:sender];
	
	// commit group (group consists only of this record)
	[undoManager commitUndo];
	
	// do the actual action
	testValue++;
	[textField setIntValue:testValue];
	[textField display];
}
- (void)redo:(id)sender
{
	[undoManager redo];
}
- (void)undo:(id)sender
{
	[undoManager undo];
}
- (BOOL)validateMenuItem:(NSMenuItem *)anItem
{
    NSString *menuTitle = [anItem title];
    if([menuTitle hasPrefix:@"Undo"]){
        if([undoManager numberOfUndos] == 0){
            [anItem setTitle:@"Undo"];
            return NO;
        }
        [anItem setTitle:[undoManager undoName]];
        return YES;
    }
    if([menuTitle hasPrefix:@"Redo"]){
        if([undoManager numberOfRedos] == 0){
                [anItem setTitle:@"Redo"];
                return NO;
        }
        [anItem setTitle:[undoManager redoName]];
        return YES;
    }
    return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.