This is AppDelegate.m in view mode; [Download] [Up]
//
// AppDelegate.m -- Example of using category of MiscTree that allows a
// MiscTree to be a delegate for an NXBrowser
// Written by Scott Anguish Copyright (c) 1994 by Scott Anguish.
// Version 1.0. All rights reserved.
//
// This notice may not be removed from this source code.
//
// This program is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
#import "AppDelegate.h"
#import "MiscTree.TreeBrowser.h"
#import "AppDelegate.TreeSearching.h"
@implementation AppDelegate
static NXStream *localStream;
static id theLine;
static MiscTree *root;
-(MiscTree*) root {return root;}
// find-panel browser-searching
- selectEntry:(MiscTree *) theEntry
{ [root selectNode:theEntry inBrowser:theBrowser];
[root selectNode:theEntry inBrowser:simpleBrowser];
[root selectNode:theEntry inBrowser:theTree];
return self;
}
-appDidInit:sender
{ [self loadTree:self];
// [root setStringValue:"Root"];
[theTree refineBackgroundColor];
[theBrowser setPathSeparator:'/'];
[simpleBrowser setPathSeparator:'/'];
[simpleBrowser setDelegate:root];
[theBrowser setDelegate:root];// split browser
[theTree setDelegate:root];
[theBrowser setTarget:self];
[theBrowser setAction:@selector(didClick:)];
[theBrowser loadColumnZero];
[simpleBrowser loadColumnZero];
[self renewSearchHashtable];
return self;
}
- didClick:sender
{
id theNode;
id pathString;
theNode=[root returnSelectedNode:sender];
[selectedLabelNode setStringValue:[theNode label]];
pathString=[root returnSelectedPath:sender];
[selectedLabelPath setStringValue:[pathString stringValue]];
return self;
}
int ParseTree(id lastLimb, int currentLevel, id lastPlanting);
- loadTree:sender
{ id applicationLocation;
char path[MAXPATHLEN+1];
applicationLocation=[NXBundle mainBundle];
if ([applicationLocation getPath:path forResource:"MiscKit" ofType:".tree"])
{ localStream=NXMapFile(path,NX_READONLY);
root = [[MiscTree alloc] init];
ParseTree(root,-1,root);
NXClose(localStream);
} return self;
}
// loading stuff¼
char *NXGets(char *s, int n, NXStream *stream)
{
int c, i = 0;
while (((c = NXGetc(stream)) != EOF) && (i < n-1)) {
s[i++] = c;
if (c == '\n')
break;
}
s[i++] = 0;
return i > 1 ? s : NULL;
}
id NXGetsString(NXStream *stream)
{
char theLine[BUFSIZ];
id theString;
theString=[[MiscString alloc] init];
[theString setStringValue:NXGets(theLine,BUFSIZ, stream)];
return (theString);
}
int ParseTree(id lastLimb, int currentLevel, id lastPlanting)
{
int indentLevel;
id newLeaf;
id lastLeaf;
int returnLevel;
lastLeaf=lastPlanting;
while (YES)
{
theLine=NXGetsString(localStream);
if ((!theLine) || ([theLine emptyString])) {return (-1);};
indentLevel=[theLine numOfChar:'\t'];
[theLine replaceEveryOccurrenceOfChars:"\t" with:""];
[theLine replaceEveryOccurrenceOfChars:"\n" with:""];
if (indentLevel < currentLevel) {return (indentLevel);};
if (indentLevel > currentLevel)
{
newLeaf=[[MiscTree alloc] initLabelString:theLine];
[lastLeaf addBranch:newLeaf];
returnLevel=ParseTree(lastLeaf,indentLevel,newLeaf);
if (returnLevel != currentLevel) {return (returnLevel);};
if ((!theLine) || ([theLine emptyString])) {return (-1);};
//if we got here, then we need to take the currentLine
//and add it anyways, so we fall through
// My specific question is what you would suggest here... I'm using
// theLine as a variable in this class only... I have the other option
// of passing the MiscString as a param in ParseTree, so I could trash that
// variable, and make it part of the MiscTree without having a 'global-ish'
// variable on my mind
}
newLeaf=[[MiscTree alloc] initLabelString:theLine];
[lastLimb addBranch:newLeaf];
lastLeaf=newLeaf;
} // while(YES)
};
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.