diff --git a/ChangeLog b/ChangeLog index aae73e106..b434cf3d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2009-11-05 Wolfgang Lux + * Source/NSDocumentController.m (+initialize): Don't ignore types + without an associated document class. + * Source/NSDocument.m (+reaableTypes, +writableTypes): + * Source/NSDocumentController.m(-_readableTypesForClass:, + -_writableTypesForClass:): Add the exportable types to the + writable types. Rename private NSDocumentController methods. + * Source/NSDocument.m (-_addItemsToSpaButtonFromArray, + -changeSaveType, _runSavePanelForSaveOperation): Save panel + accessory pop up now allows the user to select one of the + exportable types for NSSaveToOperation. + * KeyBindings/DefaultKeyBindings.dict: Enable Ctrl-l key binding and add Ctrl-o key binding as in Emacs and Cocoa. * Source/NSTextView_actions.m (-insertNewlineIgnoringFieldEditor:, diff --git a/Source/NSDocument.m b/Source/NSDocument.m index 75df5c64d..3192b95f5 100644 --- a/Source/NSDocument.m +++ b/Source/NSDocument.m @@ -48,14 +48,14 @@ { // FIXME: Should allow for filterable types return [[NSDocumentController sharedDocumentController] - _editorAndViewerTypesForClass: self]; + _readableTypesForClass: self]; } + (NSArray *) writableTypes { // FIXME: Should allow for filterable types return [[NSDocumentController sharedDocumentController] - _editorTypesForClass: self]; + _writableTypesForClass: self]; } + (BOOL) isNativeType: (NSString *)type @@ -1016,10 +1016,9 @@ originalContentsURL: (NSURL *)orig { NSDocumentController *controller = [NSDocumentController sharedDocumentController]; - NSArray *extensions = nil; + NSArray *extensions; - ASSIGN(_save_type, [controller _nameForHumanReadableType: - [sender titleOfSelectedItem]]); + ASSIGN(_save_type, [[sender selectedItem] representedObject]); extensions = [controller fileExtensionsFromType: _save_type]; [(NSSavePanel *)[sender window] setAllowedFileTypes: extensions]; } @@ -1076,32 +1075,27 @@ originalContentsURL: (NSURL *)orig - (void) _addItemsToSpaButtonFromArray: (NSArray *)types { - NSEnumerator *en = [types objectEnumerator]; - NSString *title = nil; - int i = 0; + NSString *type, *title; + int i, count = [types count]; - while ((title = [en nextObject]) != nil) + [_spa_button removeAllItems]; + for (i = 0; i < count; i++) { + type = [types objectAtIndex: i]; + title = [[NSDocumentController sharedDocumentController] + displayNameForType: type]; [_spa_button addItemWithTitle: title]; - i++; + [[_spa_button itemAtIndex: i] setRepresentedObject: type]; } // if it's more than one, then - [_spa_button setEnabled: (i > 0)]; + [_spa_button setEnabled: (count > 0)]; // if we have some items, select the current filetype. - if (i > 0) + if (count > 0) { - NSString *title = [[NSDocumentController sharedDocumentController] - displayNameForType: [self fileType]]; - if ([_spa_button itemWithTitle: title] != nil) - { - [_spa_button selectItemWithTitle: title]; - } - else - { - [_spa_button selectItemAtIndex: 0]; - } + [_spa_button selectItemAtIndex: + [_spa_button indexOfItemWithRepresentedObject: [self fileType]]]; } } @@ -1110,25 +1104,25 @@ originalContentsURL: (NSURL *)orig NSView *accessory = nil; NSString *title; NSString *directory; - NSArray *displayNames; + NSArray *types; NSDocumentController *controller; NSSavePanel *savePanel = [NSSavePanel savePanel]; ASSIGN(_save_type, [self fileType]); controller = [NSDocumentController sharedDocumentController]; - displayNames = [controller _displayNamesForClass: [self class]]; - + types = [self writableTypesForSaveOperation: saveOperation]; + if ([self shouldRunSavePanelWithAccessoryView]) { if (_save_panel_accessory == nil) [self _createPanelAccessory]; - [self _addItemsToSpaButtonFromArray: displayNames]; + [self _addItemsToSpaButtonFromArray: types]; accessory = _save_panel_accessory; } - if ([displayNames count] > 0) + if ([types count] > 0) { NSArray *extensions = [controller fileExtensionsFromType: [self fileType]]; [savePanel setAllowedFileTypes: extensions]; diff --git a/Source/NSDocumentController.m b/Source/NSDocumentController.m index 100dbc99e..13d847b91 100644 --- a/Source/NSDocumentController.m +++ b/Source/NSDocumentController.m @@ -56,6 +56,7 @@ static NSString *NSDOSExtensionsKey = @"NSDOSExtensions"; //static NSString *NSMacOSTypesKey = @"NSMacOSTypes"; //static NSString *NSMIMETypesKey = @"NSMIMETypes"; static NSString *NSDocumentClassKey = @"NSDocumentClass"; +static NSString *NSExportableAsKey = @"NSExportableAs"; static NSString *CFBundleDocumentTypes = @"CFBundleDocumentTypes"; static NSString *CFBundleTypeExtensions = @"CFBundleTypeExtensions"; @@ -196,19 +197,21 @@ TypeInfoForHumanReadableName (NSArray *types, NSString *typeName) if (YES == [types isKindOfClass: [NSArray class]]) { unsigned count = [types count]; - unsigned src; - unsigned dst = 0; + unsigned i; + unsigned nNames = 0; + unsigned nValid = 0; NSString *names[count]; NSDictionary *valid[count]; - for (src = 0; src < count; src++) + for (i = 0; i < count; i++) { - NSDictionary *d = [types objectAtIndex: src]; + NSDictionary *d = [types objectAtIndex: i]; if (YES == [d isKindOfClass: [NSDictionary class]]) { NSString *name = [d objectForKey: NSDocumentClassKey]; + valid[nValid++] = d; /* Is this type handled by an NSDocument subclass? */ if (YES == [name isKindOfClass: [NSString class]]) @@ -217,8 +220,7 @@ TypeInfoForHumanReadableName (NSArray *types, NSString *typeName) if (YES == [c isSubclassOfClass: [NSDocument class]]) { - names[dst] = name; - valid[dst++] = d; + names[nNames++] = name; } else if (c == 0) { @@ -234,13 +236,17 @@ TypeInfoForHumanReadableName (NSArray *types, NSString *typeName) else { NSLog(@"Bad item at index %u in %@", - src, CFBundleDocumentTypes); + i, CFBundleDocumentTypes); } } - if (dst > 0) + if (nNames > 0) { - classNames = [[NSArray alloc] initWithObjects: names count: dst]; - allTypes = [[NSArray alloc] initWithObjects: valid count: dst]; + classNames = [[NSArray alloc] initWithObjects: names + count: nNames]; + } + if (nValid > 0) + { + allTypes = [[NSArray alloc] initWithObjects: valid count: nValid]; } } } @@ -1346,7 +1352,7 @@ static BOOL _shouldClose = YES; @implementation NSDocumentController (Private) -- (NSArray *) _editorAndViewerTypesForClass: (Class)documentClass +- (NSArray *) _readableTypesForClass: (Class)documentClass { int i, count = [_types count]; NSMutableArray *types = [NSMutableArray arrayWithCapacity: count]; @@ -1382,7 +1388,7 @@ static BOOL _shouldClose = YES; return types; } -- (NSArray *) _editorTypesForClass: (Class)documentClass +- (NSArray *) _writableTypesForClass: (Class)documentClass { int i, count = [_types count]; NSMutableArray *types = [NSMutableArray arrayWithCapacity: count]; @@ -1393,6 +1399,7 @@ static BOOL _shouldClose = YES; NSDictionary *typeInfo = [_types objectAtIndex: i]; NSString *className = [typeInfo objectForKey: NSDocumentClassKey]; NSString *role = [typeInfo objectForKey: NSRoleKey]; + NSArray *exportableAs = [typeInfo objectForKey: NSExportableAsKey]; // if the standard one isn't filled... check the CF key. if (role == nil) @@ -1411,48 +1418,24 @@ static BOOL _shouldClose = YES; } [types addObject: name]; } + + if ([exportableAs isKindOfClass: [NSArray class]]) + { + int i, count = [exportableAs count]; + NSString *name; + + for (i = 0; i < count; i++) + { + name = [exportableAs objectAtIndex: i]; + if ([name isKindOfClass: [NSString class]]) + [types addObject: name]; + } + } } return types; } -- (NSArray *) _exportableTypesForClass: (Class)documentClass -{ - // Dunno what this method is for; maybe looks for filter types - return [self _editorTypesForClass: documentClass]; -} - -- (NSString *) _nameForHumanReadableType: (NSString *)typeHR -{ - NSDictionary *typeInfo = HR_TYPE_INFO(typeHR); - NSString *type = [typeInfo objectForKey: NSNameKey]; - - if (type == nil) - { - type = [typeInfo objectForKey: CFBundleTypeName]; - } - return type; -} - -- (NSArray *) _displayNamesForTypes: (NSArray *)types -{ - NSEnumerator *en = [types objectEnumerator]; - NSString *type = nil; - NSMutableArray *result = [NSMutableArray arrayWithCapacity: 10]; - while ((type = (NSString *)[en nextObject]) != nil) - { - NSString *name = [self displayNameForType: type]; - [result addObject: name]; - } - return result; -} - -- (NSArray *) _displayNamesForClass: (Class)documentClass -{ - return [self _displayNamesForTypes: - [self _editorTypesForClass: documentClass]]; -} - static NSMapTable *autosavedDocuments = NULL; static NSString *processName = nil; diff --git a/Source/NSDocumentFrameworkPrivate.h b/Source/NSDocumentFrameworkPrivate.h index 1114cdd95..f4e9d9e58 100644 --- a/Source/NSDocumentFrameworkPrivate.h +++ b/Source/NSDocumentFrameworkPrivate.h @@ -35,12 +35,8 @@ @class NSTimer; @interface NSDocumentController (Private) -- (NSArray *)_editorAndViewerTypesForClass:(Class)documentClass; -- (NSArray *)_editorTypesForClass:(Class)fp12; -- (NSArray *)_exportableTypesForClass:(Class)documentClass; -- (NSString *)_nameForHumanReadableType: (NSString *)type; -- (NSArray *)_displayNamesForTypes: (NSArray *)types; -- (NSArray *)_displayNamesForClass: (Class)documentClass; +- (NSArray *)_readableTypesForClass:(Class)documentClass; +- (NSArray *)_writableTypesForClass:(Class)documentClass; - (NSString *)_autosaveDirectory: (BOOL)create; - (void)_autosaveDocuments: (NSTimer *)timer; - (BOOL)_reopenAutosavedDocuments;