This is Test.rtf in view mode; [Download] [Up]
DrawView.m
#import <appkit/appkit.h>
/*
DrawView:
Subclasses from View:Responder:Object
August 5, 1993
Sean Luke
DrawView stores, manages, and displays DrawCells, to create a draw-program-like
environment. It handles events and passes these to the DrawCells, which deal
with them as they like.
*/
@interface DrawView:View
{
id cell_list; // list of all cells
}
- initFrame:(const NXRect *) newFrame; // overloads View's
// standard constructor
- drawSelf:(const NXRect*) rects:(int) rectCount; // draws the cells
- mouseDown:(NXEvent*) theEvent; // passes mouseDown events
- mouseDragged:(NXEvent*) theEvent; // ... etc.
- mouseUp:(NXEvent*) theEvent; // ... etc.
@end
DrawView.m
#import "DrawView.h"
#import "IconCell.h"
#import "RectangleCell.h"
@implementation DrawView
- initFrame:(const NXRect *) newFrame
{
id returnval=[super initFrame:newFrame];
cell_list=[[List alloc] init]; // initialize the cell list
// Make four members of cell list, two icons, two rectangles
[cell_list addObject:[[[IconCell alloc] init] setView:self]];
[cell_list addObject:[[[IconCell alloc] init] setView:self]];
[cell_list addObject:[[[RectangleCell alloc] init] setView:self]];
[cell_list addObject:[[[RectangleCell alloc] init] setView:self]];
return returnval;
}
- drawSelf:(const NXRect*) rects:(int) rectCount
{
int x;
int max=[cell_list count];
// erase entire view
PSsetgray(NX_LTGRAY);
NXRectFill(&bounds);
// tell each cell to draw itself
for (x=0;x<max;x++)
{
[[cell_list objectAt:x] drawSelf:rects:rectCount];
}
return self;
}
- mouseDown:(NXEvent*) theEvent
{
int x;
int max=[cell_list count];
// add mouseDragged as a valid item in the view
[window addToEventMask:NX_MOUSEDRAGGEDMASK];
// deselect old object(s)
for (x=0;x<max;x++)
{
[[cell_list objectAt:x] deselect];
}
// tell each cell to select itself if hit
for (x=0;x<max;x++)
{
if ([[cell_list objectAt:x] hit:theEvent])
{
[[cell_list objectAt:x] select];
[[cell_list objectAt:x] mouseDown:theEvent];
break;
}
}
// redisplay view
[self display];
return self;
}
- mouseDragged:(NXEvent*) theEvent
{
int x;
int max=[cell_list count];
// tell each cell to move if selected
for (x=0;x<max;x++)
{
if ([[cell_list objectAt:x] isSelected])
{
[[cell_list objectAt:x] mouseDragged:(NXEvent*) theEvent];
break;
}
}
// redisplay view
[self display];
return self;
}
- mouseUp:(NXEvent*) theEvent
{
int x;
int max=[cell_list count];
// tell each cell to stop moving itself if selected
for (x=0;x<max;x++)
{
if ([[cell_list objectAt:x] isSelected])
{
[[cell_list objectAt:x] mouseUp:(NXEvent*) theEvent];
break;
}
}
// redisplay view
[self display];
return self;
}
@end
DrawCell.h
#import <appkit/appkit.h>
/*
DrawCell:
Subclasses from Object
August 5, 1993
Sean Luke
Subclasses of DrawCell can draw themselves as individual drawing items in
a DrawView.
*/
@interface DrawCell:Object
{
NXPoint coord; // origin coordinate
BOOL selected;
id view;
}
- init;
- setView:the_view;
- setPoint:(NXPoint*) the_point; // sets NXPoint
- drawSelf:(const NXRect*) rects:(int) rectCount; // draws the cell
- (BOOL) hit:(NXEvent*) theEvent; // tests if hit at a point
- mouseDown:(NXEvent*) theEvent; // handles mouseDown events
- mouseDragged:(NXEvent*) theEvent; // ... etc.
- mouseUp:(NXEvent*) theEvent; // ... etc.
- select; // sets selected to YES
- deselect; // ...to NO
- (BOOL) isSelected; // returns selected
@end
DrawCell.m
#import "DrawCell.h"
#import "DrawView.h"
@implementation DrawCell
- init
{
id returnval=[super init];
selected=0;
// no need to initialize coord
return returnval;
}
- setPoint:(NXPoint*) the_point
{
coord=*the_point;
return self;
}
- setView:the_view
{
view=the_view;
return self;
}
- drawSelf:(const NXRect*) rects:(int) rectCount
{
return self;
}
- (BOOL) hit:(NXEvent*) theEvent
{
return NO; // just a default
}
- mouseDown:(NXEvent*) theEvent
{
return self;
}
- mouseDragged:(NXEvent*) theEvent
{
return self;
}
- mouseUp:(NXEvent*) theEvent
{
return self;
}
- select
{
selected=YES;
return self;
}
- deselect
{
selected=NO;
return self;
}
- (BOOL) isSelected
{
return selected;
}
@end
IconCell.h
#import "DrawCell.h" // which imports appkit
/*
IconCell:
Subclasses from DrawCell:Object
August 5, 1993
Sean Luke
Draws an icon object to be moved around a DrawView.
*/
@interface IconCell:DrawCell
{
id icon;
}
- init;
- drawSelf:(const NXRect*) rects:(int) rectCount; // draws the cell
- (BOOL) hit:(NXEvent*) theEvent; // tests if hit at a point
- mouseDown:(NXEvent*) theEvent; // handles mouseDown events
- mouseDragged:(NXEvent*) theEvent; // ... etc.
- mouseUp:(NXEvent*) theEvent; // ... etc.
@end
IconCell.m
#import "IconCell.h" // which imports appkit and hence NXImage.h
#define ICON_WIDTH 48
#define ICON_HEIGHT 48
@implementation IconCell
- init
{
id returnval=[super init];
icon=[NXImage findImageNamed:"NXdefaulticon"];
// we assume this is a 48x48 icon--see above
return returnval;
}
- drawSelf:(const NXRect*) rects:(int) rectCount
{
[icon composite:NX_SOVER toPoint:&coord];
return self;
}
- (BOOL) hit:(NXEvent*) theEvent
{
NXPoint start=theEvent->location;
NXRect temp_rect;
// Load temp_rect with size and coordinates
temp_rect.size.width=ICON_WIDTH;
temp_rect.size.height=ICON_HEIGHT;
temp_rect.origin=coord;
// convert event's point into view coordinate system
[view convertPoint:&start fromView:nil];
return NXPointInRect(&start, &temp_rect);
}
- mouseDown:(NXEvent*) theEvent
{
return [super mouseDown:theEvent];
}
- mouseDragged:(NXEvent*) theEvent
{
NXPoint start=theEvent->location;
[view convertPoint:&start fromView:nil];
coord=start;
return [super mouseDragged:theEvent];
}
- mouseUp:(NXEvent*) theEvent
{
return [super mouseUp:theEvent];
}
@end
RectangleCell.h
#import "DrawCell.h" // which imports appkit
/*
RectangleCell:
Subclasses from DrawCell:Object
August 5, 1993
Sean Luke
Draws a rectangle object to be moved around a DrawView.
*/
@interface RectangleCell:DrawCell
{
NXSize rectangle_size;
float line_width; // width is >=0
float line_gray; // grays are between 0 and 1
float fill_gray;
}
- init;
- drawSelf:(const NXRect*) rects:(int) rectCount; // draws the cell
- (BOOL) hit:(NXEvent*) theEvent; // tests if hit at a point
- mouseDown:(NXEvent*) theEvent; // handles mouseDown events
- mouseDragged:(NXEvent*) theEvent; // ... etc.
- mouseUp:(NXEvent*) theEvent; // ... etc.
@end
RectangleCell.m
#import "RectangleCell.h" // which imports appkit
#import "RectangleCellWraps.h"
@implementation RectangleCell
- init
{
id returnval=[super init];
line_width=4;
line_gray=0;
fill_gray=1;
rectangle_size.width=30;
rectangle_size.height=20;
return returnval;
}
- drawSelf:(const NXRect*) rects:(int) rectCount
{
RectangleCell_draw(coord.x, coord.y,
rectangle_size.width, rectangle_size.height,
line_width, line_gray, fill_gray);
return self;
}
- (BOOL) hit:(NXEvent*) theEvent
{
NXPoint start=theEvent->location;
NXRect temp_rect;
// Load temp_rect with size and coordinates
temp_rect.size=rectangle_size;
temp_rect.origin=coord;
// convert event's point into view coordinate system
[view convertPoint:&start fromView:nil];
return NXPointInRect(&start, &temp_rect);
}
- mouseDown:(NXEvent*) theEvent
{
return [super mouseDown:theEvent];
}
- mouseDragged:(NXEvent*) theEvent
{
NXPoint start=theEvent->location;
[view convertPoint:&start fromView:nil];
coord=start;
return [super mouseDragged:theEvent];
}
- mouseUp:(NXEvent*) theEvent
{
return [super mouseUp:theEvent];
}
@end
RectangleCellWraps.psw
defineps RectangleCell_draw
(float x; float y; float w; float h; float lw; float lg; float fg)
newpath
x y moveto
w 0 rlineto
0 h rlineto
w neg 0 rlineto
0 h neg rlineto
closepath
gsave
fg setgray
fill
grestore
lg setgray
lw setlinewidth
stroke
endps
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.