From b43b097d401b8f21ab0d613ca3f2aaae48a7cbf7 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 13 Oct 2009 15:42:44 -0700 Subject: [PATCH] Fix for building from scratch. Reviewed by me. --- AppKit/Jakefile | 11 +- AppKit/OLDCPTableColumn.j | 471 ------ AppKit/OLDCPTableView.j | 1302 ----------------- AppKit/Themes/CommonJS/blendtask.j | 2 +- .../lib-js/objective-j/jake/bundletask.js | 1 + common.jake | 4 +- 6 files changed, 10 insertions(+), 1781 deletions(-) delete mode 100644 AppKit/OLDCPTableColumn.j delete mode 100644 AppKit/OLDCPTableView.j diff --git a/AppKit/Jakefile b/AppKit/Jakefile index 8d97c442a..51e1b74f2 100644 --- a/AppKit/Jakefile +++ b/AppKit/Jakefile @@ -4,7 +4,6 @@ require("../common.jake"); $BUILD_PATH = FILE.join($BUILD_DIR, $CONFIGURATION, 'AppKit'); -$THEME_PRODUCT = FILE.join($BUILD_PATH, 'Resources', 'Aristo.blend'); AppKitFiles = new FileList("**/*.j").exclude('CoreGraphics/CGContextCanvas.j', 'CoreGraphics/CGContextVML.j', 'Themes/**/*', 'Tools/**/*'); @@ -36,14 +35,16 @@ filedir ($COMMONJS_PRODUCT_APPKIT, ["AppKit"], function() cp_r(appKitTask.buildProductPath(), $COMMONJS_PRODUCT_APPKIT); }); -subtasks (["Tools"], ["build"/*, "clean", "clobber"*/]); +//subtasks (["Themes"], ["clean", "clobber"]); -task ($THEME_PRODUCT, [$COMMONJS_PRODUCT_APPKIT], function() +task ("Theme", [$COMMONJS_PRODUCT_APPKIT], function() { subjake(["Themes"], "build"); - cp_r(FILE.join($BUILD_DIR, $CONFIGURATION, 'Aristo.blend'), $THEME_PRODUCT); + + cp_r(FILE.join($BUILD_DIR, $CONFIGURATION, 'Aristo.blend'), FILE.join($BUILD_PATH, 'Resources', 'Aristo.blend')); + cp_r(FILE.join($BUILD_DIR, $CONFIGURATION, 'Aristo.blend'), FILE.join($COMMONJS_PRODUCT_APPKIT, "Resources", "Aristo.blend")); }); -task ("build", ["AppKit", $THEME_PRODUCT, $COMMONJS_PRODUCT_APPKIT]); +task ("build", ["AppKit", $COMMONJS_PRODUCT_APPKIT, "Theme"]); //CLOBBER.include($ENVIRONMENT_PRODUCT) diff --git a/AppKit/OLDCPTableColumn.j b/AppKit/OLDCPTableColumn.j deleted file mode 100644 index 6d37c1de9..000000000 --- a/AppKit/OLDCPTableColumn.j +++ /dev/null @@ -1,471 +0,0 @@ -/* - * CPTableColumn.j - * AppKit - * - * Created by Francisco Tolmasky. - * Copyright 2008, 280 North, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -@import - - -/* -@ignore -*/ - -/* - @global - @class CPTableColumn -*/ -CPTableColumnNoResizing = 0; -/* - @global - @class CPTableColumn -*/ -CPTableColumnAutoresizingMask = 1; -/* - @global - @class CPTableColumn -*/ -CPTableColumnUserResizingMask = 2; - -#define PurgableInfoMake(aView, aRow) { view:(aView), row:(aRow) } -#define PurgableInfoView(anInfo) ((anInfo).view) -#define PurgableInfoRow(anInfo) ((anInfo).row) - -/*! - @ingroup appkit - @class CPTableColumn - - An CPTableColumn object mainly keeps information about the width of the column, its minimum and maximum width; whether the column can be edited or resized; and the cells used to draw the column header and the data in the column. You can change all these attributes of the column by calling the appropriate methods. Please note that the table column does not hold nor has access to the data to be displayed in the column; this data is maintained in the table view's data source.

- -

