This is HLDelegate.m in view mode; [Download] [Up]
//************************************************************************ // // HLDelegate.m. // // NXBrowser delegate of the Hot list and HotList controller // // by Felipe A. Rodriguez // // This code is supplied "as is" the author makes no warranty as to its // suitability for any purpose. This code is free and may be distributed // in accordance with the terms of the: // // GNU GENERAL PUBLIC LICENSE // Version 2, June 1991 // copyright (C) 1989, 1991 Free Software Foundation, Inc. // 675 Mass Ave, Cambridge, MA 02139, USA // //************************************************************************ #import "GKdefs.h" #import "HLDelegate.h" #import "HLRecord.h" #import "Coordinator.h" #import <appkit/appkit.h> #import <dbkit/DBImageView.h> #import <sys/types.h> #import <sys/dir.h> /* POSIX applications #include <dirent.h> */ @implementation HLDelegate //************************************************************************ // // sent to us after nib objects are unarchived and init'd // //************************************************************************ - awakeFromNib { char *sC; NXRect spVRect; // sizeof splitview NXSize maxSize = {300.0, 600.0}; // max hotlist win size [[HLImageView setEditable:NO] setStyle:DB_ImageNoFrame]; // theSplitView -- IB connected to be top view [theSplitView getFrame: &spVRect]; spVRect.size.width -= 20; sC = NXCopyStringBuffer(NXGetDefaultValue([NXApp appName],BROWSERHT)); // if not def and val is less than splitview's height if(atof(sC) > 600.0 || atof(sC) < 0.0) spVRect.size.height *= 2.0/3.0; // def, make top view 2/3 of splitview else spVRect.size.height = atof(sC); // per saved free(sC); HLBrowser = [[NXBrowser alloc] initFrame:&spVRect]; [[[[[[[[HLBrowser setTitled:NO] // create and configure nxbrowser setHorizontalScrollButtonsEnabled:NO] setDelegate:self] setTarget:self] setAction:@selector(browserHit:)] setDoubleAction:@selector(browserDoubleClick:)] setMinColumnWidth:200] setMaxVisibleColumns:1]; [theSplitView addSubview:HLBrowser]; sC = NXCopyStringBuffer(NXGetDefaultValue([NXApp appName], ADDRESSHT)); if(atof(sC) > 600.0 || atof(sC) < 0.0) spVRect.size.height /= 2.0; // make bottom view 1/3 of splitview else spVRect.size.height = atof(sC); // per saved free(sC); [addressView setFrame:&spVRect]; [theSplitView addSubview:addressView]; [theSplitView display]; if(![[NXBundle mainBundle]getPath:oPath forResource:"options" ofType:NULL]) oPath[0] = '\0'; [self initHotListPath]; // set each view in the heirarchy to resize its subviews [hotList setMaxSize:&maxSize]; [hotList setFrameUsingName:[hotList title]]; // remem [hotList setFrameAutosaveName:[hotList title]]; return self; } //***************************************************************************** // // initialize the hotlist and reinit if path to it is changed // //***************************************************************************** - initHotListPath { char *sC; // cell selection in hotList should persist between sessions // so recall previous selection sC = NXCopyStringBuffer(NXGetDefaultValue([NXApp appName],SELCELL)); selCell = atoi(sC); free(sC); [HLBrowser loadColumnZero]; // NXBrowser s/load cols from its delegate if(hotListDirValid) // if hotList path is valid { mat = [HLBrowser matrixInColumn:0]; [HLBrowser useScrollButtons:NO]; if(!(selCell < [dirList count])) selCell = 0; if(selCell < [dirList count]) { [mat selectCellAt:selCell :0]; if(!(image = [[dirList objectAt:selCell] gateIcon])) image = [NXImage findImageNamed: "Blank"]; // else use blank [mat scrollCellToVisible:selCell :0]; } else image = [NXImage findImageNamed: "Blank"]; // else use blank [HLImageView setImage:image]; [HLProviderField setStringValue: [[[HLBrowser matrixInColumn:0] selectedCell] stringValue]]; } return self; } //***************************************************************************** // // provide to listBrowser(NXBrowser) it's data to be displayed // do this because we are its delegate // //***************************************************************************** - (int)browser:b fillMatrix:m inColumn:(int)c { int i = 0, strSize; id t, obj = nil; char *ptr; NXHashState state; const void *key; void *value; struct direct *dirp; static DIR *dp = NULL, *dpOLD = NULL; if(dp) dpOLD = dp; if ((dp = opendir(NXGetDefaultValue([NXApp appName], "HotList"))) != NULL) { if(!namHashTable) // alloc hashtable w/str keys, obj vals namHashTable = [[HashTable alloc] initKeyDesc:"*" valueDesc:"@"]; else { tmpHashTable = [namHashTable copyFromZone:[self zone]]; [namHashTable empty]; } if(dirList) [dirList empty]; // empty list else dirList = [[List alloc] init]; // produce an array of objects if ([tmpHashTable isKey:"AppDefault"] == NO) { // create a HotList record for app default if (oPath[0] != '\0') // if options file exists in app wrapper { obj = [[HLRecord alloc] init]; [obj setRecordPath:oPath]; [namHashTable insertKey:"AppDefault" value:obj]; } } // if record exists in hash else // use existing record [namHashTable insertKey:"AppDefault" value:[tmpHashTable valueForKey:"AppDefault"]]; while (dirp = readdir(dp)) // read dir and find all { // entries with ext .Gate if((strSize = strlen(dirp->d_name)) > 5) { ptr = dirp->d_name + strSize; // point to end of name str ptr -= 5; if(strcmp(ptr, ".Gate") == 0) // if extension is .Gate { // if str not in hash table if ([tmpHashTable isKey:dirp->d_name] == NO) { // create a HotList record obj = [[HLRecord alloc] init]; [obj setGateDocName:dirp->d_name]; [namHashTable insertKey:dirp->d_name value:obj]; } // if record exists in hash else // use existing record [namHashTable insertKey:dirp->d_name value:[tmpHashTable valueForKey:dirp->d_name]]; } } }; [tmpHashTable free]; if(dpOLD) closedir(dpOLD); // sort and display dir in NXBrowser for(i = 0; i < [namHashTable count]; i++) { // Return NXHashState structure required // when iterating through the HashTable state = [namHashTable initState]; while ([namHashTable nextState:&state key:&key value:&value]) { // iterate thru the hashtable and perform if ([dirList indexOf:value] == NX_NOT_IN_LIST) { if(!obj) obj = value; // an ascending sort if(strcasecmp(key, [obj gateDocName]) < 0) obj = [namHashTable valueForKey:key]; } }; [m addRow]; // add row to HotList matrx t = [m cellAt:i :0]; // ret cell in NXBrowser [dirList addObject:obj]; [t setStringValueNoCopy:[obj gateDocName]]; [t setLoaded:YES]; [t setLeaf:YES]; obj = nil; } hotListDirValid = YES; // hotList dir was opened } else { [[NXApp delegate] showAlert:"Error opening HotList directory."]; hotListDirValid = NO; // hotList dir is invalid } return i; } //***************************************************************************** // // target/action for a single click in the browser. // //***************************************************************************** - browserHit:sender { selCell = [[sender matrixInColumn:0] selectedRow]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell return self; } //***************************************************************************** // // target/action method for a double click in the browser. // //***************************************************************************** - browserDoubleClick:sender { selCell = [[sender matrixInColumn:0] selectedRow]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell if([dirList count] >= 1) // open sel'td HotList file [[NXApp delegate] app:self openFile: [[dirList objectAt:selCell] gateDocPath] type:NULL]; else [[NXApp delegate] showAlert:"noSelectedDoc"]; return self; } //***************************************************************************** // // target/action for a single click in the preferences browser. // //***************************************************************************** - pBrowserHit:sender { selCell = [[sender matrixInColumn:0] selectedRow]; [mat selectCellAt:selCell :0]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell [mat scrollCellToVisible:selCell :0]; return self; } //***************************************************************************** // // target/action method for a double click in the preferences browser. // //***************************************************************************** - pBrowserDoubleClick:sender { selCell = [[sender matrixInColumn:0] selectedRow]; [mat selectCellAt:selCell :0]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell [mat scrollCellToVisible:selCell :0]; if([dirList count] >= 1) // open sel'td HotList file [[NXApp delegate] app:self openFile: [[dirList objectAt:selCell] gateDocPath] type:NULL]; else [[NXApp delegate] showAlert:"noSelectedDoc"]; return self; } //***************************************************************************** // // go to next gate doc in hotList // //***************************************************************************** - nextItem:sender { [sender setState:0]; if(selCell < ([dirList count] - 1)) selCell++; else selCell = 0; [mat selectCellAt:selCell :0]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell [mat scrollCellToVisible:selCell :0]; return self; } //***************************************************************************** // // go to previous gate doc in hotList // //***************************************************************************** - prevItem:sender { [sender setState:0]; if(selCell > 0) selCell--; else selCell = [dirList count] - 1; [mat selectCellAt:selCell :0]; [self setDispPerCellAt:selCell]; // display traits of sel'd cell [mat scrollCellToVisible:selCell :0]; return self; } //***************************************************************************** // // set views per selected cell in hotlist // //***************************************************************************** - setDispPerCellAt:(int)selectedCell { if((strcmp([[[NXApp mainMenu] findCellWithTag:2] title], [[NXApp delegate] localString:"Connect"]) == 0) && [[[NXApp mainMenu] findCellWithTag:2] isEnabled]) { // item enabled [HLProviderField setStringValue: [[[HLBrowser matrixInColumn:0] selectedCell] stringValue]]; if(!(image = [[dirList objectAt:selectedCell] gateIcon])) // if imge image = [NXImage findImageNamed: "Blank"]; // else use blank [HLImageView setImage:image]; if(toolBarView) [toolBarView setImage:image]; } if(prefBMat) { [prefBMat selectCellAt:selCell :0]; [prefBMat scrollCellToVisible:selCell :0]; } return self; } //***************************************************************************** // // link based on selected file // //***************************************************************************** - playLink { if([dirList count] >= 1) // open sel'td HotList file [[NXApp delegate]linkWithFile:[[dirList objectAt:selCell]gateDocPath]]; else [[NXApp delegate] showAlert:"noSelectedDoc"]; return self; } //***************************************************************************** // // forward anything in Greek to someone who might understand // //***************************************************************************** - forward:(SEL)aSelector :(marg_list)argFrame { // if ( [toolWin respondsTo:aSelector] ) // return [toolWin performv:aSelector :argFrame]; [self doesNotRecognize:aSelector]; // error abort process return self; } //************************************************************************ // // app will terminate so save selected cell, browser size // //************************************************************************ - appWillTerminate { char tmpStr[16]; NXRect hlVRect; sprintf(tmpStr, "%d", selCell); // write an entry to defaults database if(!NXWriteDefault([NXApp appName], SELCELL, tmpStr)) [[NXApp delegate] showAlert:"ddbWriteError"]; [HLBrowser getFrame: &hlVRect]; sprintf(tmpStr,"%f", hlVRect.size.height); // write an entry to defaults database if(!NXWriteDefault([NXApp appName], BROWSERHT, tmpStr)) [[NXApp delegate] showAlert:"ddbWriteError"]; [addressView getFrame: &hlVRect]; sprintf(tmpStr,"%f", hlVRect.size.height); // write an entry to defaults database if(!NXWriteDefault([NXApp appName], ADDRESSHT, tmpStr)) [[NXApp delegate] showAlert:"ddbWriteError"]; return self; } //************************************************************************ // // free simply gets rid of everything we created // This is how nice objects clean up. // //************************************************************************ - free { if(dirList) { [dirList freeObjects]; // free list's objects [dirList free]; // free list object } if(namHashTable) [namHashTable free]; return [super free]; } //***************************************************************************** // // splitview delegate method, invoked after divider is moved by user // //***************************************************************************** - splitViewDidResizeSubviews:sender { NXRect graphRect; // sizeof scroll's content view [HLBrowser getFrame: &graphRect]; return self; } //***************************************************************************** // // tell the Browser to load col 0 // //***************************************************************************** - loadBrowser { [HLBrowser loadColumnZero]; // NXBrowser s/load cols from its delegate if(hotListDirValid) // if hotList path is valid { mat = [HLBrowser matrixInColumn:0]; [mat selectCellAt:selCell :0]; [mat scrollCellToVisible:selCell :0]; [HLBrowser display]; [hotList makeKeyAndOrderFront:self]; } return self; } //***************************************************************************** // // send images back to this object // //***************************************************************************** - setToolBar:aView { toolBarView = aView; [toolBarView setImage:image]; return self; } //***************************************************************************** // // send selected cell back to this object // //***************************************************************************** - setPreferencesBMat:aMatrix { prefBMat = aMatrix; return self; } //***************************************************************************** // // return the selectedCell // //***************************************************************************** - (int)hLSelectedCell { return selCell; } //***************************************************************************** // // return the statusWindow // //***************************************************************************** - statusWindow { return hotList; } //***************************************************************************** // // return the path to the selected gate docs options file // //***************************************************************************** - (const char *)selGateDocOptionsPath { if([dirList count] >= 1) // path of selected doc { strncpy(oPath,[[dirList objectAt:selCell] gateDocPath], MAXPATHLEN); strncat(oPath, OPTION, MAXPATHLEN - strlen(oPath)); return oPath; } else [[NXApp delegate] showAlert:"noSelectedDoc"]; return NULL; } //******************* status Window delegate methods ************************** //***************************************************************************** // // called whenever the user minituriazes our status window. // //***************************************************************************** - windowWillMiniaturize:sender toMiniwindow:miniwindow { return [sender setMiniwindowIcon:"miniWinIcon"]; } //***************************************************************************** // // called whenever the user closes our status window. // //***************************************************************************** - windowWillClose:sender { if(!NXWriteDefault([NXApp appName], DISPLAYS, "NO")) [[NXApp delegate] showAlert:"ddbWriteError"]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.