aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/SPFieldEditor.h58
-rw-r--r--Source/SPFieldEditorController.h73
-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