From a343ff6aa7e5789cd0d35a28caace8e39959e777 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Sat, 13 Jun 2009 13:25:59 +0000 Subject: =?UTF-8?q?=E2=80=A2=20moved=20code=20for=20de/increasing=20font?= =?UTF-8?q?=20and=20drag&drop=20feature=20(content=20or=20while=20holding?= =?UTF-8?q?=20=E2=8C=98=20path)=20to=20SPTextViewAddition=20-=20two=20fing?= =?UTF-8?q?er=20zooming=20gesture=20is=20disabled=20for=20NSTableView=20ce?= =?UTF-8?q?lls=20-=20i.e.=20all=20NSTextViews=20including=20NSTableView=20?= =?UTF-8?q?cells=20inherit=20these=20feature=20=E2=80=A2=20simplified=20Qu?= =?UTF-8?q?ickLookFormat=20IBActions=20-=20added=20bin/text=20storing=20ty?= =?UTF-8?q?pe=20to=20each=20action=20=E2=80=A2=20QuickLook=20animation=20s?= =?UTF-8?q?et=20to=20SP's=20window=20middle=20point=20=E2=80=A2=20fixed=20?= =?UTF-8?q?issue=20that=20while=20having=20an=20image=20in=20editSheet=20a?= =?UTF-8?q?n=20attribute=20change=20(font/size)=20in=20the=20editTextView?= =?UTF-8?q?=20destroyed=20the=20image=20data=20=E2=80=A2=20fix=20to=20allo?= =?UTF-8?q?w=20again=20drag&drop=20an=20image=20to=20editSheet=20=E2=80=A2?= =?UTF-8?q?=20hide=20text/image/hex=20segment=20controll=20and=20QuickLook?= =?UTF-8?q?=20pull=20down=20button=20if=20user=20chose=20multipleLineEditi?= =?UTF-8?q?ngButton=20for=20non-blob=20fields=20=20=E2=80=A2=20disabled=20?= =?UTF-8?q?NSLog=20of=20print=20result=20in=20TableDocument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Interfaces/English.lproj/DBView.xib | 131 +++++++++------------ Source/CMTextView.h | 4 - Source/CMTextView.m | 214 ---------------------------------- Source/SPTextViewAdditions.h | 7 ++ Source/SPTextViewAdditions.m | 222 ++++++++++++++++++++++++++++++++++++ Source/TableContent.h | 16 +-- Source/TableContent.m | 109 ++++++++++-------- Source/TableDocument.m | 2 +- 8 files changed, 351 insertions(+), 354 deletions(-) diff --git a/Interfaces/English.lproj/DBView.xib b/Interfaces/English.lproj/DBView.xib index 2e26162a..52a9fe0c 100644 --- a/Interfaces/English.lproj/DBView.xib +++ b/Interfaces/English.lproj/DBView.xib @@ -8,6 +8,7 @@ 353.00 YES + YES @@ -6175,7 +6176,6 @@ 34 {{0, 36}, {667, 5}} - {0, 0} 67239424 @@ -6198,7 +6198,6 @@ 257 {{581, 7}, {66, 25}} - 1 YES @@ -6222,7 +6221,6 @@ 257 {{507, 7}, {66, 25}} - YES 67239424 @@ -6244,7 +6242,6 @@ 256 {{94, 7}, {66, 25}} - YES 67239424 @@ -6266,7 +6263,6 @@ 256 {{20, 7}, {66, 25}} - YES 67239424 @@ -6288,7 +6284,6 @@ 292 {{328, 7}, {48, 25}} - YES 71433792 @@ -6341,6 +6336,7 @@ 2147483647 _popUpItemAction: + 1 @@ -6351,6 +6347,7 @@ _popUpItemAction: + 2 @@ -6361,6 +6358,7 @@ _popUpItemAction: + 3 @@ -6371,6 +6369,7 @@ _popUpItemAction: + 4 @@ -6381,6 +6380,7 @@ _popUpItemAction: + 5 @@ -6391,6 +6391,7 @@ _popUpItemAction: + 6 @@ -6401,6 +6402,7 @@ _popUpItemAction: + 7 @@ -6411,10 +6413,12 @@ _popUpItemAction: + 8 + 9 YES 1 YES @@ -6427,7 +6431,6 @@ 292 {{183, 10}, {137, 19}} - YES -2080244224 @@ -6493,7 +6496,6 @@ {667, 14} - @@ -6542,7 +6544,6 @@ {667, 370} - @@ -6554,7 +6555,6 @@ -2147483392 {{220, 1}, {11, 141}} - 256 _doScroller: @@ -6565,7 +6565,6 @@ 256 {{-100, -100}, {87, 18}} - 257 _doScroller: @@ -6575,7 +6574,6 @@ {{0, 39}, {667, 370}} - 528 @@ -6599,7 +6597,6 @@ {{0, 39}, {667, 370}} - YES 270663168 @@ -6649,7 +6646,6 @@ {667, 14} - @@ -6715,7 +6711,6 @@ {667, 370} - @@ -6727,7 +6722,6 @@ -2147483392 {{639, 2}, {11, 359}} - 256 _doScroller: @@ -6738,7 +6732,6 @@ 256 {{-100, -100}, {87, 18}} - 257 _doScroller: @@ -6748,7 +6741,6 @@ {{0, 39}, {667, 370}} - 528 @@ -6761,7 +6753,6 @@ {{325, 220}, {32, 32}} - 28682 1.600000e+01 1.000000e+02 @@ -6771,7 +6762,6 @@ 10 {{0, 407}, {667, 5}} - {0, 0} 67239424 @@ -6792,7 +6782,6 @@ {667, 416} - {{0, 0}, {1440, 878}} {560, 222} @@ -16007,92 +15996,92 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 5966 - - quickLookAsImage: + + editSheetProgressBar - + - 5969 + 5985 - - quickLookAsPDF: + + editSheetQuickLookButton - + - 5970 + 5988 - quickLookAsMovie: + quickLookFormatButton: - + - 5973 + 5990 - quickLookAsWordDoc: + quickLookFormatButton: - + - 5976 + 5991 - quickLookAsRTF: + quickLookFormatButton: - + - 5977 + 5992 - quickLookAsSoundLinear: + quickLookFormatButton: - 5980 + 5993 - quickLookAsSoundM4A: + quickLookFormatButton: - + - 5982 + 5994 - quickLookAsSoundMP3: + quickLookFormatButton: - + - 5983 + 5995 - - editSheetProgressBar + + quickLookFormatButton: - + - 5985 + 5996 - quickLookAsHTML: + quickLookFormatButton: - + - 5987 + 5997 - - editSheetQuickLookButton + + quickLookFormatButton: - + - 5988 + 5998 @@ -22602,11 +22591,11 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 - + @@ -26003,7 +25992,7 @@ aGUgYWN0aXZlIHNlbGVjdGlvbiAo4oyl4oyYUik com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{503, 95}, {137, 173}} + {{384, 199}, {126, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -26024,8 +26013,8 @@ aGUgYWN0aXZlIHNlbGVjdGlvbiAo4oyl4oyYUik com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{230, 340}, {667, 416}} - {{230, 340}, {667, 416}} + {{67, 340}, {667, 416}} + {{67, 340}, {667, 416}} @@ -26276,7 +26265,7 @@ Y2hhbmdlIHRoZSBvcmRlcg - 5989 + 5998 @@ -27574,15 +27563,7 @@ Y2hhbmdlIHRoZSBvcmRlcg dropImage: filterTable: openEditSheet: - quickLookAsHTML: - quickLookAsImage: - quickLookAsMovie: - quickLookAsPDF: - quickLookAsRTF: - quickLookAsSoundLinear: - quickLookAsSoundM4A: - quickLookAsSoundMP3: - quickLookAsWordDoc: + quickLookFormatButton: reloadTable: reloadTableValues: removeRow: @@ -27611,14 +27592,6 @@ Y2hhbmdlIHRoZSBvcmRlcg id id id - id - id - id - id - id - id - id - id diff --git a/Source/CMTextView.h b/Source/CMTextView.h index 6c4da129..9b0d7659 100644 --- a/Source/CMTextView.h +++ b/Source/CMTextView.h @@ -77,10 +77,6 @@ - (unsigned int) getLineNumberForCharacterIndex:(unsigned int)anIndex; - (void) autoHelp; - (void) doSyntaxHighlighting; -- (void) insertFileContentOfFile:(NSString *)aPath; -- (unsigned int) characterIndexOfPoint:(NSPoint)aPoint; -- (void) makeTextSizeLarger; -- (void) makeTextSizeSmaller; - (void) setConnection:(CMMCPConnection *)theConnection withVersion:(int)majorVersion; - (void) doCompletion; - (NSArray *)suggestionsForSQLCompletionWith:(NSString *)currentWord dictMode:(BOOL)isDictMode; diff --git a/Source/CMTextView.m b/Source/CMTextView.m index 9c66b068..39c83977 100644 --- a/Source/CMTextView.m +++ b/Source/CMTextView.m @@ -1003,30 +1003,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) return [compl autorelease]; } -/* - * Increase the textView's font size by 1 - */ -- (void)makeTextSizeLarger -{ - NSFont *aFont = [self font]; - BOOL editableStatus = [self isEditable]; - [self setEditable:YES]; - [self setFont:[[NSFontManager sharedFontManager] convertFont:aFont toSize:[aFont pointSize]+1]]; - [self setEditable:editableStatus]; -} - -/* - * Decrease the textView's font size by 1 but not smaller than 4pt - */ -- (void)makeTextSizeSmaller -{ - NSFont *aFont = [self font]; - int newSize = ([aFont pointSize]-1 < 4) ? [aFont pointSize] : [aFont pointSize]-1; - BOOL editableStatus = [self isEditable]; - [self setEditable:YES]; - [self setFont:[[NSFontManager sharedFontManager] convertFont:aFont toSize:newSize]]; - [self setEditable:editableStatus]; -} /* * Hook to invoke the auto-uppercasing of SQL keywords after pasting @@ -2480,196 +2456,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) // Dragging methods /////////////////////////// -/* - * 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] ) { - 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.")); - NSBeep(); - return YES; - } - - NSString *filepath = [[pboard propertyListForType:NSFilenamesPboardType] objectAtIndex:0]; - - // Set the new insertion point - NSPoint draggingLocation = [sender draggingLocation]; - draggingLocation = [self convertPoint:draggingLocation fromView:nil]; - unsigned int 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 %.1f MB of data?", @"message of panel asking for confirmation for inserting large text from dragging action"), - [filesize unsignedLongValue]/1048576.0]]; - [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:(int)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. - */ -- (unsigned int)characterIndexOfPoint:(NSPoint)aPoint -{ - unsigned int glyphIndex; - NSLayoutManager *layoutManager = [self layoutManager]; - float 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:@"application/octet-stream"] || [result hasPrefix:@"audio/mpeg"] || [result hasPrefix:@"text/plain"] || [[[aPath pathExtension] lowercaseString] isEqualToString:@"sql"]) - { - // 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]; - [self insertText:@""]; // Invoke keyword uppercasing - 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]; - [self insertText:@""]; // Invoke keyword uppercasing - return; - } - } - - [result release]; - - NSLog(@"%@ ‘%@’.", NSLocalizedString(@"Couldn't read the file content of", @"Couldn't read the file content of"), aPath); - NSBeep(); -} - -#pragma mark - -#pragma mark multi-touch trackpad support - -/* - * Trackpad two-finger zooming gesture in/decreases the font size - */ -- (void) magnifyWithEvent:(NSEvent *)anEvent -{ - if([anEvent deltaZ]>5.0) - [self makeTextSizeLarger]; - else if([anEvent deltaZ]<-5.0) - [self makeTextSizeSmaller]; - - [self insertText:@""]; -} - (void) dealloc { diff --git a/Source/SPTextViewAdditions.h b/Source/SPTextViewAdditions.h index d1fa91d8..ccf865fb 100644 --- a/Source/SPTextViewAdditions.h +++ b/Source/SPTextViewAdditions.h @@ -41,4 +41,11 @@ - (IBAction)doTranspose:(id)sender; - (IBAction)doRemoveDiacritics:(id)sender; +- (void)makeTextSizeLarger; +- (void)makeTextSizeSmaller; + +- (unsigned int)characterIndexOfPoint:(NSPoint)aPoint; + +- (void)insertFileContentOfFile:(NSString *)aPath; + @end \ No newline at end of file diff --git a/Source/SPTextViewAdditions.m b/Source/SPTextViewAdditions.m index 34cbbab8..7e882dca 100644 --- a/Source/SPTextViewAdditions.m +++ b/Source/SPTextViewAdditions.m @@ -23,6 +23,7 @@ // More info at #import "SPStringAdditions.h" +#import "SPTextViewAdditions.h" @implementation NSTextView (SPTextViewAdditions) @@ -384,4 +385,225 @@ } } +/* + * 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] ) { + 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]; + unsigned int 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 %.1f MB of data?", @"message of panel asking for confirmation for inserting large text from dragging action"), + [filesize unsignedLongValue]/1048576.0]]; + [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:(int)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. + */ +- (unsigned int)characterIndexOfPoint:(NSPoint)aPoint +{ + unsigned int glyphIndex; + NSLayoutManager *layoutManager = [self layoutManager]; + float 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:@"application/octet-stream"] || [result hasPrefix:@"audio/mpeg"] || [result hasPrefix:@"text/plain"] || [[[aPath pathExtension] lowercaseString] isEqualToString:@"sql"]) + { + // 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]; + [self insertText:@""]; // Invoke keyword uppercasing + 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]; + [self insertText:@""]; // Invoke keyword uppercasing + return; + } + } + + [result release]; + + NSLog(@"%@ ‘%@’.", NSLocalizedString(@"Couldn't read the file content of", @"Couldn't read the file content of"), aPath); +} + +/* + * Increase the textView's font size by 1 + */ +- (void)makeTextSizeLarger +{ + NSFont *aFont = [self font]; + BOOL editableStatus = [self isEditable]; + [self setEditable:YES]; + [self setFont:[[NSFontManager sharedFontManager] convertFont:aFont toSize:[aFont pointSize]+1]]; + [self setEditable:editableStatus]; +} + +/* + * Decrease the textView's font size by 1 but not smaller than 4pt + */ +- (void)makeTextSizeSmaller +{ + NSFont *aFont = [self font]; + int newSize = ([aFont pointSize]-1 < 4) ? [aFont pointSize] : [aFont pointSize]-1; + BOOL editableStatus = [self isEditable]; + [self setEditable:YES]; + [self setFont:[[NSFontManager sharedFontManager] convertFont:aFont toSize:newSize]]; + [self setEditable:editableStatus]; +} + + +#pragma mark - +#pragma mark multi-touch trackpad support + +/* + * Trackpad two-finger zooming gesture in/decreases the font size + */ +- (void) magnifyWithEvent:(NSEvent *)anEvent +{ + + //Avoid font resizing for NSTextViews in CMCopyTable or NSTableView + if([[[[self delegate] class] description] isEqualToString:@"CMCopyTable"] + || [[[[self delegate] class] description] isEqualToString:@"NSTableView"]) return; + + if([anEvent deltaZ]>5.0) + [self makeTextSizeLarger]; + else if([anEvent deltaZ]<-5.0) + [self makeTextSizeSmaller]; + + [self insertText:@""]; +} + + @end diff --git a/Source/TableContent.h b/Source/TableContent.h index b440bf6a..7ac59148 100644 --- a/Source/TableContent.h +++ b/Source/TableContent.h @@ -168,6 +168,8 @@ int numRows, currentlyEditingRow, maxNumRowsOfCurrentTable; bool areShowingAllRows; + BOOL editSheetWillBeInitialized; + int quickLookCloseMarker; } @@ -191,19 +193,11 @@ - (IBAction)openEditSheet:(id)sender; - (IBAction)saveEditSheet:(id)sender; - (IBAction)segmentControllerChanged:(id)sender; -- (IBAction)quickLookAsMovie:(id)sender; -- (IBAction)quickLookAsSoundLinear:(id)sender; -- (IBAction)quickLookAsSoundM4A:(id)sender; -- (IBAction)quickLookAsSoundMP3:(id)sender; -- (IBAction)quickLookAsImage:(id)sender; -- (IBAction)quickLookAsPDF:(id)sender; -- (IBAction)quickLookAsWordDoc:(id)sender; -- (IBAction)quickLookAsRTF:(id)sender; -- (IBAction)quickLookAsHTML:(id)sender; -- (void)invokeQuickLookOfType:(NSString *)type; +- (IBAction)quickLookFormatButton:(id)sender; +- (void)invokeQuickLookOfType:(NSString *)type treatAsText:(BOOL)isText; - (void)processUpdatedImageData:(NSData *)data; - (IBAction)dropImage:(id)sender; -- (void)textDidChange:(NSNotification *)notification; +- (void)textViewDidChangeSelection:(NSNotification *)aNotification; - (NSString *)dataToHex:(NSData *)data; //getter methods diff --git a/Source/TableContent.m b/Source/TableContent.m index f75cef3e..eb36e9ba 100644 --- a/Source/TableContent.m +++ b/Source/TableContent.m @@ -37,6 +37,7 @@ #import "SPQueryConsole.h" #import "SPStringAdditions.h" #import "SPArrayAdditions.h" +#import "SPTextViewAdditions.h" @implementation TableContent @@ -951,6 +952,7 @@ NSString *fileName = [panel filename]; // Write binary field types directly to the file + //// || [editSheetBinaryButton state] == NSOnState if ( [editData isKindOfClass:[NSData class]] ) { [editData writeToFile:fileName atomically:YES]; @@ -970,47 +972,25 @@ #pragma mark - #pragma mark QuickLook -- (IBAction)quickLookAsWordDoc:(id)sender +- (IBAction)quickLookFormatButton:(id)sender { - [self invokeQuickLookOfType:@"doc"]; -} -- (IBAction)quickLookAsRTF:(id)sender -{ - [self invokeQuickLookOfType:@"rtf"]; -} -- (IBAction)quickLookAsMovie:(id)sender -{ - [self invokeQuickLookOfType:@"mov"]; -} -- (IBAction)quickLookAsSoundM4A:(id)sender -{ - [self invokeQuickLookOfType:@"m4a"]; -} -- (IBAction)quickLookAsSoundMP3:(id)sender -{ - [self invokeQuickLookOfType:@"mp3"]; -} -- (IBAction)quickLookAsSoundLinear:(id)sender -{ - [self invokeQuickLookOfType:@"wav"]; -} -- (IBAction)quickLookAsImage:(id)sender -{ - [self invokeQuickLookOfType:@"pict"]; -} -- (IBAction)quickLookAsPDF:(id)sender -{ - [self invokeQuickLookOfType:@"pdf"]; -} -- (IBAction)quickLookAsHTML:(id)sender -{ - [self invokeQuickLookOfType:@"html"]; + switch([sender tag]) { + case 0: [self invokeQuickLookOfType:@"pict" treatAsText:NO]; break; + case 1: [self invokeQuickLookOfType:@"m4a" treatAsText:NO]; break; + case 2: [self invokeQuickLookOfType:@"mp3" treatAsText:NO]; break; + case 3: [self invokeQuickLookOfType:@"wav" treatAsText:NO]; break; + case 4: [self invokeQuickLookOfType:@"mov" treatAsText:NO]; break; + case 5: [self invokeQuickLookOfType:@"pdf" treatAsText:NO]; break; + case 6: [self invokeQuickLookOfType:@"html" treatAsText:YES]; break; + case 7: [self invokeQuickLookOfType:@"doc" treatAsText:NO]; break; + case 8: [self invokeQuickLookOfType:@"rtf" treatAsText:YES]; break; + } } /* * Opens QuickLook for current data if QuickLook is available */ -- (void)invokeQuickLookOfType:(NSString *)type +- (void)invokeQuickLookOfType:(NSString *)type treatAsText:(BOOL)isText { // Load private framework @@ -1023,7 +1003,7 @@ NSString *tmpFileName = [NSString stringWithFormat:@"/tmp/SequelProQuickLook.%@", type]; // if data are binary - if ( [editData isKindOfClass:[NSData class]] ) { + if ( [editData isKindOfClass:[NSData class]] || !isText) { [editData writeToFile:tmpFileName atomically:YES]; // write other field types' representations to the file via the current encoding @@ -1083,11 +1063,13 @@ // if user closes the QuickLook view quickLookCloseMarker = 1; - // TODO get QuickLook's pulldown button's frame to zoom out/in from/into it - NSRect r = [editSheetQuickLookButton convertRectToBase:[editSheetQuickLookButton frame]]; - // tentative setting - r.origin.y=400; - return r; + // Return the App's middle point + NSRect mwf = [[NSApp mainWindow] frame]; + return NSMakeRect( + mwf.origin.x+mwf.size.width/2, + mwf.origin.y+mwf.size.height/2, + 5, 5); + } @@ -1112,7 +1094,8 @@ NSString *contents = [[NSString alloc] initWithData:data encoding:[CMMCPConnection encodingForMySQLEncoding:[[tableDocumentInstance connectionEncoding] UTF8String]]]; // Set the string contents and hex representation - [editTextView setString:contents]; + if(contents) + [editTextView setString:contents]; [hexTextView setString:[self dataToHex:editData]]; [contents release]; @@ -1132,11 +1115,16 @@ } } -- (void)textDidChange:(NSNotification *)notification +- (void)textViewDidChangeSelection:(NSNotification *)notification /* invoked when the user changes the string in the editSheet */ { + + // Do nothing if user really didn't changed text (e.g. for font size changing return) + if(editSheetWillBeInitialized || ([[[notification object] textStorage] changeInLength]==0)) + return; + // clear the image and hex (since i doubt someone can "type" a gif) [editImage setImage:nil]; [hexTextView setString:@""]; @@ -1148,6 +1136,7 @@ // set edit data to text editData = [[editTextView string] retain]; + } - (NSString *)dataToHex:(NSData *)data @@ -2232,8 +2221,11 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn } } + BOOL isBlob = [tableDataInstance columnIsBlobOrText:[aTableColumn identifier]]; // Open the sheet if the multipleLineEditingButton is enabled or the column was a blob or a text. - if ( [multipleLineEditingButton state] == NSOnState || [tableDataInstance columnIsBlobOrText:[aTableColumn identifier]] ) { + if ( [multipleLineEditingButton state] == NSOnState || isBlob ) { + + editSheetWillBeInitialized = YES; theValue = [[filteredResult objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier]]; NSImage *image = nil; @@ -2246,6 +2238,9 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn [editTextView setHidden:YES]; [editTextScrollView setHidden:YES]; + [editSheetQuickLookButton setHidden:(!isBlob)]; + [editSheetSegmentControl setHidden:(!isBlob)]; + // order out editSheet to inform the user that // SP is working [NSApp beginSheet:editSheet modalForWindow:tableWindow modalDelegate:self didEndSelector:nil contextInfo:nil]; @@ -2299,6 +2294,8 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn [editSheetProgressBar stopAnimation:self]; + editSheetWillBeInitialized = NO; + // wait for editSheet code = [NSApp runModalForWindow:editSheet]; @@ -2430,6 +2427,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn /** * Traps enter and return key and closes editSheet instead of inserting a linebreak when user hits return. + * Catch ⌘+ and ⌘- to de/increase font size of aTextView */ - (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector { @@ -2439,7 +2437,28 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn { [NSApp stopModalWithCode:1]; return YES; - } else { + } + else if([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) + { + // increase text size by 1; ⌘+ and numpad + + if([[[NSApp currentEvent] charactersIgnoringModifiers] isEqualToString:@"+"]) + { + [aTextView makeTextSizeLarger]; + return YES; + } + // decrease text size by 1; ⌘- and numpad - + else if([[[NSApp currentEvent] charactersIgnoringModifiers] isEqualToString:@"-"]) + { + [aTextView makeTextSizeSmaller]; + return YES; + } + else + { + return NO; + } + } + else + { return NO; } } diff --git a/Source/TableDocument.m b/Source/TableDocument.m index d2a24fd3..c797b530 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -241,7 +241,7 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum // Process the template and display the results. NSString *result = [engine processTemplateInFileAtPath:templatePath withVariables:print_data]; - NSLog(@"result %@", result); + //NSLog(@"result %@", result); return result; } -- cgit v1.2.3