diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/SPFieldEditor.h | 58 | ||||
-rw-r--r-- | Source/SPFieldEditorController.h | 73 | ||||
-rw-r--r-- | Source/SPFieldEditorController.m (renamed from Source/SPFieldEditor.m) | 297 |
3 files changed, 237 insertions, 191 deletions
diff --git a/Source/SPFieldEditor.h b/Source/SPFieldEditor.h deleted file mode 100644 index 1271b483..00000000 --- a/Source/SPFieldEditor.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// SPFieldEditor.h -// sequel-pro -// -// Created by Bibiko on 25.06.09. -// Copyright 2009 __MyCompanyName__. All rights reserved. -// - -#import <Cocoa/Cocoa.h> - - -@interface SPFieldEditor : NSWindow { - - IBOutlet id editSheetProgressBar; - IBOutlet id editSheetSegmentControl; - IBOutlet id editSheetQuickLookButton; - IBOutlet id editImage; - IBOutlet id editTextView; - IBOutlet id hexTextView; - IBOutlet id editTextScrollView; - IBOutlet id hexTextScrollView; - - id sheetEditData; - - NSString *stringValue; - - BOOL editSheetWillBeInitialized; - BOOL isBlob; - int quickLookCloseMarker; - NSStringEncoding encoding; - - -} - -- (IBAction)closeEditSheet:(id)sender; -- (IBAction)openEditSheet:(id)sender; -- (IBAction)saveEditSheet:(id)sender; -- (IBAction)dropImage:(id)sender; -- (IBAction)segmentControllerChanged:(id)sender; -- (IBAction)quickLookFormatButton:(id)sender; -- (IBAction)dropImage:(id)sender; - -- (void)initWithObject:(id)data usingEncoding:(NSStringEncoding)anEncoding isObjectBlob:(BOOL)isFieldBlob; - -- (void)processPasteImageData; -- (void)processUpdatedImageData:(NSData *)data; - -- (id)editData; - -- (void)invokeQuickLookOfType:(NSString *)type treatAsText:(BOOL)isText; -- (void)removeQuickLooksTempFile:(NSString*)aPath; - -- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector; -- (void)textViewDidChangeSelection:(NSNotification *)notification; - -- (void)clean; - -@end diff --git a/Source/SPFieldEditorController.h b/Source/SPFieldEditorController.h new file mode 100644 index 00000000..4867276f --- /dev/null +++ b/Source/SPFieldEditorController.h @@ -0,0 +1,73 @@ +// +// $Id: SPFieldEditorController.h 802 2009-06-03 20:46:57Z bibiko $ +// +// SPFieldEditorController.m +// sequel-pro +// +// Created by Hans-Jörg Bibiko on July 16, 2009 +// +// 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 <http://code.google.com/p/sequel-pro/> + +#import <Cocoa/Cocoa.h> + + +@interface SPFieldEditorController : NSWindowController { + + IBOutlet id editSheetProgressBar; + IBOutlet id editSheetSegmentControl; + IBOutlet id editSheetQuickLookButton; + IBOutlet id editImage; + IBOutlet id editTextView; + IBOutlet id hexTextView; + IBOutlet id editTextScrollView; + IBOutlet id hexTextScrollView; + IBOutlet id editSheet; + + id sheetEditData; + + NSString *stringValue; + + BOOL editSheetWillBeInitialized; + BOOL isBlob; + int quickLookCloseMarker; + NSStringEncoding encoding; + + +} + +- (IBAction)closeEditSheet:(id)sender; +- (IBAction)openEditSheet:(id)sender; +- (IBAction)saveEditSheet:(id)sender; +- (IBAction)dropImage:(id)sender; +- (IBAction)segmentControllerChanged:(id)sender; +- (IBAction)quickLookFormatButton:(id)sender; +- (IBAction)dropImage:(id)sender; + +- (id)editWithObject:(id)data usingEncoding:(NSStringEncoding)anEncoding isObjectBlob:(BOOL)isFieldBlob withWindow:(NSWindow *)tableWindow; + +- (void)processPasteImageData; +- (void)processUpdatedImageData:(NSData *)data; + +- (void)invokeQuickLookOfType:(NSString *)type treatAsText:(BOOL)isText; +- (void)removeQuickLooksTempFile:(NSString*)aPath; + +- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector; +- (void)textViewDidChangeSelection:(NSNotification *)notification; + +- (void)clean; + +@end diff --git a/Source/SPFieldEditor.m b/Source/SPFieldEditorController.m index e8ac915f..ed2f941e 100644 --- a/Source/SPFieldEditor.m +++ b/Source/SPFieldEditorController.m @@ -1,12 +1,28 @@ // -// SPFieldEditor.m +// $Id: SPFieldEditorController.m 802 2009-06-03 20:46:57Z bibiko $ +// +// SPFieldEditorController.m // sequel-pro // -// Created by Bibiko on 25.06.09. -// Copyright 2009 __MyCompanyName__. All rights reserved. +// Created by Hans-Jörg Bibiko on July 16, 2009 +// +// 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 <http://code.google.com/p/sequel-pro/> -#import "SPFieldEditor.h" +#import "SPFieldEditorController.h" #import "SPStringAdditions.h" #import "SPArrayAdditions.h" #import "SPTextViewAdditions.h" @@ -14,60 +30,69 @@ #import "QLPreviewPanel.h" -@implementation SPFieldEditor +@implementation SPFieldEditorController -// - (id) init -// { -// [self clean]; -// self = [super init]; -// return self; -// } +- (id) init +{ + if ((self = [super initWithWindowNibName:@"FieldEditorSheet"])) { + // force the nib to be loaded + (void) [self window]; + } + return self; + +} -- (void)initWithObject:(id)data usingEncoding:(NSStringEncoding)anEncoding isObjectBlob:(BOOL)isFieldBlob +- (void) dealloc { + [super dealloc]; +} +- (id)editWithObject:(id)data usingEncoding:(NSStringEncoding)anEncoding isObjectBlob:(BOOL)isFieldBlob withWindow:(NSWindow *)tableWindow +{ + [self clean]; - // hide all views in editSheet [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; [editImage setHidden:YES]; [editTextView setHidden:YES]; [editTextScrollView setHidden:YES]; - + editSheetWillBeInitialized = YES; - + encoding = anEncoding; - + isBlob = isFieldBlob; - + // sheetEditData = data; sheetEditData = [data copy]; - NSLog(@"bbb:%@", sheetEditData); - + // hide all views in editSheet [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; [editImage setHidden:YES]; [editTextView setHidden:YES]; [editTextScrollView setHidden:YES]; - + // Hide QuickLook button and text/iamge/hex control for text data [editSheetQuickLookButton setHidden:(!isBlob)]; [editSheetSegmentControl setHidden:(!isBlob)]; - + + [NSApp beginSheet:editSheet modalForWindow:tableWindow modalDelegate:self didEndSelector:nil contextInfo:nil]; + [editSheetProgressBar startAnimation:self]; + NSImage *image = nil; if ( [sheetEditData isKindOfClass:[NSData class]] ) { image = [[[NSImage alloc] initWithData:sheetEditData] autorelease]; - + // Set hex view to "" - load on demand only [hexTextView setString:@""]; stringValue = [[NSString alloc] initWithData:sheetEditData encoding:encoding]; if (stringValue == nil) stringValue = [[NSString alloc] initWithData:sheetEditData encoding:NSASCIIStringEncoding]; - + [hexTextView setHidden:NO]; [hexTextScrollView setHidden:NO]; [editImage setHidden:YES]; @@ -76,9 +101,9 @@ [editSheetSegmentControl setSelectedSegment:2]; } else { stringValue = [sheetEditData retain]; - + [hexTextView setString:@""]; - + [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; [editImage setHidden:YES]; @@ -86,10 +111,10 @@ [editTextScrollView setHidden:NO]; [editSheetSegmentControl setSelectedSegment:0]; } - + if (image) { [editImage setImage:image]; - + [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; [editImage setHidden:NO]; @@ -101,8 +126,7 @@ } if (stringValue) { [editTextView setString:stringValue]; - NSLog(@"tv:%@", [editTextView class]); - + if(image == nil) { [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; @@ -110,34 +134,48 @@ [editTextView setHidden:NO]; [editTextScrollView setHidden:NO]; [editSheetSegmentControl setSelectedSegment:0]; - } - + } + // Locate the caret in editTextView // (to select all takes a bit time for large data) [editTextView setSelectedRange:NSMakeRange(0,0)]; - + // Set focus if(image == nil) - [self makeFirstResponder:editTextView]; + [editSheet makeFirstResponder:editTextView]; else - [self makeFirstResponder:editImage]; - + [editSheet makeFirstResponder:editImage]; + [stringValue release]; } editSheetWillBeInitialized = NO; - + [editSheetProgressBar stopAnimation:self]; - - + + // wait for editSheet + int code = [NSApp runModalForWindow:editSheet]; + + [NSApp endSheet:editSheet]; + [editSheet orderOut:nil]; + + + // For safety reasons inform QuickLook to quit + quickLookCloseMarker = 1; + + if ( code ) return [sheetEditData autorelease]; + + [self clean]; + + return nil; } - (void)clean { [hexTextView setString:@""]; - [editTextView setString:@"AA"]; + [editTextView setString:@""]; [editImage setImage:nil]; if ( sheetEditData ) { [sheetEditData release]; @@ -145,13 +183,6 @@ } -- (id)editData -{ - NSLog(@"aa:%@", sheetEditData); - return [sheetEditData copy]; -} - - - (IBAction)closeEditSheet:(id)sender { [NSApp stopModalWithCode:[sender tag]]; @@ -164,11 +195,11 @@ if ( [panel runModal] == NSOKButton ) { NSString *fileName = [panel filename]; NSString *contents = nil; - + editSheetWillBeInitialized = YES; - + [editSheetProgressBar startAnimation:self]; - + // free old data if ( sheetEditData != nil ) { [sheetEditData release]; @@ -176,15 +207,15 @@ // load new data/images sheetEditData = [[NSData alloc] initWithContentsOfFile:fileName]; - + NSImage *image = [[NSImage alloc] initWithData:sheetEditData]; contents = [[NSString alloc] initWithData:sheetEditData encoding:encoding]; if (contents == nil) contents = [[NSString alloc] initWithData:sheetEditData encoding:NSASCIIStringEncoding]; - + // set the image preview, string contents and hex representation [editImage setImage:image]; - + if(contents) [editTextView setString:contents]; @@ -194,7 +225,7 @@ // Load hex data only if user has already displayed them if(![[hexTextView string] isEqualToString:@""]) [hexTextView setString:[sheetEditData dataToFormattedHexString]]; - + // If the image cell now contains a valid image, select the image view if (image) { [editSheetSegmentControl setSelectedSegment:1]; @@ -203,8 +234,8 @@ [editImage setHidden:NO]; [editTextView setHidden:YES]; [editTextScrollView setHidden:YES]; - - // Otherwise deselect the image view + + // Otherwise deselect the image view } else { [editSheetSegmentControl setSelectedSegment:0]; [hexTextView setHidden:YES]; @@ -229,34 +260,34 @@ { switch([sender selectedSegment]){ case 0: // text - [editTextView setHidden:NO]; - [editTextScrollView setHidden:NO]; - [editImage setHidden:YES]; - [hexTextView setHidden:YES]; - [hexTextScrollView setHidden:YES]; - // [self makeFirstResponder:editTextView]; - break; + [editTextView setHidden:NO]; + [editTextScrollView setHidden:NO]; + [editImage setHidden:YES]; + [hexTextView setHidden:YES]; + [hexTextScrollView setHidden:YES]; + // [self makeFirstResponder:editTextView]; + break; case 1: // image - [editTextView setHidden:YES]; - [editTextScrollView setHidden:YES]; - [editImage setHidden:NO]; - [hexTextView setHidden:YES]; - [hexTextScrollView setHidden:YES]; - // [self makeFirstResponder:editImage]; - break; + [editTextView setHidden:YES]; + [editTextScrollView setHidden:YES]; + [editImage setHidden:NO]; + [hexTextView setHidden:YES]; + [hexTextScrollView setHidden:YES]; + // [self makeFirstResponder:editImage]; + break; case 2: // hex - load on demand - if([sheetEditData length] && [[hexTextView string] isEqualToString:@""]) { - [editSheetProgressBar startAnimation:self]; - [hexTextView setString:[sheetEditData dataToFormattedHexString]]; - [editSheetProgressBar stopAnimation:self]; - } - [editTextView setHidden:YES]; - [editTextScrollView setHidden:YES]; - [editImage setHidden:YES]; - [hexTextView setHidden:NO]; - [hexTextScrollView setHidden:NO]; - // [self makeFirstResponder:hexTextView]; - break; + if([sheetEditData length] && [[hexTextView string] isEqualToString:@""]) { + [editSheetProgressBar startAnimation:self]; + [hexTextView setString:[sheetEditData dataToFormattedHexString]]; + [editSheetProgressBar stopAnimation:self]; + } + [editTextView setHidden:YES]; + [editTextScrollView setHidden:YES]; + [editImage setHidden:YES]; + [hexTextView setHidden:NO]; + [hexTextScrollView setHidden:NO]; + // [self makeFirstResponder:hexTextView]; + break; } } @@ -268,26 +299,26 @@ NSSavePanel *panel = [NSSavePanel savePanel]; if ( [panel runModal] == NSOKButton ) { - + [editSheetProgressBar startAnimation:self]; - + NSString *fileName = [panel filename]; // Write binary field types directly to the file //// || [editSheetBinaryButton state] == NSOnState if ( [sheetEditData isKindOfClass:[NSData class]] ) { [sheetEditData writeToFile:fileName atomically:YES]; - - // Write other field types' representations to the file via the current encoding + + // Write other field types' representations to the file via the current encoding } else { [[sheetEditData description] writeToFile:fileName - atomically:YES - encoding:encoding - error:NULL]; + atomically:YES + encoding:encoding + error:NULL]; } - + [editSheetProgressBar stopAnimation:self]; - + } } @@ -315,34 +346,34 @@ */ - (void)invokeQuickLookOfType:(NSString *)type treatAsText:(BOOL)isText { - + // Load private framework if([[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/QuickLookUI.framework"] load]) { - + [editSheetProgressBar startAnimation:self]; - + // Create a temporary file name to store the data as file // since QuickLook only works on files. NSString *tmpFileName = [NSString stringWithFormat:@"/tmp/SequelProQuickLook.%@", type]; - + // if data are binary if ( [sheetEditData isKindOfClass:[NSData class]] || !isText) { [sheetEditData writeToFile:tmpFileName atomically:YES]; - - // write other field types' representations to the file via the current encoding + + // write other field types' representations to the file via the current encoding } else { [[sheetEditData description] writeToFile:tmpFileName - atomically:YES - encoding:encoding - error:NULL]; + atomically:YES + encoding:encoding + error:NULL]; } - + id ql = [NSClassFromString(@"QLPreviewPanel") sharedPreviewPanel]; - + // Init QuickLook [[ql delegate] setDelegate:self]; [ql setURLs:[NSArray arrayWithObject: - [NSURL fileURLWithPath:tmpFileName]] currentIndex:0 preservingDisplayState:YES]; + [NSURL fileURLWithPath:tmpFileName]] currentIndex:0 preservingDisplayState:YES]; // TODO: No interaction with iChat and iPhoto due to .scriptSuite warning: // for superclass of class 'MainController' in suite 'Sequel Pro': 'NSCoreSuite.NSAbstractObject' is not a valid class name. [ql setShowsAddToiPhotoButton:NO]; @@ -353,12 +384,12 @@ [ql setEnableDragNDrop:NO]; // Order out QuickLook with animation effect according to self:previewPanel:frameForURL: [ql makeKeyAndOrderFrontWithEffect:2]; // 1 = fade in - + // quickLookCloseMarker == 1 break the modal session quickLookCloseMarker = 0; - + [editSheetProgressBar stopAnimation:self]; - + // Run QuickLook in its own modal seesion for event handling NSModalSession session = [NSApp beginModalSessionForWindow:ql]; for (;;) { @@ -368,11 +399,11 @@ || ![ql isVisible]) break; [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; - + beforeDate:[NSDate distantFuture]]; + } [NSApp endModalSession:session]; - + // Remove temp file after closing the sheet to allow double-click event at the QuickLook preview. // The afterDelay: time is a kind of dummy, because after double-clicking the model session loop // will break (ql not visible) and returns the event handling back to the editSheet which by itself @@ -380,9 +411,9 @@ [self performSelector:@selector(removeQuickLooksTempFile:) withObject:tmpFileName afterDelay:2]; // [[NSFileManager defaultManager] removeItemAtPath:tmpFileName error:NULL]; - + } - + } - (void)removeQuickLooksTempFile:(NSString*)aPath @@ -395,49 +426,49 @@ // If an empty frame is returned then the panel will fade in/out instead - (NSRect)previewPanel:(NSPanel*)panel frameForURL:(NSURL*)URL { - + // Close modal session defined in invokeQuickLookOfType: // if user closes the QuickLook view quickLookCloseMarker = 1; - + // 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); - + mwf.origin.x+mwf.size.width/2, + mwf.origin.y+mwf.size.height/2, + 5, 5); + } -(void)processPasteImageData { editSheetWillBeInitialized = YES; - + NSImage *image = nil; image = [[[NSImage alloc] initWithPasteboard:[NSPasteboard generalPasteboard]] autorelease]; if (image) { - + if (nil != sheetEditData) [sheetEditData release]; - + [editImage setImage:image]; - + sheetEditData = [[NSData alloc] initWithData:[image TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1]]; - + NSString *contents = [[NSString alloc] initWithData:sheetEditData encoding:encoding]; if (contents == nil) contents = [[NSString alloc] initWithData:sheetEditData encoding:NSASCIIStringEncoding]; - + // Set the string contents and hex representation if(contents) [editTextView setString:contents]; if(![[hexTextView string] isEqualToString:@""]) [hexTextView setString:[sheetEditData dataToFormattedHexString]]; - + [contents release]; } - + editSheetWillBeInitialized = NO; } /* @@ -446,11 +477,11 @@ */ - (void)processUpdatedImageData:(NSData *)data { - + editSheetWillBeInitialized = YES; - + if (nil != sheetEditData) [sheetEditData release]; - + // If the image was not processed, set a blank string as the contents of the edit and hex views. if ( data == nil ) { sheetEditData = [[NSData alloc] init]; @@ -459,13 +490,13 @@ editSheetWillBeInitialized = NO; return; } - + // Process the provided image sheetEditData = [[NSData alloc] initWithData:data]; NSString *contents = [[NSString alloc] initWithData:data encoding:encoding]; if (contents == nil) contents = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; - + // Set the string contents and hex representation if(contents) [editTextView setString:contents]; @@ -478,7 +509,7 @@ - (IBAction)dropImage:(id)sender { - + // If the image was deleted, set a blank string as the contents of the edit and hex views. // The actual dropped image processing is handled by processUpdatedImageData:. if ( [editImage image] == nil ) { @@ -495,11 +526,11 @@ 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:@""]; @@ -511,7 +542,7 @@ // set edit data to text sheetEditData = [[editTextView string] retain]; - + } // TextView delegate methods |