This is MiscShellInspector.m in view mode; [Download] [Up]
// Copyright (C) 1995 Steve Hayman
// Use is governed by the MiscKit license
#import "MiscShellInspector.h"
#import "MiscShell.subproj/MiscShell.h"
#import "EmacsText.h"
@implementation MiscShellInspector
// Simple view swapping methods in response to the popup
//
- swapToBox:aBox
{
[swapBox setContentView:[aBox contentView]];
[swapBox display];
return self;
}
// the popup buttons send this
- swapView:sender
{
switch( [[sender selectedCell] tag] ) {
case 0:
[self swapToBox:scriptBox ];
break;
case 1:
[self swapToBox:optionsBox];
break;
}
return self;
}
// Load the Inspector.
// TODO - replace this with an EmacsText object
- init
{
char buf[MAXPATHLEN + 1];
id bundle;
NXRect textFrame;
Font *originalFont;
[super init];
bundle = [NXBundle bundleForClass:[MiscShell class]];
[bundle getPath: buf forResource: "MiscShellInspector" ofType:"nib"];
[NXApp loadNibFile:buf owner:self withNames:NO fromZone:[self zone]];
[self swapToBox:scriptBox];
/*
* at this point, "text" is pointing to the old scrolling text.
*/
originalFont = [text font];
/*
* Now we want to create an EmacsText object and replace the text
* inside the "document" scroll view with it.
* Some of this code is borrowed from Scott Anguish's enhanced Yap.
* Thanks, Scott.
*/
[[scrollView docView] getFrame:&textFrame];
text = [[EmacsText alloc]
initFrame:&textFrame text:"" alignment:NX_LEFTALIGNED];
/*
* Put this new text object in the window and free the IB-created one.
*/
[[scrollView setDocView:text] free];
/*
* Finish setting up the new text object
*/
[text setFont:originalFont]; // Whatever was set in IB
[text setVertResizable:YES]; // Grow down as you type
[text setHorizResizable:NO]; // But not sideways
[text setAutosizing:NX_WIDTHSIZABLE]; // Size horizontally when resized
[text setMonoFont:YES];
[text setOpaque:YES];
[text setMinSize:&textFrame.size];
NX_WIDTH(&textFrame) = NX_HEIGHT(&textFrame) = 1.0e38;
[text setMaxSize:&textFrame.size]; // Can grow
[text setSel:0:0]; // Set the selection
[text setDelegate:self];
[text sizeToFit];
return self;
}
/*
* revert - set inspector to reflect object's state
*/
- revert: sender
{
int tag;
[text setText: [[object script] stringValue] ];
[runToCompletionCheck setState:[object runToCompletion]];
switch( [object delimiter] ) {
case 0: tag = 0; break;
case '\t': tag = 1; break;
case ' ': tag = 2; break;
case ':': tag = 3; break;
default: tag = 0; break; // ??? TODO - print an error message
}
[delimiters selectCellWithTag:tag];
[customDelimiters setStringValue: [[object customDelimiters] stringValue]];
[tableSort selectCellWithTag: [object sortWhenColumnsMove]];
return [super revert:sender];
}
/*
* ok - set object to reflect inspector's contents. various objects in
* the inspector panel send us this message when they're clicked.
*
*/
- ok: sender
{
MiscString *newScript = [[MiscString alloc] init];
MiscString *aLine = [[MiscString alloc] init];
NXStream *textStream = [text stream];
char newDelim;
MiscString *newDelimiters = [[MiscString alloc] init];
[self touch:self]; // mark inspector panel edited
[[NXApp activeDocument] touch]; // mark nib as edited
/*
* The textStream isn't necessarily at the start when we do [text stream];
* it might be where we left it before. which could cause us to
* hit EOS immediately. which did happen. which drove me nuts for
* a while as my carefully setup scripts kept vanishing in the inspector.
*/
NXSeek(textStream, 0L, NX_FROMSTART);
while ( [aLine streamGets:textStream] != EOF) {
[newScript concatenate:aLine];
}
[newScript concatenate:aLine]; // last incomplete line if any
[object setScript:newScript]; // it makes a copy
[newDelimiters setStringValue: [customDelimiters stringValue]];
[object setCustomDelimiters:newDelimiters]; // it makes a copy
[newDelimiters free];
[newScript free];
[aLine free];
[object setRunToCompletion: [runToCompletionCheck state]];
switch ( [[delimiters selectedCell] tag] ) {
case 0: newDelim = 0; break;
case 1: newDelim = '\t'; break;
case 2: newDelim = ' '; break;
case 3: newDelim = ':'; break;
default: newDelim = 0; break; // ??? todo - add an error msg
}
[object setDelimiter:newDelim];
[object setSortWhenColumnsMove: [[tableSort selectedCell] tag]];
return self;
}
- (BOOL)wantsButtons
{
return NO;
}
// Text delegate methods - we're the delegate of the script text, so we
// want to do "ok" whenever the text changes.
// thanks to the StringList palette for this clever method.
- textDidGetKeys:sender isEmpty:(BOOL)flag
{
[self perform:@selector(ok:) with:self afterDelay:500 cancelPrevious:YES];
return self;
}
// same deal for text fields
- textDidChange:sender
{
[self perform:@selector(ok:) with:self afterDelay:500 cancelPrevious:YES];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.