diff options
author | rowanbeentje <rowan@beent.je> | 2009-03-03 23:39:15 +0000 |
---|---|---|
committer | rowanbeentje <rowan@beent.je> | 2009-03-03 23:39:15 +0000 |
commit | f716a08986866455792ccbb3a7d16c4e72028ade (patch) | |
tree | ebaca750fce2911d60f70c8ffdf409a122cff527 /Source | |
parent | edd1d6f093a5d6d3301a8f8cade43b051bd69083 (diff) | |
download | sequelpro-f716a08986866455792ccbb3a7d16c4e72028ade.tar.gz sequelpro-f716a08986866455792ccbb3a7d16c4e72028ade.tar.bz2 sequelpro-f716a08986866455792ccbb3a7d16c4e72028ade.zip |
- BLOB and binary fields are now fully visible and editable again (fixes Issue #155)
- Added basic support for viewing, filtering, and editing BIT columns (resolves Issue #127 in basic form)
- Rewrites selection/save handling. Rows are now only written to database if their content has changed, resolving a long-standing complaint; row selection and editing has also been improved, improving edit/save interaction (fixes Issue #157) and allowing re-editing of the row on failure (fixes Issue #115). Hopefully also addresses #Issue 131, and improves Issue #172.
- Hides the console window when the associated document window closes
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMMCPResult.h | 1 | ||||
-rw-r--r-- | Source/CMMCPResult.m | 4 | ||||
-rw-r--r-- | Source/CustomQuery.m | 8 | ||||
-rw-r--r-- | Source/TableContent.h | 4 | ||||
-rw-r--r-- | Source/TableContent.m | 139 | ||||
-rw-r--r-- | Source/TableDocument.m | 26 | ||||
-rw-r--r-- | Source/TableDump.m | 4 | ||||
-rw-r--r-- | Source/TablesList.m | 6 |
8 files changed, 140 insertions, 52 deletions
diff --git a/Source/CMMCPResult.h b/Source/CMMCPResult.h index 7f527949..d460b361 100644 --- a/Source/CMMCPResult.h +++ b/Source/CMMCPResult.h @@ -25,6 +25,7 @@ #import <Cocoa/Cocoa.h> #import <MCPKit_bundled/MCPKit_bundled.h> +#define FIELD_TYPE_BIT 16 @interface CMMCPResult : MCPResult { diff --git a/Source/CMMCPResult.m b/Source/CMMCPResult.m index f80ff5c3..145825a7 100644 --- a/Source/CMMCPResult.m +++ b/Source/CMMCPResult.m @@ -100,6 +100,10 @@ modified version for use with sequel-pro case FIELD_TYPE_NEWDATE: // Don't know what the format for this type is... theCurrentObj = [self stringWithCString:theData]; break; + + case FIELD_TYPE_BIT: + theCurrentObj = [NSString stringWithFormat:@"%u", theData[0]]; + break; case FIELD_TYPE_TINY_BLOB: case FIELD_TYPE_BLOB: diff --git a/Source/CustomQuery.m b/Source/CustomQuery.m index 04b4b9f8..e917e984 100644 --- a/Source/CustomQuery.m +++ b/Source/CustomQuery.m @@ -480,6 +480,10 @@ inserts the query in the textView and performs query if ( [[theRow objectAtIndex:[theIdentifier intValue]] isKindOfClass:[NSData class]] ) { NSString *tmp = [[NSString alloc] initWithData:[theRow objectAtIndex:[theIdentifier intValue]] encoding:[mySQLConnection encoding]]; + if (tmp == nil) { + tmp = [[NSString alloc] initWithData:[theRow objectAtIndex:[theIdentifier intValue]] + encoding:NSASCIIStringEncoding]; + } return [tmp autorelease]; } if ( [[theRow objectAtIndex:[theIdentifier intValue]] isMemberOfClass:[NSNull class]] ) @@ -636,6 +640,10 @@ opens sheet with value when double clicking on a field if ( [[theRow objectAtIndex:[theIdentifier intValue]] isKindOfClass:[NSData class]] ) { theValue = [[NSString alloc] initWithData:[theRow objectAtIndex:[theIdentifier intValue]] encoding:[mySQLConnection encoding]]; + if (theValue == nil) { + theValue = [[NSString alloc] initWithData:[theRow objectAtIndex:[theIdentifier intValue]] + encoding:NSASCIIStringEncoding]; + } [theValue autorelease]; } else if ( [[theRow objectAtIndex:[theIdentifier intValue]] isMemberOfClass:[NSNull class]] ) { theValue = [prefs objectForKey:@"nullValue"]; diff --git a/Source/TableContent.h b/Source/TableContent.h index e0802e3b..5847b868 100644 --- a/Source/TableContent.h +++ b/Source/TableContent.h @@ -65,7 +65,7 @@ NSString *compareType, *sortField; BOOL isEditingRow, isEditingNewRow, isDesc, setLimit; NSUserDefaults *prefs; - int numRows; + int numRows, currentlyEditingRow; bool areShowingAllRows; } @@ -105,6 +105,7 @@ - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(NSString *)contextInfo; - (int)getNumberOfRows; - (int)fetchNumberOfRows; +- (BOOL)saveRowOnDeselect; //tableView datasource methods - (int)numberOfRowsInTableView:(NSTableView *)aTableView; @@ -118,7 +119,6 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn //tableView delegate methods - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn; -- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView; - (void)tableViewSelectionDidChange:(NSNotification *)aNotification; - (void)tableViewSelectionIsChanging:(NSNotification *)aNotification; - (void)tableViewColumnDidResize:(NSNotification *)aNotification; diff --git a/Source/TableContent.m b/Source/TableContent.m index b3044c94..1e40e99d 100644 --- a/Source/TableContent.m +++ b/Source/TableContent.m @@ -44,6 +44,7 @@ selectedTable = nil; sortField = nil; areShowingAllRows = false; + currentlyEditingRow = -1; return self; } @@ -312,6 +313,10 @@ */ - (IBAction)reloadTable:(id)sender { + + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; + // Store the current viewport location NSRect viewRect = [tableContentView visibleRect]; @@ -398,6 +403,12 @@ NSString *queryString; int i; + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) { + [argument release]; + return; + } + // Update negative limits if ( [limitRowsField intValue] <= 0 ) { [limitRowsField setStringValue:@"1"]; @@ -583,6 +594,10 @@ */ - (IBAction)showAll:(id)sender { + + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; + [filteredResult setArray:fullResult]; [tableContentView reloadData]; areShowingAllRows = YES; @@ -611,8 +626,8 @@ NSMutableDictionary *column, *newRow = [NSMutableDictionary dictionary]; int i; - if ( ![self selectionShouldChangeInTableView:nil] ) - return; + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; columns = [[NSArray alloc] initWithArray:[tableDataInstance columns]]; for ( i = 0 ; i < [columns count] ; i++ ) { @@ -626,10 +641,11 @@ [filteredResult addObject:newRow]; [columns release]; - isEditingRow = YES; - isEditingNewRow = YES; [tableContentView reloadData]; [tableContentView selectRow:[tableContentView numberOfRows]-1 byExtendingSelection:NO]; + isEditingRow = YES; + isEditingNewRow = YES; + currentlyEditingRow = [tableContentView selectedRow]; if ( [multipleLineEditingButton state] == NSOffState ) [tableContentView editColumn:0 row:[tableContentView numberOfRows]-1 withEvent:nil select:YES]; } @@ -644,8 +660,9 @@ NSDictionary *row; int i; - if ( ![self selectionShouldChangeInTableView:nil] ) - return; + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; + if ( [tableContentView numberOfSelectedRows] < 1 ) return; if ( [tableContentView numberOfSelectedRows] > 1 ) { @@ -656,8 +673,6 @@ //copy row tempRow = [NSMutableDictionary dictionaryWithDictionary:[filteredResult objectAtIndex:[tableContentView selectedRow]]]; [filteredResult insertObject:tempRow atIndex:[tableContentView selectedRow]+1]; - isEditingRow = YES; - isEditingNewRow = YES; //set autoincrement fields to NULL queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM `%@`", selectedTable]]; if ([queryResult numOfRows]) [queryResult dataSeek:0]; @@ -670,6 +685,9 @@ //select row and go in edit mode [tableContentView reloadData]; [tableContentView selectRow:[tableContentView selectedRow]+1 byExtendingSelection:NO]; + isEditingRow = YES; + isEditingNewRow = YES; + currentlyEditingRow = [tableContentView selectedRow]; if ( [multipleLineEditingButton state] == NSOffState ) [tableContentView editColumn:0 row:[tableContentView selectedRow] withEvent:nil select:YES]; } @@ -679,8 +697,9 @@ asks user if he really wants to delete the selected rows */ { - if ( ![self selectionShouldChangeInTableView:nil] ) - return; + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; + if ( ![tableContentView numberOfSelectedRows] ) return; /* @@ -1097,7 +1116,6 @@ */ - (BOOL)addRowToDB { - int rowIndex = [tableContentView selectedRow]; NSArray *theColumns, *columnNames; NSMutableArray *fieldValues = [[NSMutableArray alloc] init]; NSMutableString *queryString; @@ -1108,11 +1126,15 @@ NSString *currentTime = [[NSDate date] descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil locale:nil]; int i; - if ( !isEditingRow || rowIndex == -1) { + if ( !isEditingRow || currentlyEditingRow == -1) { [fieldValues release]; return YES; } + + // If editing, compare the new row to the old row and if they're the same do nothing. + if ( !isEditingNewRow && [oldRow isEqualToDictionary:[filteredResult objectAtIndex:currentlyEditingRow]] ) return YES; + // Retrieve the field names and types for this table from the data cache. This is used when requesting all data as part // of the fieldListForQuery method, and also to decide whether or not to preserve the current filter/sort settings. theColumns = [tableDataInstance columns]; @@ -1120,7 +1142,7 @@ // Get the field values for ( i = 0 ; i < [columnNames count] ; i++ ) { - rowObject = [[filteredResult objectAtIndex:rowIndex] objectForKey:[columnNames objectAtIndex:i]]; + rowObject = [[filteredResult objectAtIndex:currentlyEditingRow] objectForKey:[columnNames objectAtIndex:i]]; // Convert the object to a string (here we can add special treatment for date-, number- and data-fields) if ( [[rowObject description] isEqualToString:[prefs stringForKey:@"nullValue"]] @@ -1142,6 +1164,8 @@ } else { if ( [[rowObject description] isEqualToString:@"CURRENT_TIMESTAMP"] ) { [rowValue setString:@"CURRENT_TIMESTAMP"]; + } else if ([[[theColumns objectAtIndex:i] objectForKey:@"typegrouping"] isEqualToString:@"bit"]) { + [rowValue setString:((![[rowObject description] length] || [[rowObject description] isEqualToString:@"0"])?@"0":@"1")]; } else { [rowValue setString:[NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[rowObject description]]]]; } @@ -1178,9 +1202,10 @@ } else { NSBeep(); } - [filteredResult replaceObjectAtIndex:rowIndex withObject:[NSMutableDictionary dictionaryWithDictionary:oldRow]]; + [filteredResult replaceObjectAtIndex:currentlyEditingRow withObject:[NSMutableDictionary dictionaryWithDictionary:oldRow]]; isEditingRow = NO; isEditingNewRow = NO; + currentlyEditingRow = -1; [queryConsoleInstance showErrorInConsole:[NSString stringWithFormat:NSLocalizedString(@"/* WARNING %@ No rows have been affected */\n", @"warning shown in the console when no rows have been affected after writing to the db"), currentTime]]; return YES; @@ -1193,16 +1218,17 @@ if ( [prefs boolForKey:@"reloadAfterAdding"] ) { [self reloadTableValues:self]; [tableContentView deselectAll:self]; + [tableWindow endEditingFor:nil]; } else { // Set the insertId for fields with auto_increment for ( i = 0; i < [theColumns count] ; i++ ) { if ([[theColumns objectAtIndex:i] objectForKey:@"autoincrement"]) { - [[filteredResult objectAtIndex:rowIndex] setObject:[NSNumber numberWithLong:[mySQLConnection insertId]] + [[filteredResult objectAtIndex:currentlyEditingRow] setObject:[NSNumber numberWithLong:[mySQLConnection insertId]] forKey:[columnNames objectAtIndex:i]]; } } - [fullResult addObject:[filteredResult objectAtIndex:rowIndex]]; + [fullResult addObject:[filteredResult objectAtIndex:currentlyEditingRow]]; } isEditingNewRow = NO; @@ -1211,6 +1237,7 @@ if ( [prefs boolForKey:@"reloadAfterEditing"] ) { [self reloadTableValues:self]; [tableContentView deselectAll:self]; + [tableWindow endEditingFor:nil]; // TODO: this probably needs looking at... it's reloading it all itself? } else { @@ -1232,6 +1259,7 @@ [fullResult setArray:[self fetchResultAsArray:queryResult]]; } } + currentlyEditingRow = -1; return YES; // Report errors which have occurred @@ -1242,6 +1270,27 @@ } } + +/* + * A method to be called whenever the table selection changes; checks whether the current + * row is being edited, and if so attempts to save it. Returns YES if no save was necessary + * or the save was successful, and NO if a save was necessary and failed - in which case further + * editing is required. In that case this method will reselect the row in question for reediting. + */ +- (BOOL)saveRowOnDeselect +{ + + // If no rows are currently being edited, return success at once. + if (!isEditingRow) return YES; + + // Attempt to save the row, and return YES if the save succeeded. + if ([self addRowToDB]) return YES; + + // Saving failed - reselect the old row and return failure. + [tableContentView selectRow:currentlyEditingRow byExtendingSelection:NO]; + return NO; +} + /* * Returns the WHERE argument to identify a row. * If "row" is -2, it uses the oldRow. @@ -1311,6 +1360,8 @@ if ( [tempValue isKindOfClass:[NSData class]] ) { NSString *tmpString = [[NSString alloc] initWithData:tempValue encoding:[mySQLConnection encoding]]; + if (tmpString == nil) + tmpString = [[NSString alloc] initWithData:tempValue encoding:NSASCIIStringEncoding]; [value setString:[NSString stringWithString:tmpString]]; [tmpString release]; } else { @@ -1339,7 +1390,7 @@ [value setString:[NSString stringWithFormat:@"'%@'", value]]; columnType = [[tableDataInstance columnWithName:[keys objectAtIndex:i]] objectForKey:@"typegrouping"]; - if ( [columnType isEqualToString:@"integer"] || [columnType isEqualToString:@"float"] ) { + if ( [columnType isEqualToString:@"integer"] || [columnType isEqualToString:@"float"] || [columnType isEqualToString:@"bit"] ) { [argument appendString:[NSString stringWithFormat:@"`%@` = %@", [keys objectAtIndex:i], value]]; } else { [argument appendString:[NSString stringWithFormat:@"`%@` LIKE %@", [keys objectAtIndex:i], value]]; @@ -1433,6 +1484,7 @@ isEditingRow = NO; isEditingNewRow = NO; } + currentlyEditingRow = -1; } [tableContentView reloadData]; } else if ( [contextInfo isEqualToString:@"removeallrows"] ) { @@ -1556,12 +1608,14 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn theRow = [filteredResult objectAtIndex:rowIndex]; theValue = [theRow objectForKey:[aTableColumn identifier]]; - // Convert data objects to their string representation in the current encoding. + // Convert data objects to their string representation in the current encoding, falling back to ascii if ( [theValue isKindOfClass:[NSData class]] ) { NSString *dataRepresentation = [[NSString alloc] initWithData:theValue encoding:[mySQLConnection encoding]]; + if (dataRepresentation == nil) + dataRepresentation = [[NSString alloc] initWithData:theValue encoding:NSASCIIStringEncoding]; if (dataRepresentation == nil) theValue = @"- cannot be displayed -"; else theValue = [NSString stringWithString:dataRepresentation]; - [dataRepresentation release]; + if (dataRepresentation) [dataRepresentation release]; } return theValue; @@ -1575,6 +1629,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn if ( !isEditingRow ) { [oldRow setDictionary:[filteredResult objectAtIndex:rowIndex]]; isEditingRow = YES; + currentlyEditingRow = rowIndex; } if ( anObject ) { [[filteredResult objectAtIndex:rowIndex] setObject:anObject forKey:[aTableColumn identifier]]; @@ -1597,9 +1652,10 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn if ( [selectedTable isEqualToString:@""] || !selectedTable ) return; - if ( ![self selectionShouldChangeInTableView:nil] ) - return; + // Check whether a save of the current row is required. + if ( ![self saveRowOnDeselect] ) return; + //query started [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryWillBePerformed" object:self]; @@ -1660,32 +1716,16 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn } } -- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView -{ - /* - int row = [tableContentView editedRow]; - int column = [tableContentView editedColumn]; - NSTableColumn *tableColumn; - NSCell *cell; - - if ( row != -1 ) { - tableColumn = [[tableContentView tableColumns] objectAtIndex:column]; - cell = [tableColumn dataCellForRow:row]; - [cell endEditing:[tableContentView currentEditor]]; - } - */ - //end editing (otherwise problems when user hits reload button) - [tableWindow endEditingFor:nil]; - - return [self addRowToDB]; -} - - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { // Check our notification object is our table content view if ([aNotification object] != tableContentView) return; + + // If we are editing a row, attempt to save that row - if saving failed, reselect the edit row. + if ( isEditingRow && [tableContentView selectedRow] != currentlyEditingRow && ![self saveRowOnDeselect] ) return; + // Update the row selection count if ( [tableContentView numberOfSelectedRows] > 0 ) { [countText setStringValue:[NSString stringWithFormat:NSLocalizedString(@"%d of %d rows selected", @"Text showing how many rows are selected"), [tableContentView numberOfSelectedRows], [tableContentView numberOfRows]]]; } else { @@ -1750,7 +1790,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { int code; - NSString *columnTypeGrouping, *query; + NSString *columnTypeGrouping, *query, *stringValue = nil; NSEnumerator *enumerator; NSDictionary *tempRow; NSMutableDictionary *modifiedRow = [NSMutableDictionary dictionary]; @@ -1800,15 +1840,20 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn if ( [theValue isKindOfClass:[NSData class]] ) { image = [[NSImage alloc] initWithData:theValue]; [hexTextView setString:[self dataToHex:theValue]]; - theValue = [[NSString alloc] initWithData:theValue encoding:[mySQLConnection encoding]]; + stringValue = [[NSString alloc] initWithData:theValue encoding:[mySQLConnection encoding]]; + if (stringValue == nil) + stringValue = [[NSString alloc] initWithData:theValue encoding:NSASCIIStringEncoding]; } else { [hexTextView setString:@""]; - theValue = [theValue description]; + stringValue = [[NSString alloc] initWithString:[theValue description]]; } [editImage setImage:image]; - [editTextView setString:theValue]; - [editTextView setSelectedRange:NSMakeRange(0,[[editTextView string] length])]; + if (stringValue) { + [editTextView setString:stringValue]; + [editTextView setSelectedRange:NSMakeRange(0,[[editTextView string] length])]; + [stringValue release]; + } [NSApp beginSheet:editSheet modalForWindow:tableWindow modalDelegate:self didEndSelector:nil contextInfo:nil]; code = [NSApp runModalForWindow:editSheet]; @@ -1820,6 +1865,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn if ( !isEditingRow ) { [oldRow setDictionary:[filteredResult objectAtIndex:rowIndex]]; isEditingRow = YES; + currentlyEditingRow = rowIndex; } [[filteredResult objectAtIndex:rowIndex] setObject:[editData copy] forKey:[aTableColumn identifier]]; @@ -1924,6 +1970,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn [filteredResult removeObjectAtIndex:row]; [tableContentView reloadData]; } + currentlyEditingRow = -1; return TRUE; } else diff --git a/Source/TableDocument.m b/Source/TableDocument.m index f8c6bc73..ea02dd20 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -1159,6 +1159,13 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa - (IBAction)viewStructure:(id)sender { + // Cancel the selection if currently editing a content row and unable to save + if ([tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == 1 + && ![tableContentInstance saveRowOnDeselect]) { + [mainToolbar setSelectedItemIdentifier:@"SwitchToTableContentToolbarItemIdentifier"]; + return; + } + [tableTabView selectTabViewItemAtIndex:0]; [mainToolbar setSelectedItemIdentifier:@"SwitchToTableStructureToolbarItemIdentifier"]; } @@ -1171,12 +1178,26 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa - (IBAction)viewQuery:(id)sender { + // Cancel the selection if currently editing a content row and unable to save + if ([tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == 1 + && ![tableContentInstance saveRowOnDeselect]) { + [mainToolbar setSelectedItemIdentifier:@"SwitchToTableContentToolbarItemIdentifier"]; + return; + } + [tableTabView selectTabViewItemAtIndex:2]; [mainToolbar setSelectedItemIdentifier:@"SwitchToRunQueryToolbarItemIdentifier"]; } - (IBAction)viewStatus:(id)sender { + // Cancel the selection if currently editing a content row and unable to save + if ([tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == 1 + && ![tableContentInstance saveRowOnDeselect]) { + [mainToolbar setSelectedItemIdentifier:@"SwitchToTableContentToolbarItemIdentifier"]; + return; + } + [tableTabView selectTabViewItemAtIndex:3]; [mainToolbar setSelectedItemIdentifier:@"SwitchToTableStatusToolbarItemIdentifier"]; } @@ -1432,7 +1453,7 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa - (void)windowWillClose:(NSNotification *)aNotification { if ([mySQLConnection isConnected]) [self closeConnection]; - + if ([[queryConsoleInstance window] isVisible]) [self toggleConsole:self]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } @@ -1571,6 +1592,9 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn if ( [theValue isKindOfClass:[NSData class]] ) { theValue = [[NSString alloc] initWithData:theValue encoding:[mySQLConnection encoding]]; + if (theValue == nil) { + [[NSString alloc] initWithData:theValue encoding:NSASCIIStringEncoding]; + } } return theValue; diff --git a/Source/TableDump.m b/Source/TableDump.m index 0b134bf3..5c813407 100644 --- a/Source/TableDump.m +++ b/Source/TableDump.m @@ -1098,6 +1098,8 @@ // Retrieve the contents of this cell if ([[csvRow objectAtIndex:j] isKindOfClass:[NSData class]]) { dataConversionString = [[NSString alloc] initWithData:[csvRow objectAtIndex:j] encoding:tableEncoding]; + if (dataConversionString == nil) + dataConversionString = [[NSString alloc] initWithData:[csvRow objectAtIndex:j] encoding:NSASCIIStringEncoding]; [csvCell setString:[NSString stringWithString:dataConversionString]]; [dataConversionString release]; } else { @@ -1438,6 +1440,8 @@ // Retrieve the contents of this tag if ([[xmlRow objectAtIndex:j] isKindOfClass:[NSData class]]) { dataConversionString = [[NSString alloc] initWithData:[xmlRow objectAtIndex:j] encoding:tableEncoding]; + if (dataConversionString == nil) + dataConversionString = [[NSString alloc] initWithData:[xmlRow objectAtIndex:j] encoding:NSASCIIStringEncoding]; [xmlItem setString:[NSString stringWithString:dataConversionString]]; [dataConversionString release]; } else { diff --git a/Source/TablesList.m b/Source/TablesList.m index f5f8a16f..ad3c0217 100644 --- a/Source/TablesList.m +++ b/Source/TablesList.m @@ -98,7 +98,7 @@ adds a new table to the tables-array (no changes in mysql-db) - (IBAction)addTable:(id)sender { if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] || - ![tableContentInstance selectionShouldChangeInTableView:nil] || + ![tableContentInstance saveRowOnDeselect] || ![tableDocumentInstance database] ) return; [tableWindow endEditingFor:nil]; @@ -151,7 +151,7 @@ copies a table, if desired with content if ( [tablesListView numberOfSelectedRows] != 1 ) return; - if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] || ![tableContentInstance selectionShouldChangeInTableView:nil] ) + if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] || ![tableContentInstance saveRowOnDeselect] ) return; [tableWindow endEditingFor:nil]; @@ -588,7 +588,7 @@ traps enter and esc and edit/cancel without entering next row //we have to be sure that TableSource and TableContent have finished editing // if ( ![tableSourceInstance addRowToDB] || ![tableContentInstance addRowToDB] ) { if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] || - ![tableContentInstance selectionShouldChangeInTableView:nil] ) { + ![tableContentInstance saveRowOnDeselect] ) { return NO; } else { return YES; |