diff options
Diffstat (limited to 'Source/SPBundleEditorController.m')
-rw-r--r-- | Source/SPBundleEditorController.m | 159 |
1 files changed, 84 insertions, 75 deletions
diff --git a/Source/SPBundleEditorController.m b/Source/SPBundleEditorController.m index 387bfcf1..8d4d1c65 100644 --- a/Source/SPBundleEditorController.m +++ b/Source/SPBundleEditorController.m @@ -40,17 +40,18 @@ #define SP_BUNDLEEDITOR_SPLITVIEW_AUTOSAVE_STRING @"SPBundleEditorSplitView" -@interface SPBundleEditorController (PrivateAPI) +@interface SPBundleEditorController () - (void)_updateBundleDataView; +- (void)_updateBundleMetaSummary; - (id)_currentSelectedObject; - (id)_currentSelectedNode; -- (void)_enableBundleDataInput:(BOOL)enabled; -- (void)_enableMetaDataInput:(BOOL)enabled; +- (void)_enableBundleDataInput:(BOOL)enabled bundleEnabled:(BOOL)bundleEnabled; - (void)_initTree; - (NSUInteger)_arrangedScopeIndexForScopeIndex:(NSUInteger)scopeIndex; - (NSUInteger)_scopeIndexForArrangedScopeIndex:(NSUInteger)scopeIndex; - (NSUInteger)_arrangedCategoryIndexForScopeIndex:(NSUInteger)scopeIndex andCategory:(NSString*)category; +- (void)_metaSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; @end @@ -73,12 +74,10 @@ } return self; - } - (void)dealloc { - [inputGeneralScopePopUpMenu release]; [inputInputFieldScopePopUpMenu release]; [inputDataTableScopePopUpMenu release]; @@ -106,14 +105,13 @@ [shellVariableSuggestions release]; [deletedDefaultBundles release]; - if(touchedBundleArray) [touchedBundleArray release], touchedBundleArray = nil; - if(commandBundleTree) [commandBundleTree release], commandBundleTree = nil; - if(sortDescriptor) [sortDescriptor release], sortDescriptor = nil; - if(bundlePath) [bundlePath release], bundlePath = nil; + if (touchedBundleArray) [touchedBundleArray release], touchedBundleArray = nil; + if (commandBundleTree) [commandBundleTree release], commandBundleTree = nil; + if (sortDescriptor) [sortDescriptor release], sortDescriptor = nil; + if (bundlePath) [bundlePath release], bundlePath = nil; if (esUndoManager) [esUndoManager release], esUndoManager = nil; [super dealloc]; - } - (void)awakeFromNib @@ -800,14 +798,6 @@ } /** - * Show/Hide meta data input fields - */ -- (IBAction)metaButtonChanged:(id)sender -{ - [self _enableMetaDataInput:([sender state] == NSOnState) ? YES : NO]; -} - -/** * Read all installed bundles and order front the Bundle Editor */ - (IBAction)showWindow:(id)sender @@ -841,7 +831,21 @@ [sender orderOut:nil]; else if ([sender respondsToSelector:@selector(window)]) [[sender window] orderOut:nil]; +} +- (IBAction)displayBundleMetaInfo:(id)sender +{ + [NSApp beginSheet:metaInfoSheet + modalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(_metaSheetDidEnd:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (IBAction)closeSheet:(id)sender +{ + [NSApp endSheet:[sender window] returnCode:[sender tag]]; + [[sender window] orderOut:self]; } /** @@ -849,7 +853,6 @@ */ - (IBAction)saveAndCloseWindow:(id)sender { - // Commit all pending edits if([commandBundleTreeController commitEditing]) { @@ -1283,7 +1286,6 @@ */ - (void)outlineViewSelectionDidChange:(NSNotification *)aNotification { - if([aNotification object] != commandsOutlineView) return; // Remember selected bundle name to reset the name if the user cancelled @@ -1291,9 +1293,9 @@ if(oldBundleName) [oldBundleName release], oldBundleName = nil; if(![[self _currentSelectedObject] objectForKey:kChildrenKey]) { oldBundleName = [[[self _currentSelectedObject] objectForKey:kBundleNameKey] retain]; - [self _enableBundleDataInput:YES]; + [self _enableBundleDataInput:YES bundleEnabled:![[[self _currentSelectedObject] objectForKey:@"disabled"] boolValue]]; } else { - [self _enableBundleDataInput:NO]; + [self _enableBundleDataInput:NO bundleEnabled:NO]; if(oldBundleName) [oldBundleName release], oldBundleName = nil; } @@ -1303,6 +1305,7 @@ [touchedBundleArray addObject:oldBundleName]; [self _updateBundleDataView]; + [commandTextView setSelectedRange:NSMakeRange(0,0)]; } @@ -1478,7 +1481,6 @@ [commandBundleTreeController rearrangeObjects]; [commandsOutlineView reloadData]; } - } #pragma mark - @@ -1489,17 +1491,17 @@ */ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - SEL action = [menuItem action]; - if ( (action == @selector(duplicateCommandBundle:)) - || (action == @selector(revealCommandBundleInFinder:)) - || (action == @selector(saveBundle:)) - || (action == @selector(removeCommandBundle:)) - ) + if ((action == @selector(duplicateCommandBundle:)) || + (action == @selector(revealCommandBundleInFinder:)) || + (action == @selector(saveBundle:)) || + (action == @selector(removeCommandBundle:)) || + (action == @selector(displayBundleMetaInfo:))) { // Allow to record short-cuts used by the Bundle Editor if([[NSApp mainWindow] firstResponder] == keyEquivalentField) return NO; + return ([[commandBundleTreeController selectedObjects] count] == 1 && ![[[commandBundleTreeController selectedObjects] objectAtIndex:0] objectForKey:kChildrenKey]); } @@ -1508,7 +1510,6 @@ } return YES; - } #pragma mark - @@ -1675,18 +1676,8 @@ doGroupDueToChars = YES; } -@end - -#pragma mark - - -@implementation SPBundleEditorController (PrivateAPI) - - (void)_initTree { - - [showHideMetaButton setState:NSOffState]; - [self _enableMetaDataInput:NO]; - // Re-init commandBundleTree [[[commandBundleTree objectForKey:kChildrenKey] objectAtIndex:kInputFieldScopeArrayIndex] setObject:[NSMutableArray array] forKey:kChildrenKey]; [[[commandBundleTree objectForKey:kChildrenKey] objectAtIndex:kDataTableScopeArrayIndex] setObject:[NSMutableArray array] forKey:kChildrenKey]; @@ -1814,7 +1805,7 @@ [commandsOutlineView expandItem:[commandsOutlineView itemAtRow:0] expandChildren:NO]; [self _updateBundleDataView]; - [self _enableBundleDataInput:NO]; + [self _enableBundleDataInput:NO bundleEnabled:NO]; } /** @@ -1822,7 +1813,6 @@ */ - (void)_updateBundleDataView { - NSInteger anIndex; if([commandsOutlineView selectedRow] < 0) return; @@ -1963,6 +1953,9 @@ [fallbackLabelField setHidden:YES]; } + // Update the bundle summary text + [self _updateBundleMetaSummary]; + // Validate add and remove bundle button in left bar [removeButton setEnabled:([[commandBundleTreeController selectedObjects] count] == 1 && ![[[commandBundleTreeController selectedObjects] objectAtIndex:0] objectForKey:kChildrenKey])]; [addButton setEnabled:([[commandBundleTreeController selectionIndexPath] length] > 1)]; @@ -1970,6 +1963,29 @@ } /** + * Update the bundle meta summary text + */ +- (void)_updateBundleMetaSummary +{ + NSDictionary *currentDict = [self _currentSelectedObject]; + if (!currentDict) { + [metaInfoSummary setStringValue:@""]; + return; + } + + NSMutableString *metaString = [[[NSMutableString alloc] init] autorelease]; + if ([currentDict objectForKey:@"author"]) { + [metaString appendFormat:@"(%@) ", [currentDict objectForKey:@"author"]]; + } else if ([currentDict objectForKey:@"contact"]) { + [metaString appendFormat:@"(%@) ", [currentDict objectForKey:@"contact"]]; + } + + if ([currentDict objectForKey:@"description"]) [metaString appendString:[currentDict objectForKey:@"description"]]; + + [metaInfoSummary setStringValue:metaString]; +} + +/** * Return the current selected object as NSDictionary */ - (id)_currentSelectedObject @@ -1990,7 +2006,6 @@ */ - (NSUInteger)_arrangedScopeIndexForScopeIndex:(NSUInteger)scopeIndex { - NSString *unsortedBundleName = [[[commandBundleTree objectForKey:kChildrenKey] objectAtIndex:scopeIndex] objectForKey:kBundleNameKey]; if(!unsortedBundleName || ![unsortedBundleName length]) return scopeIndex; @@ -2005,7 +2020,6 @@ } return k; - } /** @@ -2013,7 +2027,6 @@ */ - (NSUInteger)_scopeIndexForArrangedScopeIndex:(NSUInteger)scopeIndex { - NSString *bName = [[[[[[[commandBundleTreeController arrangedObjects] childNodes] objectAtIndex:0] childNodes] objectAtIndex:scopeIndex] representedObject] objectForKey:kBundleNameKey]; NSUInteger k = 0; for(id i in [commandBundleTree objectForKey:kChildrenKey]) { @@ -2027,40 +2040,29 @@ /** * Enable / disable data input */ -- (void)_enableBundleDataInput:(BOOL)enabled -{ - [nameTextField setEnabled:enabled]; - [inputPopupButton setEnabled:enabled]; - [inputFallbackPopupButton setEnabled:enabled]; - [scopePopupButton setEnabled:enabled]; - [commandTextView setEditable:enabled]; - [outputPopupButton setEnabled:enabled]; - [triggerPopupButton setEnabled:enabled]; - [disabledCheckbox setEnabled:enabled]; - [keyEquivalentField setEnabled:enabled]; - [categoryTextField setEnabled:enabled]; - [tooltipTextField setEnabled:enabled]; +- (void)_enableBundleDataInput:(BOOL)enabled bundleEnabled:(BOOL)bundleEnabled +{ + + // Most of the interface requires both a bundle selected and enabled + BOOL enableInterface = enabled && bundleEnabled; + [nameTextField setEnabled:enableInterface]; + [inputPopupButton setEnabled:enableInterface]; + [inputFallbackPopupButton setEnabled:enableInterface]; + [scopePopupButton setEnabled:enableInterface]; + [commandTextView setEditable:enableInterface]; + [outputPopupButton setEnabled:enableInterface]; + [triggerPopupButton setEnabled:enableInterface]; + [keyEquivalentField setEnabled:enableInterface]; + [categoryTextField setEnabled:enableInterface]; + [tooltipTextField setEnabled:enableInterface]; + + // Always leave the meta fields enabled, and the disabled checkbox. [authorTextField setEnabled:enabled]; [contactTextField setEnabled:enabled]; [descriptionTextView setEditable:enabled]; -} + [displayMetaInfoButton setEnabled:enabled]; -/** - * Enable / disable meta input - */ -- (void)_enableMetaDataInput:(BOOL)enabled -{ - [commandTextView setHidden:enabled]; - [disabledCheckbox setHidden:enabled]; - [commandLabelField setHidden:enabled]; - [commandScrollView setHidden:enabled]; - [authorLabelField setHidden:!enabled]; - [contactLabelField setHidden:!enabled]; - [descriptionLabelField setHidden:!enabled]; - [descriptionTextView setHidden:!enabled]; - [authorTextField setHidden:!enabled]; - [contactTextField setHidden:!enabled]; - [descriptionScrollView setHidden:!enabled]; + [disabledCheckbox setEnabled:enabled]; } /** @@ -2117,5 +2119,12 @@ return returnIndex; } +- (void)_metaSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [sheet makeFirstResponder:nil]; + + [self _updateBundleMetaSummary]; +} + @end |