diff options
-rw-r--r-- | Interfaces/English.lproj/Localizable.strings | bin | 41798 -> 20981 bytes | |||
-rw-r--r-- | Resources/Images/func-small.png | bin | 0 -> 1829 bytes | |||
-rw-r--r-- | Resources/Images/proc-small.png | bin | 0 -> 1766 bytes | |||
-rw-r--r-- | Source/CustomQuery.m | 4 | ||||
-rw-r--r-- | Source/SPSQLParser.h | 5 | ||||
-rw-r--r-- | Source/SPSQLParser.m | 47 | ||||
-rw-r--r-- | Source/SPTableData.m | 8 | ||||
-rw-r--r-- | Source/SPTableInfo.m | 14 | ||||
-rw-r--r-- | Source/TableDocument.m | 60 | ||||
-rw-r--r-- | Source/TablesList.h | 5 | ||||
-rw-r--r-- | Source/TablesList.m | 279 | ||||
-rw-r--r-- | sequel-pro.xcodeproj/project.pbxproj | 20 |
12 files changed, 380 insertions, 62 deletions
diff --git a/Interfaces/English.lproj/Localizable.strings b/Interfaces/English.lproj/Localizable.strings Binary files differindex 22c600f2..2b07c11e 100644 --- a/Interfaces/English.lproj/Localizable.strings +++ b/Interfaces/English.lproj/Localizable.strings diff --git a/Resources/Images/func-small.png b/Resources/Images/func-small.png Binary files differnew file mode 100644 index 00000000..3202de84 --- /dev/null +++ b/Resources/Images/func-small.png diff --git a/Resources/Images/proc-small.png b/Resources/Images/proc-small.png Binary files differnew file mode 100644 index 00000000..d865a8e1 --- /dev/null +++ b/Resources/Images/proc-small.png diff --git a/Source/CustomQuery.m b/Source/CustomQuery.m index 579f8c3e..a2cc0b9a 100644 --- a/Source/CustomQuery.m +++ b/Source/CustomQuery.m @@ -61,7 +61,7 @@ // Retrieve the custom query string and split it into separate SQL queries queryParser = [[SPSQLParser alloc] initWithString:[textView string]]; - queries = [queryParser splitStringByCharacter:';']; + queries = [queryParser parseQueries]; [queryParser release]; NSRange curRange = [textView selectedRange]; @@ -110,7 +110,7 @@ // Otherwise, run the selected text. } else { queryParser = [[SPSQLParser alloc] initWithString:[[textView string] substringWithRange:selectedRange]]; - queries = [queryParser splitStringByCharacter:';']; + queries = [queryParser parseQueries]; [queryParser release]; } diff --git a/Source/SPSQLParser.h b/Source/SPSQLParser.h index 3e68501c..317e3e16 100644 --- a/Source/SPSQLParser.h +++ b/Source/SPSQLParser.h @@ -227,7 +227,10 @@ typedef enum _SPCommentTypes { - (void) deleteCharactersInRange:(NSRange)aRange; - (void) insertString:(NSString *)aString atIndex:(NSUInteger)anIndex; - +/* + * return an array of queries + */ +- (NSArray *) parseQueries; /* Required and primitive methods to allow subclassing class cluster */ #pragma mark - diff --git a/Source/SPSQLParser.m b/Source/SPSQLParser.m index e5c490da..ad3697d6 100644 --- a/Source/SPSQLParser.m +++ b/Source/SPSQLParser.m @@ -30,6 +30,53 @@ @implementation SPSQLParser : NSMutableString +/* + * return an array of queries + */ +- (NSArray *) parseQueries +{ + [self deleteComments]; + + /* this is a hack so I could test the funcs and procs viewing, needed a way to get those in. + * all this does is look for 'delimiter' in the text to trigger this parser. basically + * it runs through the query, line by line, and sets the delimiter accordingly to break + * out the individual queries. this is not very rebust but works for testing purposes. + * I believe Hans is currently working on a more robust parser. :mtv + */ + if( [string rangeOfString:@"delimiter" options:NSCaseInsensitiveSearch].location != NSNotFound ) { + NSString *delim = @";"; + NSString *thisLine = @""; + NSMutableArray *nq = [[NSMutableArray alloc] init]; + NSArray *lines = [self splitStringByCharacter:'\n']; + for( NSString *line in lines ) { + line = [line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if( [line hasPrefix:@"delimiter"] ) { + delim = [line substringFromIndex:9]; + delim = [delim stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSLog( @"delimiter now [%@]", delim ); + continue; + } + if( [line hasSuffix:delim] ) { + thisLine = [thisLine stringByAppendingString:line]; + [nq addObject:[thisLine substringWithRange:NSMakeRange(0,[thisLine length]-[delim length])]]; + NSLog( @"query: [%@]", [thisLine substringWithRange:NSMakeRange(0,[thisLine length]-[delim length])] ); + thisLine = @""; + } + else { + thisLine = [thisLine stringByAppendingString:line]; + thisLine = [thisLine stringByAppendingString:@"\n"]; + } + } + if( thisLine != @"" ) { + [nq addObject:thisLine]; + NSLog( @"query: [%@]", thisLine ); + } + return nq; + } else { + // just split as normal + return [self splitStringByCharacter:';']; + } +} /* * Removes comments within the current string, trimming "#", "--[/s]", and "/* * /" style strings. diff --git a/Source/SPTableData.m b/Source/SPTableData.m index b791563b..4ed5823a 100644 --- a/Source/SPTableData.m +++ b/Source/SPTableData.m @@ -214,11 +214,15 @@ */ - (BOOL) updateInformationForCurrentTable { - NSDictionary *tableData = [self informationForTable:[tableListInstance tableName]]; + NSDictionary *tableData = nil; NSDictionary *columnData; NSEnumerator *enumerator; - if (tableData == nil) { + if( [tableListInstance tableType] == SP_TABLETYPE_TABLE || [tableListInstance tableType] == SP_TABLETYPE_VIEW ) { + tableData = [self informationForTable:[tableListInstance tableName]]; + } + + if (tableData == nil ) { [columns removeAllObjects]; [columnNames removeAllObjects]; return FALSE; diff --git a/Source/SPTableInfo.m b/Source/SPTableInfo.m index c87a337d..de933515 100644 --- a/Source/SPTableInfo.m +++ b/Source/SPTableInfo.m @@ -82,6 +82,20 @@ return; } + if ([tableListInstance tableType] == SP_TABLETYPE_PROC) { + [info addObject:@"PROCEDURE INFORMATION"]; + [info addObject:@"no information available"]; + [infoTable reloadData]; + return; + } + + if ([tableListInstance tableType] == SP_TABLETYPE_FUNC) { + [info addObject:@"FUNCTION INFORMATION"]; + [info addObject:@"no information available"]; + [infoTable reloadData]; + return; + } + [info addObject:@"TABLE INFORMATION"]; if ([tableListInstance tableName]) { diff --git a/Source/TableDocument.m b/Source/TableDocument.m index fcb3340e..6a769996 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -917,7 +917,32 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum - (IBAction)showCreateTableSyntax:(id)sender { //Create the query and get results - NSString *query = [NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self table] backtickQuotedString]]; + NSString *query = nil; + NSString *createWindowTitle; + int colOffs = 1; + + if( [tablesListInstance tableType] == SP_TABLETYPE_TABLE ) { + query = [NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self table] backtickQuotedString]]; + createWindowTitle = @"Create Table Syntax"; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_VIEW ) { + query = [NSString stringWithFormat:@"SHOW CREATE VIEW %@", [[self table] backtickQuotedString]]; + createWindowTitle = @"Create View Syntax"; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_PROC ) { + query = [NSString stringWithFormat:@"SHOW CREATE PROCEDURE %@", [[self table] backtickQuotedString]]; + createWindowTitle = @"Create Procedure Syntax"; + colOffs = 2; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_FUNC ) { + query = [NSString stringWithFormat:@"SHOW CREATE FUNCTION %@", [[self table] backtickQuotedString]]; + createWindowTitle = @"Create Function Syntax"; + colOffs = 2; + } + + if( query == nil ) + return; + CMMCPResult *theResult = [mySQLConnection queryString:query]; // Check for errors, only displaying if the connection hasn't been terminated @@ -928,7 +953,7 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum return; } - id tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:1]; + id tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:colOffs]; if ([tableSyntax isKindOfClass:[NSData class]]) tableSyntax = [[NSString alloc] initWithData:tableSyntax encoding:[mySQLConnection encoding]]; @@ -938,6 +963,7 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum else [syntaxViewContent setString:tableSyntax]; + [createTableSyntaxWindow setTitle:createWindowTitle]; [createTableSyntaxWindow makeKeyAndOrderFront:self]; } @@ -946,8 +972,28 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum */ - (IBAction)copyCreateTableSyntax:(id)sender { - // Create the query and get results - NSString *query = [NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self table] backtickQuotedString]]; + // Create the query and get results + NSString *query = nil; + int colOffs = 1; + + if( [tablesListInstance tableType] == SP_TABLETYPE_TABLE ) { + query = [NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self table] backtickQuotedString]]; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_VIEW ) { + query = [NSString stringWithFormat:@"SHOW CREATE VIEW %@", [[self table] backtickQuotedString]]; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_PROC ) { + query = [NSString stringWithFormat:@"SHOW CREATE PROCEDURE %@", [[self table] backtickQuotedString]]; + colOffs = 2; + } + else if( [tablesListInstance tableType] == SP_TABLETYPE_FUNC ) { + query = [NSString stringWithFormat:@"SHOW CREATE FUNCTION %@", [[self table] backtickQuotedString]]; + colOffs = 2; + } + + if( query == nil ) + return; + CMMCPResult *theResult = [mySQLConnection queryString:query]; // Check for errors, only displaying if the connection hasn't been terminated @@ -958,7 +1004,7 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum return; } - id tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:1]; + id tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:colOffs]; if ([tableSyntax isKindOfClass:[NSData class]]) tableSyntax = [[NSString alloc] initWithData:tableSyntax encoding:[mySQLConnection encoding]]; @@ -972,9 +1018,9 @@ NSString *TableDocumentFavoritesControllerSelectionIndexDidChange = @"TableDocum [pb setString:tableSyntax forType:NSStringPboardType]; // Table syntax copied Growl notification - [[SPGrowlController sharedGrowlController] notifyWithTitle:@"Table Syntax Copied" + [[SPGrowlController sharedGrowlController] notifyWithTitle:@"Syntax Copied" description:[NSString stringWithFormat:NSLocalizedString(@"Syntax for %@ table copied",@"description for table syntax copied growl notification"), [self table]] - notificationName:@"Table Syntax Copied"]; + notificationName:@"Syntax Copied"]; } - (IBAction)copyColumnNames:(id)sender diff --git a/Source/TablesList.h b/Source/TablesList.h index 265fb73b..9eb632ab 100644 --- a/Source/TablesList.h +++ b/Source/TablesList.h @@ -27,8 +27,11 @@ enum sp_table_types { + SP_TABLETYPE_NONE = -1, SP_TABLETYPE_TABLE = 0, - SP_TABLETYPE_VIEW = 1 + SP_TABLETYPE_VIEW = 1, + SP_TABLETYPE_PROC = 2, + SP_TABLETYPE_FUNC = 3 }; @class CMMCResult, CMMCPConnection; diff --git a/Source/TablesList.m b/Source/TablesList.m index beeef5a1..14a3711f 100644 --- a/Source/TablesList.m +++ b/Source/TablesList.m @@ -57,7 +57,7 @@ [tablesListView deselectAll:self]; [tables removeAllObjects]; [tableTypes removeAllObjects]; - [tableTypes addObject:[NSNumber numberWithInt:-1]]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_NONE]]; if ([tableDocumentInstance database]) { @@ -85,6 +85,96 @@ } } } + + /* grab the procedures and functions + * + * using information_schema gives us more info (for information window perhaps?) but breaks + * backward compatibility with pre 4 I believe. I left the other methods below, in case. + */ + NSString *pQuery = [NSString stringWithFormat:@"SELECT * FROM information_schema.routines WHERE routine_schema = '%@' ORDER BY routine_name",[tableDocumentInstance database]]; + theResult = [mySQLConnection queryString:pQuery]; + + if( [theResult numOfRows] ) { + // add the header row + [tables addObject:NSLocalizedString(@"PROCS & FUNCS",@"header for procs & funcs list")]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_NONE]]; + [theResult dataSeek:0]; + + if( [theResult numOfFields] == 1 ) { + for( i = 0; i < [theResult numOfRows]; i++ ) { + [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:3]]; + if( [[[theResult fetchRowAsArray] objectAtIndex:4] isEqualToString:@"PROCEDURE"]) { + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_PROC]]; + } else { + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_FUNC]]; + } + } + } else { + for( i = 0; i < [theResult numOfRows]; i++ ) { + resultRow = [theResult fetchRowAsArray]; + [tables addObject:[resultRow objectAtIndex:3]]; + if( [[resultRow objectAtIndex:4] isEqualToString:@"PROCEDURE"] ) { + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_PROC]]; + } else { + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_FUNC]]; + } + } + } + } + + /* + BOOL addedPFHeader = FALSE; + NSString *pQuery = [NSString stringWithFormat:@"SHOW PROCEDURE STATUS WHERE db = '%@'",[tableDocumentInstance database]]; + theResult = [mySQLConnection queryString:pQuery]; + + if( [theResult numOfRows] ) { + // add the header row + [tables addObject:NSLocalizedString(@"PROCS & FUNCS",@"header for procs & funcs list")]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_NONE]]; + addedPFHeader = TRUE; + [theResult dataSeek:0]; + + if( [theResult numOfFields] == 1 ) { + for( i = 0; i < [theResult numOfRows]; i++ ) { + [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:1]]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_PROC]]; + } + } else { + for( i = 0; i < [theResult numOfRows]; i++ ) { + resultRow = [theResult fetchRowAsArray]; + [tables addObject:[resultRow objectAtIndex:1]]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_PROC]]; + } + } + } + + pQuery = [NSString stringWithFormat:@"SHOW FUNCTION STATUS WHERE db = '%@'",[tableDocumentInstance database]]; + theResult = [mySQLConnection queryString:pQuery]; + + if( [theResult numOfRows] ) { + if( !addedPFHeader ) { + // add the header row + [tables addObject:NSLocalizedString(@"PROCS & FUNCS",@"header for procs & funcs list")]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_NONE]]; + } + [theResult dataSeek:0]; + + if( [theResult numOfFields] == 1 ) { + for( i = 0; i < [theResult numOfRows]; i++ ) { + [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:1]]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_FUNC]]; + } + } else { + for( i = 0; i < [theResult numOfRows]; i++ ) { + resultRow = [theResult fetchRowAsArray]; + [tables addObject:[resultRow objectAtIndex:1]]; + [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_FUNC]]; + } + } + } + */ + // Notify listeners that the query has finished + [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:self]; } if (containsViews) { @@ -93,9 +183,6 @@ [tables insertObject:NSLocalizedString(@"TABLES",@"header for table list") atIndex:0]; } - // Notify listeners that the query has finished - [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:self]; - [tablesListView reloadData]; //if the previous selected table still exists, select it @@ -145,12 +232,11 @@ [mySQLConnection queryString:createStatement]; if ([[mySQLConnection getLastErrorMessage] isEqualToString:@""]) { - // Table creation was successful - [tables addObject:tableName]; - [tableTypes addObject:[NSNumber numberWithInt:SP_TABLETYPE_TABLE]]; + [tables insertObject:tableName atIndex:1]; + [tableTypes insertObject:[NSNumber numberWithInt:SP_TABLETYPE_TABLE] atIndex:1]; [tablesListView reloadData]; - [tablesListView selectRow:([tables count] - 1) byExtendingSelection:NO]; + [tablesListView selectRow:1 byExtendingSelection:NO]; NSInteger selectedIndex = [tabView indexOfTabViewItem:[tabView selectedTabViewItem]]; @@ -229,8 +315,13 @@ if ([tablesListView numberOfSelectedRows] == 1) { if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_VIEW) tblTypes = NSLocalizedString(@"view", @"view"); - else + else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_TABLE) tblTypes = NSLocalizedString(@"table", @"table"); + else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_PROC) + tblTypes = NSLocalizedString(@"procedure", @"procedure"); + else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_FUNC) + tblTypes = NSLocalizedString(@"function", @"function"); + [alert setMessageText:[NSString stringWithFormat:NSLocalizedString(@"Delete %@ '%@'?", @"delete table/view message"), tblTypes, [tables objectAtIndex:[tablesListView selectedRow]]]]; [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"Are you sure you want to delete the %@ '%@'. This operation cannot be undone.", @"delete table/view informative message"), tblTypes, [tables objectAtIndex:[tablesListView selectedRow]]]]; } @@ -272,8 +363,14 @@ // int rowCount, i, j; // BOOL errors = NO; - if ( [tablesListView numberOfSelectedRows] != 1 ) + if ( [tablesListView numberOfSelectedRows] != 1 || + [[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_PROC || + [[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_FUNC ) { + return; + } + + if ( ![tableSourceInstance saveRowOnDeselect] || ![tableContentInstance saveRowOnDeselect] ) { return; } @@ -429,11 +526,20 @@ [mySQLConnection queryString: [NSString stringWithFormat: @"DROP VIEW %@", [[tables objectAtIndex:currentIndex] backtickQuotedString] ]]; - } else { + } else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_TABLE) { [mySQLConnection queryString: [NSString stringWithFormat: @"DROP TABLE %@", - [[tables objectAtIndex:currentIndex] backtickQuotedString] - ]]; - } + [[tables objectAtIndex:currentIndex] backtickQuotedString] + ]]; + } else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_PROC) { + [mySQLConnection queryString: [NSString stringWithFormat: @"DROP PROCEDURE %@", + [[tables objectAtIndex:currentIndex] backtickQuotedString] + ]]; + } else if([[tableTypes objectAtIndex:currentIndex] intValue] == SP_TABLETYPE_FUNC) { + [mySQLConnection queryString: [NSString stringWithFormat: @"DROP FUNCTION %@", + [[tables objectAtIndex:currentIndex] backtickQuotedString] + ]]; + } + if ( [[mySQLConnection getLastErrorMessage] isEqualTo:@""] ) { //dropped table with success [tables removeObjectAtIndex:currentIndex]; @@ -712,36 +818,47 @@ // Reset the table information caches [tableDataInstance resetAllData]; - // If encoding is set to Autodetect, update the connection character set encoding - // based on the newly selected table's encoding - but only if it differs from the current encoding. - if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultEncoding"] isEqualToString:@"Autodetect"]) { - if (![[tableDataInstance tableEncoding] isEqualToString:[tableDocumentInstance connectionEncoding]]) { - [tableDocumentInstance setConnectionEncoding:[tableDataInstance tableEncoding] reloadingViews:NO]; - [tableDataInstance resetAllData]; + if( [[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_VIEW || + [[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_TABLE) { + // If encoding is set to Autodetect, update the connection character set encoding + // based on the newly selected table's encoding - but only if it differs from the current encoding. + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultEncoding"] isEqualToString:@"Autodetect"]) { + if (![[tableDataInstance tableEncoding] isEqualToString:[tableDocumentInstance connectionEncoding]]) { + [tableDocumentInstance setConnectionEncoding:[tableDataInstance tableEncoding] reloadingViews:NO]; + [tableDataInstance resetAllData]; + } + } + + if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0 ) { + [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; + structureLoaded = YES; + contentLoaded = NO; + statusLoaded = NO; + } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 1 ) { + [tableContentInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; + structureLoaded = NO; + contentLoaded = YES; + statusLoaded = NO; + } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3 ) { + [tableStatusInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; + structureLoaded = NO; + contentLoaded = NO; + statusLoaded = YES; + } else { + structureLoaded = NO; + contentLoaded = NO; + statusLoaded = NO; } - } - - if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0 ) { - [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; - structureLoaded = YES; - contentLoaded = NO; - statusLoaded = NO; - } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 1 ) { - [tableContentInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; - structureLoaded = NO; - contentLoaded = YES; - statusLoaded = NO; - } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3 ) { - [tableStatusInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; - structureLoaded = NO; - contentLoaded = NO; - statusLoaded = YES; } else { + // if we are not looking at a table or view, clear these + [tableSourceInstance loadTable:nil]; + [tableContentInstance loadTable:nil]; + [tableStatusInstance loadTable:nil]; structureLoaded = NO; contentLoaded = NO; - statusLoaded = NO; + statusLoaded = NO; } - + // Set gear menu items Remove/Duplicate table/view and mainMenu > Table items // according to the table types if([[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_VIEW) @@ -749,8 +866,12 @@ // Change mainMenu > Table > ... according to table type [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:0] setTitle:NSLocalizedString(@"Copy Create View Syntax", @"copy create view syntax menu item")]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:1] setTitle:NSLocalizedString(@"Show Create View Syntax", @"show create view syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:2] setHidden:NO]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:3] setHidden:NO]; // copy columns + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:4] setHidden:NO]; // divider [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:5] setTitle:NSLocalizedString(@"Check View", @"check view menu item")]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:6] setHidden:YES]; // repair + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:7] setHidden:YES]; // divider [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:8] setHidden:YES]; // analyse [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:9] setHidden:YES]; // optimize [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:10] setTitle:NSLocalizedString(@"Flush View", @"flush view menu item")]; @@ -758,11 +879,16 @@ [removeTableMenuItem setTitle:NSLocalizedString(@"Remove view", @"remove view menu title")]; [duplicateTableMenuItem setTitle:NSLocalizedString(@"Duplicate view", @"duplicate view menu title")]; - } else { + } + else if([[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_TABLE) { [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:0] setTitle:NSLocalizedString(@"Copy Create Table Syntax", @"copy create table syntax menu item")]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:1] setTitle:NSLocalizedString(@"Show Create Table Syntax", @"show create table syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:2] setHidden:NO]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:3] setHidden:NO]; // copy columns + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:4] setHidden:NO]; // divider [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:5] setTitle:NSLocalizedString(@"Check Table", @"check table menu item")]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:6] setHidden:NO]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:7] setHidden:NO]; // divider [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:8] setHidden:NO]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:9] setHidden:NO]; [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:10] setTitle:NSLocalizedString(@"Flush Table", @"flush table menu item")]; @@ -770,8 +896,41 @@ [removeTableMenuItem setTitle:NSLocalizedString(@"Remove table", @"remove table menu title")]; [duplicateTableMenuItem setTitle:NSLocalizedString(@"Duplicate table", @"duplicate table menu title")]; + } + else if([[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_PROC) { + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:0] setTitle:NSLocalizedString(@"Copy Create Procedure Syntax", @"copy create proc syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:1] setTitle:NSLocalizedString(@"Show Create Procedure Syntax", @"show create proc syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:2] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:3] setHidden:YES]; // copy columns + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:4] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:5] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:6] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:7] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:8] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:9] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:10] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:11] setHidden:YES]; + + [removeTableMenuItem setTitle:NSLocalizedString(@"Remove procedure", @"remove proc menu title")]; + [duplicateTableMenuItem setTitle:NSLocalizedString(@"Duplicate procedure", @"duplicate proc menu title")]; + } + else if([[tableTypes objectAtIndex:[tablesListView selectedRow]] intValue] == SP_TABLETYPE_FUNC) { + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:0] setTitle:NSLocalizedString(@"Copy Create Function Syntax", @"copy create func syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:1] setTitle:NSLocalizedString(@"Show Create Function Syntax", @"show create func syntax menu item")]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:2] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:3] setHidden:YES]; // copy columns + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:4] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:5] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:6] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:7] setHidden:YES]; // divider + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:8] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:9] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:10] setHidden:YES]; + [[[[[NSApp mainMenu] itemAtIndex:5] submenu] itemAtIndex:11] setHidden:YES]; + + [removeTableMenuItem setTitle:NSLocalizedString(@"Remove function", @"remove func menu title")]; + [duplicateTableMenuItem setTitle:NSLocalizedString(@"Duplicate function", @"duplicate func menu title")]; } - // set window title [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@/%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance name], [tableDocumentInstance database], [tables objectAtIndex:[tablesListView selectedRow]]]]; @@ -810,15 +969,21 @@ */ - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex { - return (rowIndex != 0); + //return (rowIndex != 0); + if( [tableTypes count] == 0 ) + return (rowIndex != 0 ); + return ([[tableTypes objectAtIndex:rowIndex] intValue] != SP_TABLETYPE_NONE ); } /** * Table view delegate method */ -- (BOOL)tableView:(NSTableView *)aTableView isGroupRow:(int)row +- (BOOL)tableView:(NSTableView *)aTableView isGroupRow:(int)rowIndex { - return (row == 0); + //return (row == 0); + if( [tableTypes count] == 0 ) + return (rowIndex == 0 ); + return ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_NONE ); } /** @@ -829,12 +994,21 @@ if (rowIndex > 0 && [[aTableColumn identifier] isEqualToString:@"tables"]) { if ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_VIEW) { [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"table-view-small"]]; - } else { + } else if ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_TABLE) { [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"table-small"]]; + } else if ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_PROC) { + [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"proc-small"]]; + } else if ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_FUNC) { + [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"func-small"]]; + } + + if ([[tableTypes objectAtIndex:rowIndex] intValue] == SP_TABLETYPE_NONE) { + [(ImageAndTextCell*)aCell setImage:nil]; + [(ImageAndTextCell*)aCell setIndentationLevel:0]; + } else { + [(ImageAndTextCell*)aCell setIndentationLevel:1]; + [(ImageAndTextCell*)aCell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; } - - [(ImageAndTextCell*)aCell setIndentationLevel:1]; - [(ImageAndTextCell*)aCell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; } else { [(ImageAndTextCell*)aCell setImage:nil]; [(ImageAndTextCell*)aCell setIndentationLevel:0]; @@ -856,7 +1030,8 @@ */ - (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem { - if ( [tablesListView numberOfSelectedRows] == 1 ) { + if ( [tablesListView numberOfSelectedRows] == 1 && + ([tablesListView tableType] == SP_TABLETYPE_TABLE || [tablesListView tableType] == SP_TABLETYPE_VIEW) ) { if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0) && !structureLoaded ) { [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]]; @@ -873,6 +1048,10 @@ statusLoaded = YES; } } + else { + [tableSourceInstance loadTable:nil]; + [tableContentInstance loadTable:nil]; + } } /** @@ -883,6 +1062,8 @@ // popup button below table list if ([menuItem action] == @selector(copyTable:)) { + if( [self tableType] == SP_TABLETYPE_FUNC || [self tableType] == SP_TABLETYPE_PROC ) + return NO; return [tablesListView numberOfSelectedRows] == 1 && [[self tableName] length] && [tablesListView numberOfSelectedRows] > 0; } if ([menuItem action] == @selector(removeTable:)) diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 6d69dddb..2a5417d8 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -65,6 +65,9 @@ 296DC8BC0F909194002A3258 /* MGTemplateStandardFilters.m in Sources */ = {isa = PBXBuildFile; fileRef = 296DC8B40F909194002A3258 /* MGTemplateStandardFilters.m */; }; 296DC8BF0F9091DF002A3258 /* libicucore.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 296DC8BE0F9091DF002A3258 /* libicucore.dylib */; }; 296DC8D20F90950C002A3258 /* sequel-pro-print-template.html in Resources */ = {isa = PBXBuildFile; fileRef = 296DC8D10F90950C002A3258 /* sequel-pro-print-template.html */; }; + 384582BE0FB95C9100DDACB6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 384582BC0FB95C9100DDACB6 /* Localizable.strings */; }; + 384582C40FB95FF800DDACB6 /* func-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C30FB95FF800DDACB6 /* func-small.png */; }; + 384582C70FB9603600DDACB6 /* proc-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C60FB9603600DDACB6 /* proc-small.png */; }; 4DECC3350EC2A170008D359E /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3320EC2A170008D359E /* Sparkle.framework */; }; 4DECC3360EC2A170008D359E /* MCPKit_bundled.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3330EC2A170008D359E /* MCPKit_bundled.framework */; }; 4DECC3370EC2A170008D359E /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3340EC2A170008D359E /* Growl.framework */; }; @@ -259,6 +262,9 @@ 296DC8D10F90950C002A3258 /* sequel-pro-print-template.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "sequel-pro-print-template.html"; sourceTree = "<group>"; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; + 384582BD0FB95C9100DDACB6 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = Interfaces/English.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; + 384582C30FB95FF800DDACB6 /* func-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "func-small.png"; sourceTree = "<group>"; }; + 384582C60FB9603600DDACB6 /* proc-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "proc-small.png"; sourceTree = "<group>"; }; 4DECC3320EC2A170008D359E /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Frameworks/Sparkle.framework; sourceTree = "<group>"; }; 4DECC3330EC2A170008D359E /* MCPKit_bundled.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MCPKit_bundled.framework; path = Frameworks/MCPKit_bundled.framework; sourceTree = "<group>"; }; 4DECC3340EC2A170008D359E /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = Frameworks/Growl.framework; sourceTree = "<group>"; }; @@ -430,6 +436,7 @@ 17E641430EF01E90001BC333 /* Resources */ = { isa = PBXGroup; children = ( + 384582BC0FB95C9100DDACB6 /* Localizable.strings */, 17E6418B0EF01FF7001BC333 /* Images */, 1703EF2A0F0B0742005BBE7E /* english_help */, 296DC8D10F90950C002A3258 /* sequel-pro-print-template.html */, @@ -567,6 +574,8 @@ 17E6418B0EF01FF7001BC333 /* Images */ = { isa = PBXGroup; children = ( + 384582C60FB9603600DDACB6 /* proc-small.png */, + 384582C30FB95FF800DDACB6 /* func-small.png */, 17E6418C0EF02036001BC333 /* appicon.icns */, B58A323D0F6509D60003C243 /* button_action.tiff */, B58A323E0F6509D60003C243 /* button_add.tiff */, @@ -821,6 +830,9 @@ B508B5DA0F9837A200E03A69 /* button_edit.tiff in Resources */, B53857340F9CC3B600EB2354 /* button_clear.tiff in Resources */, BC2C8E220FA8C2DB008468C7 /* sequel-pro-mysql-help-template.html in Resources */, + 384582BE0FB95C9100DDACB6 /* Localizable.strings in Resources */, + 384582C40FB95FF800DDACB6 /* func-small.png in Resources */, + 384582C70FB9603600DDACB6 /* proc-small.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -927,6 +939,14 @@ name = InfoPlist.strings; sourceTree = "<group>"; }; + 384582BC0FB95C9100DDACB6 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 384582BD0FB95C9100DDACB6 /* English */, + ); + name = Localizable.strings; + sourceTree = "<group>"; + }; 58186D1F0F4CB38900851FE9 /* ConnectionErrorDialog.xib */ = { isa = PBXVariantGroup; children = ( |