This is DirPanel.m in view mode; [Download] [Up]
#import "DirPanel.h" #import <appkit/Button.h> #import <appkit/OpenPanel.h> @implementation OpenPanel (DirPanel) /* This flags a real cancel. */ static BOOL notCancel=NO; /* This is where the real okButton is stored. */ static id realOkButton=nil; /* When we are masquerading as the okButton, catch setEnabled:. */ - setEnabled:(BOOL)flag { [realOkButton setEnabled:YES]; return self; } - forward:(SEL)aSelector :(marg_list)argFrame { if ([realOkButton respondsTo:aSelector]) { return[realOkButton performv:aSelector :argFrame]; } return[self doesNotRecognize:aSelector]; } -(int)dirPanelRunModal:(const char *)dir { int ret; /* Store the okButton target/action. */ id okt = [okButton target]; SEL oka = [okButton action]; /* Enable the button, and redirect it at realOk:. */ [okButton setEnabled:YES]; [okButton setTarget:self]; [okButton setAction:@selector(realOk:)]; /* store away the okButton, and "become" it. */ realOkButton = okButton; okButton = self; /* Make sure we don't misfire on this. */ notCancel = NO; /* * OpenPanel doesn't seem to pay attention to setRequiredFileType, so I * have to do things differently for it. Actually, I would tend to * recommend just using SavePanels, but that's just me. * * The idea, here, is that not many people are going to have files named * *.abcdefghijklmnop, so the SavePanel can't find any, so it can only show * directories, that you can move around in and look for stuff. Since * we're choosing directories, this is the right behaviour. */ if ([self isMemberOf:[SavePanel class]]) { [self setRequiredFileType:"abcdefghijklmnop"]; ret = [self runModal]; } else { const char *types[] = {"abcdefghijklmnop", NULL}; /* I cast to OpenPanel to remove the warning on compile. */ ret = [(OpenPanel *)self runModalForDirectory:dir file:NULL types:types]; } /* * If SavePanel thinks we canceled, check to see if _we_ think so, too. */ if (!ret && notCancel) { notCancel = NO; ret = 1; } /* Restore the okButton's target/action. */ okButton = realOkButton; [okButton setTarget:okt]; [okButton setAction:oka]; return ret; } /* Handles ok's for the panel. I need to pretend to be a cancel, * for some reason. Don't ask me - it wasn't working when I didn't * do it, so I left it. */ - realOk:sender { /* Mark this as a fake Cancel. */ notCancel = YES; /* Use the ok: method to pull out any data from the form. */ [self ok:sender]; /* Use cancel: to get out of the modal loop. */ return[self cancel:sender]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.