Annotation of Examples/AppKit/Backspace/Thinspector.m, revision 1.1.1.1

1.1       root        1: //  Thinspector.m
                      2: //
                      3: //  contains more routines for the Thinker class, mostly related to
                      4: //  BackSpace's inspectors.
                      5: //
                      6: //  You may freely copy, distribute, and reuse the code in this example.
                      7: //  NeXT disclaims any warranty of any kind, expressed or  implied, as to its
                      8: //  fitness for any particular use.
                      9: 
                     10: #import "Thinker.h"
                     11: #import "BackWindow.h"
                     12: #import "BackView.h"
                     13: #import "SpaceView.h"
                     14: #import "MySlider.h"
                     15: #import "Password.h"
                     16: #import "psfuncts.h"
                     17: #import "ModuleList.h"
                     18: 
                     19: 
                     20: #import <appkit/appkit.h>
                     21: #import <objc/NXBundle.h>
                     22: #import <sys/dir.h>                            /* for opendir(), etc. */
                     23: 
                     24: 
                     25: @implementation Thinker(inspector)
                     26: 
                     27: - commonImageInspector
                     28: {
                     29:        return commonImageInspector;
                     30: }
                     31: 
                     32: - nullInspector
                     33: {
                     34:        return nullInspector;
                     35: }
                     36: 
                     37: - spaceInspector
                     38: {
                     39:        return spaceInspector;
                     40: }
                     41: 
                     42: - boinkInspector
                     43: {
                     44:        return boinkInspector;
                     45: }
                     46: 
                     47: - revertToDefaultImage:sender
                     48: {
                     49:        [self setImageFromName: "defaultImage"];
                     50:        NXRemoveDefault([NXApp appName], "imageFile");
                     51:        return self;
                     52: }
                     53: 
                     54: - (BOOL)browser:sender columnIsValid:(int)column
                     55: {
                     56:        return browserValid;
                     57: }
                     58: 
                     59: - addCellWithString:(const char *)str at:(int)row toMatrix:matrix
                     60: {
                     61:        id theCell;
                     62:        
                     63:        [matrix insertRowAt:row];
                     64:        theCell = [matrix cellAt:row :0];
                     65:        [theCell setStringValue:str];
                     66:        [theCell setLoaded:YES];
                     67:        [theCell setLeaf:YES];
                     68:        return self;
                     69: }
                     70: 
                     71: - (int)browser:sender fillMatrix:matrix inColumn:(int)column
                     72: {
                     73:        const char *ptr;
                     74:        int i;
                     75:        
                     76:        // this shouldn't happen...
                     77:        if (browserValid) return [matrix cellCount];
                     78: 
                     79:        [self addCellWithString:NXLocalString("All", 0, 0)
                     80:                at:0 toMatrix:matrix];
                     81:        
                     82:        for (i = 0; i < [moduleList count]; i++)
                     83:                [self addCellWithString:NXLocalString([moduleList nameAt: i], 0, 0)
                     84:                        at:(i+1) toMatrix:matrix];
                     85:                        
                     86:        realViewIndex = 0;
                     87: 
                     88:        ptr = NXGetDefaultValue([NXApp appName], "viewType");
                     89:        if (ptr)
                     90:        {
                     91:            for (i = 0; i < [moduleList count]; i++)
                     92:                if (strcmp(ptr, [moduleList nameAt: i]) == 0)
                     93:                {
                     94:                    realViewIndex = i+1;
                     95:                    break;
                     96:                }
                     97:        }
                     98:        
                     99:        browserValid = YES;
                    100:        return [matrix cellCount];
                    101: }
                    102: 
                    103: 
                    104: //  Dynamically load all object files found in the specified directory
                    105: //     if we find a module in several places, we save the additional paths
                    106: //     in case they point to modules for different architectures
                    107: 
                    108: - loadViewsFrom: (const char *) dirname
                    109: {
                    110:     DIR *dir;
                    111:     struct direct *de;
                    112:     char path[MAXPATHLEN];
                    113:     char name[60];
                    114:        char *iptr;
                    115:        ModuleInfo *m;
                    116:        BOOL validName, filePackage;
                    117: 
                    118: 
                    119:     dir = opendir(dirname);
                    120:     if (dir == NULL) {
                    121:                //perror(dirname);
                    122:                return self;
                    123:     }
                    124: 
                    125:     while ((de = readdir(dir)) != NULL)
                    126:        {
                    127:                int i, numstrings;
                    128:        
                    129:                // Ignore '.'-files (not really necessary, I guess)
                    130:                if (de->d_name[0] == '.')
                    131:                        continue;
                    132: 
                    133:                filePackage = validName = NO;
                    134:                if (de->d_namlen > 10 && 
                    135:                                !strcmp(&de->d_name[de->d_namlen-10], "View.BackO"))
                    136:                {
                    137:                        validName = YES;
                    138:                        filePackage = NO;
                    139:                }
                    140:                else if (de->d_namlen > 15 && 
                    141:                                !strcmp(&de->d_name[de->d_namlen-15], "View.BackModule"))
                    142:                {
                    143:                        validName = YES;
                    144:                        filePackage = YES;
                    145:                }
                    146: 
                    147:                if (!validName) continue;
                    148: 
                    149: 
                    150:                // refuse to load if the name matches a module already loaded
                    151:                numstrings = [moduleList count];
                    152:                strcpy(name, de->d_name);
                    153: 
                    154:                // Smash out the 'V' in "FooView.BackO"
                    155:                if (iptr = rindex(name, 'V'))
                    156:                        *iptr = '\0';
                    157: 
                    158:                for (i=0; i< numstrings; i++)
                    159:                {
                    160:                        if (!strcmp(name, [moduleList nameAt:i]))
                    161:                        {
                    162:                                // we already have a module with this name, but will save the path anyway
                    163:                                validName = NO;
                    164:                                if (filePackage) sprintf(path,"%s/%sView.BackModule",dirname,name);
                    165:                                else strcpy(path, dirname);
                    166:                                [[moduleList objectAt:i] appendPath:path];
                    167:                                break;
                    168:                        }
                    169:                }
                    170:                if (!validName) continue;
                    171:                
                    172:                // I used to load the class at this time; this got horribly
                    173:                // inefficient.  I now wait until I'm about to instantiate
                    174:                // a view before doing this (thanx bbum!)
                    175: 
                    176:                if (filePackage) sprintf(path,"%s/%sView.BackModule",dirname,name);
                    177:                else strcpy(path, dirname);
                    178:                
                    179:                m = [[ModuleInfo alloc] 
                    180:                        initWithView:NULL name:name path:path];
                    181:            [moduleList addObject: m];
                    182:     }
                    183: 
                    184:     closedir(dir);
                    185: 
                    186:     return self;
                    187: }
                    188: 
                    189: - (BOOL)appAcceptsAnotherFile:sender
                    190: {
                    191:     // return openAnother;
                    192:        // if I just return openAnother, I fail to open the module if
                    193:        // I get launched to do it.  Punt until I think of a better solution.
                    194:     return YES;
                    195: }
                    196: 
                    197: - (int)app:sender openFile:(const char *)filename type:(const char *)aType
                    198: {
                    199:        // Here we have caught BackSpace off guard; Speaker says open a file,
                    200:        // but BackSpace is already locked on a view because it doesn't unlock
                    201:        // focus or bail out of the event loop unless there's an event.
                    202:        // This is good for performance but it means it handles openfile badly;
                    203:        // it must post an event telling it to bail out of the event loop and
                    204:        // open the file later; multi file opens are therefore broken, and
                    205:        // the return value here is bogus...
                    206:        
                    207:     char path[MAXPATHLEN];
                    208:        NXEvent anEvent;
                    209:        char *iptr;
                    210: 
                    211:        if (fileToOpen)
                    212:        {       free(fileToOpen);
                    213:                fileToOpen = NULL;
                    214:        }
                    215:        
                    216:        strcpy(path,filename);
                    217: 
                    218:        if (!strcmp(aType,"BackModule"))
                    219:        {
                    220:                iptr = rindex(filename, '/');
                    221:                strcat(path,iptr);                      // /xxx/fooView.BackModule/fooView.BackModule
                    222:                iptr = rindex(path, 'M');
                    223:                strcat(iptr,"O");                       // /xxx/fooView.BackModule/fooView.BackO
                    224:        }
                    225: 
                    226:        fileToOpen = NXCopyStringBuffer(path);
                    227:        openAnother = NO;
                    228:                
                    229:        anEvent.type = NX_APPDEFINED;
                    230:        anEvent.data.compound.subtype = BSOPENFILE;
                    231:        anEvent.ctxt = [NXApp context];
                    232:        DPSPostEvent(&anEvent,0);
                    233:        return YES;
                    234: }
                    235: 
                    236: - doDelayedOpenFile
                    237: {
                    238:        int i, numstrings;
                    239:        int ret = YES;
                    240:     char path[MAXPATHLEN];
                    241:        id theMatrix;
                    242:        char *name;
                    243:        char *iptr;
                    244:        ModuleInfo *m;
                    245: 
                    246:        numstrings = [moduleList count];
                    247:        strcpy(path, fileToOpen);
                    248: 
                    249:        if ((name = rindex(path, '/')) != NULL)
                    250:                *name = '\0';
                    251:        name++;
                    252: 
                    253:        // Smash out the 'V' in "FooView.BackO"
                    254:        if ((iptr = rindex(name, 'V')) != NULL)
                    255:                *iptr = '\0';
                    256: 
                    257:        for (i=0; i< numstrings; i++)
                    258:        {
                    259:                if (!strcmp(name, [moduleList nameAt:i]))
                    260:                {       ret = NO;
                    261:                        break;
                    262:                }
                    263:        }
                    264:                
                    265:        if (ret)
                    266:        {
                    267:                m = [[ModuleInfo alloc] 
                    268:                        initWithView:NULL name:name path:path];
                    269:            [moduleList addObject: m];
                    270: 
                    271:                browserValid = NO;
                    272:                [moduleList sort];
                    273:        
                    274:                [viewSelectionBrowser loadColumnZero];
                    275:        }
                    276:        
                    277:        theMatrix = [viewSelectionBrowser matrixInColumn:0];
                    278:        numstrings = [moduleList count];
                    279:        for (i=0; i< numstrings; i++)
                    280:        {
                    281:                if (!strcmp(name, [moduleList nameAt:i]))
                    282:                        break;
                    283:        }
                    284:        realViewIndex = i+1;
                    285:                
                    286:        [theMatrix selectCellAt:realViewIndex :0];
                    287:        [theMatrix scrollCellToVisible:realViewIndex :0];
                    288:        [viewSelectionBrowser display];
                    289: 
                    290:        [self setVirtualViewIndexAndIncrement:NO];
                    291: 
                    292:        free(fileToOpen);
                    293:        fileToOpen = NULL;
                    294:        openAnother = YES;
                    295:        
                    296:        return self;
                    297: }
                    298: 
                    299: 
                    300: extern const char *appDirectory();
                    301: - (const char *) appDirectory
                    302: {
                    303:        return appDirectory();
                    304: }
                    305: 
                    306: - (const char *) moduleDirectory:(const char *)name
                    307: {
                    308:        int i, numstrings;
                    309:        
                    310:        numstrings = [moduleList count];
                    311:        for (i=0; i< numstrings; i++)
                    312:        {
                    313:                if (!strcmp(name, [moduleList nameAt:i]))
                    314:                        return [[moduleList objectAt:i] path];
                    315:        }
                    316:        return NULL;
                    317: }
                    318: 
                    319: - (struct mach_header *) headerForModule:(const char *)name
                    320: {
                    321:        int i, numstrings;
                    322:        
                    323:        numstrings = [moduleList count];
                    324:        for (i=0; i< numstrings; i++)
                    325:        {
                    326:                if (!strcmp(name, [moduleList nameAt:i]))
                    327:                        return [[moduleList objectAt:i] header];
                    328:        }
                    329:        return NULL;
                    330: }
                    331: 
                    332: 
                    333: 
                    334: 
                    335: static char *launchDir = NULL; /* if this is NULL, it will be calculated */
                    336: 
                    337: /**
                    338:  **    which-dir -- find the path for the named exectuable file
                    339:  ** Returns malloc'd string if it finds it, or NULL if it can't
                    340:  **
                    341:  **    borrowed from Lennart, munged by sam
                    342:  **/
                    343: 
                    344: const char *which_dir(const char *file)
                    345: {
                    346:     char buf[MAXPATHLEN];
                    347:     char *paths, *p, *q;
                    348:        char *ret;
                    349:     int dirlen;
                    350: 
                    351:     paths = getenv("PATH");
                    352:     if (paths == NULL) return NULL;
                    353: 
                    354:     for (p = q = paths; *q != '\0'; p = q + 1)
                    355:        {
                    356:                q = index(p, ':');
                    357:                if (q == NULL) q = p + strlen(p);
                    358: 
                    359:                dirlen = q - p;
                    360: 
                    361:                sprintf(buf, "%.*s/%s", dirlen, p, file);
                    362:                if (access(buf, X_OK) != 0) continue;
                    363: 
                    364:                buf[dirlen] = '\0';
                    365:                ret = malloc((dirlen+1)*sizeof(char));
                    366:                strcpy(ret,buf);
                    367:                return ret;
                    368:     }
                    369:        return NULL;
                    370: }
                    371: 
                    372: const char *appDirectory()
                    373: {
                    374:     char buf[MAXPATHLEN];
                    375:     char *suffix, *path;
                    376: 
                    377:        if (launchDir) return launchDir;
                    378:        
                    379:     strcpy (buf,NXArgv[0]);
                    380:     suffix = rindex(buf,'/');
                    381:     if (suffix != NULL)                        // explicit path
                    382:        {
                    383:                *suffix = '\0';                 // remove executable name
                    384:        }
                    385:        else
                    386:        {
                    387:                path = (char *)which_dir([NXApp appName]);
                    388:                if (path != NULL)
                    389:                {
                    390:                        launchDir = path;
                    391:                        return launchDir;
                    392:                }
                    393:                else
                    394:                {
                    395:                        // Don't know where we came from -- arbitrarily
                    396:                        // presume "." and continue (it's better than breaking)
                    397:                        strcpy(buf, ".");
                    398:                }
                    399:     }
                    400: 
                    401:        launchDir = malloc((strlen(buf)+1)*sizeof(char));
                    402:        strcpy(launchDir,buf);
                    403:        return launchDir;
                    404: }
                    405: 
                    406: @end
                    407: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.