// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2010 Apple, Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ========================================================================== sc_require('views/table'); sc_require('views/table_header'); /** @class The head of a `SC.TableView`. It's a special row of the table that holds the column header cells. @extends SC.View @since SproutCore 1.1 */ SC.TableHeadView = SC.View.extend({ /** @scope SC.TableHeadView.prototype */ layout: { height: 18, left: 0, right: 0, top: 0 }, classNames: ['sc-table-head'], cells: [], acceptsFirstResponder: YES, dragOrder: null, init: function() { sc_super(); this._scthv_handleChildren(); }, columns: function() { return this.get('parentView').get('columns'); }.property(), renderChildViews: function(context, firstTime) { var cells = this.get('cells'), cell, idx; for (idx = 0; idx < cells.get('length'); idx++) { cell = cells.objectAt(idx); context = context.begin(cell.get('tagName')); cell.prepareContext(context, firstTime); context = context.end(); } return context; }, layoutChildViews: function() { var cells = this.get('cells'), cell, idx; for (idx = 0; idx < cells.get('length'); idx++) { cell = cells.objectAt(idx); cell.adjust(this._scthv_layoutForHeaderAtColumnIndex(idx)); cell.updateLayout(); } }, // .......................................................... // INTERNAL SUPPORT // _scthv_enterDragMode: function() { var order = [], columns = this.get('columns'), idx; for (idx = 0; idx < columns.get('length'); idx++) { order.push(columns.objectAt(idx).get('key')); } this.set('dragOrder', order); }, _scthv_changeDragOrder: function(draggedColumnIndex, leftOfIndex) { var dragOrder = this.get('dragOrder'), draggedColumn = dragOrder.objectAt(draggedColumnIndex); dragOrder.removeAt(idx); dragOrder.insertAt(leftOfIndex, draggedColumn); }, _scthv_reorderDragColumnViews: function() { }.observes('dragOrder'), _scthv_columnContentFromTableContent: function(tableContent, columnIndex) { var column = this.get('columns').objectAt(columnIndex), key = column.get('key'), ret = [], idx; if (!tableContent) return ret; var tableView = this.get('parentView'), length = tableContent.get('length'); // visibleIndexes = tableView.contentIndexesInRect( // tableView.get('frame')).toArray(); for (idx = 0; idx < length; idx++) { //visibleIndex = visibleIndexes.objectAt(idx); ret.push(tableContent.objectAt(idx).get(key)); } return ret; }, _scthv_layoutForHeaderAtColumnIndex: function(index) { var columns = this.get('columns'), rowHeight = this.get('parentView').get('rowHeight'), layout = {}, left = 0, idx; for (idx = 0; idx < index; idx++) { left += columns.objectAt(idx).get('width'); } return { left: left, width: columns.objectAt(index).get('width'), height: rowHeight }; }, _scthv_handleChildren: function() { var columns = this.get('columns'); var tableView = this.get('parentView'); var tableContent = tableView.get('content'); var column, key, label, content, cells = [], cell, idx; for (idx = 0; idx < columns.get('length'); idx++) { column = columns.objectAt(idx); key = column.get('key'); label = column.get('label'); content = this._scthv_columnContentFromTableContent(tableContent, idx); cell = this._scthv_createTableHeader(column, label, content, idx); cells.push(cell); } this.set('cells', cells); if (cells.length > 0) this.replaceAllChildren(cells); }, _scthv_createTableHeader: function(column, label, content, idx) { var tableView = this.get('parentView'); var cell = SC.TableHeaderView.create({ column: column, label: label, content: content, tableView: tableView, columnIndex: idx }); return cell; } });