aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPFieldEditorController.h3
-rw-r--r--Source/SPFieldEditorController.m48
-rw-r--r--Source/TableContent.m18
3 files changed, 63 insertions, 6 deletions
diff --git a/Source/SPFieldEditorController.h b/Source/SPFieldEditorController.h
index 76e8a86e..f7b669f4 100644
--- a/Source/SPFieldEditorController.h
+++ b/Source/SPFieldEditorController.h
@@ -49,6 +49,7 @@
NSString *tmpFileName;
int counter;
+ unsigned long long maxTextLength;
NSUserDefaults *prefs;
}
@@ -65,6 +66,8 @@
- (id)editWithObject:(id)data fieldName:(NSString*)fieldName usingEncoding:(NSStringEncoding)anEncoding
isObjectBlob:(BOOL)isFieldBlob isEditable:(BOOL)isEditable withWindow:(NSWindow *)tableWindow;
+- (void)setTextMaxLength:(unsigned long long)length;
+
- (void)processPasteImageData;
- (void)processUpdatedImageData:(NSData *)data;
diff --git a/Source/SPFieldEditorController.m b/Source/SPFieldEditorController.m
index 7b05c5fa..230a3861 100644
--- a/Source/SPFieldEditorController.m
+++ b/Source/SPFieldEditorController.m
@@ -28,6 +28,7 @@
#import "SPTextViewAdditions.h"
#import "SPDataAdditions.h"
#import "QLPreviewPanel.h"
+#import "SPDataCellFormatter.h"
@implementation SPFieldEditorController
@@ -37,6 +38,7 @@
// force the nib to be loaded
(void) [self window];
counter = 0;
+ maxTextLength = 0;
// Allow the user to enter cmd+return to close the edit sheet in addition to fn+return
[editSheetOkButton setKeyEquivalentModifierMask:NSCommandKeyMask];
@@ -51,6 +53,11 @@
[super dealloc];
}
+- (void)setTextMaxLength:(unsigned long long)length
+{
+ maxTextLength = length;
+}
+
- (id)editWithObject:(id)data fieldName:(NSString*)fieldName usingEncoding:(NSStringEncoding)anEncoding
isObjectBlob:(BOOL)isFieldBlob isEditable:(BOOL)isEditable withWindow:(NSWindow *)tableWindow
{
@@ -594,12 +601,51 @@
}
}
+#pragma mark -
+#pragma mark Delegates
+
+/*
+ Validate editTextView for max text length
+ */
+- (BOOL)textView:(NSTextView *)textView shouldChangeTextInRange:(NSRange)r replacementString:(NSString *)replacementString
+{
+ if(textView == editTextView && maxTextLength > 0) {
+
+ int newLength;
+
+ // Pure attribute changes are ok.
+ if (!replacementString) return YES;
+
+ // The exact change isn't known. Disallow the change to be safe.
+ if (r.location==NSNotFound) return NO;
+
+ // Calculate the length of the text after the change.
+ newLength=[[textView textStorage] length]+[replacementString length]-r.length;
+
+ // If it's too long, disallow the change.
+ // If the user pastes something into insert it partially to maxTextLength.
+ if (newLength>maxTextLength) {
+
+ if(maxTextLength-[[textView textStorage] length] < [replacementString length]) {
+ [textView insertText:[replacementString substringToIndex:maxTextLength-[[textView textStorage] length]]];
+ }
+ NSBeep();
+ return NO;
+ }
+
+ // Otherwise, allow it.
+ return YES;
+
+ }
+ return YES;
+}
+
/*
invoked when the user changes the string in the editSheet
*/
- (void)textViewDidChangeSelection:(NSNotification *)notification
{
-
+
// Do nothing if user really didn't changed text (e.g. for font size changing return)
if(editSheetWillBeInitialized || ([[[notification object] textStorage] changeInLength]==0))
return;
diff --git a/Source/TableContent.m b/Source/TableContent.m
index c0d77959..e94037f3 100644
--- a/Source/TableContent.m
+++ b/Source/TableContent.m
@@ -237,7 +237,7 @@
// Set the line break mode and an NSFormatter subclass which truncates long strings for display
[dataCell setLineBreakMode:NSLineBreakByTruncatingTail];
- //[dataCell setFormatter:[[SPDataCellFormatter new] autorelease]];
+ [dataCell setFormatter:[[SPDataCellFormatter new] autorelease]];
// Set field length limit if field is a varchar to match varchar length
if ([[columnDefinition objectForKey:@"typegrouping"] isEqualToString:@"string"]) {
@@ -1876,9 +1876,17 @@
* This function changes the text color of text/blob fields which are not yet loaded to gray
*/
- (void)tableView:(CMCopyTable *)aTableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn*)aTableColumn row:(int)row
-{
+{
+
+ // If user wants to edit 'cell' set text color to black and return to avoid
+ // writing in gray if value was NULL
+ if ( [aTableView editedColumn] == [[aTableColumn identifier] intValue] && [aTableView editedRow] == row) {
+ [cell setTextColor:[NSColor blackColor]];
+ return;
+ }
+
NSDictionary *column = NSArrayObjectAtIndex(dataColumns, [[aTableColumn identifier] intValue]);
-
+
// For NULL cell's display the user's NULL value placeholder in grey to easily distinguish it from other values
if ([cell respondsToSelector:@selector(setTextColor:)]) {
@@ -2139,7 +2147,7 @@
if ([multipleLineEditingButton state] == NSOnState || isBlob) {
SPFieldEditorController *fieldEditor = [[SPFieldEditorController alloc] init];
-
+ [fieldEditor setTextMaxLength:[[[aTableColumn dataCellForRow:rowIndex] formatter] textLimit]];
id editData = [[fieldEditor editWithObject:[[filteredResult objectAtIndex:rowIndex] objectAtIndex:[[aTableColumn identifier] intValue]]
fieldName:[[aTableColumn headerCell] stringValue]
usingEncoding:[mySQLConnection encoding]
@@ -2152,7 +2160,7 @@
isEditingRow = YES;
currentlyEditingRow = rowIndex;
}
-
+
[[filteredResult objectAtIndex:rowIndex] replaceObjectAtIndex:[[aTableColumn identifier] intValue] withObject:[editData copy]];
}