aboutsummaryrefslogtreecommitdiffstats
path: root/Source/TablesList.m
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2008-12-10 16:52:52 +0000
committerstuconnolly <stuart02@gmail.com>2008-12-10 16:52:52 +0000
commitfab9a6506cd04ec8f840c98772a80c44a79c74a7 (patch)
tree3cd483487bef381c934717f10df71d306c7eaf97 /Source/TablesList.m
parent4c3b208fad0572d8d1a79bba1bd1b8147fd0f8a6 (diff)
downloadsequelpro-fab9a6506cd04ec8f840c98772a80c44a79c74a7.tar.gz
sequelpro-fab9a6506cd04ec8f840c98772a80c44a79c74a7.tar.bz2
sequelpro-fab9a6506cd04ec8f840c98772a80c44a79c74a7.zip
MERGED r262:266 from branches/stuart02 to trunk to include new project structure.
Diffstat (limited to 'Source/TablesList.m')
-rw-r--r--Source/TablesList.m700
1 files changed, 700 insertions, 0 deletions
diff --git a/Source/TablesList.m b/Source/TablesList.m
new file mode 100644
index 00000000..40ea87c5
--- /dev/null
+++ b/Source/TablesList.m
@@ -0,0 +1,700 @@
+//
+// 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"
+#import "CMMCPConnection.h"
+#import "CMMCPResult.h"
+
+@implementation TablesList
+
+
+#pragma mark IBAction methods
+
+/*
+loads all table names in array tables and reload the tableView
+*/
+- (IBAction)updateTables:(id)sender
+{
+ CMMCPResult *theResult;
+ int i;
+
+ //query started
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryWillBePerformed" object:self];
+
+ [tablesListView deselectAll:self];
+ [tables removeAllObjects];
+ [tables addObject:NSLocalizedString(@"TABLES",@"header for table list")];
+
+ theResult = (CMMCPResult *)[mySQLConnection listTables];
+ if ([theResult numOfRows]) [theResult dataSeek:0];
+ for ( i = 0 ; i < [theResult numOfRows] ; i++ ) {
+ [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:0]];
+ }
+
+ [tablesListView reloadData];
+
+ //query finished
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:self];
+}
+
+/*
+adds a new table to the tables-array (no changes in mysql-db)
+*/
+- (IBAction)addTable:(id)sender
+{
+ 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];
+}
+
+/*
+invoked when user hits the remove button
+alert sheet to ask user if he really wants to delete the table
+*/
+- (IBAction)removeTable:(id)sender
+{
+ 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]]]);
+ }
+}
+
+/*
+copies a table, if desired with content
+*/
+- (IBAction)copyTable:(id)sender
+{
+ 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
+ [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]];
+ }
+ }
+}
+
+
+#pragma mark Alert sheet methods
+
+/*
+method for alert sheets
+invoked when user wants to delete a table
+*/
+- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(NSString *)contextInfo
+{
+ if ( [contextInfo isEqualToString:@"addRow"] ) {
+ alertSheetOpened = NO;
+ } else if ( [contextInfo isEqualToString:@"removeRow"] ) {
+ if ( returnCode == NSAlertDefaultReturn ) {
+ [sheet orderOut:self];
+ [self removeTable];
+ }
+ }
+}
+
+/*
+closes copyTableSheet and stops modal session
+*/
+- (IBAction)closeCopyTableSheet:(id)sender
+{
+ [NSApp stopModalWithCode:[sender tag]];
+}
+
+#pragma mark Additional methods
+
+/*
+removes selected table(s) from mysql-db and tableView
+*/
+- (void)removeTable;
+{
+ 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]);
+}
+
+/*
+sets the connection (received from TableDocument) and makes things that have to be done only once
+*/
+- (void)setConnection:(CMMCPConnection *)theConnection
+{
+ mySQLConnection = theConnection;
+ [self updateTables:self];
+}
+
+/*
+selects customQuery tab and passes query to customQueryInstance
+*/
+- (void)doPerformQueryService:(NSString *)query
+{
+ [tabView selectTabViewItemAtIndex:2];
+ [customQueryInstance doPerformQueryService:query];
+}
+
+
+#pragma mark Getter methods
+
+/*
+returns the currently selected table or nil if no table or mulitple tables are selected
+*/
+- (NSString *)table
+{
+ if ( [tablesListView numberOfSelectedRows] == 1 ) {
+ return [tables objectAtIndex:[tablesListView selectedRow]];
+ } else if ([tablesListView numberOfSelectedRows] > 1) {
+ return @"";
+ } else {
+ return nil;
+ }
+}
+
+- (NSArray *)tables
+{
+ return tables;
+}
+
+/*
+returns YES if table source has already been loaded
+*/
+- (BOOL)structureLoaded
+{
+ return structureLoaded;
+}
+
+/*
+returns YES if table content has already been loaded
+*/
+- (BOOL)contentLoaded
+{
+ return contentLoaded;
+}
+
+/*
+returns YES if table status has already been loaded
+*/
+- (BOOL)statusLoaded
+{
+ return statusLoaded;
+}
+
+#pragma mark Setter methods
+
+/*
+Mark the content table for refresh when it's next switched to
+*/
+- (void)setContentRequiresReload:(BOOL)reload
+{
+ contentLoaded = !reload;
+}
+
+#pragma mark 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
+ [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
+ 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]]);
+ }
+ }
+ }
+}
+
+#pragma mark TableView delegate methods
+
+/*
+traps enter and esc and edit/cancel without entering next row
+*/
+- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
+{
+ if ( [textView methodForSelector:command] == [textView methodForSelector:@selector(insertNewline:)] ) {
+ //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:)] ) {
+
+ //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;
+ }
+}
+
+/**
+ * Loads a table in content or source view (if tab selected)
+ */
+- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
+{
+ 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]]]];
+
+ // Update connection characater set encoding based on the table's encoding if required
+ if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"encoding"] isEqualToString:@"Autodetect"]) {
+ [tableDocumentInstance detectTableEncodingForTable:[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]]];
+ }
+}
+
+- (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];
+ if ( [[NSUserDefaults standardUserDefaults] boolForKey:@"useMonospacedFonts"] ) {
+ [(ImageAndTextCell*)aCell setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]];
+ }
+ else
+ {
+ [(ImageAndTextCell*)aCell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+ }
+
+ } else {
+ [(ImageAndTextCell*)aCell setImage:nil];
+ [(ImageAndTextCell*)aCell setIndentationLevel:0];
+ }
+}
+
+- (float)tableView:(NSTableView *)tableView heightOfRow:(int)row
+{
+ if (row == 0) {
+ return 25;
+ } else {
+ return 17;
+ }
+}
+
+#pragma mark -
+#pragma mark TabView delegate methods
+
+/*
+loads structure or source if tab selected the first time
+*/
+- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ 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];
+ }
+*/
+}
+
+#pragma mark -
+//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