Each CPTableColumn object is identified by a CPString, called the column identifier. The reason is that, after a column has been added to a table view, the user might move the columns around, so there is a need to identify the columns regardless of its position in the table. - - @ignore -*/ -@implementation CPTableColumn : CPObject -{ - CPString _identifier; - CPView _headerView; - - CPTableView _tableView; - - float _width; - float _minWidth; - float _maxWidth; - - unsigned _resizingMask; - - CPView _dataView; // default data view for this column - - Object _dataViewData; // cache of data view archives (key=data view UID, value=data view archive) - Object _dataViewForView; // mapping from view instances back to their data view prototype (key=view instance UID, value=data view) - Object _purgableInfosForDataView; // (key=data view UID, value=) -} - -/*! - Initializes the table column with the specified identifier. - @param anIdentifier the identifier - @return the initialized table column -*/ -- (id)initWithIdentifier:(CPString)anIdentifier -{ - self = [super init]; - - if (self) - { - [self _init]; - - _identifier = anIdentifier; - - _width = 40.0; - _minWidth = 8.0; - _maxWidth = 1000.0; - - var dataView = [[CPTextField alloc] initWithFrame:CPRectMakeZero()]; - [dataView setValue:[CPColor whiteColor] forThemeAttribute:"text-color" inState:CPThemeStateHighlighted]; - - [self setDataView:dataView]; - - _headerView = [[CPTextField alloc] initWithFrame:CPRectMakeZero()]; - [_headerView setBackgroundColor:[CPColor greenColor]]; - } - - return self; -} - -- (void)_init -{ - _dataViewData = {}; - _dataViewForView = {}; - _purgableInfosForDataView = {}; -} - -/*! - Sets the table column's identifier - @param anIdentifier the new identifier -*/ -- (void)setIdentifier:(CPString)anIdentifier -{ - _identifier = anIdentifier; -} - -/*! - Returns the table column's identifier -*/ -- (CPString)identifier -{ - return _identifier; -} - -// Setting the CPTableView -/*! - Sets the table's view. This is called automatically by Cappuccino. - @param aTableView the new table view -*/ -- (void)setTableView:(CPTableView)aTableView -{ - _tableView = aTableView; -} - -/*! - Returns the column's table view. -*/ -- (CPTableView)tableView -{ - return _tableView; -} - -// Controlling size -/*! - Sets the column's width. - @param aWidth the new column width -*/ -- (void)setWidth:(float)aWidth -{ - _width = aWidth; -} - -/*! - Returns the column's width -*/ -- (float)width -{ - return _width; -} - -/*! - Sets column's minimum width. - @param aWidth the new minimum column width -*/ -- (void)setMinWidth:(float)aWidth -{ - if (_width < (_minWidth = aWidth)) - [self setWidth:_minWidth]; -} - -/*! - The column's minimum width -*/ -- (float)minWidth -{ - return _minWidth; -} - -/*! - Sets the column's maximum width. - @param aWidth the new maximum width -*/ -- (void)setMaxWidth:(float)aWidth -{ - if (_width > (_maxmimumWidth = aWidth)) - [self setWidth:_maxWidth]; -} - -/*! - Sets the resizing mask. The mask is one of: -

-CPTableColumnNoResizing;
-CPTableColumnAutoresizingMask;
-CPTableColumnUserResizingMask;
-
- @param aMask the new resizing mask -*/ -- (void)setResizingMask:(unsigned)aMask -{ - _resizingMask = aMask; -} - -/*! - Returns the column's resizing mask. One of: -
-CPTableColumnNoResizing;
-CPTableColumnAutoresizingMask;
-CPTableColumnUserResizingMask;
-
-*/ -- (unsigned)resizingMask -{ - return _resizingMask; -} - -/*! - Resizes the column according to the min, max and set width. -*/ -- (void)sizeToFit -{ - var width = CPRectGetWidth([_headerView frame]); - - if (width < _minWidth) - [self setMinWidth:width]; - else if (width > _maxWidth) - [self setMaxWidth:width] - - if (_width != width) - [self setWidth:width]; -} - -/*! - Sets whether the column in this data is editable. - @param aFlag YES means the column data is editable -*/ -- (void)setEditable:(BOOL)aFlag -{ - _isEditable = aFlag; -} - -/*! - Returns YES if the column data is editable. -*/ -- (BOOL)isEditable -{ - return _isEditable; -} - -//Setting the column header view - -/*! - Sets the view that draws the column's header. - @param aHeaderView the view that will draws the column header -*/ - -- (void)setHeaderView:(CPView)aView -{ - _headerView = aView; -} - -/*! - Return the view that draws the column's header -*/ -- (CPView)headerView -{ - return _headerView; -} - -/*! - Sets the data cell that draws rows in this column. -*/ -- (void)setDataCell:(CPView )aView -{ - [self setDataView:aView]; -} - -/* - Sets the data view that draws rows in this column. -*/ -- (void)setDataView:(CPView )aView -{ - if (_dataView) - _dataViewData[[_dataView UID]] = nil; - - _dataView = aView; - _dataViewData[[aView UID]] = [CPKeyedArchiver archivedDataWithRootObject:aView]; -} - -/*! - Returns the data cell that draws rows in this column -*/ -- (CPCell)dataCell -{ - return _dataView; -} - -/* - Returns the data view that draws rows in this column -*/ -- (CPView)dataView -{ - return [self dataCell]; -} - -/*! - By default returns the value from dataCell. This can - be overridden by a subclass to return different cells for different - rows. - @param aRowIndex the index of the row to obtain the cell for -*/ -- (CPCell)dataCellForRow:(int)aRowIndex -{ - return [self dataView]; -} - -- (CPView)dataViewForRow:(int)aRowIndex -{ - return [self dataCellForRow:aRowIndex]; -} -/* -- (void)_markViewAsPurgable:(CPView)aView -{ - var viewUID = [aView UID], - dataViewUID = [_dataViewForView[viewUID] UID]; - - if (!_purgableInfosForDataView[dataViewUID]) - _purgableInfosForDataView[dataViewUID] = [CPDictionary dictionary]; - - [_purgableInfosForDataView[dataViewUID] setObject:aView forKey:viewUID]; -} -*/ -- (void)_markView:(CPView)aView inRow:(unsigned)aRow asPurgable:(BOOL)isPurgable -{ - var viewUID = [aView UID], - dataViewUID = [_dataViewForView[viewUID] UID]; - - if (!_purgableInfosForDataView[dataViewUID]) - { - if (!isPurgable) - return; - - _purgableInfosForDataView[dataViewUID] = {}; - } - - if (!isPurgable) { - if (_purgableInfosForDataView[dataViewUID][viewUID]) - CPLog.warn("removing unpurgable " + _purgableInfosForDataView[dataViewUID][viewUID]); - delete _purgableInfosForDataView[dataViewUID][viewUID]; - } - else - _purgableInfosForDataView[dataViewUID][viewUID] = PurgableInfoMake(aView, aRow); -} - -- (CPView)_newDataViewForRow:(int)aRowIndex avoidingRows:(CPRange)rows -{ - var view = [self dataViewForRow:aRowIndex], - viewUID = [view UID], - purgableInfos = _purgableInfosForDataView[viewUID]; - - if (purgableInfos) - { - for (var key in purgableInfos) - { - var info = purgableInfos[key]; - //if (!CPLocationInRange(PurgableInfoRow(info), rows)) - //{ - //CPLog.debug("yes, a purged view is usable, its called: " + PurgableInfoView(info)); - delete purgableInfos[key]; - return PurgableInfoView(info); - //} - //else - // CPLog.warn("avoiding"); - } - } - - // if we haven't cached an archive of the data view, do it now - if (!_dataViewData[viewUID]) - _dataViewData[viewUID] = [CPKeyedArchiver archivedDataWithRootObject:view]; - - // unarchive the data view cache - var newView = [CPKeyedUnarchiver unarchiveObjectWithData:_dataViewData[viewUID]]; - - // map the new view's UID to it's data view prototype - _dataViewForView[[newView UID]] = view; - - CPLog.warn("creating cell: %s", newView); - - return newView; -} - -- (void)_purge -{ - for (var viewUID in _purgableInfosForDataView) - { - var purgableInfos = _purgableInfosForDataView[viewUID]; - - for (var key in purgableInfos) - { - var view = PurgableInfoView(purgableInfos[key]); - - if (!view) - CPLog.info("key="+key+" view=" + view + " purgableInfos[key]="+purgableInfos[key]) - else if (view._superview) { - //CPLog.error("PURGING: (removing)" + view); - //[view removeFromSuperview]; - [view setHidden:YES]; - } - //else - // CPLog.warn("PURGING: (already removed)" + view); - - //delete purgableInfos[key]; - } - } -} - -@end - - -var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey", - CPTableColumnHeaderViewKey = @"CPTableColumnHeaderViewKey", - CPTableColumnDataViewKey = @"CPTableColumnDataViewKey", - CPTableColumnWidthKey = @"CPTableColumnWidthKey", - CPTableColumnMinWidthKey = @"CPTableColumnMinWidthKey", - CPTableColumnMaxWidthKey = @"CPTableColumnMaxWidthKey", - CPTableColumnResizingMaskKey = @"CPTableColumnResizingMaskKey"; - -@implementation CPTableColumn (CPCoding) - -- (id)initWithCoder:(CPCoder)aCoder -{ - [self _init]; - - _identifier = [aCoder decodeObjectForKey:CPTableColumnIdentifierKey]; - - [self setHeaderView:[aCoder decodeObjectForKey:CPTableColumnHeaderViewKey]]; - [self setDataView:[aCoder decodeObjectForKey:CPTableColumnDataViewKey]]; - - _width = [aCoder decodeFloatForKey:CPTableColumnWidthKey]; - _minWidth = [aCoder decodeFloatForKey:CPTableColumnMinWidthKey]; - _maxWidth = [aCoder decodeFloatForKey:CPTableColumnMaxWidthKey]; - - _resizingMask = [aCoder decodeBoolForKey:CPTableColumnResizingMaskKey]; - - return self; -} - -- (void)encodeWithCoder:(CPCoder)aCoder -{ - [aCoder encodeObject:_identifier forKey:CPTableColumnIdentifierKey]; - - [aCoder encodeObject:_headerView forKey:CPTableColumnHeaderViewKey]; - [aCoder encodeObject:_dataView forKey:CPTableColumnDataViewKey]; - - [aCoder encodeObject:_width forKey:CPTableColumnWidthKey]; - [aCoder encodeObject:_minWidth forKey:CPTableColumnMinWidthKey]; - [aCoder encodeObject:_maxWidth forKey:CPTableColumnMaxWidthKey]; - - [aCoder encodeObject:_resizingMask forKey:CPTableColumnResizingMaskKey]; -} - -@end diff --git a/AppKit/OLDCPTableView.j b/AppKit/OLDCPTableView.j deleted file mode 100644 index 02b2e5cd9..000000000 --- a/AppKit/OLDCPTableView.j +++ /dev/null @@ -1,1302 +0,0 @@ -/* - * CPTableView.j - * AppKit - * - * Created by Francisco Tolmasky. - * Copyright 2008, 280 North, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -@import "CPControl.j" -@import "CPTableColumn.j" - -@import "CPColor.j" -@import "CPTextField.j" - -#define ROW_HEIGHT(aRow) (_hasVariableHeightRows ? _rowHeights[aRow] : _rowHeight) -#define ROW_MIN_Y(aRow) (_hasVariableHeightRows ? _rowMinYs[aRow] : (aRow * (_rowHeight + _intercellSpacing.height))) - -CPTableViewColumnDidMoveNotification = "CPTableViewColumnDidMoveNotification"; -CPTableViewColumnDidResizeNotification = "CPTableViewColumnDidResizeNotification"; -CPTableViewSelectionDidChangeNotification = "CPTableViewSelectionDidChangeNotification"; -CPTableViewSelectionIsChangingNotification = "CPTableViewSelectionIsChangingNotification"; - -var _CPTableViewWillDisplayCellSelector = 1 << 0, - _CPTableViewShouldSelectRowSelector = 1 << 1, - _CPTableViewShouldSelectTableColumnSelector = 1 << 2, - _CPTableViewSelectionShouldChangeSelector = 1 << 3, - _CPTableViewShouldEditTableColumnSelector = 1 << 4, - _CPTableViewSelectionIndexesForProposedSelectionSelector = 1 << 5, - _CPTableViewHeightOfRowSelector = 1 << 6; - -/* - @ingroup appkit - - This class is not yet stable. - - CPTableView is located within the AppKit framework and is used to display tables. - It uses a delegate model for getting its data i.e. you give it an object that provides - it with the data it should display. - - @ignore -*/ -@implementation CPTableView : CPControl -{ - // Archived: - - id _dataSource; - id _delegate; - - //CPTableHeaderView _headerView; - //CPView _cornerView; - - CPArray _tableColumns; - - CPIndexSet _selectedRowIndexes; - //CPArray _selectedColumns; - - float _rowHeight; - CGSize _intercellSpacing; - - BOOL _allowsMultipleSelection; - BOOL _allowsEmptySelection; - //BOOL _allowsColumnReordering; - //BOOL _allowsColumnResizing; - //BOOL _allowsColumnSelection; - //BOOL _autoresizesAllColumnsToFit; - - //CPColor _gridColor; - //BOOL _drawsGrid; - - SEL _doubleAction; - - // Not archived: - - int _delegateSelectorsCache; - - //CPScrollView _scrollView; - - unsigned _numberOfRows; - //unsigned _numberOfColumns; - - BOOL _hasVariableHeightRows; - - // Heights - float _columnHeight; // calculated - - CPArray _rowHeights; - CPArray _rowMinYs; - - CPArray _tableCells; - CPArray _tableColumnViews; - - // Caching - Object _dataViewCache; - CPArray _objectValueCache; - - CPRange _visibleRows; - CPRange _visibleColumns; - - CPRange _populatedRows; - CPRange _populatedColumns; - - // Selection - CPIndexSet _previousSelectedRowIndexes; - int _selectionStartRow; - int _selectionModifier; - - CPIndexSet _currentlySelected; - CPArray _selectionViews; - CPArray _selectionViewsPool; - - CPDate _scrollTimer; -} - -+ (void)initialize -{ - -} - -- (id)initWithFrame:(CGRect)aFrame -{ - self = [super initWithFrame:aFrame]; - - if (self) - { - [self _init]; - } - - return self; -} - -- (void)_init -{ - _tableColumns = []; - //_numberOfColumns = 0; - - _selectedRowIndexes = [CPIndexSet indexSet]; - - _rowHeight = 17.0; - _intercellSpacing = CPSizeMake(3.0, 2.0); - - _allowsMultipleSelection = YES; - _allowsEmptySelection = YES; - - - _tableCells = []; - _tableColumnViews = []; - - _dataViewCache = {}; - _objectValueCache = []; - - _visibleRows = CPMakeRange(0, 0); - _visibleColumns = CPMakeRange(0, 0); - - _rowHeights = []; - _rowMinYs = []; -} - -/* - Returns the table's column height -*/ -- (float)_columnHeight -{ - return _columnHeight;//_numberOfRows * (_rowHeight + _intercellSpacing.height); -} - -- (void)newCellForRow:(unsigned)aRowIndex column:(unsigned)aColumnIndex avoidingRows:(CPRange)rows -{ - var dataView = [_tableColumns[aColumnIndex] _newDataViewForRow:aRowIndex avoidingRows:rows]; - - [dataView setFrame:CGRectMake(0.0, ROW_MIN_Y(aRowIndex), [_tableColumns[aColumnIndex] width], ROW_HEIGHT(aRowIndex))]; - - if ([dataView respondsToSelector:@selector(highlight:)]) - [dataView highlight:[_selectedRowIndexes containsIndex:aRowIndex]]; - - if (!_objectValueCache[aColumnIndex]) - _objectValueCache[aColumnIndex] = []; - - // We may be storing 0 after all! - if (_objectValueCache[aColumnIndex][aRowIndex] === undefined) - _objectValueCache[aColumnIndex][aRowIndex] = [_dataSource tableView:self objectValueForTableColumn:_tableColumns[aColumnIndex] row:aRowIndex]; - - [dataView setObjectValue:_objectValueCache[aColumnIndex][aRowIndex]]; - - return dataView; -} - -- (void)clearCells -{ - var columnEnd = CPMaxRange(_visibleColumns), - rowEnd = CPMaxRange(_visibleRows); - - for (var column = _visibleColumns.location; column < columnEnd; column++) - { - var tableColumn = _tableColumns[column], - tableColumnCells = _tableCells[column]; - - for (var row = _visibleRows.location; row < rowEnd; row++) - { - var cell = tableColumnCells[row]; - if (cell) - { - tableColumnCells[row] = nil; - [tableColumn _markView:cell inRow:row asPurgable:YES]; - } - else - { - CPLog.warn("Missing cell? " + row + "," + column); - } - } - } - - _visibleColumns = CPMakeRange(0,0); - _visibleRows = CPMakeRange(0,0); -} - -- (void)loadTableCellsInRect:(CGRect)aRect -{ - if (!_dataSource) - return; - - // Determine new visible rows and columns. - - var rowStart = MAX(0, [self _rowAtY:CGRectGetMinY(aRect)] - 1), - rowEnd = MIN(_numberOfRows, [self _rowAtY:CGRectGetMaxY(aRect)] + 1), - - visibleRows = CPMakeRange(rowStart, rowEnd - rowStart), - - columnStart = MAX(0, [self _columnAtX:CGRectGetMinX(aRect)]), - columnEnd = MIN(_tableColumns.length, [self _columnAtX:CGRectGetMaxX(aRect)] + 1), - - visibleColumns = CPMakeRange(columnStart, columnEnd - columnStart); - - if (CPEqualRanges(_visibleRows, visibleRows) && CPEqualRanges(_visibleColumns, visibleColumns)) - return; - - var unionVisibleRows = CPUnionRange(_visibleRows, visibleRows), - unionVisibleColumns = CPUnionRange(_visibleColumns, visibleColumns); - - - // Determine whether to use 2 sweeps or one. If we have lots of overlap of cells, use just one. - if (unionVisibleRows.length * unionVisibleColumns.length <= - (_visibleRows.length * _visibleColumns.length) + (visibleRows.length * visibleColumns.length)) - { - //CPLog.info("single sweep"); - - var cEnd = CPMaxRange(unionVisibleColumns), - rEnd = CPMaxRange(unionVisibleRows), - cell; - - for (var column = unionVisibleColumns.location; column < cEnd; ++column) - { - var tableColumn = _tableColumns[column], - tableColumnCells = _tableCells[column], - columnIsVisible = CPLocationInRange(column, visibleColumns), - newCells = []; - - for (var row = unionVisibleRows.location; row < rEnd; ++row) - { - if (cell = tableColumnCells[row]) - { - if (!columnIsVisible || !CPLocationInRange(row, visibleRows)) - { - tableColumnCells[row] = nil; - [tableColumn _markView:cell inRow:row asPurgable:YES]; - } - } - else - { - newCells.push(row); - } - } - - while (newCells.length > 0) - { - var row = newCells.pop(); - - tableColumnCells[row] = [self newCellForRow:row column:column avoidingRows:visibleRows]; - - if (!tableColumnCells[row]._superview) - [_tableColumnViews[column] addSubview:tableColumnCells[row]]; - else if (tableColumnCells[row]._isHidden) - [tableColumnCells[row] setHidden:NO]; - } - - [tableColumn _purge]; - } - } - else { - //CPLog.info("double sweep"); - - // first sweep: remove old cells - - var cEnd = CPMaxRange(_visibleColumns), - rEnd = CPMaxRange(_visibleRows), - cell; - - for (var column = _visibleColumns.location; column < cEnd; ++column) - { - var tableColumn = _tableColumns[column], - tableColumnCells = _tableCells[column], - columnIsVisible = CPLocationInRange(column, visibleColumns); - - for (var row = _visibleRows.location; row < rEnd; ++row) - { - if (cell = tableColumnCells[row]) - { - if (!columnIsVisible || !CPLocationInRange(row, visibleRows)) - { - tableColumnCells[row] = nil; - [tableColumn _markView:cell inRow:row asPurgable:YES]; - } - } - } - } - - // second sweep: add new cells - - var cEnd = CPMaxRange(visibleColumns), - rEnd = CPMaxRange(visibleRows); - - for (var column = visibleColumns.location; column < cEnd; ++column) - { - var tableColumn = _tableColumns[column], - tableColumnCells = _tableCells[column]; - - for (var row = visibleRows.location; row < rEnd; ++row) - { - tableColumnCells[row] = [self newCellForRow:row column:column avoidingRows:visibleRows]; - - if (!tableColumnCells[row]._superview) - [_tableColumnViews[column] addSubview:tableColumnCells[row]]; - else if (tableColumnCells[row]._isHidden) - [tableColumnCells[row] setHidden:NO]; - } - - [tableColumn _purge]; - } - } - - - _visibleRows = visibleRows; - _visibleColumns = visibleColumns; - -} - -// Setting display attributes -/* - Sets the width and height between cell. The default is (3.0, 2.0) (width, height). - @param the width and height spacing -*/ -- (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 = CPSizeCreateCopy(aSize); -} - -/* - Returns the width and height of the space between - cells. -*/ -- (CGSize)intercellSpacing -{ - return _intercellSpacing; -} - -/* - Sets the height of table rows - @param aRowHeight the new height of the table rows -*/ -- (void)setRowHeight:(unsigned)aRowHeight -{ - if (_rowHeight == aRowHeight) - return; - - _rowHeight = aRowHeight; - - // don't perform adjustments if we're using variable height rows - if (_hasVariableHeightRows) - return; - - for (var row = 0; row < _numberOfRows; ++row) - for (var column = 0; column < _tableColumns.length; ++column) - [_tableCells[column][row] setFrameOrigin:CPPointMake(0.0, row * (_rowHeight + _intercellSpacing.height))]; -} - -/* - Returns the height of a table row -*/ -- (unsigned)rowHeight -{ - return _rowHeight; -} - -/* - Adds a column to the table - @param aTableColumn the column to be added -*/ -- (void)addTableColumn:(CPTableColumn)aTableColumn -{ - var i = 0, - x = _tableColumns.length ? CPRectGetMaxX([self rectOfColumn:_tableColumns.length - 1]) + _intercellSpacing.width : 0.0, - tableColumnView = [[CPView alloc] initWithFrame:CPRectMake(x, 0.0, [aTableColumn width], [self _columnHeight])], - tableColumnCells = []; - - [_tableColumns addObject:aTableColumn]; - [_tableColumnViews addObject:tableColumnView]; - -// [tableColumnView setBackgroundColor:[CPColor greenColor]]; - - [self addSubview:tableColumnView]; - - [_tableCells addObject:tableColumnCells]; - - // TODO: do we really need to initialize this, or is undefined good enough? - for (; i < _numberOfRows; ++i) - _tableCells[_tableColumns.length-1][i] = nil; - - //++_numberOfColumns; -} - -/* - Removes a column from the table - @param aTableColumn the column to remove -*/ -- (void)removeTableColumn:(CPTableColumn)aTableColumn -{ - var frame = [self frame], - width = [aTableColumn width] + _intercellSpacing.width, - index = [_tableColumns indexOfObjectIdenticalTo:aTableColumn]; - - // Remove the column view and all the cell views from the view hierarchy. - [_tableColumnViews[i] removeFromSuperview]; - - [_tableCells removeObjectAtIndex:index]; - [_tableColumns removeObjectAtIndex:index]; - [_tableColumnViews removeObjectAtIndex:index]; - - // Shift remaining column views to the left. - for (; index < _tableColumns.length; ++ index) - [_tableColumnViews[index] setFrameOrigin:CPPointMake(CPRectGetMinX([_tableColumnViews[index] frame]) - width, 0.0)] - - // Resize ourself. - [self setFrameSize:CPSizeMake(CPRectGetWidth(frame) - width, CPRectGetHeight(frame))]; -} - -/* - Not yet implemented. Changes the position of the column in - the table. - @param fromIndex the original index of the column - @param toIndex the desired index of the column -*/ -- (void)moveColumn:(unsigned)fromIndex toColumn:(unsinged)toIndex -{ - if (fromIndex == toIndex) - return; -// FIXME: IMPLEMENT -} - -/* - Returns an array containing the table's CPTableColumns. -*/ -- (CPArray)tableColumns -{ - return _tableColumns; -} - -/* - Returns the first CPTableColumn equal to the given object (as determined by the "isEqual:" selector), or nil if none exists. - @param anObject the object to look for -*/ -- (CPTableColumn)tableColumnWithIdentifier:(id)anObject -{ - for (var i = 0; i < _tableColumns.length; i++) - if ([_tableColumns[i] isEqual:anObject]) - return _tableColumns[i]; - return nil; -} - -// Getting the dimensions of the table -/* - Returns the number of columns in the table -*/ -- (int)numberOfColumns -{ - return _tableColumns.length; -} - -/* - Returns the number of rows in the table -*/ -- (int)numberOfRows -{ - return _numberOfRows; -} - -/* - Adjusts the size of the table and it's header view. -*/ -- (void)tile -{ - var HEIGHT = 10.0; - -// [_headerView setFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds]), HEIGHT)]; -// [_scrollView setFrame:CPRectMake(0.0, HEIGHT, CPRectGetWidth([self bounds]), CPRectGetHeight([self bounds]) - HEIGHT)]; -} - -/* - Sets the object that is used to obtain the table data. The data source must implement the following - methods: -
-- (int)numberOfRowsInTableView:(CPTableView)aTableView
-- (id)tableView:(CPTableView)aTableView objectValueForTableColumn:(CPTableColumn)aTableColumn row:(int)rowIndex
-
- @param aDataSource the object with the table data - @throws CPInternalInconsistencyException if aDataSource doesn't implement all the required methods -*/ -- (void)setDataSource:(id)aDataSource -{ - if (![aDataSource respondsToSelector:@selector(numberOfRowsInTableView:)]) - [CPException raise:CPInternalInconsistencyException reason:"Data source doesn't support 'numberOfRowsInTableView:'"]; - if (![aDataSource respondsToSelector:@selector(tableView:objectValueForTableColumn:row:)]) - [CPException raise:CPInternalInconsistencyException reason:"Data source doesn't support 'tableView:objectValueForTableColumn:row:'"]; - - _dataSource = aDataSource; - - [self reloadData]; -} - -/* - Returns the object that has access to the table data -*/ -- (id)dataSource -{ - return _dataSource; -} - - -- (id)delegate -{ - return _delegate; -} - - -/*! - Sets the delegate for the tableview. -*/ -- (void)setDelegate:(id)aDelegate -{ - if (_delegate === aDelegate) - return; - - var notificationCenter = [CPNotificationCenter defaultCenter]; - - if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)]) - [notificationCenter removeObserver:_delegate name:CPTableViewColumnDidMoveNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)]) - [notificationCenter removeObserver:_delegate name:CPTableViewColumnDidResizeNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)]) - [notificationCenter removeObserver:_delegate name:CPTableViewSelectionDidChangeNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)]) - [notificationCenter removeObserver:_delegate name:CPTableViewSelectionIsChangingNotification object:self]; - - _delegate = aDelegate; - - if ([_delegate respondsToSelector:@selector(tableViewColumnDidMove:)]) - [notificationCenter addObserver:_delegate selector:@selector(tableViewColumnDidMove:) name:CPTableViewColumnDidMoveNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewColumnDidResize:)]) - [notificationCenter addObserver:_delegate selector:@selector(tableViewColumnDidResize:) name:CPTableViewColumnDidResizeNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewSelectionDidChange:)]) - [notificationCenter addObserver:_delegate selector:@selector(tableViewSelectionDidChange:) name:CPTableViewSelectionDidChangeNotification object:self]; - if ([_delegate respondsToSelector:@selector(tableViewSelectionIsChanging:)]) - [notificationCenter addObserver:_delegate selector:@selector(tableViewSelectionIsChanging:) name:CPTableViewSelectionIsChangingNotification object:self]; - - _delegateSelectorsCache = 0; - - if ([_delegate respondsToSelector:@selector(tableView:willDisplayCell:forTableColumn:row:)]) - _delegateSelectorsCache |= _CPTableViewWillDisplayCellSelector; - if ([_delegate respondsToSelector:@selector(tableView:shouldSelectRow:)]) - _delegateSelectorsCache |= _CPTableViewShouldSelectRowSelector; - if ([_delegate respondsToSelector:@selector(tableView:shouldSelectTableColumn:)]) - _delegateSelectorsCache |= _CPTableViewShouldSelectTableColumnSelector; - if ([_delegate respondsToSelector:@selector(selectionShouldChangeInTableView:)]) - _delegateSelectorsCache |= _CPTableViewSelectionShouldChangeSelector; - if ([_delegate respondsToSelector:@selector(tableView:shouldEditTableColumn:row:)]) - _delegateSelectorsCache |= _CPTableViewShouldEditTableColumnSelector; - if ([_delegate respondsToSelector:@selector(tableView:selectionIndexesForProposedSelection:)]) - _delegateSelectorsCache |= _CPTableViewSelectionIndexesForProposedSelectionSelector; - if ([_delegate respondsToSelector:@selector(tableView:heightOfRow:)]) - { - _delegateSelectorsCache |= _CPTableViewHeightOfRowSelector; - _hasVariableHeightRows = YES; - } - else - _hasVariableHeightRows = NO; -} - - -/* - Tells the table view that the number of rows in the table - has changed. -*/ -- (void)noteNumberOfRowsChanged -{ - var numberOfRows = [_dataSource numberOfRowsInTableView:self]; - - if (_numberOfRows != numberOfRows) - { - _numberOfRows = numberOfRows; - - [self _recalculateColumnHeight]; - } -} - -- (void)noteHeightOfRowsWithIndexesChanged:(CPIndexSet)indexSet -{ - // FIXME: more efficient version is possible since we know which indexes changes - [self _recalculateColumnHeight]; -} - -/* - Returns the rectangle bounding the specified row. - @param aRowIndex the row to obtain a rectangle for - @return the bounding rectangle -*/ -- (CGRect)rectOfRow:(int)aRowIndex -{ - return CPRectMake(0.0, ROW_MIN_Y(aRowIndex), CPRectGetWidth([self bounds]), ROW_HEIGHT(aRowIndex)); -} - -/* - Returns the rectangle bounding the specified column - @param aColumnIndex the column to obtain a rectangle for - @return the bounding column -*/ -- (CGRect)rectOfColumn:(int)aColumnIndex -{ - return [_tableColumnViews[aColumnIndex] frame]; -} - -/* - Adjusts column widths to make them all visible at once. Same as tile. -*/ -- (void)sizeToFit -{ -// [self tile]; -} - -- (void)_recalculateColumnHeight -{ - var oldColumnHeight = _columnHeight; - - if (_hasVariableHeightRows) - { - _rowMinYs[0] = 0; - for (var row = 0; row < _numberOfRows; row++) - { - _rowHeights[row] = [_delegate tableView:self heightOfRow:row]; - _rowMinYs[row+1] = _rowMinYs[row] + _rowHeights[row] + _intercellSpacing.height; - } - _columnHeight = _rowMinYs[_numberOfRows]; // last index is one more than last row, and is the total column height - } - else - _columnHeight = _numberOfRows * (_rowHeight + _intercellSpacing.height); - - var count = _tableColumnViews.length; - - while (count--) - [_tableColumnViews[count] setFrameSize:CGSizeMake([_tableColumns[count] width], _columnHeight)]; - - [self setFrameSize:CGSizeMake(CGRectGetWidth([self frame]), _columnHeight)]; -} - -- (CGRect)visibleRectInParent -{ - var superview = [self superview]; - - if (!superview) - return [self bounds]; - - return [self convertRect:CGRectIntersection([superview bounds], [self frame]) fromView:superview]; -} - -/* - Reloads the data from the dataSource. This is an - expensive method, so use it lightly. -*/ -- (void)reloadData -{ - var oldNumberOfRows = _numberOfRows; - - _numberOfRows = [_dataSource numberOfRowsInTableView:self]; - - if (oldNumberOfRows != _numberOfRows) - { - [self _recalculateColumnHeight]; - [self setFrameSize:CGSizeMake(CGRectGetWidth([self frame]), [self _columnHeight])]; - } - - _objectValueCache = []; - - [self clearCells]; - - [self setNeedsLayout]; -} - -- (void)layoutSubviews -{ - [self loadTableCellsInRect:[self visibleRectInParent]]; -} - -- (void)displaySoon -{ - [_scrollTimer invalidate]; - _scrollTimer = [CPTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(displayNow) userInfo:nil repeats:NO]; -} - -- (void)displayNow -{ - [self setNeedsLayout]; -} - -- (void)viewDidMoveToSuperview -{ - [[[self enclosingScrollView] contentView] setPostsBoundsChangedNotifications:YES]; - - [[CPNotificationCenter defaultCenter] - addObserver:self - selector:@selector(viewBoundsChanged:) - name:CPViewBoundsDidChangeNotification - object:[[self enclosingScrollView] contentView]]; -} - -- (void)viewBoundsChanged:(CPNotification)aNotification -{ - //CPLog.info(_cmd + CPStringFromRect([[[self enclosingScrollView] contentView] bounds])); - //objj_debug_print_backtrace(); - //[self setNeedsLayout]; - [self displayNow]; -} - -/* -- (void)setAllowsColumnReordering:(BOOL)allowsColumnReordering -{ - if (_allowsColumnReordering === _allowsColumnReordering) - return; - - _allowsColumnReordering = allowsColumnReordering; -} -- (void)allowsColumnReordering -{ - return _allowsColumnReordering; -} - -- (void)setAllowsColumnResizing:(BOOL)allowsColumnResizing -{ - if (_allowsColumnResizing === allowsColumnResizing) - return; - - _allowsColumnResizing = allowsColumnResizing; -} -- (void)allowsColumnResizing -{ - return _allowsColumnResizing; -} - -- (void)setAllowsColumnSelection:(BOOL)allowsColumnSelection -{ - if (_allowsColumnSelection === allowsColumnSelection) - return; - - _allowsColumnSelection = allowsColumnSelection; -} -- (void)allowsColumnSelection -{ - return _allowsColumnSelection; -} -*/ - -- (void)setAllowsMultipleSelection:(BOOL)allowsMultipleSelection -{ - if (_allowsMultipleSelection === allowsMultipleSelection) - return; - - _allowsMultipleSelection = allowsMultipleSelection; - - // TODO: more stuff? -} -- (void)allowsMultipleSelection -{ - return _allowsMultipleSelection; -} - -- (void)setAllowsEmptySelection:(BOOL)allowsEmptySelection -{ - if (_allowsEmptySelection === allowsEmptySelection) - return; - - _allowsEmptySelection = allowsEmptySelection; -} -- (void)allowsEmptySelection -{ - return _allowsEmptySelection; -} - - -/* - Returns the index of the row at the given point, or CPNotFound (-1) if it is out of range. - @param aPoint the point - @return the index of the row at aPoint -*/ -- (int)rowAtPoint:(CGPoint)aPoint -{ - var index = [self _rowAtY:aPoint.y] - - if (index >= 0 && index < _numberOfRows) - return index; - else - return CPNotFound; -} - -- (int)columnAtPoint:(CGPoint)aPoint -{ - var index = [self _columnAtX:aPoint.x] - - if (index >= 0 && index < _tableColumns.length) - return index; - else - return CPNotFound; -} - -/* - @ignore - - Internal version takes a Y value, returns an index, or -1 if its beyond the min, or numberOfRows if it's beyond the max -*/ -- (int)_rowAtY:(float)y -{ - if (_hasVariableHeightRows) - { - var a = 0, - b = _numberOfRows; - - if (y < _rowMinYs[0]) - return -1; - if (y >= _rowMinYs[_rowMinYs.length-1]) - return _numberOfRows; - - // binary search - while (true) - { - var half = a + Math.floor((b - a) / 2); - - if (y < _rowMinYs[half]) - b = half; - else if (half < _numberOfRows-1 && y >= _rowMinYs[half+1]) - a = half; - else - return half; - } - } - else - return FLOOR(y / (_rowHeight + _intercellSpacing.height)); -} - -/* - @ignore - - Internal version takes a X value, returns an index, or -1 if its beyond the min, or numberOfColumns if it's beyond the max -*/ -- (int)_columnAtX:(float)x -{ - var a = 0, - b = _tableColumns.length; - - var last = [_tableColumnViews[_tableColumns.length-1] frame]; - if (x < [_tableColumnViews[0] frame].origin.x) - return -1; - if (x >= last.origin.x + last.size.width) - return _tableColumns.length; - - // binary search - while (true) - { - var half = a + Math.floor((b - a) / 2); - - if (x < [_tableColumnViews[half] frame].origin.x) - b = half; - else if (half < _tableColumns.length-1 && x >= [_tableColumnViews[half+1] frame].origin.x) - a = half; - else - return half; - } -} - -/* - Selects the specified row indexes, optionally adding to existing selection - @param indexes the indexes to select - @param extend whether or not to add to the existing selection -*/ -- (void)selectRowIndexes:(CPIndexSet)indexes byExtendingSelection:(BOOL)extend -{ - // FIXME: should this be subject to the delegate filters, etc? - - if (extend) - _selectedRowIndexes = [[_selectedRowIndexes copy] addIndexes:indexes]; - else if ([indexes count] > 0 || _allowsEmptySelection) - _selectedRowIndexes = [indexes copy]; - - [self _drawSelection]; -} - -/* - Returns a CPIndexSet of the selected rows - @return indexes of the selected rows -*/ -- (CPIndexSet)selectedRowIndexes -{ - return _selectedRowIndexes; -} - -/* - Returns the number of selected rows - @return number of selected rows -*/ -- (int)numberOfSelectedRows -{ - return [_selectedRowIndexes count]; -} - - -/* - Deselects all rows if allowsEmptySelection is true. If delegate responds to "selectionShouldChangeInTableView:", asks if it should chnage. - Sends the CPTableViewSelectionDidChangeNotification on deselection. - @param the sender in a target/action -*/ -- (void)deselectAll:(id)sender -{ - if (!_allowsEmptySelection || [_selectedRowIndexes count] === 0 || - ((_delegateSelectorsCache & _CPTableViewSelectionShouldChangeSelector) && ![_delegate selectionShouldChangeInTableView:self])) - return; - - [self selectRowIndexes:[CPIndexSet indexSet] byExtendingSelection:NO]; - [[CPNotificationCenter defaultCenter] postNotificationName:CPTableViewSelectionDidChangeNotification object:self userInfo:nil]; -} - -- (void)editColumn:(int)columnIndex row:(int)rowIndex withEvent:(CPEvent)theEvent select:(BOOL)flag -{ - -} - -/* - @ignore -*/ -- (void)_updateSelectionWithMouseAtRow:(int)aRow -{ - // Make a preliminary new selection - var newSelection; - if (_allowsMultipleSelection) - newSelection = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(MIN(aRow, _selectionStartRow), ABS(aRow-_selectionStartRow)+1)]; - else if (aRow >= 0 && aRow < _numberOfRows) - newSelection = [CPIndexSet indexSetWithIndex:aRow]; - else - newSelection = [CPIndexSet indexSet]; - - // If cmd/ctrl was held down XOR the old selection with the proposed selection - if (_allowsMultipleSelection && _selectionModifier & (CPCommandKeyMask | CPControlKeyMask | CPAlternateKeyMask)) - { - // A = newSelection, B = _previousSelectedRowIndexes - // (A intersection B) = (A - (A - B)) - var intersection = [newSelection copy], - difference = [newSelection copy]; - [difference removeIndexes:_previousSelectedRowIndexes]; - [intersection removeIndexes:difference] - - // (A xor B) = (A + B) - (A intersection B) - [newSelection addIndexes:_previousSelectedRowIndexes]; - [newSelection removeIndexes:intersection]; - - // FIXME: if multiple selection is off, and we cmd/ctrl click the previously selected row, then deselect it. - } - - // if the new selection is different than the old selection - if (![newSelection isEqualToIndexSet:_selectedRowIndexes]) - { - // ask the delegate if we should change the selection - if ((_delegateSelectorsCache & _CPTableViewSelectionShouldChangeSelector) && ![_delegate selectionShouldChangeInTableView:self]) - return; - - // ask the delegate which indexes can be selected. selectionIndexesForProposedSelection is faster than shouldSelectRow - if (_delegateSelectorsCache & _CPTableViewSelectionIndexesForProposedSelectionSelector) - newSelection = [_delegate tableView:self selectionIndexesForProposedSelection:newSelection]; - else if (_delegateSelectorsCache & _CPTableViewShouldSelectRowSelector) - { - var indexes = []; - [newSelection getIndexes:indexes maxCount:Number.MAX_VALUE inIndexRange:nil]; - for (var i = 0; i < indexes.length; i++) - if (![_delegate tableView:self shouldSelectRow:indexes[i]]) - [newSelection removeIndex:indexes[i]]; - } - } - - // if empty selection is not allowed and the new selection has nothing selected, abort - if (!_allowsEmptySelection && [newSelection count] === 0) - return; - - // if the new selection is *still* different, and update the selection and send a notification - if (![newSelection isEqualToIndexSet:_selectedRowIndexes]) - { - [self selectRowIndexes:newSelection byExtendingSelection:NO]; - [[CPNotificationCenter defaultCenter] postNotificationName:CPTableViewSelectionIsChangingNotification object:self userInfo:nil]; - } -} - -/* - @ignore -*/ -- (void)mouseDown:(CPEvent)anEvent -{ - [self trackSelection:anEvent]; -} - -/* - Sets the message to be sent to the target when a cell is double clicked - @param aSelector the selector to be performed -*/ -- (void)setDoubleAction:(SEL)aSelector -{ - _doubleAction = aSelector; -} -- (SEL)doubleAction -{ - return _doubleAction; -} - -- (int)clickedColumn -{ - return _clickedColumn; -} -- (int)clickedRow -{ - return _clickedRow; -} - -/* - @ignore -*/ -- (void)trackSelection:(CPEvent)anEvent -{ - var type = [anEvent type], - point = [self convertPoint:[anEvent locationInWindow] fromView:nil], - currentRow = MAX(0, MIN(_numberOfRows-1, [self _rowAtY:point.y])); - - if (type == CPLeftMouseUp) - { - _clickedRow = [self rowAtPoint:point]; - _clickedColumn = [self columnAtPoint:point]; - - if ([anEvent clickCount] === 2) - { - CPLog.warn("edit?!"); - - [self sendAction:_doubleAction to:_target]; - } - else - { - if (![_previousSelectedRowIndexes isEqualToIndexSet:_selectedRowIndexes]) - { - [[CPNotificationCenter defaultCenter] postNotificationName:CPTableViewSelectionDidChangeNotification object:self userInfo:nil]; - } - - [self sendAction:_action to:_target]; - } - - return; - } - - if (type == CPLeftMouseDown) - { - _previousSelectedRowIndexes = _selectedRowIndexes; - _selectionModifier = [anEvent modifierFlags]; - - if (_selectionModifier & CPShiftKeyMask) - _selectionStartRow = (ABS([_previousSelectedRowIndexes firstIndex] - currentRow) < ABS([_previousSelectedRowIndexes lastIndex] - currentRow)) ? - [_previousSelectedRowIndexes firstIndex] : [_previousSelectedRowIndexes lastIndex]; - else - _selectionStartRow = currentRow; - - [self _updateSelectionWithMouseAtRow:currentRow]; - } - else if (type == CPLeftMouseDragged) - { - [self _updateSelectionWithMouseAtRow:currentRow]; - } - - [CPApp setTarget:self selector:@selector(trackSelection:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES]; -} - -/* - @ignore -*/ -- (void)_drawSelection -{ - if (!_currentlySelected) { - _currentlySelected = [CPIndexSet indexSet]; - _selectionViews = []; - _selectionViewsPool = []; - } - - // TODO: we could also remove selections that aren't visible, but then we'll need to run this on every scroll/resize? - - // get array of indexes we can remove - var removeSet = [_currentlySelected copy], - indexesToRemove = []; - [removeSet removeIndexes:_selectedRowIndexes]; - [removeSet getIndexes:indexesToRemove maxCount:Number.MAX_VALUE inIndexRange:nil]; - - // get array of indexes we need to add - var addSet = [_selectedRowIndexes copy], - indexesToAdd = []; - [addSet removeIndexes:_currentlySelected]; - [addSet getIndexes:indexesToAdd maxCount:Number.MAX_VALUE inIndexRange:nil]; - - for (var i = 0; i < indexesToRemove.length; i++) - { - var row = indexesToRemove[i]; - for (var column = 0; column < _tableColumns.length; column++) - if ([_tableCells[column][row] respondsToSelector:@selector(highlight:)]) - [_tableCells[column][row] highlight:NO]; - } - for (var i = 0; i < indexesToAdd.length; i++) - { - var row = indexesToAdd[i]; - for (var column = 0; column < _tableColumns.length; column++) - if ([_tableCells[column][row] respondsToSelector:@selector(highlight:)]) - [_tableCells[column][row] highlight:YES]; - } - - // add each one we need to add, taking the selection views from removed seelctions, the pool, or new - for (var i = 0; i < indexesToAdd.length; i++) - { - var index = indexesToAdd[i], - view; - - if (indexesToRemove.length > 0) - { - view = _selectionViews[indexesToRemove.pop()]; - } - else if (_selectionViewsPool.length > 0) - { - view = _selectionViewsPool.pop(); - [self addSubview:view positioned:CPWindowBelow relativeTo:nil]; - } - else - { - view = [[CPView alloc] init]; - [view setBackgroundColor:[CPColor alternateSelectedControlColor]]; - - [self addSubview:view positioned:CPWindowBelow relativeTo:nil]; - } - - _selectionViews[index] = view; - - var frame = [self rectOfRow:index]; - frame.size.height += _intercellSpacing.height - 1; - //frame.size.width += 500; - - [view setFrame:frame]; - } - - // remove any selections that weren't already reused - for (var i = 0; i < indexesToRemove.length; i++) - { - var row = indexesToRemove[i], - view = _selectionViews[row]; - - [view removeFromSuperview]; - _selectionViewsPool.push(view); - } - - // update the currently selected index set - _currentlySelected = [_selectedRowIndexes copy]; -} - -@end - - -var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", - CPTableViewDelegateKey = @"CPTableViewDelegateKey", - CPTableViewHeaderViewKey = @"CPTableViewHeaderViewKey", - CPTableViewTableColumnsKey = @"CPTableViewTableColumnsKey", - CPTableViewRowHeightKey = @"CPTableViewRowHeightKey", - CPTableViewIntercellSpacingKey = @"CPTableViewIntercellSpacingKey", - CPTableViewMultipleSelectionKey = @"CPTableViewMultipleSelectionKey", - CPTableViewEmptySelectionKey = @"CPTableViewEmptySelectionKey"; - -@implementation CPTableView (CPCoding) - -- (id)initWithCoder:(CPCoder)aCoder -{ - if (self = [super initWithCoder:aCoder]) - { - [self _init]; - - _dataSource = [aCoder decodeObjectForKey:CPTableViewDataSourceKey]; - _delegate = [aCoder decodeObjectForKey:CPTableViewDelegateKey]; - - _rowHeight = [aCoder decodeFloatForKey:CPTableViewRowHeightKey]; - _intercellSpacing = [aCoder decodeSizeForKey:CPTableViewIntercellSpacingKey]; - - _allowsMultipleSelection = [aCoder decodeBoolForKey:CPTableViewMultipleSelectionKey]; - _allowsEmptySelection = [aCoder decodeBoolForKey:CPTableViewEmptySelectionKey]; - - var tableColumns = [aCoder decodeObjectForKey:CPTableViewTableColumnsKey]; - for (var i = 0; i < tableColumns.length; i++) - [self addTableColumn:tableColumns[i]]; - } - - return self; -} - -- (void)encodeWithCoder:(CPCoder)aCoder -{ - [super encodeWithCoder:aCoder]; - - [aCoder encodeObject:_dataSource forKey:CPTableViewDataSourceKey]; - [aCoder encodeObject:_delegate forKey:CPTableViewDelegateKey]; - - [aCoder encodeObject:_tableColumns forKey:CPTableViewTableColumnsKey]; - - [aCoder encodeFloat:_rowHeight forKey:CPTableViewRowHeightKey]; - [aCoder encodeSize:_intercellSpacing forKey:CPTableViewIntercellSpacingKey]; - - [aCoder encodeBool:_allowsMultipleSelection forKey:CPTableViewMultipleSelectionKey]; - [aCoder encodeBool:_allowsEmptySelection forKey:CPTableViewEmptySelectionKey]; -} - -@end - - - -@implementation CPColor (TableView) - -+ (CPColor)alternateSelectedControlColor -{ - return [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]; -} - -+ (CPColor)secondarySelectedControlColor -{ - return [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]; -} - -@end diff --git a/AppKit/Themes/CommonJS/blendtask.j b/AppKit/Themes/CommonJS/blendtask.j index 6d2bb4e69..a93874ee6 100644 --- a/AppKit/Themes/CommonJS/blendtask.j +++ b/AppKit/Themes/CommonJS/blendtask.j @@ -92,7 +92,7 @@ print("IS WRONG"); var objectTemplates = [aClass themedObjectTemplates], data = cibDataFromTopLevelObjects(objectTemplates.concat([themeTemplate])), fileContents = themeFromCibData(data); -print("will write to" + FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme")); + // No filedir in this case, so we have to make it ourselves. FILE.mkdirs(intermediatesPath); FILE.write(FILE.join(intermediatesPath, [aClass themeName] + ".keyedtheme"), MARKER_TEXT + ";" + fileContents.length + ";" + fileContents, { charset:"UTF-8" }); diff --git a/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js index 1be28be08..428ef4e16 100644 --- a/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js +++ b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js @@ -380,6 +380,7 @@ BundleTask.prototype.defineResourceTask = function(aResourcePath, aDestinationPa { filedir (aDestinationPath, [aResourcePath], function() { + // HEY TOM THIS ONE cp_r(aResourcePath, aDestinationPath); }); diff --git a/common.jake b/common.jake index e6c807e9c..db7049ceb 100644 --- a/common.jake +++ b/common.jake @@ -99,8 +99,8 @@ global.cp_r = function(/*String*/ from, /*String*/ to) if (FILE.isDirectory(from)) FILE.copyTree(from, to); - else - FILE.copy(from, to); + else{try{ + FILE.copy(from, to);}catch(e) { print(e + FILE.exists(from) + " " + FILE.exists(FILE.dirname(to))); }} } global.cp = function(/*String*/ from, /*String*/ to)