From 954b41eb8fd513513abca607f710d2688202fe1e Mon Sep 17 00:00:00 2001 From: Bibiko Date: Sat, 20 Nov 2010 10:36:54 +0000 Subject: =?UTF-8?q?=E2=80=A2=20added=20SPBundleCommandTextView=20and=20use?= =?UTF-8?q?=20it=20instead=20of=20SPEditSheetTextVIew=20since=20it=20works?= =?UTF-8?q?=20in=20a=20sheet=20only=20and=20due=20to=20future=20extensions?= =?UTF-8?q?=20=E2=80=A2=20fixed=20init=20in=20SPEditSheetTextView=20?= =?UTF-8?q?=E2=80=A2=20Bundle=20Editor:=20minor=20bug=20fixing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Interfaces/English.lproj/BundleEditor.xib | 56 +++-- Source/SPBundleCommandTextView.h | 34 +++ Source/SPBundleCommandTextView.m | 360 ++++++++++++++++++++++++++++++ Source/SPBundleEditorController.h | 2 +- Source/SPBundleEditorController.m | 4 +- Source/SPEditSheetTextView.h | 2 +- Source/SPEditSheetTextView.m | 13 +- sequel-pro.xcodeproj/project.pbxproj | 6 + 8 files changed, 449 insertions(+), 28 deletions(-) create mode 100644 Source/SPBundleCommandTextView.h create mode 100644 Source/SPBundleCommandTextView.m diff --git a/Interfaces/English.lproj/BundleEditor.xib b/Interfaces/English.lproj/BundleEditor.xib index 67caca4a..fc95329a 100644 --- a/Interfaces/English.lproj/BundleEditor.xib +++ b/Interfaces/English.lproj/BundleEditor.xib @@ -1396,22 +1396,6 @@ 853 - - - value: selection.command - - - - - - value: selection.command - value - selection.command - 2 - - - 863 - value: selection.name @@ -1752,6 +1736,30 @@ 925 + + + value: selection.command + + + + + + value: selection.command + value + selection.command + 2 + + + 927 + + + + delegate + + + + 929 + @@ -2502,9 +2510,9 @@ YES com.apple.InterfaceBuilder.CocoaPlugin - {{218, 278}, {655, 444}} + {{251, 39}, {655, 444}} com.apple.InterfaceBuilder.CocoaPlugin - {{218, 278}, {655, 444}} + {{251, 39}, {655, 444}} {726, 444} @@ -2720,7 +2728,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - SPEditSheetTextView + SPBundleCommandTextView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2759,7 +2767,7 @@ - 925 + 929 @@ -2893,6 +2901,14 @@ YES + + SPBundleCommandTextView + NSTextView + + IBDocumentRelativeSource + ../../Source/SPBundleCommandTextView.h + + SPBundleEditorController NSWindowController diff --git a/Source/SPBundleCommandTextView.h b/Source/SPBundleCommandTextView.h new file mode 100644 index 00000000..e39ec1dd --- /dev/null +++ b/Source/SPBundleCommandTextView.h @@ -0,0 +1,34 @@ +// +// $Id$ +// +// SPBundleCommandTextView.h +// sequel-pro +// +// Created by Hans-Jörg Bibiko on Nov 19, 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at + +@interface SPBundleCommandTextView : NSTextView +{ + BOOL textWasChanged; +} + +- (NSUInteger)characterIndexOfPoint:(NSPoint)aPoint; +- (void)insertFileContentOfFile:(NSString *)aPath; +- (void)saveChangedFontInUserDefaults; + +@end diff --git a/Source/SPBundleCommandTextView.m b/Source/SPBundleCommandTextView.m new file mode 100644 index 00000000..a840101a --- /dev/null +++ b/Source/SPBundleCommandTextView.m @@ -0,0 +1,360 @@ +// +// $Id$ +// +// SPBundleCommandTextView.m +// sequel-pro +// +// Created by Hans-Jörg Bibiko on Nov, 19 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at + +#import "SPBundleCommandTextView.h" +#import "SPTextViewAdditions.h" +#import "SPBundleEditorController.h" + +@implementation SPBundleCommandTextView + +- (id)init +{ + if(self = [super init]) + { + ; + } + return self; +} + +- (IBAction)undo:(id)sender +{ + textWasChanged = NO; + [[self undoManager] undo]; + // Due to the undoManager implementation it could happen that + // an action will be recoreded which actually didn't change the + // text buffer. That's why repeat undo. + if(!textWasChanged) [[self undoManager] undo]; + if(!textWasChanged) [[self undoManager] undo]; +} + +- (IBAction)redo:(id)sender +{ + textWasChanged = NO; + [[self undoManager] redo]; + // Due to the undoManager implementation it could happen that + // an action will be recoreded which actually didn't change the + // text buffer. That's why repeat redo. + if(!textWasChanged) [[self undoManager] redo]; + if(!textWasChanged) [[self undoManager] redo]; +} + +- (IBAction)paste:(id)sender +{ + // Try to create an undo group + if([[self delegate] respondsToSelector:@selector(setWasCutPaste)]) + [[self delegate] setWasCutPaste]; + [super paste:sender]; +} + +- (IBAction)cut:(id)sender +{ + // Try to create an undo group + if([[self delegate] respondsToSelector:@selector(setWasCutPaste)]) + [[self delegate] setWasCutPaste]; + [super cut:sender]; +} + +/** + * Validate undo and redo menu items + */ +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem +{ + + if ([menuItem action] == @selector(undo:)) { + return ([[self undoManager] canUndo]); + } + if ([menuItem action] == @selector(redo:)) { + return ([[self undoManager] canRedo]); + } + return YES; +} + +- (void)textDidChange:(NSNotification *)aNotification +{ + textWasChanged = YES; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + + long allFlags = (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask); + + // Check if user pressed ⌥ to allow composing of accented characters. + // e.g. for US keyboard "⌥u a" to insert ä + // or for non-US keyboards to allow to enter dead keys + // e.g. for German keyboard ` is a dead key, press space to enter ` + if (([theEvent modifierFlags] & allFlags) == NSAlternateKeyMask || [[theEvent characters] length] == 0) + { + [super keyDown: theEvent]; + return; + } + + NSString *charactersIgnMod = [theEvent charactersIgnoringModifiers]; + long curFlags = ([theEvent modifierFlags] & allFlags); + + if(curFlags & NSCommandKeyMask) { + if([charactersIgnMod isEqualToString:@"+"] || [charactersIgnMod isEqualToString:@"="]) // increase text size by 1; ⌘+ and numpad + + { + [self makeTextSizeLarger]; + [self saveChangedFontInUserDefaults]; + return; + } + if([charactersIgnMod isEqualToString:@"-"]) // decrease text size by 1; ⌘- and numpad - + { + [self makeTextSizeSmaller]; + [self saveChangedFontInUserDefaults]; + return; + } + } + + // Allow undo grouping if user typed a ' ' (for word level undo) + // or a RETURN but not for each char due to writing speed + if([charactersIgnMod isEqualToString:@" "] + || [theEvent keyCode] == 36 + || [theEvent modifierFlags] & (NSCommandKeyMask|NSControlKeyMask|NSAlternateKeyMask) + ) { + [[self delegate] setDoGroupDueToChars]; + } + + + if([[[[self delegate] class] description] isEqualToString:@"SPBundleEditorController"]) { + [super keyDown: theEvent]; + return; + } + + // Check for assign key equivalents inside user-defined bundle commands + NSDictionary *keyEquivalents = [[NSApp delegate] bundleKeyEquivalentsForScope:SPBundleScopeInputField]; + if([keyEquivalents count]) { + for(NSString* key in [keyEquivalents allKeys]) { + NSArray *keyData = [keyEquivalents objectForKey:key]; + if([[keyData objectAtIndex:0] isEqualToString:charactersIgnMod] && [[[keyEquivalents objectForKey:key] objectAtIndex:1] intValue] == curFlags) { + NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease]; + [item setToolTip:[[keyEquivalents objectForKey:key] objectAtIndex:2]]; + [item setTag:0]; + [self executeBundleItemForInputField:item]; + return; + } + } + } + + [super keyDown: theEvent]; + +} + +/* + * Insert the content of a dragged file path or if ⌘ is pressed + * while dragging insert the file path + */ +- (BOOL)performDragOperation:(id )sender +{ + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ( [[pboard types] containsObject:NSFilenamesPboardType] && [[pboard types] containsObject:@"CorePasteboardFlavorType 0x54455854"]) + return [super performDragOperation:sender]; + + + if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { + NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; + + // Only one file path is allowed + if([files count] > 1) { + NSLog(@"%@", NSLocalizedString(@"Only one dragged item allowed.",@"Only one dragged item allowed.")); + return YES; + } + + NSString *filepath = [[pboard propertyListForType:NSFilenamesPboardType] objectAtIndex:0]; + + // Set the new insertion point + NSPoint draggingLocation = [sender draggingLocation]; + draggingLocation = [self convertPoint:draggingLocation fromView:nil]; + NSUInteger characterIndex = [self characterIndexOfPoint:draggingLocation]; + [self setSelectedRange:NSMakeRange(characterIndex,0)]; + + // Check if user pressed ⌘ while dragging for inserting only the file path + if([sender draggingSourceOperationMask] == 4) + { + [self insertText:filepath]; + return YES; + } + + // Check size and NSFileType + NSDictionary *attr = [[NSFileManager defaultManager] fileAttributesAtPath:filepath traverseLink:YES]; + if(attr) + { + NSNumber *filesize = [attr objectForKey:NSFileSize]; + NSString *filetype = [attr objectForKey:NSFileType]; + if(filetype == NSFileTypeRegular && filesize) + { + // Ask for confirmation if file content is larger than 1MB + if([filesize unsignedLongValue] > 1000000) + { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")]; + [alert addButtonWithTitle:NSLocalizedString(@"Cancel", @"cancel button")]; + [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"Do you really want to proceed with %@ of data?", @"message of panel asking for confirmation for inserting large text from dragging action"), + [NSString stringForByteSize:[filesize longLongValue]]]]; + [alert setHelpAnchor:filepath]; + [alert setMessageText:NSLocalizedString(@"Warning", @"warning")]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert beginSheetModalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(dragAlertSheetDidEnd:returnCode:contextInfo:) + contextInfo:nil]; + [alert release]; + + } else + [self insertFileContentOfFile:filepath]; + } + } + return YES; + } + + return [super performDragOperation:sender]; +} + +/* + * Confirmation sheetDidEnd method + */ +- (void)dragAlertSheetDidEnd:(NSAlert *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + + [[sheet window] orderOut:nil]; + if ( returnCode == NSAlertFirstButtonReturn ) + [self insertFileContentOfFile:[sheet helpAnchor]]; + +} +/* + * Convert a NSPoint, usually the mouse location, to + * a character index of the text view. + */ +- (NSUInteger)characterIndexOfPoint:(NSPoint)aPoint +{ + NSUInteger glyphIndex; + NSLayoutManager *layoutManager = [self layoutManager]; + CGFloat fraction; + NSRange range; + + range = [layoutManager glyphRangeForTextContainer:[self textContainer]]; + glyphIndex = [layoutManager glyphIndexForPoint:aPoint + inTextContainer:[self textContainer] + fractionOfDistanceThroughGlyph:&fraction]; + if( fraction > 0.5 ) glyphIndex++; + + if( glyphIndex == NSMaxRange(range) ) + return [[self textStorage] length]; + else + return [layoutManager characterIndexForGlyphAtIndex:glyphIndex]; + +} + +/* + * Insert content of a plain text file for a given path. + * In addition it tries to figure out the file's text encoding heuristically. + */ +- (void)insertFileContentOfFile:(NSString *)aPath +{ + + NSError *err = nil; + NSStringEncoding enc; + NSString *content = nil; + + // Make usage of the UNIX command "file" to get an info + // about file type and encoding. + NSTask *task=[[NSTask alloc] init]; + NSPipe *pipe=[[NSPipe alloc] init]; + NSFileHandle *handle; + NSString *result; + [task setLaunchPath:@"/usr/bin/file"]; + [task setArguments:[NSArray arrayWithObjects:aPath, @"-Ib", nil]]; + [task setStandardOutput:pipe]; + handle=[pipe fileHandleForReading]; + [task launch]; + result=[[NSString alloc] initWithData:[handle readDataToEndOfFile] + encoding:NSASCIIStringEncoding]; + + [pipe release]; + [task release]; + + // UTF16/32 files are detected as application/octet-stream resp. audio/mpeg + if( [result hasPrefix:@"text/plain"] + || [[[aPath pathExtension] lowercaseString] isEqualToString:SPFileExtensionSQL] + || [[[aPath pathExtension] lowercaseString] isEqualToString:@"txt"] + || [result hasPrefix:@"audio/mpeg"] + || [result hasPrefix:@"application/octet-stream"] + ) + { + // if UTF16/32 cocoa will try to find the correct encoding + if([result hasPrefix:@"application/octet-stream"] || [result hasPrefix:@"audio/mpeg"] || [result rangeOfString:@"utf-16"].length) + enc = 0; + else if([result rangeOfString:@"utf-8"].length) + enc = NSUTF8StringEncoding; + else if([result rangeOfString:@"iso-8859-1"].length) + enc = NSISOLatin1StringEncoding; + else if([result rangeOfString:@"us-ascii"].length) + enc = NSASCIIStringEncoding; + else + enc = 0; + + if(enc == 0) // cocoa tries to detect the encoding + content = [NSString stringWithContentsOfFile:aPath usedEncoding:&enc error:&err]; + else + content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err]; + + if(content) + { + [self insertText:content]; + [result release]; + return; + } + // If UNIX "file" failed try cocoa's encoding detection + content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err]; + if(content) + { + [self insertText:content]; + [result release]; + return; + } + } + + [result release]; + + NSLog(@"%@ ‘%@’.", NSLocalizedString(@"Couldn't read the file content of", @"Couldn't read the file content of"), aPath); +} + +// Store the font in the prefs for selected delegates only +- (void)saveChangedFontInUserDefaults +{ + if([[[[self delegate] class] description] isEqualToString:@"SPBundleEditorController"]) + [[NSUserDefaults standardUserDefaults] setObject:[NSArchiver archivedDataWithRootObject:[self font]] forKey:@"FieldEditorSheetFont"]; +} + +// Action receiver for a font change in the font panel +- (void)changeFont:(id)sender +{ + NSFont *nf = [[NSFontPanel sharedFontPanel] panelConvertFont:[self font]]; + [self setFont:nf]; + [self saveChangedFontInUserDefaults]; +} + +@end diff --git a/Source/SPBundleEditorController.h b/Source/SPBundleEditorController.h index 5ab3a534..eca5659f 100644 --- a/Source/SPBundleEditorController.h +++ b/Source/SPBundleEditorController.h @@ -24,7 +24,7 @@ #import #import -#import "SPEditSheetTextView.h" +#import "SPBundleCommandTextView.h" @class SRRecorderControl; diff --git a/Source/SPBundleEditorController.m b/Source/SPBundleEditorController.m index 378d3b5e..829cff3e 100644 --- a/Source/SPBundleEditorController.m +++ b/Source/SPBundleEditorController.m @@ -85,8 +85,6 @@ - (void)awakeFromNib { - [commandTextView setDelegate:self]; - // Init all needed menus inputEditorScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; inputInputFieldScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; @@ -613,7 +611,7 @@ if([scopes length]) [scopes appendString:@" "]; [scopes appendString:SPBundleScopeInputField]; } - if([bundle objectForKey:SPBundleScopeDataTable] && [[bundle objectForKey:SPBundleScopeInputField] intValue]) { + if([bundle objectForKey:SPBundleScopeDataTable] && [[bundle objectForKey:SPBundleScopeDataTable] intValue]) { if([scopes length]) [scopes appendString:@" "]; [scopes appendString:SPBundleScopeDataTable]; } diff --git a/Source/SPEditSheetTextView.h b/Source/SPEditSheetTextView.h index 63d06210..752e7911 100644 --- a/Source/SPEditSheetTextView.h +++ b/Source/SPEditSheetTextView.h @@ -1,5 +1,5 @@ // -// $Id: SPTextViewAdditions.m 866 2009-06-15 16:05:54Z bibiko $ +// $Id$ // // SPEditSheetTextView.h // sequel-pro diff --git a/Source/SPEditSheetTextView.m b/Source/SPEditSheetTextView.m index bd0c5a88..a333a850 100644 --- a/Source/SPEditSheetTextView.m +++ b/Source/SPEditSheetTextView.m @@ -1,5 +1,5 @@ // -// $Id: SPTextViewAdditions.m 866 2009-06-15 16:05:54Z bibiko $ +// $Id$ // // SPEditSheetTextView.m // sequel-pro @@ -28,6 +28,15 @@ @implementation SPEditSheetTextView +- (id)init +{ + if(self = [super init]) + { + ; + } + return self; +} + - (IBAction)undo:(id)sender { textWasChanged = NO; @@ -340,8 +349,6 @@ { if([[[[self delegate] class] description] isEqualToString:@"SPFieldEditorController"]) [[NSUserDefaults standardUserDefaults] setObject:[NSArchiver archivedDataWithRootObject:[self font]] forKey:@"FieldEditorSheetFont"]; - else if([[[[self delegate] class] description] isEqualToString:@"SPBundleEditorController"]) - [[NSUserDefaults standardUserDefaults] setObject:[NSArchiver archivedDataWithRootObject:[self font]] forKey:@"BundleEditorFont"]; } // Action receiver for a font change in the font panel diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 99c91a8b..d03f394d 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -382,6 +382,7 @@ BC0E14A1120AAC2E00E52E25 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 179ECEC611F265EE009C6A40 /* libbz2.dylib */; }; BC0E14A4120AAC5000E52E25 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 583CE52C11725642008F148E /* libz.dylib */; }; BC1847EA0FE6EC8400094BFB /* SPEditSheetTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1847E90FE6EC8400094BFB /* SPEditSheetTextView.m */; }; + BC1944D01297291800A236CD /* SPBundleCommandTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1944CF1297291800A236CD /* SPBundleCommandTextView.m */; }; BC1E55C4100DC92200AAE9F0 /* table-view-small-square.tiff in Resources */ = {isa = PBXBuildFile; fileRef = BC1E55C3100DC92200AAE9F0 /* table-view-small-square.tiff */; }; BC2777A011514B940034DF6A /* SPNavigatorController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC27779F11514B940034DF6A /* SPNavigatorController.m */; }; BC2898F3125F4488001B50E1 /* SPGeometryDataView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC2898F2125F4488001B50E1 /* SPGeometryDataView.m */; }; @@ -1094,6 +1095,8 @@ BC05F1C4101241DF008A97F8 /* YRKSpinningProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YRKSpinningProgressIndicator.m; sourceTree = ""; }; BC1847E80FE6EC8400094BFB /* SPEditSheetTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPEditSheetTextView.h; sourceTree = ""; }; BC1847E90FE6EC8400094BFB /* SPEditSheetTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPEditSheetTextView.m; sourceTree = ""; }; + BC1944CE1297291800A236CD /* SPBundleCommandTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPBundleCommandTextView.h; sourceTree = ""; }; + BC1944CF1297291800A236CD /* SPBundleCommandTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPBundleCommandTextView.m; sourceTree = ""; }; BC1E55C3100DC92200AAE9F0 /* table-view-small-square.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-view-small-square.tiff"; sourceTree = ""; }; BC27779E11514B940034DF6A /* SPNavigatorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPNavigatorController.h; sourceTree = ""; }; BC27779F11514B940034DF6A /* SPNavigatorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPNavigatorController.m; sourceTree = ""; }; @@ -1786,6 +1789,8 @@ 17DC8829126B337900E9AAEC /* Text Views */ = { isa = PBXGroup; children = ( + BC1944CE1297291800A236CD /* SPBundleCommandTextView.h */, + BC1944CF1297291800A236CD /* SPBundleCommandTextView.m */, 17E641800EF01FA8001BC333 /* SPTextView.h */, 17E641810EF01FA8001BC333 /* SPTextView.m */, BC1847E80FE6EC8400094BFB /* SPEditSheetTextView.h */, @@ -3101,6 +3106,7 @@ 17D3C671128AD8160047709F /* SPSingleton.m in Sources */, 17D3C6D3128B1C900047709F /* SPFavoritesOutlineView.m in Sources */, BC68BFC7128D4EAE004907D9 /* SPBundleEditorController.m in Sources */, + BC1944D01297291800A236CD /* SPBundleCommandTextView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; -- cgit v1.2.3