From 271b47b558c0fdbf23c68d29163185127ac5d4f3 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Fri, 8 Oct 2010 12:31:32 +0000 Subject: =?UTF-8?q?=E2=80=A2=20improved=20issues=20for=20tooltip=20in=20Co?= =?UTF-8?q?ntent=20and=20Custom=20tables=20-=20added=20not=20yet=20support?= =?UTF-8?q?ed=20MCPGeometryData=20view=20-=20removed=20@try=20clauses,=20i?= =?UTF-8?q?nstead=20make=20usage=20of=20pthread=5Fmutex=5Flock=20etc.=20ap?= =?UTF-8?q?proach=20=E2=80=A2=20adjusted=20autodetectWidthForColumnDefinit?= =?UTF-8?q?ion:=20for=20SPCopyTable=20to=20calculate=20the=20width=20by=20?= =?UTF-8?q?taking=20the=20WKT=20string=20of=20MCPGeometryData=20=E2=80=A2?= =?UTF-8?q?=20added=20SPGeometryDataView=20class=20which=20will=20be=20use?= =?UTF-8?q?d=20for=20displaying=20GEOMETRY=20data=20as=20image=20(for=20to?= =?UTF-8?q?oltips,=20inside=20field=20editor=20sheet)=20[not=20yet=20imple?= =?UTF-8?q?mented]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/SPCopyTable.m | 4 ++-- Source/SPCustomQuery.m | 28 +++++++++++++++++-------- Source/SPGeometryDataView.h | 33 ++++++++++++++++++++++++++++++ Source/SPGeometryDataView.m | 50 +++++++++++++++++++++++++++++++++++++++++++++ Source/SPTableContent.m | 31 +++++++++++++++++++--------- 5 files changed, 126 insertions(+), 20 deletions(-) create mode 100644 Source/SPGeometryDataView.h create mode 100644 Source/SPGeometryDataView.m (limited to 'Source') diff --git a/Source/SPCopyTable.m b/Source/SPCopyTable.m index 9d014839..736052dc 100644 --- a/Source/SPCopyTable.m +++ b/Source/SPCopyTable.m @@ -669,9 +669,9 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003; // Retrieve the cell's content contentString = [tableStorage cellDataAtRow:i column:columnIndex]; - // TODO it's temporarily + // Get WKT string out of the MCPGeometryData for calculation if ([contentString isKindOfClass:[MCPGeometryData class]]) - contentString = [contentString description]; + contentString = [contentString wktString]; // Replace NULLs with their placeholder string else if ([contentString isNSNull]) { diff --git a/Source/SPCustomQuery.m b/Source/SPCustomQuery.m index 5184edf7..74505e23 100644 --- a/Source/SPCustomQuery.m +++ b/Source/SPCustomQuery.m @@ -2193,16 +2193,25 @@ NSPoint pos = [NSEvent mouseLocation]; pos.y -= 20; - // Try to get the original data. If not possible return nil. - // @try clause is used due to the multifarious cases of - // possible exceptions (eg for reloading tables etc.) - id theValue; - @try{ + id theValue = nil; + + // While the table is being loaded, additional validation is required - data + // locks must be used to avoid crashes, and indexes higher than the available + // rows or columns may be requested. Return "..." to indicate loading in these + // cases. + if (isWorking) { + pthread_mutex_lock(&resultDataLock); + if (row < resultDataCount && [[aTableColumn identifier] integerValue] < [resultData columnCount]) { + theValue = [[SPDataStorageObjectAtRowAndColumn(resultData, row, [[aTableColumn identifier] integerValue]) copy] autorelease]; + } + pthread_mutex_unlock(&resultDataLock); + + if (!theValue) theValue = @"..."; + } else { theValue = SPDataStorageObjectAtRowAndColumn(resultData, row, [[aTableColumn identifier] integerValue]); } - @catch(id ae) { - return nil; - } + + if(theValue == nil) return nil; // Get the original data for trying to display the blob data as an image if ([theValue isKindOfClass:[NSData class]]) { @@ -2212,6 +2221,9 @@ return nil; } } + else if ([theValue isKindOfClass:[MCPGeometryData class]]) { + ; // TODO + } // Show the cell string value as tooltip (including line breaks and tabs) // by using the cell's font diff --git a/Source/SPGeometryDataView.h b/Source/SPGeometryDataView.h new file mode 100644 index 00000000..a2a620bb --- /dev/null +++ b/Source/SPGeometryDataView.h @@ -0,0 +1,33 @@ +// +// $Id$ +// +// SPGeometryDataView.m +// sequel-pro +// +// Created by Hans-Jörg Bibiko on October 08, 2010 +// +// 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 + +#import + + +@interface SPGeometryDataView : NSView +{ + +} + +@end diff --git a/Source/SPGeometryDataView.m b/Source/SPGeometryDataView.m new file mode 100644 index 00000000..8cfaf767 --- /dev/null +++ b/Source/SPGeometryDataView.m @@ -0,0 +1,50 @@ +// +// $Id$ +// +// SPGeometryDataView.h +// sequel-pro +// +// Created by Hans-Jörg Bibiko on October 08, 2010 +// +// 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 + +#import "SPGeometryDataView.h" + + +@implementation SPGeometryDataView + +/** + * Initialize SPGeometryDataView object + */ +- (id)initWithFrame:(NSRect)frame +{ + if ( self = [super initWithFrame:frame] ) + { + ; + } + return self; +} + +/** + * dealloc + */ +- (void)dealloc +{ + [super dealloc]; +} + +@end diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index a69ad5e2..50ce0617 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -3321,18 +3321,26 @@ NSPoint pos = [NSEvent mouseLocation]; pos.y -= 20; - // Try to get the original data. If not possible return nil. - // @try clause is used due to the multifarious cases of - // possible exceptions (eg for reloading tables etc.) - id theValue; - @try{ - theValue = [tableValues cellDataAtRow:row column:[[aTableColumn identifier] integerValue]]; - } - @catch(id ae) { - return nil; + id theValue = nil; + + // While the table is being loaded, additional validation is required - data + // locks must be used to avoid crashes, and indexes higher than the available + // rows or columns may be requested. Return "..." to indicate loading in these + // cases. + if (isWorking) { + pthread_mutex_lock(&tableValuesLock); + if (row < tableRowsCount && [[aTableColumn identifier] integerValue] < [tableValues columnCount]) { + theValue = [[SPDataStorageObjectAtRowAndColumn(tableValues, row, [[aTableColumn identifier] integerValue]) copy] autorelease]; + } + pthread_mutex_unlock(&tableValuesLock); + + if (!theValue) theValue = @"..."; + } else { + theValue = SPDataStorageObjectAtRowAndColumn(tableValues, row, [[aTableColumn identifier] integerValue]); } - // Get the original data for trying to display the blob data as an image + if(theValue == nil) return nil; + if ([theValue isKindOfClass:[NSData class]]) { image = [[[NSImage alloc] initWithData:theValue] autorelease]; if(image) { @@ -3340,6 +3348,9 @@ return nil; } } + else if ([theValue isKindOfClass:[MCPGeometryData class]]) { + ; // TODO + } // Show the cell string value as tooltip (including line breaks and tabs) // by using the cell's font -- cgit v1.2.3