This is TSConsoleTextShelfItem.m in view mode; [Download] [Up]
/* TSConsoleTextShelfItem.m created by tsengel on Fri 15-Aug-1997 */ #import "TSConsoleTextShelfItem.h" @implementation TSConsoleTextShelfItem - (id)initWithContentsOfFile:(NSString *)aString { id contentDict; self = [super initWithContentsOfFile:aString]; if( !self) return nil; // <<HACK>> evil... [NSBundle loadNibNamed:@"ConsoleTextShelf" owner:self]; // If we don't have a path then lets set a default title..according to our default file... if( !aString ) [self setTitle:@"Console"]; // Ok...now read which file we should monitor...if there is no info available we'll // go for the defualt console.log. contentDict = [NSDictionary dictionaryWithContentsOfFile:[[self path] stringByAppendingPathComponent:@"Info.plist"]]; monitoredFile = [[contentDict objectForKey:@"MonitoredFilePath"] retain]; if( !monitoredFile ) { // Ok..put in the default path to the console log and note that we need to save our stuff. monitoredFile = @"/tmp/console.log"; unsavedChanges = YES; } return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [ourFileHandle closeFile]; [ourFileHandle release]; [super dealloc]; } - (void)ok:(id)sender { shouldUpdateAutomatically = NO; [super ok:self]; // Seems like we are swapping away.. lets disable all these periodic updates...we are no longer interested // in being up to date. // NSLog( @"Unregistering from path log tracking etc.. blah."); // [[NSNotificationCenter defaultCenter] removeObserver:self]; // this is a <<HACK>> !!!! We will miss all the data which has been read after this operation... hmm.. } - (void)revert:(id)sender { // Load the monitored file into the view ! id someData; [super revert:self]; // NSLog( @"Registering from path log tracking etc.. blah."); // If we never loaded the file..now its about time to do so... shouldUpdateAutomatically = YES; if( !ourFileHandle ) { [textView setString:@""]; ourFileHandle = [[NSFileHandle fileHandleForUpdatingAtPath:monitoredFile] retain]; someData = [ourFileHandle readDataToEndOfFile]; [self _appendTextData:someData]; // No matter what was before... from now one we want to be informed about changes !! [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataAvailable:) name:NSFileHandleReadCompletionNotification object:ourFileHandle]; } [self updateLog:self]; } - (void)save { id basePath = [self path]; id ourFileDict = [NSMutableDictionary new]; [super save]; // Just make a note which file we did monitor..that.s all we need. basePath = [basePath stringByAppendingPathComponent:@"Info.plist"]; [ourFileDict setObject:@"ConsoleTextShelf" forKey:@"ShelfType"]; [ourFileDict setObject:monitoredFile forKey:@"MonitoredFilePath"]; [ourFileDict writeToFile:basePath atomically:YES]; } - (void)newDataAvailable:(NSNotification *)notification { id newData = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; if( newData ) [self _appendTextData:newData]; } - (void)_appendTextData:(NSData *)newData { id aNewString = [[[NSString alloc] initWithData:newData encoding:NSASCIIStringEncoding] autorelease]; // Append the newString and scroll the new stuff to visible... // if for some strange reason we have no string... put in a message!! if( !aNewString ) aNewString = [NSString stringWithFormat:@"ATTENTION: Problems with log file at path %@.\nPlease check access permissions and path.\n\n", monitoredFile]; [textView appendString:aNewString]; [textView scrollRangeToVisible:NSMakeRange( [[textView string] length], 0 )]; } - (void)updateLog:(id)sender { // Ok.. this does not really clear the log...but updates it right now... brr...I know.. // <<HACK>> Ugly... until we know [ourFileHandle readInBackgroundAndNotify]; if( shouldUpdateAutomatically ) [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(updateLog:) userInfo:nil repeats:NO]; } - (void)clearLog:(id)sender { // Ok.. this does not really clear the log...but updates it right now... brr...I know.. // Ok..we frist should take teh files attributes and then set the same attributes again.. and if we are not allowed to // write it we should pop up an allter etc..pp. well... //.. maybe we should just truncate our internal representation but not the rela file... [textView setString:@""]; } - (void)findNext:(id)sender { } - (void)findPrevious:(id)sender { } - (void)filterLog:(id)sender { } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.