This is Bounce.m in view mode; [Download] [Up]
/////////////////////////////////////////////////////////////////////////////// // FILENAME: Bounce.m // SUMMARY: Implementation of Bouncy annotations to eText documents // SUPERCLASS: Object // INTERFACE: None // PROTOCOLS: <DocNotification, Annotation, Tool> // AUTHOR: Rohit Khare // COPYRIGHT: (c) 1994 California Institure of Technology, eText Project /////////////////////////////////////////////////////////////////////////////// // DESCRIPTION // Glue for Ali Ozer's LinesView code. Demo of <Annotation> /////////////////////////////////////////////////////////////////////////////// // HISTORY // 10/31/94: Converted to eText5.0 inspector protocol. // 02/04/94: Created. Derived from NextDeveloper/Examples/Appkit/Lines. /////////////////////////////////////////////////////////////////////////////// #import "Bounce.h" @implementation Bounce + toolAwake:theApp { char buf[MAXPATHLEN]; NXBundle *bundle; NXImage *theIcon; bundle = [NXBundle bundleForClass:[Bounce class]]; if ( [bundle getPath:buf forResource:"BounceIcon" ofType:"tiff"] ) { theIcon = [[NXImage alloc] initFromFile:buf]; } else { NXLogError("Image not found: BounceIcon"); theIcon = [NXImage findImageNamed:"NXdefaulticon"]; } [theApp registerAnnotation: [Bounce class] name: "Bounce" RTFDirective: "Bounce" menuLabel: "Fun Stuff/Insert Bouncy..." menuKey: '\0' menuIcon: (NXImage *) theIcon]; return self; } -init { char buf[MAXPATHLEN]; NXBundle *bundle; NXRect frame; [super init]; bundle = [NXBundle bundleForClass:[Bounce class]]; if ( [bundle getPath:buf forResource:"Bounce" ofType:"nib"] ) { [NXApp loadNibFile:buf owner:self withNames:NO]; } else { NXLogError("NIB not found: Bounce"); } controlView = [controlPanel contentView]; frame.origin.x = frame.origin.y = 0.0; frame.size.width = frame.size.height = 48.0; sz.width = sz.height = 48.0; corners = 5; linesView = [[LinesView alloc] initFrame:&frame]; [linesView setNumberOfCorners:self]; return self; } - initFromPboard:thePboard inDoc:theDoc linked:(BOOL) linked { [self init]; return self; } - free { [[NXApp inspector] invalidate]; etDoc=nil; [linesView off]; [linesView removeFromSuperview]; [NXApp delayedFree:linesView]; [controlPanel free]; return [super free]; } - (int)intValue {return corners;} - readRichText:(NXStream *)stream forView:view { NXScanf(stream, "%f %f %d", &sz.height, &sz.width, &corners); [linesView setNumberOfCorners:self]; return self; } - writeRichText:(NXStream *)stream forView:view { NXPrintf(stream, "%f %f %d", sz.height, sz.width, corners); return self; } - calcCellSize:(NXSize *)theSize { theSize->width = sz.width; theSize->height = sz.height; return self; } - highlight:(const NXRect *)cellFrame inView:controlView lit:(BOOL)flag { static BOOL highlighted=NO; if (highlighted != flag) { highlighted = flag; /* toggle highlighting */ NXHighlightRect(cellFrame); /* make change visible */ //[[cView window] flushWindow]; } return self; } - drawSelf:(const NXRect *)cellFrame inView:cView { PSgsave(); if ([linesView superview] == NULL) [cView addSubview:linesView]; // To show a view, we do a move/display combination [linesView moveTo:cellFrame->origin.x :cellFrame->origin.y]; [linesView sizeTo:sz.width :sz.height]; PSgrestore(); [linesView display]; return self; } - (BOOL) trackMouse:(NXEvent *)event inRect:(const NXRect *)cellFrame ofView:cView { NXPoint mouseLocation; mouseLocation = event->location; [cView convertPoint:&mouseLocation fromView:NULL]; if (NXPointInRect(&mouseLocation, cellFrame)) if (event->data.mouse.click == 2) [self doubleClick:self]; else if (event->data.mouse.click == 1) { [[NXApp inspector] inspect: self]; if (!(event->flags && NX_COMMANDMASK)) [self click:self]; } return YES; } - click:sender { sz.width = [widthField floatValue]; sz.height = [heightField floatValue]; corners = [cornerField intValue]; [linesView setNumberOfCorners:self]; [linesView toggleRun:sender]; return self; } - doubleClick:sender { return self; } - editCorners:sender { corners = [cornerField intValue]; return [linesView setNumberOfCorners:self]; } - editSize:sender { sz.width = [widthField floatValue]; sz.height = [heightField floatValue]; return self; } - (const NXAtom *) types { static NXAtom types[2] = {NULL, NULL}; if (!types[0]) { types[0] = NXUniqueString("Controls"); } return types; } - (const char *) inspectorTitle { return NXUniqueString("Bouncing Lines"); } - resignInspector: (View *) oldInspector ofType: (const char *) type { sz.width = [widthField floatValue]; sz.height = [heightField floatValue]; corners = [cornerField intValue]; [linesView setNumberOfCorners:self]; return self; } - activateInspector: (View *) newInspector ofType: (const char *) type { [widthField setFloatValue:sz.width]; [heightField setFloatValue:sz.height]; [cornerField setIntValue:corners]; return self; } - inspectorForType:(const char *) type { if(!strcmp(type,NXUniqueString("Controls"))) return controlView; else NXLogError("Massive Inspector Failure: Asked Bouncy for: %s", type); return controlView; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.