This is ClientScroller.m in view mode; [Download] [Up]
#import "ClientScroller.h"
#import "ClientText.h"
#import "ServerText.h"
#import "RTFDChat.h"
#import <appkit/appkit.h>
#define MAXSIZE 1.0e38 // Maximum size of a text object
#define TITLESIZE 20
@implementation ClientScroller
- initFrame:(const NXRect *)frameRect
{
NXSize textSize = {MAXSIZE, MAXSIZE};
NXRect aFrame = {0.0, 0.0, 0.0, 0.0};
ClientText *newText;
[super initFrame:frameRect];
[self setHorizScrollerRequired:NO];
[self setVertScrollerRequired:YES];
[self setBorderType:NX_BEZEL];
[self getContentSize:&aFrame.size];
newText = [[ClientText alloc] initFrame:&aFrame];
[newText setVertResizable:YES];
[newText setHorizResizable:NO];
[newText setGraphicsImportEnabled:YES];
[newText setEditable:NO];
[newText setMonoFont:NO];
[newText setOpaque:YES];
[newText notifyAncestorWhenFrameChanged:YES];
[newText setAutosizing:NX_WIDTHSIZABLE];
[newText setMinSize:&aFrame.size];
[newText setMaxSize:&textSize];
[newText setFontPanelEnabled:NO];
[self setDocView:newText];
[contentView setAutoresizeSubviews:YES];
[scrollButton setTarget:newText];
[scrollButton setAction:@selector(setAutoscrollFrom:)];
[newText setAutoscrollFrom:scrollButton];
[newText setDelegate:self];
clientUName = NULL;
return self;
}
- free
{
if (clientUName)
free(clientUName);
if (topic)
free(topic);
return [super free];
}
- delayedFree:sender
{
return [self free];
}
- freeScroller:sender
{
if (NXRunAlertPanel(NXBLS("Close")
, NXBLS("ReallyCloseConnect-1-User")
, NXBLS("Close"), NXBLS("Don't close"), 0, [nameTextField stringValue])
== NX_ALERTDEFAULT)
{
[self perform:@selector(freeDocument:) with:sender
afterDelay:1 cancelPrevious:NO];
}
return self;
}
- freeDocument:sender
{
if ([[window delegate] clientIsDying:[self docView]])
{
[self free];
return nil;
}
return self;
}
- ringServerText:sender
{
id server;
server = [(ClientText *)[self docView] serverText];
if ([server respondsTo:@selector(ring:)])
[server ring:self];
return self;
}
- tile
{
NXRect scrollerRect;
NXRect buttonRect;
[super tile];
if (!nameTextField)
{
NXRect rect = {24, 4, 200, 15};
nameTextField = [[TextField alloc] initFrame:&rect];
[nameTextField setStringValue:""];
[nameTextField setBackgroundGray:NX_LTGRAY];
[nameTextField setEditable:NO];
[nameTextField setBordered:NO];
[self addSubview:nameTextField];
}
if (!closeButton)
{
NXRect rect = {4, 4, 15, 15};
closeButton = [[Button alloc] initFrame:&rect];
[closeButton setIcon:"NTKclose"];
[closeButton setAltIcon:"NTKcloseH"];
[closeButton setType:NX_MOMENTARYCHANGE];
[closeButton setTarget:self];
[closeButton setAction:@selector(freeScroller:)];
[closeButton setBordered:NO];
[self addSubview:closeButton];
}
if (!ringButton)
{
NXRect rect = {4, 4, 15, 15};
ringButton = [[Button alloc] initFrame:&rect];
[ringButton setIcon:"NTKbell"];
[ringButton setAltIcon:"NTKbellH"];
[ringButton setType:NX_MOMENTARYCHANGE];
[ringButton setTarget:self];
[ringButton setAction:@selector(ringServerText:)];
[ringButton setBordered:NO];
[self addSubview:ringButton];
}
[[self vertScroller] getFrame:&scrollerRect];
if (!scrollButton)
{
buttonRect.origin.x = 0;
buttonRect.origin.y = 0;
buttonRect.size.width = scrollerRect.size.width;
buttonRect.size.height = scrollerRect.size.width;
scrollButton = [[Button alloc] initFrame:&buttonRect];
[scrollButton setIcon:"NTKscroll"];
[scrollButton setAltIcon:"NTKscrollH"];
[scrollButton setBordered:NO];
[scrollButton setType:NX_TOGGLE];
[scrollButton setState:1];
[self addSubview:scrollButton];
}
NXDivideRect(&scrollerRect, &buttonRect, scrollerRect.size.width, NX_YMAX);
scrollerRect.origin.y += TITLESIZE;
scrollerRect.size.height -= TITLESIZE;
[[self vertScroller] setFrame:&scrollerRect];
NXInsetRect(&buttonRect, 1.0, 1.0);
[scrollButton setFrame:&buttonRect];
return self;
}
- drawSelf:(const NXRect *)rects :(int)nRects
{
[super drawSelf:rects :nRects];
PSsetgray(NX_LTGRAY);
PSmoveto(20, 2);
PSlineto(20, TITLESIZE);
PSstroke();
PSsetgray(NX_DKGRAY);
PSmoveto(2, TITLESIZE+1);
PSlineto(bounds.size.width-4, TITLESIZE+1);
PSstroke();
return self;
}
- sizeTo:(NXCoord)width :(NXCoord)height
{
NXSize contentSize;
[super sizeTo:width :height];
[nameTextField sizeTo:width-68 :15];
[ringButton moveTo:width-39 :4];
[closeButton moveTo:width-19 :4];
[self getContentSize:&contentSize];
contentSize.height -= TITLESIZE;
[[contentView sizeTo:contentSize.width :contentSize.height]
moveBy:0 :TITLESIZE];
[[self docView] setMinSize:&contentSize];
[[self docView] sizeToFit];
return self;
}
- setClientUName:(const char *)aClientUName
{
if (clientUName)
free(clientUName);
clientUName = NULL;
if (aClientUName)
{
clientUName = malloc(strlen(aClientUName)+1);
strcpy(clientUName, aClientUName);
}
return self;
}
- (const char *)clientUName
{
return clientUName;
}
- setConnectionCode:(const char *)aCode
{
if (connectionCode)
free(connectionCode);
connectionCode = NULL;
if (aCode)
{
connectionCode = malloc(strlen(aCode)+1);
strcpy(connectionCode, aCode);
}
return self;
}
- (const char *)connectionCode
{
return connectionCode;
}
- setTopic:(const char *)aTopic
{
if (topic)
free(topic);
topic = NULL;
if (aTopic)
{
topic = malloc(strlen(aTopic)+1);
strcpy(topic, aTopic);
}
return self;
}
- (const char *)topic
{
return topic;
}
- setUserName:(const char *)aUserName
{
if (nameTextField)
[nameTextField setStringValue:aUserName];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.