Index: chrome/browser/resources/shared/js/cr/ui/table/table_header.js |
=================================================================== |
--- chrome/browser/resources/shared/js/cr/ui/table/table_header.js (revision 177292) |
+++ chrome/browser/resources/shared/js/cr/ui/table/table_header.js (working copy) |
@@ -1,237 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-/** |
- * @fileoverview This implements a table header. |
- */ |
- |
-cr.define('cr.ui.table', function() { |
- /** @const */ var TableSplitter = cr.ui.TableSplitter; |
- |
- /** |
- * Creates a new table header. |
- * @param {Object=} opt_propertyBag Optional properties. |
- * @constructor |
- * @extends {HTMLDivElement} |
- */ |
- var TableHeader = cr.ui.define('div'); |
- |
- TableHeader.prototype = { |
- __proto__: HTMLDivElement.prototype, |
- |
- table_: null, |
- |
- /** |
- * Initializes the element. |
- */ |
- decorate: function() { |
- this.className = 'table-header'; |
- |
- this.headerInner_ = this.ownerDocument.createElement('div'); |
- this.headerInner_.className = 'table-header-inner'; |
- this.appendChild(this.headerInner_); |
- this.addEventListener('touchstart', |
- this.handleTouchStart_.bind(this), false); |
- }, |
- |
- /** |
- * Updates table header width. Header width depends on list having a |
- * vertical scrollbar. |
- */ |
- updateWidth: function() { |
- // Header should not span over the vertical scrollbar of the list. |
- var list = this.table_.querySelector('list'); |
- this.headerInner_.style.width = list.clientWidth + 'px'; |
- }, |
- |
- /** |
- * Resizes columns. |
- */ |
- resize: function() { |
- var cm = this.table_.columnModel; |
- |
- var headerCells = this.querySelectorAll('.table-header-cell'); |
- if (headerCells.length != cm.size) { |
- this.redraw(); |
- return; |
- } |
- |
- for (var i = 0; i < cm.size; i++) { |
- headerCells[i].style.width = cm.getWidth(i) + 'px'; |
- } |
- this.placeSplitters_(this.querySelectorAll('.table-header-splitter')); |
- }, |
- |
- batchCount_: 0, |
- |
- startBatchUpdates: function() { |
- this.batchCount_++; |
- }, |
- |
- endBatchUpdates: function() { |
- this.batchCount_--; |
- if (this.batchCount_ == 0) |
- this.redraw(); |
- }, |
- |
- /** |
- * Redraws table header. |
- */ |
- redraw: function() { |
- if (this.batchCount_ != 0) |
- return; |
- |
- var cm = this.table_.columnModel; |
- var dm = this.table_.dataModel; |
- |
- this.updateWidth(); |
- this.headerInner_.textContent = ''; |
- |
- if (!cm || ! dm) { |
- return; |
- } |
- |
- for (var i = 0; i < cm.size; i++) { |
- var cell = this.ownerDocument.createElement('div'); |
- cell.style.width = cm.getWidth(i) + 'px'; |
- cell.className = 'table-header-cell'; |
- if (dm.isSortable(cm.getId(i))) |
- cell.addEventListener('click', |
- this.createSortFunction_(i).bind(this)); |
- |
- cell.appendChild(this.createHeaderLabel_(i)); |
- this.headerInner_.appendChild(cell); |
- } |
- this.appendSplitters_(); |
- }, |
- |
- /** |
- * Appends column splitters to the table header. |
- */ |
- appendSplitters_: function() { |
- var cm = this.table_.columnModel; |
- var splitters = []; |
- for (var i = 0; i < cm.size; i++) { |
- // splitter should use CSS for background image. |
- var splitter = new TableSplitter({table: this.table_}); |
- splitter.columnIndex = i; |
- splitter.addEventListener('dblclick', |
- this.handleDblClick_.bind(this, i)); |
- |
- this.headerInner_.appendChild(splitter); |
- splitters.push(splitter); |
- } |
- this.placeSplitters_(splitters); |
- }, |
- |
- /** |
- * Place splitters to right positions. |
- * @param {Array.<HTMLElement>|NodeList} splitters Array of splitters. |
- */ |
- placeSplitters_: function(splitters) { |
- var cm = this.table_.columnModel; |
- var place = 0; |
- for (var i = 0; i < cm.size; i++) { |
- place += cm.getWidth(i); |
- splitters[i].style.webkitMarginStart = place + 'px'; |
- } |
- }, |
- |
- /** |
- * Renders column header. Appends text label and sort arrow if needed. |
- * @param {number} index Column index. |
- */ |
- createHeaderLabel_: function(index) { |
- var cm = this.table_.columnModel; |
- var dm = this.table_.dataModel; |
- |
- var labelDiv = this.ownerDocument.createElement('div'); |
- labelDiv.className = 'table-header-label'; |
- |
- if (cm.isEndAlign(index)) |
- labelDiv.style.textAlign = 'end'; |
- var span = this.ownerDocument.createElement('span'); |
- span.appendChild(cm.renderHeader(index, this.table_)); |
- span.style.padding = '0'; |
- |
- if (dm) { |
- if (dm.sortStatus.field == cm.getId(index)) { |
- if (dm.sortStatus.direction == 'desc') |
- span.className = 'table-header-sort-image-desc'; |
- else |
- span.className = 'table-header-sort-image-asc'; |
- } |
- } |
- labelDiv.appendChild(span); |
- return labelDiv; |
- }, |
- |
- /** |
- * Creates sort function for given column. |
- * @param {number} index The index of the column to sort by. |
- */ |
- createSortFunction_: function(index) { |
- return function() { |
- this.table_.sort(index); |
- }.bind(this); |
- }, |
- |
- /** |
- * Handles the touchstart event. If the touch happened close enough |
- * to a splitter starts dragging. |
- * @param {TouchEvent} e The touch event. |
- */ |
- handleTouchStart_: function(e) { |
- if (e.touches.length != 1) |
- return; |
- var clientX = e.touches[0].clientX; |
- |
- var minDistance = TableHeader.TOUCH_DRAG_AREA_WIDTH; |
- var candidate; |
- |
- var splitters = this.querySelectorAll('.table-header-splitter'); |
- for (var i = 0; i < splitters.length; i++) { |
- var r = splitters[i].getBoundingClientRect(); |
- if (clientX <= r.left && r.left - clientX <= minDistance) { |
- minDistance = r.left - clientX; |
- candidate = splitters[i]; |
- } |
- if (clientX >= r.right && clientX - r.right <= minDistance) { |
- minDistance = clientX - r.right; |
- candidate = splitters[i]; |
- } |
- } |
- if (candidate) |
- candidate.startDrag(clientX, true); |
- // Splitter itself shouldn't handle this event. |
- e.stopPropagation(); |
- }, |
- |
- /** |
- * Handles the double click on a column separator event. |
- * Ajusts column width. |
- * @param {number} index Column index. |
- * @param {Event} e The double click event. |
- */ |
- handleDblClick_: function(index, e) { |
- this.table_.fitColumn(index); |
- } |
- }; |
- |
- /** |
- * The table associated with the header. |
- * @type {cr.ui.Table} |
- */ |
- cr.defineProperty(TableHeader, 'table'); |
- |
- /** |
- * Rectangular area around the splitters sensitive to touch events |
- * (in pixels). |
- */ |
- TableHeader.TOUCH_DRAG_AREA_WIDTH = 30; |
- |
- return { |
- TableHeader: TableHeader |
- }; |
-}); |