/* -*- C++ -*- NSOpenPanel.m Standard open panel for opening files Copyright (C) 1996 Free Software Foundation, Inc. Author: Scott Christley Date: 1996 Author: Daniel Bðhringer Date: August 1998 Source by Daniel Bðhringer integrated into Scott Christley's preliminary implementation by Felipe A. Rodriguez This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include // toDo: - canChooseFiles unimplemented // - allowsMultipleSelection untested // - setCanChooseDirectories untested static NSOpenPanel *gnustep_gui_open_panel = nil; @implementation NSOpenPanel // // Class methods // + (void)initialize { if (self == [NSOpenPanel class]) [self setVersion:1]; // Initial version } // // Accessing the NSOpenPanel // + (NSOpenPanel *)openPanel { if (!gnustep_gui_open_panel) { // PanelLoader *pl = [PanelLoader panelLoader]; // gnustep_gui_open_panel = [pl loadPanel: @"NSOpenPanel"]; gnustep_gui_open_panel = [[NSOpenPanel alloc] init]; } return gnustep_gui_open_panel; } // // Instance methods // // // Initialization // - init { self = [super init]; [self setTitle:@"Open"]; [self setCanChooseFiles:YES]; multiple_select = NO; return self; } // // Filtering Files // - (void)setAllowsMultipleSelection:(BOOL)flag { allowsMultipleSelection=flag; [browser setAllowsMultipleSelection:flag]; } -(BOOL) allowsMultipleSelection { return allowsMultipleSelection; } -(void) setCanChooseDirectories:(BOOL)flag { canChooseDirectories = flag; } -(BOOL) canChooseDirectories { return canChooseDirectories; } -(void) setCanChooseFiles:(BOOL)flag { canChooseFiles = flag; } -(BOOL) canChooseFiles { return canChooseFiles; } -(NSString*) filename { return [browser path]; } // // Querying the Chosen Files // - (NSArray *)filenames { if(!allowsMultipleSelection) return [NSArray arrayWithObject:[self filename]]; else { NSArray *cells=[browser selectedCells]; NSEnumerator *cellEnum; id currCell; NSMutableArray *ret = [NSMutableArray array]; NSString *dir=[self directory]; for(cellEnum=[cells objectEnumerator];currCell=[cellEnum nextObject];) { [ret addObject:[NSString stringWithFormat:@"%@/%@",dir,[currCell stringValue]]]; } return ret; } } // // Running the NSOpenPanel // - (int)runModalForTypes:(NSArray *)fileTypes { return [self runModalForDirectory:[self directory] file: nil types: fileTypes]; } - (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes { if(requiredTypes) [requiredTypes autorelease]; requiredTypes = [fileTypes retain]; return [self runModalForDirectory:path file:name]; } // // Target and Action Methods // - (void)ok_ORIGINAL_NOT_USED:(id)sender // excess? fix me FAR { char *sp, files[4096], *p; NSMutableString *m; if (the_filenames) [the_filenames release]; the_filenames = [NSMutableArray array]; // Search for space strcpy(files, [file_name cString]); sp = strchr(files, ' '); if (sp == NULL) { // No space then only one file selected [the_filenames addObject:file_name]; sp = strrchr(files, '\\'); sp++; *sp = '\0'; directory = [NSString stringWithCString:files]; } else { // Multiple files selected *sp = '\0'; directory = [NSString stringWithCString:files]; p = sp + 1; sp = strchr(p, ' '); while (sp != NULL) { *sp = '\0'; m = [NSMutableString stringWithCString:files]; [m appendString:@"\\"]; [m appendString:[NSString stringWithCString:p]]; [the_filenames addObject:m]; p = sp + 1; sp = strchr(p, ' '); } if (strchr(p, '\0')) { m = [NSMutableString stringWithCString:files]; [m appendString:@"\\"]; [m appendString:[NSString stringWithCString:p]]; [the_filenames addObject:m]; } } } // // NSCoding protocol // - (void)encodeWithCoder:aCoder { [super encodeWithCoder:aCoder]; [aCoder encodeObject: the_filenames]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &multiple_select]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &choose_dir]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &choose_file]; } - initWithCoder:aDecoder { [super initWithCoder:aDecoder]; the_filenames = [aDecoder decodeObject]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &multiple_select]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &choose_dir]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &choose_file]; return self; } @end