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