// // $Id$ // // CMCopyTable.h // sequel-pro // // Created by Stuart Glenn on Wed Apr 21 2004. // Changed by Lorenz Textor on Sat Nov 13 2004 // Copyright (c) 2004 Stuart Glenn. 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 #import #import "SPTableView.h" #define SP_MAX_CELL_WIDTH_MULTICOLUMN 200 #define SP_MAX_CELL_WIDTH 400 @class SPDataStorage; /*! @class copyTable @abstract subclassed NSTableView to implement copy & drag-n-drop @discussion Allows copying by creating a string with each table row as a separate line and each cell then separate via tabs. The drag out is in similar format. The values for each cell are obtained via the objects description method */ @interface CMCopyTable : SPTableView { id tableInstance; // the table content view instance id mySQLConnection; // current MySQL connection NSArray* columnDefinitions; // array of NSDictionary containing info about columns NSString* selectedTable; // the name of the current selected table SPDataStorage* tableStorage; // the underlying storage array holding the table data NSUserDefaults *prefs; } /*! @method copy: @abstract does the work of copying @discussion gets selected (if any) row(s) as a string setting it then into th default pasteboard as a string type and tabular text type. @param sender who asked for this copy? */ - (void)copy:(id)sender; /*! @method validateMenuItem: @abstract Dynamically enable Copy menu item for the table view @discussion Will only enable the Copy item when something is selected in this table view @param anItem the menu item being validated @result YES if there is at least one row selected & the menu item is copy, NO otherwise */ - (BOOL)validateMenuItem:(NSMenuItem*)anItem; /*! @method draggingSourceOperationMaskForLocal: @discussion Allows for dragging out of the table to other applications @param isLocal who cares @result Always calls for a copy type drag operation */ - (NSUInteger)draggingSourceOperationMaskForLocal:(BOOL)isLocal; /*! @method selectedRowsAsTabStringWithHeaders @abstract getter of the selected rows of the table for copy @discussion For the selected rows returns a single string with each row separated by a newline and then for each column value separated by a tab. Values are from the objects description method, so make sure it returns something meaningful. @result The above described string, or nil if nothing selected */ - (NSString *)selectedRowsAsTabStringWithHeaders:(BOOL)withHeaders; /*! @method draggedRowsAsTabString: @abstract getter of the dragged rows of the table for drag @discussion For the dragged rows returns a single string with each row separated by a newline and then for each column value separated by a tab. Values are from the objects description method, so make sure it returns something meaningful. @result The above described string, or nil if nothing selected */ - (NSString *)draggedRowsAsTabString; /* * Generate a string in form of INSERT INTO VALUES () of * currently selected rows. Support blob data as well. */ - (NSString *)selectedRowsAsSqlInserts; /* * Set all necessary data from the table content view. */ - (void)setTableInstance:(id)anInstance withTableData:(SPDataStorage *)theTableStorage withColumns:(NSArray *)columnDefs withTableName:(NSString *)aTableName withConnection:(id)aMySqlConnection; /* * Update the table storage location if necessary. */ - (void)setTableData:(SPDataStorage *)theTableStorage; /*! @method autodetectColumnWidths @abstract Autodetect and return column widths based on contents @discussion Support autocalculating column widths for the represented data. This uses the underlying table storage, calculates string widths, and eventually returns an array of table column widths. Suitable for calling on background threads, but ensure that the data storage range in use (currently rows 1-200) won't be altered while this accesses it. @result A dictionary - mapped by column identifier - of the column widths to use */ - (NSDictionary *) autodetectColumnWidths; /*! @method autodetectWidthForColumnDefinition:maxRows: @abstract Autodetect and return column width based on contents @discussion Support autocalculating column width for the represented data. This uses the underlying table storage, and the supplied column definition, iterating through the data and returning a reasonable column width to display that data. Suitable for calling on background threads, but ensure that the data storage range in use won't be altered while being accessed. @param A column definition for a represented column; the column to use is derived @param The maximum number of rows to process when looking at string lengths @result A reasonable column width to use when displaying data */ /** * Autodetect the column width for a specified column - derived from the supplied * column definition, using the stored data and the specified font. */ - (NSUInteger)autodetectWidthForColumnDefinition:(NSDictionary *)columnDefinition maxRows:(NSUInteger)rowsToCheck; @end extern NSInteger MENU_EDIT_COPY; extern NSInteger MENU_EDIT_COPY_WITH_COLUMN; extern NSInteger MENU_EDIT_COPY_AS_SQL;