This is ClientText.m in view mode; [Download] [Up]
#import "ClientText.h"
#import "ServerText.h"
#import "TextDiff.h"
#import "RTFDChat.h"
#import <appkit/appkit.h>
#import <remote/NXProxy.h>
#import <remote/NXConnection.h>
@implementation ClientText
- initFrame:(const NXRect *)frameRect
text:(const char *)theText alignment:(int)mode
{
char path[MAXPATHLEN];
[[NXBundle bundleForClass:[RTFDChat class]]
getPath:path forResource:"Empty.rtfd" ofType:NULL];
[super initFrame:frameRect text:theText alignment:mode];
[self openRTFDFrom:path];
stayFirstResponder = NO;
return self;
}
- awakeFromNib
{
NXAtom supportedTypes[11] = {NXFilenamePboardType,
NXFileContentsPboardType,
NXSoundPboardType,
NXPostScriptPboardType,
NXTIFFPboardType,
NXColorPboardType,
NXFontPboardType,
NXRulerPboardType,
NXRTFPboardType,
NXAsciiPboardType,
NULL};
[self registerForDraggedTypes:supportedTypes count:10];
return self;
}
- setStayFirstResponder:(BOOL)aFlag
{
stayFirstResponder = aFlag;
return self;
}
- resignFirstResponder
{
if (stayFirstResponder)
return nil;
return [super resignFirstResponder];
}
- free
{
[[serverText connectionForProxy] unregisterForInvalidationNotification:self];
[serverText removeClientText:self];
[NXConnection removeObject:self];
return [super free];
}
- (oneway void)applyDifference:(bycopy TextDiff *)diff
{
int start, end;
int click;
NXRect oldRect;
id oldResponder;
[window disableFlushWindow];
oldResponder = [window firstResponder];
if ([oldResponder respondsTo:@selector(setStayFirstResponder:)])
[oldResponder setStayFirstResponder:YES];
/* save up the old selection */
start = sp0.cp;
end = spN.cp;
click = clickCount;
[superview getDocVisibleRect:&oldRect];
/* apply difference */
[self setEditable:YES];
[diff applyTo:self];
[self setEditable:NO];
[self setSel:spN.cp :spN.cp];
/* restore the old selection or scroll to visible */
if (autoscroll)
[self scrollSelToVisible];
else
[self scrollPoint:&oldRect.origin];
[self setSel:start :end];
clickCount = click;
/* we HAVE TO free diff, because it should be a copy... */
/* if we are in another task than the server, it is... */
/* else it isn't, and the app will crash! */
[diff free];
if ([oldResponder respondsTo:@selector(setStayFirstResponder:)])
[oldResponder setStayFirstResponder:NO];
[[window reenableFlushWindow] flushWindow];
return;
}
- (int)clickCount
{
return clickCount;
}
- setClickCount:(int)count
{
clickCount = count;
return self;
}
- serverText
{
return serverText;
}
- setServerText:aServer
{
serverText = aServer;
[[serverText connectionForProxy] registerForInvalidationNotification:self];
return self;
}
- serverIsDead
{
[[serverText connectionForProxy] unregisterForInvalidationNotification:self];
serverText = nil;
if ([[window delegate] clientIsDying:self])
{
[[[self superview] superview] free];
return nil;
}
return self;
}
- (BOOL)doesAutoscroll;
{
return autoscroll;
}
- setAutoscrollFrom:sender;
{
autoscroll = [sender state];
return self;
}
/********************************************/
/* NXSenderIsInvalid protocol */
/********************************************/
- senderIsInvalid:sender
{
return [self serverIsDead];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.