aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/TablesList.m
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TablesList.m')
-rw-r--r--trunk/TablesList.m694
1 files changed, 694 insertions, 0 deletions
diff --git a/trunk/TablesList.m b/trunk/TablesList.m
new file mode 100644
index 00000000..19b9362f
--- /dev/null
+++ b/trunk/TablesList.m
@@ -0,0 +1,694 @@
+//
+// TablesList.m
+// sequel-pro
+//
+// Created by lorenz textor (lorenz@textor.ch) on Wed May 01 2002.
+// Copyright (c) 2002-2003 Lorenz Textor. All rights reserved.
+//
+// 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/>
+// Or mail to <lorenz@textor.ch>
+
+#import "TablesList.h"
+#import "TableDocument.h"
+#import "TableSource.h"
+#import "TableContent.h"
+#import "TableDump.h"
+#import "ImageAndTextCell.h"
+
+@implementation TablesList
+
+//IBAction methods
+- (IBAction)updateTables:(id)sender
+/*
+loads all table names in array tables and reload the tableView
+*/
+{
+ CMMCPResult *theResult;
+ int i;
+
+ //query started
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryWillBePerformed" object:self];
+
+ [tablesListView deselectAll:self];
+ [tables removeAllObjects];
+ [tables addObject:@"TABLES"];
+
+ theResult = [mySQLConnection listTables];
+ for ( i = 0 ; i < [theResult numOfRows] ; i++ ) {
+ [theResult dataSeek:i];
+ [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:0]];
+ }
+
+ [tablesListView reloadData];
+
+ //query finished
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:self];
+}
+
+- (IBAction)addTable:(id)sender
+/*
+adds a new table to the tables-array (no changes in mysql-db)
+*/
+{
+ if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] ||
+ ![tableContentInstance selectionShouldChangeInTableView:nil] ||
+ ![tableDocumentInstance database] )
+ return;
+ [tableWindow endEditingFor:nil];
+
+ [tables addObject:@""];
+ [tablesListView reloadData];
+ [tablesListView selectRow:[tables count]-1 byExtendingSelection:NO];
+ [tablesListView editColumn:0 row:[tables count]-1 withEvent:nil select:YES];
+}
+
+- (IBAction)removeTable:(id)sender
+/*
+invoked when user hits the remove button
+alert sheet to ask user if he really wants to delete the table
+*/
+{
+ if ( ![tablesListView numberOfSelectedRows] )
+ return;
+ [tableWindow endEditingFor:nil];
+
+ if ( [tablesListView numberOfSelectedRows] == 1 ) {
+ NSBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"Delete", @"delete button"), NSLocalizedString(@"Cancel", @"cancel button"), nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil,
+ @"removeRow", [NSString stringWithFormat:NSLocalizedString(@"Do you really want to delete the table %@?", @"message of panel asking for confirmation for deleting table"),
+ [tables objectAtIndex:[tablesListView selectedRow]]]);
+ } else {
+ NSBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"Delete", @"delete button"), NSLocalizedString(@"Cancel", @"cancel button"), nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil,
+ @"removeRow", [NSString stringWithFormat:NSLocalizedString(@"Do you really want to delete the selected tables?", @"message of panel asking for confirmation for deleting tables"),
+ [tables objectAtIndex:[tablesListView selectedRow]]]);
+ }
+}
+
+- (IBAction)copyTable:(id)sender
+/*
+copies a table, if desired with content
+*/
+{
+ CMMCPResult *queryResult;
+ NSScanner *scanner = [NSScanner alloc];
+ NSString *scanString;
+// NSArray *fieldNames;
+// NSArray *theRow;
+// NSMutableString *rowValue = [NSMutableString string];
+// NSMutableArray *fieldValues;
+ int code;
+// int rowCount, i, j;
+// BOOL errors = NO;
+
+ if ( [tablesListView numberOfSelectedRows] != 1 )
+ return;
+ if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] || ![tableContentInstance selectionShouldChangeInTableView:nil] )
+ return;
+ [tableWindow endEditingFor:nil];
+
+//open copyTableSheet
+ [copyTableNameField setStringValue:[NSString stringWithFormat:@"%@Copy", [tables objectAtIndex:[tablesListView selectedRow]]]];
+ [copyTableContentSwitch setState:NSOffState];
+ [NSApp beginSheet:copyTableSheet
+ modalForWindow:tableWindow modalDelegate:self
+ didEndSelector:nil contextInfo:nil];
+ code = [NSApp runModalForWindow:copyTableSheet];
+
+ [NSApp endSheet:copyTableSheet];
+ [copyTableSheet orderOut:nil];
+
+ if ( !code )
+ return;
+ if ( [[copyTableNameField stringValue] isEqualToString:@""] ) {
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, NSLocalizedString(@"Table must have a name.", @"message of panel when no name is given for table"));
+ return;
+ }
+
+//get table structure
+ queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE `%@`",
+ [tables objectAtIndex:[tablesListView selectedRow]]]];
+ if ( ![queryResult numOfRows] ) {
+//error while getting table structure
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil,
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't get table information.\nMySQL said: %@", @"message of panel when table information cannot be retrieved"), [mySQLConnection getLastErrorMessage]]);
+ } else {
+//insert new table name in create syntax and create new table
+ [scanner initWithString:[[queryResult fetchRowAsDictionary] objectForKey:@"Create Table"]];
+ [scanner scanUpToString:@"(" intoString:nil];
+ [scanner scanUpToString:@"" intoString:&scanString];
+ [mySQLConnection queryString:[NSString stringWithFormat:@"CREATE TABLE `%@` %@", [copyTableNameField stringValue], scanString]];
+ if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
+//error while creating new table
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil,
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't create table.\nMySQL said: %@", @"message of panel when table cannot be created"), [mySQLConnection getLastErrorMessage]]);
+ } else {
+ if ( [copyTableContentSwitch state] == NSOnState ) {
+//copy table content
+/*
+ queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM `%@`",
+ [tables objectAtIndex:[tablesListView selectedRow]]]];
+ fieldNames = [queryResult fetchFieldNames];
+ rowCount = [queryResult numOfRows];
+ for ( i = 0 ; i < rowCount ; i++ ) {
+ [queryResult dataSeek:i];
+ theRow = [queryResult fetchRowAsArray];
+ fieldValues = [NSMutableArray array];
+ for ( j = 0 ; j < [theRow count] ; j++ ) {
+ if ( [[theRow objectAtIndex:j] isKindOfClass:[NSData class]] ) {
+// [rowValue setString:[[NSString alloc] initWithData:[theRow objectAtIndex:j]
+// encoding:[mySQLConnection encoding]]];
+ [rowValue setString:[mySQLConnection prepareBinaryData:[theRow objectAtIndex:j]]];
+ } else {
+ [rowValue setString:[mySQLConnection prepareString:[[theRow objectAtIndex:j] description]]];
+ }
+*/
+/*
+ //escape special characters
+ for ( u = 0 ; u < [rowValue length] ; u++ ) {
+ if ( [rowValue characterAtIndex:u] == '\\' ) {
+ [rowValue insertString:@"\\" atIndex:u];
+ u++;
+ } else if ( [rowValue characterAtIndex:u] == '"' ) {
+ [rowValue insertString:@"\\" atIndex:u];
+ u++;
+ }
+ }
+*/
+/*
+ if ( [[theRow objectAtIndex:j] isKindOfClass:[NSNull class]] ) {
+ [fieldValues addObject:@"NULL"];
+ } else {
+// [fieldValues addObject:[NSString stringWithFormat:@"\"%@\"", [mySQLConnection prepareString:rowValue]]];
+// [fieldValues addObject:[NSString stringWithFormat:@"\"%@\"", rowValue]];
+// [fieldValues addObject:[NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:rowValue]]];
+ [fieldValues addObject:[NSString stringWithFormat:@"'%@'", rowValue]];
+
+ }
+ }
+ [mySQLConnection queryString:[NSString stringWithFormat:@"INSERT INTO `%@` (`%@`) VALUES (%@)",
+ [copyTableNameField stringValue], [fieldNames componentsJoinedByString:@"`,`"],
+ [fieldValues componentsJoinedByString:@","]]];
+ if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
+ errors = YES;
+ }
+ }
+ if ( errors )
+ NSBeginAlertSheet(@"Warning", @"OK", nil, nil, tableWindow, self, nil, nil, nil,
+ @"There have been errors while copying table content. Please control the new table.");
+*/
+ [mySQLConnection queryString:[NSString stringWithFormat:@"INSERT INTO `%@` SELECT * FROM `%@`",
+ [copyTableNameField stringValue], [tables objectAtIndex:[tablesListView selectedRow]]]];
+ if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
+ NSBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil,
+ NSLocalizedString(@"There have been errors while copying table content. Please control the new table.", @"message of panel when table content cannot be copied"));
+ }
+ }
+ [tables insertObject:[copyTableNameField stringValue] atIndex:[tablesListView selectedRow]+1];
+ [tablesListView reloadData];
+ [tablesListView selectRow:[tablesListView selectedRow]+1 byExtendingSelection:NO];
+ [tablesListView scrollRowToVisible:[tablesListView selectedRow]];
+ }
+ }
+}
+
+
+//alert sheet methods
+- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(NSString *)contextInfo
+/*
+method for alert sheets
+invoked when user wants to delete a table
+*/
+{
+ if ( [contextInfo isEqualToString:@"addRow"] ) {
+ alertSheetOpened = NO;
+ } else if ( [contextInfo isEqualToString:@"removeRow"] ) {
+ if ( returnCode == NSAlertDefaultReturn ) {
+ [sheet orderOut:self];
+ [self removeTable];
+ }
+ }
+}
+
+//copyTableSheet methods
+- (IBAction)closeCopyTableSheet:(id)sender
+/*
+closes copyTableSheet and stops modal session
+*/
+{
+ [NSApp stopModalWithCode:[sender tag]];
+}
+
+//additional methods
+- (void)removeTable;
+/*
+removes selected table(s) from mysql-db and tableView
+*/
+{
+ NSIndexSet *indexes = [tablesListView selectedRowIndexes];
+ NSString *errorText;
+ BOOL error = FALSE;
+ // get last index
+ unsigned currentIndex = [indexes lastIndex];
+ while (currentIndex != NSNotFound)
+ {
+ [mySQLConnection queryString:[NSString stringWithFormat:@"DROP TABLE `%@`", [tables objectAtIndex:currentIndex]]];
+
+ if ( [[mySQLConnection getLastErrorMessage] isEqualTo:@""] ) {
+ //dropped table with success
+ [tables removeObjectAtIndex:currentIndex];
+ } else {
+ //couldn't drop table
+ error = TRUE;
+ errorText = [mySQLConnection getLastErrorMessage];
+ }
+ // get next index (beginning from the end)
+ currentIndex = [indexes indexLessThanIndex:currentIndex];
+ }
+ [tablesListView deselectAll:self];
+// [tableSourceInstance loadTable:nil];
+// [tableContentInstance loadTable:nil];
+// [tableStatusInstance loadTable:nil];
+ [tablesListView reloadData];
+ // set window title
+ [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
+ [tableDocumentInstance host], [tableDocumentInstance database]]];
+ if ( error )
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil,
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't remove table.\nMySQL said: %@", @"message of panel when table cannot be removed"), errorText]);
+}
+
+- (void)setConnection:(CMMCPConnection *)theConnection
+/*
+sets the connection (received from TableDocument) and makes things that have to be done only once
+*/
+{
+ mySQLConnection = theConnection;
+
+// prefs = [[NSUserDefaults standardUserDefaults] retain];
+
+//set smallSystemFonts
+// [[[tablesListView tableColumnWithIdentifier:@"tables"] dataCell] setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+// [copyTableNameField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+// if ( [prefs boolForKey:@"useMonospacedFonts"] ) {
+ if ( [[NSUserDefaults standardUserDefaults] boolForKey:@"useMonospacedFonts"] ) {
+ [[[tablesListView tableColumnWithIdentifier:@"tables"] dataCell]
+ setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]];
+ }
+
+ [self updateTables:self];
+}
+
+- (void)doPerformQueryService:(NSString *)query
+/*
+selects customQuery tab and passes query to customQueryInstance
+*/
+{
+ [tabView selectTabViewItemAtIndex:2];
+ [customQueryInstance doPerformQueryService:query];
+}
+
+
+//getter methods
+- (NSString *)table
+/*
+returns the currently selected table or nil if no table or mulitple tables are selected
+*/
+{
+ if ( [tablesListView numberOfSelectedRows] == 1 ) {
+ return [tables objectAtIndex:[tablesListView selectedRow]];
+ } else if ([tablesListView numberOfSelectedRows] > 1) {
+ return @"";
+ } else {
+ return nil;
+ }
+}
+
+- (BOOL)structureLoaded
+/*
+returns YES if table source has already been loaded
+*/
+{
+ return structureLoaded;
+}
+
+- (BOOL)contentLoaded
+/*
+returns YES if table content has already been loaded
+*/
+{
+ return contentLoaded;
+}
+
+- (BOOL)statusLoaded
+/*
+returns YES if table status has already been loaded
+*/
+{
+ return statusLoaded;
+}
+
+
+//tableView datasource methods
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView
+{
+ return [tables count];
+}
+
+- (id)tableView:(NSTableView *)aTableView
+ objectValueForTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex
+{
+ return [tables objectAtIndex:rowIndex];
+}
+
+/**
+ * adds or renames a table (in tables-array and mysql-db)
+ * removes new table from table-array if renaming had no success
+ */
+- (void)tableView:(NSTableView *)aTableView
+ setObjectValue:(id)anObject
+ forTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex
+{
+ if ( [[tables objectAtIndex:rowIndex] isEqualToString:@""] ) {
+ //new table
+ if ( [anObject isEqualToString:@""] ) {
+ //table has no name
+ alertSheetOpened = YES;
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil, @"addRow", NSLocalizedString(@"Table must have a name.", @"message of panel when no name is given for table"));
+ [tables removeObjectAtIndex:rowIndex];
+ [tablesListView reloadData];
+ } else {
+ if ( [tableDocumentInstance supportsEncoding] ) {
+ [mySQLConnection queryString:[NSString stringWithFormat:@"CREATE TABLE `%@` (id int) DEFAULT CHARACTER SET %@", anObject, [tableDocumentInstance encoding]]];
+ } else {
+ [mySQLConnection queryString:[NSString stringWithFormat:@"CREATE TABLE `%@` (id int)", anObject]];
+ }
+ if ( [[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
+ //added table with success
+ // NSLog(@"added new table with success");
+ [tables replaceObjectAtIndex:rowIndex withObject:anObject];
+ if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0 ) {
+ [tableSourceInstance loadTable:anObject];
+ structureLoaded = YES;
+ contentLoaded = NO;
+ statusLoaded = NO;
+ } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 1 ) {
+ [tableSourceInstance loadTable:anObject];
+ [tableContentInstance loadTable:anObject];
+ structureLoaded = YES;
+ contentLoaded = YES;
+ statusLoaded = NO;
+ } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3 ) {
+ [tableStatusInstance loadTable:anObject];
+ statusLoaded = YES;
+ structureLoaded = NO;
+ contentLoaded = NO;
+ } else {
+ statusLoaded = NO;
+ structureLoaded = NO;
+ contentLoaded = NO;
+ }
+ // set window title
+ [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
+ [tableDocumentInstance host], [tableDocumentInstance database], anObject]];
+ } else {
+ //error while adding new table
+ // NSLog(@"couldn't add new table");
+ alertSheetOpened = YES;
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil, @"addRow",
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't add table %@.\nMySQL said: %@", @"message of panel when table cannot be created with the given name"),
+ anObject, [mySQLConnection getLastErrorMessage]]);
+ [tables removeObjectAtIndex:rowIndex];
+ [tablesListView reloadData];
+ }
+ }
+ } else {
+ //table modification
+ if ( [[tables objectAtIndex:rowIndex] isEqualToString:anObject] ) {
+ //no changes in table name
+ // NSLog(@"no changes in table name");
+ } else if ( [anObject isEqualToString:@""] ) {
+ //table has no name
+ // NSLog(@"name is nil");
+ alertSheetOpened = YES;
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil, @"addRow", NSLocalizedString(@"Table must have a name.", @"message of panel when no name is given for table"));
+ } else {
+ [mySQLConnection queryString:[NSString stringWithFormat:@"RENAME TABLE `%@` TO `%@`", [tables objectAtIndex:rowIndex], anObject]];
+ if ( [[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
+ // NSLog(@"renamed table with success");
+ //renamed with success
+ [tables replaceObjectAtIndex:rowIndex withObject:anObject];
+ if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0 ) {
+ [tableSourceInstance loadTable:anObject];
+ structureLoaded = YES;
+ contentLoaded = NO;
+ statusLoaded = NO;
+ } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 1 ) {
+ [tableSourceInstance loadTable:anObject];
+ [tableContentInstance loadTable:anObject];
+ structureLoaded = YES;
+ contentLoaded = YES;
+ statusLoaded = NO;
+ } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3 ) {
+ [tableStatusInstance loadTable:anObject];
+ structureLoaded = NO;
+ contentLoaded = NO;
+ statusLoaded = YES;
+ } else {
+ statusLoaded = NO;
+ structureLoaded = NO;
+ contentLoaded = NO;
+ }
+ // set window title
+ [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
+ [tableDocumentInstance host], [tableDocumentInstance database], anObject]];
+ } else {
+ //error while renaming
+ // NSLog(@"couldn't rename table");
+ alertSheetOpened = YES;
+ NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self,
+ @selector(sheetDidEnd:returnCode:contextInfo:), nil, @"addRow",
+ [NSString stringWithFormat:NSLocalizedString(@"Couldn't rename table.\nMySQL said: %@", @"message of panel when table cannot be renamed"),
+ [mySQLConnection getLastErrorMessage]]);
+ }
+ }
+ }
+}
+
+//tableView delegate methods
+- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
+/*
+traps enter and esc and edit/cancel without entering next row
+*/
+{
+ if ( [textView methodForSelector:command] == [textView methodForSelector:@selector(insertNewline:)] ) //trap enter
+ {
+ //save current line
+ [[control window] makeFirstResponder:control];
+ return TRUE;
+ }
+ else if ( [[control window] methodForSelector:command] == [[control window] methodForSelector:@selector(_cancelKey:)] ||
+ [textView methodForSelector:command] == [textView methodForSelector:@selector(complete:)] ) //trap esc
+ {
+ //abort editing
+ [control abortEditing];
+ if ( [[tables objectAtIndex:[tablesListView selectedRow]] isEqualToString:@""] ) {
+ //user added new table and then pressed escape
+ [tables removeObjectAtIndex:[tablesListView selectedRow]];
+ [tablesListView reloadData];
+ }
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView
+{
+/*
+ int row = [tablesListView editedRow];
+ int column = [tablesListView editedColumn];
+ NSTableColumn *tableColumn;
+ NSCell *cell;
+
+ if ( row != -1 ) {
+ tableColumn = [[tablesListView tableColumns] objectAtIndex:column];
+ cell = [tableColumn dataCellForRow:row];
+ [cell endEditing:[tablesListView currentEditor]];
+ }
+*/
+//end editing (otherwise problems when user hits reload button)
+ [tableWindow endEditingFor:nil];
+ if ( alertSheetOpened ) {
+ return NO;
+ }
+
+//we have to be sure that TableSource and TableContent have finished editing
+// if ( ![tableSourceInstance addRowToDB] || ![tableContentInstance addRowToDB] ) {
+ if ( ![tableSourceInstance selectionShouldChangeInTableView:nil] ||
+ ![tableContentInstance selectionShouldChangeInTableView:nil] ) {
+ return NO;
+ } else {
+ return YES;
+ }
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
+/*
+loads a table in content or source view (if tab selected)
+*/
+{
+ if ( [tablesListView numberOfSelectedRows] == 1 ) {
+ 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 ) {
+ [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ [tableContentInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ structureLoaded = YES;
+ 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;
+ }
+ // set window title
+ [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
+ [tableDocumentInstance host], [tableDocumentInstance database], [tables objectAtIndex:[tablesListView selectedRow]]]];
+
+ } else {
+ [tableSourceInstance loadTable:nil];
+ [tableContentInstance loadTable:nil];
+ [tableStatusInstance loadTable:nil];
+ structureLoaded = NO;
+ contentLoaded = NO;
+ statusLoaded = NO;
+ // set window title
+ [tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
+ [tableDocumentInstance host], [tableDocumentInstance database]]];
+ }
+}
+
+//tabView delegate methods
+- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+/*
+loads structure or source if tab selected the first time
+*/
+{
+ if ( [tablesListView numberOfSelectedRows] == 1 )
+ {
+ if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0) && !structureLoaded )
+ {
+ [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ structureLoaded = YES;
+ }
+ if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 1) && !contentLoaded )
+ {
+ if ( !structureLoaded ) {
+ [tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ structureLoaded = YES;
+ }
+ [tableContentInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ contentLoaded = YES;
+ }
+ if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3) && !statusLoaded )
+ {
+ [tableStatusInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ statusLoaded = YES;
+ }
+ }
+/*
+ if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 3 )
+ {
+ [tableDumpInstance reloadTables:self];
+ }
+*/
+}
+
+- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex
+{
+ return (rowIndex != 0);
+}
+
+
+- (BOOL)tableView:(NSTableView *)aTableView isGroupRow:(int)row
+{
+ return (row == 0);
+}
+
+- (void)tableView:(NSTableView *)aTableView
+ willDisplayCell:(id)aCell
+ forTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex
+{
+ if (rowIndex > 0 && [[aTableColumn identifier] isEqualToString:@"tables"]) {
+ [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"table-small"]];
+ [(ImageAndTextCell*)aCell setIndentationLevel:1];
+
+ } else {
+ [(ImageAndTextCell*)aCell setImage:nil];
+ [(ImageAndTextCell*)aCell setIndentationLevel:0];
+ }
+}
+
+- (float)tableView:(NSTableView *)tableView heightOfRow:(int)row
+{
+ if (row == 0) {
+ return 25;
+ } else {
+ return 17;
+ }
+}
+
+//last but not least
+- (id)init
+{
+ self = [super init];
+
+ tables = [[NSMutableArray alloc] init];
+ structureLoaded = NO;
+ contentLoaded = NO;
+ [tables addObject:NSLocalizedString(@"TABLES",@"header for table list")];
+ return self;
+}
+
+- (void)dealloc
+{
+// NSLog(@"TableList dealloc");
+
+ [tables release];
+
+ [super dealloc];
+}
+
+
+@end