aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPCopyTable.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPCopyTable.m')
-rw-r--r--Source/SPCopyTable.m137
1 files changed, 53 insertions, 84 deletions
diff --git a/Source/SPCopyTable.m b/Source/SPCopyTable.m
index 4dcf6d9c..2634c7f5 100644
--- a/Source/SPCopyTable.m
+++ b/Source/SPCopyTable.m
@@ -34,6 +34,7 @@
#import "SPNotLoaded.h"
#import "SPConstants.h"
#import "SPDataStorage.h"
+#import "SPTextAndLinkCell.h"
NSInteger MENU_EDIT_COPY = 2001;
NSInteger MENU_EDIT_COPY_WITH_COLUMN = 2002;
@@ -73,56 +74,55 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
}
/*
+ * Cell editing in SPCustomQuery or for views in SPTableContent
+ */
+- (BOOL)isCellEditingMode
+{
+
+ return ([[self delegate] isKindOfClass:[SPCustomQuery class]]
+ || ([[self delegate] isKindOfClass:[SPTableContent class]]
+ && [[self delegate] valueForKeyPath:@"tablesListInstance"]
+ && [[[self delegate] valueForKeyPath:@"tablesListInstance"] tableType] == SPTableTypeView));
+
+}
+
+/*
+ * Check if current edited cell represents a class other than a normal NSString
+ * like pop-up menus for enum or set
+ */
+- (BOOL)isCellComplex
+{
+
+ return (![[self preparedCellAtColumn:[self editedColumn] row:[self editedRow]] isKindOfClass:[SPTextAndLinkCell class]]);
+
+}
+
+/*
* Trap the enter, escape, tab and arrow keys, overriding default behaviour and continuing/ending editing,
* only within the current row.
*/
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
{
- NSUInteger row, column, i;
+
+ NSUInteger row, column;
row = [self editedRow];
column = [self editedColumn];
- BOOL isCellEditing = NO;
-
- // cell editing for views in SPTableContent or in SPCustomQuery
- if([[self delegate] isKindOfClass:[SPCustomQuery class]] || ([[self delegate] isKindOfClass:[SPTableContent class]] && [[self delegate] valueForKeyPath:@"tablesListInstance"] && [[[self delegate] valueForKeyPath:@"tablesListInstance"] tableType] == SPTableTypeView))
- isCellEditing = YES;
// Trap tab key
- // -- for handling of blob fields look at [self control:textShouldBeginEditing:]
+ // -- for handling of blob fields and to check if it's editable look at [[self delegate] control:textShouldBeginEditing:]
if ( [textView methodForSelector:command] == [textView methodForSelector:@selector(insertTab:)] )
{
[[control window] makeFirstResponder:control];
- if(isCellEditing) {
- // Look for the next editable field
- if ( column != ( [self numberOfColumns] - 1 ) ) {
- i = 1;
- while ([[self delegate] fieldEditStatusForRow:row andColumn:[NSArrayObjectAtIndex([self tableColumns], column+i) identifier]] != 1) {
- i++;
-
- // If there are no columns after the latest blob or text column, save the current line.
- if ( (column+i) >= [self numberOfColumns] )
- return YES;
-
- }
-
- [self editColumn:column+i row:row withEvent:nil select:YES];
-
- }
-
+ // Save the current line if it's the last field in the table
+ if ( [self numberOfColumns] - 1 == column) {
+ if([[self delegate] respondsToSelector:@selector(addRowToDB)])
+ [[self delegate] addRowToDB];
} else {
-
- // Save the current line if it's the last field in the table
- if ( column == ( [self numberOfColumns] - 1 ) ) {
- if([[self delegate] respondsToSelector:@selector(addRowToDB)])
- [[self delegate] addRowToDB];
- } else {
- // Select the next field for editing
- [self editColumn:column+1 row:row withEvent:nil select:YES];
- }
-
+ // Select the next field for editing
+ [self editColumn:column+1 row:row withEvent:nil select:YES];
}
return YES;
@@ -133,36 +133,16 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
{
[[control window] makeFirstResponder:control];
- if(isCellEditing) {
- // Look for the next editable field backwards
- if ( column > 0 ) {
- i = 1;
- while ([[self delegate] fieldEditStatusForRow:row andColumn:[NSArrayObjectAtIndex([self tableColumns], column-i) identifier]] != 1) {
- i++;
-
- // If there are no columns before the latestone, return.
- if ( column == i ) {
- [[self onMainThread] makeFirstResponder];
- return TRUE;
- }
- }
-
- [self editColumn:column-i row:row withEvent:nil select:YES];
-
- }
+ // Save the current line if it's the last field in the table
+ if ( column < 1 ) {
+ if([[self delegate] respondsToSelector:@selector(addRowToDB)])
+ [[self delegate] addRowToDB];
+ [[self onMainThread] makeFirstResponder];
} else {
-
- // Save the current line if it's the last field in the table
- if ( column < 1 ) {
- if([[self delegate] respondsToSelector:@selector(addRowToDB)])
- [[self delegate] addRowToDB];
- [[self onMainThread] makeFirstResponder];
- } else {
- // Select the previous field for editing
- [self editColumn:column-1 row:row withEvent:nil select:YES];
- }
-
+ // Select the previous field for editing
+ [self editColumn:column-1 row:row withEvent:nil select:YES];
}
+
return YES;
}
@@ -170,13 +150,11 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
else if ( [textView methodForSelector:command] == [textView methodForSelector:@selector(insertNewline:)] )
{
// If enum field is edited RETURN selects the new value instead of saving the entire row
- if([[self delegate] isKindOfClass:[SPTableContent class]] && [[self delegate] valueForKeyPath:@"tableDataInstance"]) {
- NSString *fieldType = [[[[self delegate] valueForKeyPath:@"tableDataInstance"] columnWithName:[[NSArrayObjectAtIndex([self tableColumns], column) headerCell] stringValue]] objectForKey:@"typegrouping"];
- if([fieldType isEqualToString:@"enum"])
- return YES;
- }
+ if([self isCellComplex])
+ return YES;
+
[[control window] makeFirstResponder:control];
- if([[self delegate] isKindOfClass:[SPTableContent class]] && !isCellEditing && [[self delegate] respondsToSelector:@selector(addRowToDB)])
+ if([[self delegate] isKindOfClass:[SPTableContent class]] && ![self isCellEditingMode] && [[self delegate] respondsToSelector:@selector(addRowToDB)])
[[self delegate] addRowToDB];
return YES;
@@ -187,17 +165,14 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
{
// If enum field is edited ARROW key navigates through the popup list
- if([[self delegate] isKindOfClass:[SPTableContent class]] && [[self delegate] valueForKeyPath:@"tableDataInstance"]) {
- NSString *fieldType = [[[[self delegate] valueForKeyPath:@"tableDataInstance"] columnWithName:[[NSArrayObjectAtIndex([self tableColumns], column) headerCell] stringValue]] objectForKey:@"typegrouping"];
- if([fieldType isEqualToString:@"enum"])
- return NO;
- }
+ if([self isCellComplex])
+ return NO;
NSUInteger newRow = row+1;
if (newRow>=[[self delegate] numberOfRowsInTableView:self]) return YES; //check if we're already at the end of the list
[[control window] makeFirstResponder:control];
- if([[self delegate] isKindOfClass:[SPTableContent class]] && !isCellEditing && [[self delegate] respondsToSelector:@selector(addRowToDB)])
+ if([[self delegate] isKindOfClass:[SPTableContent class]] && ![self isCellEditingMode] && [[self delegate] respondsToSelector:@selector(addRowToDB)])
[[self delegate] addRowToDB];
if (newRow>=[[self delegate] numberOfRowsInTableView:self]) return YES; //check again. addRowToDB could reload the table and change the number of rows
@@ -213,17 +188,14 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
{
// If enum field is edited ARROW key navigates through the popup list
- if([[self delegate] isKindOfClass:[SPTableContent class]] && [[self delegate] valueForKeyPath:@"tableDataInstance"]) {
- NSString *fieldType = [[[[self delegate] valueForKeyPath:@"tableDataInstance"] columnWithName:[[NSArrayObjectAtIndex([self tableColumns], column) headerCell] stringValue]] objectForKey:@"typegrouping"];
- if([fieldType isEqualToString:@"enum"])
- return NO;
- }
+ if([self isCellComplex])
+ return NO;
- if (row==0) return TRUE; //already at the beginning of the list
+ if (row==0) return YES; //already at the beginning of the list
NSUInteger newRow = row-1;
[[control window] makeFirstResponder:control];
- if([[self delegate] isKindOfClass:[SPTableContent class]] && !isCellEditing && [[self delegate] respondsToSelector:@selector(addRowToDB)])
+ if([[self delegate] isKindOfClass:[SPTableContent class]] && ![self isCellEditingMode] && [[self delegate] respondsToSelector:@selector(addRowToDB)])
[[self delegate] addRowToDB];
if (newRow>=[[self delegate] numberOfRowsInTableView:self]) return YES; // addRowToDB could reload the table and change the number of rows
@@ -753,14 +725,11 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003;
// by calling tableView:shouldEditTableColumn: to validate
if([self numberOfSelectedRows] == 1 && ([theEvent keyCode] == 36 || [theEvent keyCode] == 76)) {
- NSUInteger i = 0;
-
for(id item in [self tableColumns]) {
// Run in fieldEditorMode?
if(![[self delegate] tableView:self shouldEditTableColumn:item row:[self selectedRow]])
;
else {
- // if not in fieldEditorMode select the first item
[self editColumn:0 row:[self selectedRow] withEvent:nil select:YES];
break;
}