1 // ========================================================================== 2 // Project: SproutCore - JavaScript Application Framework 3 // Copyright: ©2006-2011 Strobe Inc. and contributors. 4 // Portions ©2008-2011 Apple, Inc. All rights reserved. 5 // License: Licensed under MIT license (see license.js) 6 // ========================================================================== 7 8 sc_require('views/table'); 9 sc_require('views/table_header'); 10 11 12 SC.TableHeadView = SC.View.extend({ 13 /** @scope SC.TableHeadView.prototype */ 14 15 layout: { height: 18, left: 0, right: 0, top: 0 }, 16 17 classNames: ['sc-table-head'], 18 19 cells: [], 20 21 acceptsFirstResponder: YES, 22 23 dragOrder: null, 24 25 init: function() { 26 sc_super(); 27 this._scthv_handleChildren(); 28 }, 29 30 columns: function() { 31 return this.get('parentView').get('columns'); 32 }.property(), 33 34 renderChildViews: function(context, firstTime) { 35 var cells = this.get('cells'), cell, idx; 36 for (idx = 0; idx < cells.get('length'); idx++) { 37 cell = cells.objectAt(idx); 38 context = context.begin(cell.get('tagName')); 39 cell.render(context, firstTime); 40 context = context.end(); 41 } 42 return context; 43 }, 44 45 layoutChildViews: function() { 46 var cells = this.get('cells'), cell, idx; 47 for (idx = 0; idx < cells.get('length'); idx++) { 48 cell = cells.objectAt(idx); 49 cell.adjust(this._scthv_layoutForHeaderAtColumnIndex(idx)); 50 cell.updateLayout(); 51 } 52 }, 53 54 55 // .......................................................... 56 // INTERNAL SUPPORT 57 // 58 59 _scthv_enterDragMode: function() { 60 var order = [], columns = this.get('columns'), idx; 61 62 for (idx = 0; idx < columns.get('length'); idx++) { 63 order.push(columns.objectAt(idx).get('key')); 64 } 65 66 this.set('dragOrder', order); 67 }, 68 69 _scthv_changeDragOrder: function(draggedColumnIndex, leftOfIndex) { 70 var dragOrder = this.get('dragOrder'), 71 draggedColumn = dragOrder.objectAt(draggedColumnIndex); 72 73 dragOrder.removeAt(idx); 74 dragOrder.insertAt(leftOfIndex, draggedColumn); 75 }, 76 77 _scthv_reorderDragColumnViews: function() { 78 79 }.observes('dragOrder'), 80 81 82 _scthv_columnContentFromTableContent: function(tableContent, columnIndex) { 83 var column = this.get('columns').objectAt(columnIndex), 84 key = column.get('key'), 85 ret = [], 86 idx; 87 88 if (!tableContent) return ret; 89 90 var tableView = this.get('parentView'), 91 length = tableContent.get('length'); 92 // visibleIndexes = tableView.contentIndexesInRect( 93 // tableView.get('frame')).toArray(); 94 95 for (idx = 0; idx < length; idx++) { 96 //visibleIndex = visibleIndexes.objectAt(idx); 97 ret.push(tableContent.objectAt(idx).get(key)); 98 } 99 100 return ret; 101 }, 102 103 _scthv_layoutForHeaderAtColumnIndex: function(index) { 104 var columns = this.get('columns'), 105 rowHeight = this.get('parentView').get('rowHeight'), 106 layout = {}, 107 left = 0, idx; 108 109 for (idx = 0; idx < index; idx++) { 110 left += columns.objectAt(idx).get('width'); 111 } 112 113 return { 114 left: left, 115 width: columns.objectAt(index).get('width'), 116 height: rowHeight 117 }; 118 }, 119 120 _scthv_handleChildren: function() { 121 var columns = this.get('columns'); 122 var tableView = this.get('parentView'); 123 var tableContent = tableView.get('content'); 124 125 var column, key, label, content, cells = [], cell, idx; 126 for (idx = 0; idx < columns.get('length'); idx++) { 127 column = columns.objectAt(idx); 128 key = column.get('key'); 129 label = column.get('label'); 130 content = this._scthv_columnContentFromTableContent(tableContent, idx); 131 cell = this._scthv_createTableHeader(column, label, content, idx); 132 cells.push(cell); 133 } 134 this.set('cells', cells); 135 if (cells.length > 0) 136 this.replaceAllChildren(cells); 137 }, 138 139 _scthv_createTableHeader: function(column, label, content, idx) { 140 var tableView = this.get('parentView'); 141 var cell = SC.TableHeaderView.create({ 142 column: column, 143 label: label, 144 content: content, 145 tableView: tableView, 146 columnIndex: idx 147 }); 148 return cell; 149 } 150 }); 151 152