This is VisibleOne.m in view mode; [Download] [Up]
//
// A Visible View
// Randy Nelson, NeXT Developer Training
// Created 5-1-90
// Modified 9-3-90 for 2.0
//
// You may freely copy, distribute and reuse the code in this example.
// NeXT disclaims any warranty of any kind, expressed or implied, as to
// its fitness for any particular use.
//
#import "VisibleOne.h"
#import "StringManager.h"
#import <appkit/View.h>
#import <appkit/publicWraps.h>
#import <dpsclient/wraps.h>
#import <appkit/graphics.h>
#import <appkit/Application.h>
#import <appkit/Font.h>
#import <appkit/Form.h>
#import <appkit/Control.h>
#import <appkit/Button.h>
#import <appkit/NXImage.h>
#import <objc/NXStringTable.h>
#import <libc.h>
#import "SubViewFramer.h"
#import "Drawgrid.h"
#import "SomePS.h"
#import "Appender.h"
@implementation VisibleOne
//sets clipping off
- initFrame:(const NXRect *)framerect;
{
[super initFrame:framerect];
[self setClipping:NO];
//because we read strings in our drawSelf::
//we must assure they'll be there by the first time it's called
stringSet = [[[StringManager alloc] init] stringSet];
//save some defs in the window server
somedefs();
return self;
}
//translate
- setSelfOrigin:sender
{
//the slider returns values that are the opposite of what we need
[self setDrawOrigin:([translateX intValue] *( -1))
:([translateY intValue] *( -1))];
[window display];
return self;
}
//scale
- setSelfScale:sender
{
//can't scale by zero
if ([scaleX floatValue] == 0) {
[scaleX setIntValue:1];
}
if ([scaleY floatValue] == 0) {
[scaleY setIntValue:1];
}
[self scale:[scaleX floatValue] :[scaleY floatValue]];
[window display];
//reset the interface values
[scaleX setIntValue:1];
[scaleY setIntValue:1];
return self;
}
//rotate
- setSelfRotation:sender
{
[self setDrawRotation:[sender intValue]];
[window display];
return self;
}
//move frame
- frameMove:sender
{
[self moveTo:[frameX intValue] :[frameY intValue]];
[window display];
[self setTrackingRect];
return self;
}
//rotate frame
//tracking rects don't work when your frame is rotated
- frameRotate:sender
{
[self rotateTo:[sender intValue]];
[window display];
return self;
}
//resize frame
- frameChangeSize:sender
{
[self sizeTo:[frameWidth intValue] :[frameHeight intValue]];
[self setTrackingRect];
[window display];
return self;
}
//sent by the preferences buttons to force a redraw, reflecting their new state
- newDisplayState:sender
{
[window display];
return self;
}
//delegate method of app
- appDidInit:sender
{
NXRect aRect = {0.0, 0.0, 0.0, 0.0};
[appender appendToText:
[stringSet valueForStringKey:"Received appDidInit:"]];
//gets the image for compositing & scales it to frame
myPic = [NXImage findImageNamed:[stringSet valueForStringKey:"Logo"]];
[myPic setScalable:YES];
[myPic setSize:&frame.size];
//sets up the subViewFramer as our superview
newSuperView = [SubViewFramer alloc];
[newSuperView initFrame:&aRect];
[window setContentView:newSuperView];
[newSuperView addSubview:self];
[newSuperView display];
[self setTrackingRect];
[window makeKeyAndOrderFront:self];
return self;
}
//allows us to become first responder
- (BOOL)acceptsFirstResponder
{
[appender appendToText:
[stringSet valueForStringKey:
"Received acceptsFirstResponder -- returning YES"]];
return YES;
}
//allows us to use the mouse click that activates the window
- (BOOL)acceptsFirstMouse
{
[appender appendToText:
[stringSet valueForStringKey:
"Received acceptsFirstMouse -- returning YES"]];
return YES;
}
//draws the view and then calls the superview for framing
- drawSelf:(NXRect *)r :(int)c
{
NXPoint zero = {0.0, 0.0};
[self updateVitals];
if([compositeIndicator state]){
[myPic composite:NX_SOVER toPoint:&zero];
}
if([drawGridIndicator state]){
PSselectfont( (char *)NXUniqueStringNoCopy(
[stringSet valueForStringKey:"Times-Italic"]), 24.0);
PSsetgray(NX_WHITE);
RNdrawgrid();
}
if (NXDrawingStatus != NX_DRAWING) {
//make sure we send the defs to the printer or pasteboard
somedefs();
}
//draws the views basic contents
somePS();
//displays the bounds rect
PSsetgray(NX_BLACK);
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:"bounds.origin.x %.1f,.y %.1f"]),
bounds.origin.x, bounds.origin.y);
PSmoveto(bounds.origin.x, (bounds.origin.y - 18));
PSselectfont((char *)NXUniqueStringNoCopy(
[stringSet valueForStringKey:"Times-Italic"]), 24.0);
PSshow(buffer);
NXFrameRect(&bounds);
//calls the subViewFramer, our superview
[newSuperView frameMe:self];
return self;
}
//indicates the mouse down with a beep
- mouseDown:(NXEvent *)e
{
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:
"Received mouseDown: -- window coordinates %.f, %.f"]),
e->location.x, e->location.y);
[appender appendToText:buffer];
NXBeep();
return self;
}
//indicates at the location of the mouse at mouse up using instance drawing
- mouseUp:(NXEvent *)e
{
NXPoint mousePoint = e->location;
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:
"Received mouseUp: -- window coordinates %.f, %.f"]),
e->location.x, e->location.y);
[appender appendToText:buffer];
[self convertPointFromSuperview:&mousePoint];
[self lockFocus];
PSselectfont( (char *) NXUniqueStringNoCopy(
[stringSet valueForStringKey:"Times-Italic"]), 24.0);
PSsetgray(NX_DKGRAY);
PSnewinstance();
PSsetinstance(YES);
PSmoveto(mousePoint.x, mousePoint.y);
PSsetgray(0.0);
PSrectfill(mousePoint.x-2.0,
mousePoint.y-2.0, 4.0, 4.0);
PSmoveto(mousePoint.x+4.0, mousePoint.y+4.0);
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:"%.f, %.f"]),
mousePoint.x, mousePoint.y);
PSshow(buffer);
PSsetinstance(NO);
[self unlockFocus];
return self;
}
//tracks the mouse entering the view
- mouseEntered:(NXEvent *)e
{
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:
"Received mouseEntered: -- window coordinates %.f, %.f"]),
e->location.x, e->location.y);
[appender appendToText:buffer];
return self;
}
//tracks the mouse leaving the view
- mouseExited:(NXEvent *)e
{
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:
"Received mouseExited: -- window coordinates %.f, %.f"]),
e->location.x, e->location.y);
[appender appendToText:buffer];
return self;
}
//gets keyUps
- keyUp:(NXEvent *)e
{
[appender appendToText:[stringSet valueForStringKey:"Received keyUp:"]];
return self;
}
//gets keyDowns
- keyDown:(NXEvent *)e
{
sprintf(buffer, NXUniqueStringNoCopy(
[stringSet valueForStringKey:"Received keyDown: -- char '%c'"]),
e->data.key.charCode);
[appender appendToText:buffer];
return self;
}
//checks to see if the mouse down was in this view
- hitTest:(NXPoint *)aPt
{
[appender appendToText:
[stringSet valueForStringKey:"Received hitTest:"]];
if ([super hitTest:aPt]){
[appender appendToText:
[stringSet valueForStringKey:" -- YES inside this view"]];
return self;
}
[appender appendToText:
[stringSet valueForStringKey:" -- NO not inside this view"]];
return nil;
}
//updates the statistics matrix
- updateVitals
{
[[[[[[[[[[vitalMatrix setFloatValue:bounds.origin.x at:0]
setFloatValue:bounds.origin.y at:1]
setFloatValue:bounds.size.width at:2]
setFloatValue:bounds.size.height at:3]
setFloatValue:[self boundsAngle] at:4]
setFloatValue:frame.origin.x at:5]
setFloatValue:frame.origin.y at:6]
setFloatValue:frame.size.width at:7]
setFloatValue:frame.size.height at:8]
setFloatValue:[self frameAngle] at:9];
return self;
}
//for communication with the transparent superview
- (BOOL)wantsTransparency
{
return [transparencyIndicator state];
}
- setTrackingRect
{
NXRect aRect;
//registers the tracking rect
aRect = frame;
[superview convertRect:&aRect toView:nil];
[appender appendToText:
[stringSet valueForStringKey:"Sending setTrackingRect:... to window"]];
[window setTrackingRect:&aRect
inside:NO
owner:self
tag:23
left:NO
right:NO];
return self;
}
- infoPanel:sender
{
if(infoPanel == nil){
[NXApp loadNibSection:"Info.nib" owner:self];
}
[infoPanel orderFront:sender];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.