This is MyController.m in view mode; [Download] [Up]
// Written by Todd Thomas Copyright (c) 1995 by Todd Thomas. // Version 1.0. All rights reserved. // // This notice may not be removed from this source code. // // This object 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 <appkit/appkit.h> #import <misckit/MiscFile.h> #import <misckit/MiscAppFile.h> #import "MyNXBrowserCell.h" #import "Inspector.subproj/FileInspector.h" #import "MyController.h" @implementation MyController - init { [super init]; rootFile = [ [MiscFile alloc] initWithPath: "/"]; // Used so we can create children of different classes depending upon // their extension. For this example, there is just one subclass of // MiscFile which will be used for any file that has the "app" extension. [rootFile setCreateChildrenUsingExtensions: YES]; [MiscFile registerFileClass: [MiscAppFile class] forExtension: "app"]; inspector = nil; return self; } - free { [rootFile free]; return [super free]; } - updateDirectory: sender { // Called when we click the "Update Directory" button. id selectedFile = [ [browser selectedCell] file]; int selectedCol = [browser selectedColumn]; if ([selectedFile isDirectory]) { [selectedFile updateChildren]; selectedCol++; } else [ [ [selectedFile parents] objectAt: 0] updateChildren]; [browser reloadColumn: selectedCol]; return self; } - showInspector: sender { // Load the inspector if it hasn't been already. if (inspector == nil) { char path[MAXPATHLEN+1]; if ([ [NXBundle mainBundle] getPath: path forResource: "Inspector" ofType: "nib"]) [NXApp loadNibFile: path owner: self]; } // Display the inspector window. [self inspectFile: nil]; [ [inspector window] orderFront: nil]; return self; } - inspectFile: sender { // If the inspector is loaded then let it know there is a new // file to look at. if (inspector != nil) { if ([ [sender selectedCell] file] == nil) [inspector selectedFile: rootFile]; else [inspector selectedFile: [ [sender selectedCell ] file] ]; } return self; } - duplicateFile: sender { // When the menu item "Duplicate file" is clicked upon, get the selected // item and try to duplicate it. MiscFile *selFile = [ [browser selectedCell] file]; char tmp[MAXPATHLEN+1]; char *ptr; if (selFile == nil) return self; strcpy (tmp, [selFile fullPath]); ptr = strrchr (tmp, '/'); *(ptr+1) = '\0'; strcat (tmp, "CopyOf"); strcat (tmp, [selFile filename]); if ([selFile createCopyNamed: tmp] == nil) NXRunAlertPanel ("Oh no!", "Couldn't create the copy. Sorry.", "OK", 0, 0); [self updateDirectory: nil]; return self; } - createSymLink: sender { // Create a symbolic link to the selected file in the browser. MiscFile *selFile = [ [browser selectedCell] file]; char tmp[MAXPATHLEN+1]; char *ptr; if (selFile == nil) return self; strcpy (tmp, [selFile fullPath]); ptr = strrchr (tmp, '/'); *(ptr+1) = '\0'; strcat (tmp, "SymLinkOf"); strcat (tmp, [selFile filename]); if ([selFile createSymbolicLinkNamed: tmp] == nil) NXRunAlertPanel ("Oh no!", "Couldn't create the symbolic link. Sorry.", "OK", 0, 0); [self updateDirectory: nil]; return self; } - createHardLink: sender { // Create a hard link to the selected file in the browser. MiscFile *selFile = [ [browser selectedCell] file]; char tmp[MAXPATHLEN+1]; char *ptr; if (selFile == nil) return self; strcpy (tmp, [selFile fullPath]); ptr = strrchr (tmp, '/'); *(ptr+1) = '\0'; strcat (tmp, "HardLinkOf"); strcat (tmp, [selFile filename]); if ([selFile createHardLinkNamed: tmp] == nil) NXRunAlertPanel ("Oh no!", "Couldn't create the link. Sorry.", "OK", 0, 0); [self updateDirectory: nil]; return self; } @end @implementation MyController (NibInitialization) // Do some initialization (especially to the browser). - awakeFromNib { // Use new browser cell to keep track of underlying MiscFile each cell // represents. [browser setCellClass: [MyNXBrowserCell class] ]; // The delegate is set here instead of in IB because when it is set // in IB, loadColumnZero gets called (from within drawSelf::) before // this awakeFromNib does, and since the new browser cell isn't set // yet, it crashes. I mailed it to Bug_NeXT. [browser setDelegate: self]; [browser setTarget: self]; [browser setAction: @selector(inspectFile:)]; [browser loadColumnZero]; return self; } @end @implementation MyController (BrowserDelegate) // Load up whatever column we are supposed to. If we are loading the // first one just use the rootFile, else we have to ask the // rightmost selected cell to tell us the MiscFile it represents. - (int)browser:sender fillMatrix:matrix inColumn:(int)column { id displayFile = nil; id children = nil; id child = nil; id cell = nil; int i; // determine which MiscFile to use if (column == 0) displayFile = rootFile; else // get the MiscFile represented by the rightmost selected cell displayFile = [ [browser selectedCell] file]; children = [displayFile children]; // Load up the matrix with the MiscFile's children. for (i=0; i<[children count]; i++) { [matrix insertRowAt: i]; cell = [matrix cellAt: i :0]; child = [children objectAt: i]; [cell setStringValue: [child filename] ]; [cell setFile: child]; // This is so each cell knows it's MiscFile [cell setLoaded: YES]; [cell setLeaf: [child displayAsLeaf] ]; } return [children count]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.