Files
cappuccino/AppKit/NEWCPTableView.j
T

577 lines
19 KiB
Plaintext

@import <AppKit/CPControl.j>
var CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_ = 1 << 2
CPTableViewDataSource_tableView_acceptDrop_row_dropOperation_ = 1 << 3,
CPTableViewDataSource_tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes_ = 1 << 4,
CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_ = 1 << 5,
CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_ = 1 << 6,
CPTableViewDataSource_tableView_sortDescriptorsDidChange_ = 1 << 7;
var CPTableViewDelegate_selectionShouldChangeInTableView_ = 1 << 0,
CPTableViewDelegate_tableView_dataViewForTableColumn_row_ = 1 << 1,
CPTableViewDelegate_tableView_didClickTableColumn_ = 1 << 2,
CPTableViewDelegate_tableView_didDragTableColumn_ = 1 << 3,
CPTableViewDelegate_tableView_heightOfRow_ = 1 << 4,
CPTableViewDelegate_tableView_isGroupRow_ = 1 << 5,
CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_ = 1 << 6,
CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_ = 1 << 7,
CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_ = 1 << 8,
CPTableViewDelegate_tableView_shouldEditTableColumn_row_ = 1 << 9,
CPTableViewDelegate_tableView_shouldSelectRow_ = 1 << 10,
CPTableViewDelegate_tableView_shouldSelectTableColumn_ = 1 << 11,
CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_ = 1 << 12,
CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_ = 1 << 13,
CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_ = 1 << 14,
CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_ = 1 << 15,
CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_ = 1 << 16,
CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_ = 1 << 17,
CPTableViewDelegate_tableViewSelectionDidChange_ = 1 << 18,
CPTableViewDelegate_tableViewSelectionIsChanging_ = 1 << 19;
// TODO: add docs
CPTableViewSelectionHighlightStyleRegular = 0;
CPTableViewSelectionHighlightStyleSourceList = 1;
@implementation NEWCPTableView : CPControl
{
id _dataSource;
unsigned _implementedDataSourceMethods;
CPArray _tableColumns;
//Configuring Behavior
BOOL _allowsColumnReordering;
BOOL _allowsColumnResizing;
BOOL _allowsMultipleSelection;
BOOL _allowsEmptySelection;
//Setting Display Attributes
CGSize _intercellSpacing;
float _rowHeight;
BOOL _usesAlternatingRowBackgroundColors;
unsigned _selectionHighlightMask;
unsigned _currentHighlightedTableColumn;
unsigned _numberOfRows;
unsigned _numberOfColumns;
}
- (void)_init
{
//Configuring Behavior
_allowsColumnReordering = YES;
_allowsColumnResizing = YES;
_allowsMultipleSelection = NO;
_allowsEmptySelection = YES;
_allowsColumnSelection = NO;
//Setting Display Attributes
_selectionHighlightMask = CPTableViewSelectionHighlightStyleRegular;
}
- (void)setDataSource:(id)aDataSource
{
if (_dataSource === aDataSource)
return;
_dataSource = aDataSource;
_implementedDataSourceMethods = 0;
if (!_dataSource)
return;
if (![_dataSource respondsToSelector:@selector(numberOfRowsInTableView:)])
[CPException raise:CPInternalInconsistencyException
reason:[aDataSource description] " does not implement numberOfRowsInTableView:."];
if (![_dataSource respondsToSelector:@selector(tableView:objectValueForTableColumn:row:)])
[CPException raise:CPInternalInconsistencyException
reason:[aDataSource description] " does not implement tableView:objectValueForTableColumn:row:"];
if ([_dataSource respondsToSelector:@selector(tableView:setObjectValue:forTableColumn:row:)])
_implementedDataSourceMethods |= CPTableViewDataSource_tableView_setObjectValue_forTableColumn_row_;
if ([_dataSource respondsToSelector:@selector(tableView:setObjectValue:forTableColumn:row:)])
_implementedDataSourceMethods |= CPTableViewDataSource_tableView_acceptDrop_row_dropOperation_;
if ([_dataSource respondsToSelector:@selector(tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:)])
_implementedDataSourceMethods |= CPTableViewDataSource_tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes_;
if ([_dataSource respondsToSelector:@selector(tableView:validateDrop:proposedRow:proposedDropOperation:)])
_implementedDataSourceMethods |= CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_;
if ([_dataSource respondsToSelector:@selector(tableView:writeRowsWithIndexes:toPasteboard:)])
_implementedDataSourceMethods |= CPTableViewDataSource_tableView_writeRowsWithIndexes_toPasteboard_;
}
- (id)dataSource
{
return _dataSource;
}
//Loading Data
* Ð reloadData
//Target-action Behavior
* Ð setDoubleAction:
* Ð doubleAction
* Ð clickedColumn
* Ð clickedRow
//Configuring Behavior
Ð (void)setAllowsColumnReordering:(BOOL)allowsColumnReordering
{
_allowsColumnReordering = allowsColumnReordering;
}
Ð (BOOL)allowsColumnReordering
{
return _allowsColumnReordering;
}
Ð (void)setAllowsColumnResizing:(BOOL)allowsColumnResizing
{
_allowsColumnResizing = allowsColumnResizing;
}
Ð (BOOL)allowsColumnResizing
{
return _allowsColumnResizing;
}
Ð (void)setAllowsMultipleSelection:(BOOL)allowsMultipleSelection
{
_allowsMultipleSelection = allowsMultipleSelection;
}
Ð (BOOL)allowsMultipleSelection
{
return _allowsMultipleSelection;
}
Ð (void)setAllowsEmptySelection:(BOOL)allowsEmptySelection
{
_allowsEmptySelection = allowsEmptySelection;
}
Ð (BOOL)allowsEmptySelection
{
return _allowsEmptySelection;
}
Ð (void)setAllowsColumnSelection:(BOOL)allowsColumnSelection
{
_allowsColumnSelection = allowsColumnSelection;
}
Ð (BOOL)allowsColumnSelection
{
return allowsColumnSelection;
}
//Setting Display Attributes
Ð (void)setIntercellSpacing:(CGSize)aSize
{
if (_intercellSpacing.width != aSize.width)
{
var i = 1,
delta = aSize.width - _intercellSpacing.width;
total = delta;
for (; i < _tableColumns.length; ++i, total += delta)
{
var origin = [_tableColumnViews[i] frame].origin;
[_tableColumnViews[i] setFrameOrigin:CGPointMake(origin.x + total, origin.y)];
}
}
if (_intercellSpacing.height != aSize.height)
{
var i = 0;
for (; i < _tableColumns.length; ++i, total += delta)
{
[_tableColumnViews[i] setFrameSize:CGSizeMake([_tableColumnViews[i] width], _numberOfRows * (_rowHeight + _intercellSpacing.height))];
var j = 1,
y = _rowHeight + _intercellSpacing.height;
for (; j < _numberOfRows; ++i, y += _rowHeight + _intercellSpacing.height)
{
if (!_tableCells[i][j])
continue;
[_tableCells[i][j] setFrameOrigin:CPPointMake(0.0, y)];
}
}
// FIXME: variable height rows
}
_intercellSpacing = _CGSizeCreateCopy(aSize);
}
Ð (CPSize)intercellSpacing
{
return _intercellSpacing;
}
Ð (void)setRowHeight:(unsigned)aRowHeight
{
if (_rowHeight == aRowHeight)
return;
_rowHeight = aRowHeight;
}
- (unsigned)rowHeight
{
return _rowHeight;
}
// TODO: confirm: comes from superclass CPView
//Ð setBackgroundColor:
//Ð backgroundColor
Ð (void)setUsesAlternatingRowBackgroundColors:(BOOL)shouldUseAlternatingRowBackgroundColors
{
// TODO:need to look at how one actually sets the alternating row, a tip at:
// http://forums.macnn.com/79/developer-center/228347/nstableview-alternating-row-colors/
// otherwise this may not be feasible or may introduce an additional change req'd in CP
// we'd probably need to iterate through rowId % 2 == 0 and setBackgroundColor with
// whatever the alternating row color is.
_usesAlternatingRowBackgroundColors = shouldUseAlternatingRowBackgroundColors;
}
Ð (BOOL)usesAlternatingRowBackgroundColors
{
return _usesAlternatingRowBackgroundColors;
}
Ð (unsigned)selectionHighlightStyle
{
return _selectionHighlightMask;
}
Ð (void)setSelectionHighlightStyle:(unsigned)aSelectionHighlightStyle
{
_selectionHighlightMask = aSelectionHighlightStyle;
}
Ð setGridColor:
* Ð gridColor
* Ð setGridStyleMask:
* Ð gridStyleMask
* Ð indicatorImageInTableColumn:
* Ð setIndicatorImage:inTableColumn:
//Column Management
* Ð addTableColumn:
* Ð removeTableColumn:
* Ð moveColumn:toColumn:
* Ð tableColumns
* Ð columnWithIdentifier:
* Ð tableColumnWithIdentifier:
//Selecting Columns and Rows
* Ð selectColumnIndexes:byExtendingSelection:
* Ð selectRowIndexes:byExtendingSelection:
* Ð selectedColumnIndexes
* Ð selectedRowIndexes
* Ð deselectColumn:
* Ð deselectRow:
* Ð numberOfSelectedColumns
* Ð numberOfSelectedRows
* Ð selectedColumn
* Ð selectedRow
* Ð isColumnSelected:
* Ð isRowSelected:
* Ð selectAll:
* Ð deselectAll:
* Ð allowsTypeSelect
* Ð setAllowsTypeSelect:
//Table Dimensions
Ð (int)numberOfColumns
{
return _numberOfColumns;
}
/*
Returns the number of rows in the receiver.
*/
Ð (int)numberOfRows
{
return _numberOfRows;
}
//Displaying Cell
* Ð tableView:willDisplayCell:forTableColumn:row: delegate method
* Ð preparedCellAtColumn:row:
* Ð tableView:dataCellForTableColumn:row: delegate method
* Ð tableView:shouldShowCellExpansionForTableColumn:row: delegate method
* Ð tableView:isGroupRow: delegate method
//Editing Cells
* Ð editColumn:row:withEvent:select:
* Ð editedColumn
* Ð editedRow
* Ð tableView:shouldEditTableColumn:row: delegate method
//Setting Auxiliary Views
* Ð setHeaderView:
* Ð headerView
* Ð setCornerView:
* Ð cornerView
//Layout Support
* Ð rectOfColumn:
* Ð rectOfRow:
* Ð rowsInRect:
* Ð columnIndexesInRect:
* Ð columnAtPoint:
* Ð rowAtPoint:
* Ð frameOfCellAtColumn:row:
* Ð columnAutoresizingStyle
* Ð setColumnAutoresizingStyle:
* Ð sizeLastColumnToFit
* Ð noteNumberOfRowsChanged
* Ð tile
* Ð sizeToFit
* Ð noteHeightOfRowsWithIndexesChanged:
* Ð tableView:heightOfRow: delegate method
* Ð columnsInRect: Deprecated in Mac OS X v10.5
//Drawing
* Ð drawRow:clipRect:
* Ð drawGridInClipRect:
* Ð highlightSelectionInClipRect:
* Ð drawBackgroundInClipRect:
//Scrolling
* Ð scrollRowToVisible:
* Ð scrollColumnToVisible:
//Persistence
* Ð autosaveName
* Ð autosaveTableColumns
* Ð setAutosaveName:
* Ð setAutosaveTableColumns:
//Selecting in the Tableview
* Ð selectionShouldChangeInTableView: delegate method
* Ð tableView:shouldSelectRow: delegate method
* Ð tableView:selectionIndexesForProposedSelection: delegate method
* Ð tableView:shouldSelectTableColumn: delegate method
* Ð tableViewSelectionIsChanging: delegate method
* Ð tableViewSelectionDidChange: delegate method
* Ð tableView:shouldTypeSelectForEvent:withCurrentSearchString: delegate method
* Ð tableView:typeSelectStringForTableColumn:row: delegate method
* Ð tableView:nextTypeSelectMatchFromRow:toRow:forString: delegate method
//Setting the Delegate:(id)aDelegate
- (void)setDelegate:(id)aDelegate
{
if (_delegate === aDelegate)
return;
var defaultCenter = [CPNotificationCenter defaultCenter];
if (_delegate)
{
if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)])
[defaultCenter
removeObserver:_delegate
name:CPTableViewColumnDidMoveNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)])
[defaultCenter
removeObserver:_delegate
name:CPTableViewColumnDidResizeNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)])
[defaultCenter
removeObserver:_delegate
name:CPTableViewSelectionDidChangeNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)])
[defaultCenter
removeObserver:_delegate
name:CPTableViewSelectionIsChangingNotification
object:self];
}
_delegate = aDelegate;
_implementedDelegateMethods = 0;
if ([_delegate respondsToSelector:@selector(selectionShouldChangeInTableView:)])
_implementedDelegateMethods |= CPTableViewDelegate_selectionShouldChangeInTableView_;
if ([_delegate respondsToSelector:@selector(tableView:dataViewForTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_dataViewForTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableView:didClickTableColumn:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_didClickTableColumn_;
if ([_delegate respondsToSelector:@selector(tableView:didDragTableColumn:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_didDragTableColumn_;
if ([_delegate respondsToSelector:@selector(tableView:heightOfRow:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_heightOfRow_;
if ([_delegate respondsToSelector:@selector(tableView:isGroupRow:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_isGroupRow_;
if ([_delegate respondsToSelector:@selector(tableView:mouseDownInHeaderOfTableColumn:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_mouseDownInHeaderOfTableColumn_;
if ([_delegate respondsToSelector:@selector(tableView:nextTypeSelectMatchFromRow:toRow:forString:)
_implementedDelegateMethods |= CPTableViewDelegate_tableView_nextTypeSelectMatchFromRow_toRow_forString_;
if ([_delegate respondsToSelector:@selector(tableView:selectionIndexesForProposedSelection:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_selectionIndexesForProposedSelection_;
if ([_delegate respondsToSelector:@selector(tableView:shouldEditTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldEditTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableView:shouldSelectRow:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldSelectRow_;
if ([_delegate respondsToSelector:@selector(tableView:shouldSelectTableColumn:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldSelectTableColumn_;
if ([_delegate respondsToSelector:@selector(tableView:shouldShowViewExpansionForTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldShowViewExpansionForTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableView:shouldTrackView:forTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldTrackView_forTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableView:shouldTypeSelectForEvent:withCurrentSearchString:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_shouldTypeSelectForEvent_withCurrentSearchString_;
if ([_delegate respondsToSelector:@selector(tableView:toolTipForView:rect:tableColumn:row:mouseLocation:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_toolTipForView_rect_tableColumn_row_mouseLocation_;
if ([_delegate respondsToSelector:@selector(tableView:typeSelectStringForTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_typeSelectStringForTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableView:willDisplayView:forTableColumn:row:)])
_implementedDelegateMethods |= CPTableViewDelegate_tableView_willDisplayView_forTableColumn_row_;
if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)])
[defaultCenter
addObserver:_delegate
selector:@selector(tableViewColumnDidMove:)
name:CPTableViewColumnDidMoveNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)])
[defaultCenter
addObserver:_delegate
selector:@selector(tableViewColumnDidMove:)
name:CPTableViewColumnDidResizeNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)])
[defaultCenter
addObserver:_delegate
selector:@selector(tableViewSelectionDidChange:)
name:CPTableViewSelectionDidChangeNotification
object:self];
if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)])
[defaultCenter
addObserver:_delegate
selector:@selector(tableViewSelectionIsChanging:)
name:CPTableViewSelectionIsChangingNotification
object:self];
}
- (id)delegate
{
return _delegate;
}
//Highlightable Column Headers
Ð (CPTableColumn)highlightedTableColumn
{
}
* Ð setHighlightedTableColumn:
//Dragging
* Ð dragImageForRowsWithIndexes:tableColumns:event:offset:
* Ð canDragRowsWithIndexes:atPoint:
* Ð setDraggingSourceOperationMask:forLocal:
* Ð setDropRow:dropOperation:
* Ð setVerticalMotionCanBeginDrag:
* Ð verticalMotionCanBeginDrag
//Sorting
* Ð setSortDescriptors:
* Ð sortDescriptors
//Moving and Resizing Columns
* Ð tableView:didDragTableColumn: delegate method
* Ð tableViewColumnDidMove: delegate method
* Ð tableViewColumnDidResize: delegate method
//Responding to Mouse Events
* Ð tableView:didClickTableColumn: delegate method
* Ð tableView:mouseDownInHeaderOfTableColumn: delegate method
* Ð tableView:shouldTrackCell:forTableColumn:row: delegate method
//Text Delegate Methods
* Ð textShouldBeginEditing:
* Ð textDidBeginEditing:
* Ð textDidChange:
* Ð textShouldEndEditing:
* Ð textDidEndEditing:
//Displaying Tooltips
* Ð tableView:toolTipForCell:rect:tableColumn:row:mouseLocation: delegate method
@end