Index: chrome/browser/resources/shared/js/cr/ui/splitter.js |
=================================================================== |
--- chrome/browser/resources/shared/js/cr/ui/splitter.js (revision 177292) |
+++ chrome/browser/resources/shared/js/cr/ui/splitter.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 splitter element which can be used to resize |
- * elements in split panes. |
- * |
- * The parent of the splitter should be an hbox (display: -webkit-box) with at |
- * least one previous element sibling. The splitter controls the width of the |
- * element before it. |
- * |
- * <div class=split-pane> |
- * <div class=left>...</div> |
- * <div class=splitter></div> |
- * ... |
- * </div> |
- * |
- */ |
- |
-cr.define('cr.ui', function() { |
- // TODO(arv): Currently this only supports horizontal layout. |
- // TODO(arv): This ignores min-width and max-width of the elements to the |
- // right of the splitter. |
- |
- /** |
- * Returns the computed style width of an element. |
- * @param {!Element} el The element to get the width of. |
- * @return {number} The width in pixels. |
- */ |
- function getComputedWidth(el) { |
- return parseFloat(el.ownerDocument.defaultView.getComputedStyle(el).width) / |
- getZoomFactor(el.ownerDocument); |
- } |
- |
- /** |
- * This uses a WebKit bug to work around the same bug. getComputedStyle does |
- * not take the page zoom into account so it returns the physical pixels |
- * instead of the logical pixel size. |
- * @param {!Document} doc The document to get the page zoom factor for. |
- * @param {number} The zoom factor of the document. |
- */ |
- function getZoomFactor(doc) { |
- var dummyElement = doc.createElement('div'); |
- dummyElement.style.cssText = |
- 'position:absolute;width:100px;height:100px;top:-1000px;overflow:hidden'; |
- doc.body.appendChild(dummyElement); |
- var cs = doc.defaultView.getComputedStyle(dummyElement); |
- var rect = dummyElement.getBoundingClientRect(); |
- var zoomFactor = parseFloat(cs.width) / 100; |
- doc.body.removeChild(dummyElement); |
- return zoomFactor; |
- } |
- |
- /** |
- * Creates a new splitter element. |
- * @param {Object=} opt_propertyBag Optional properties. |
- * @constructor |
- * @extends {HTMLDivElement} |
- */ |
- var Splitter = cr.ui.define('div'); |
- |
- Splitter.prototype = { |
- __proto__: HTMLDivElement.prototype, |
- |
- /** |
- * Initializes the element. |
- */ |
- decorate: function() { |
- this.addEventListener('mousedown', this.handleMouseDown_.bind(this), |
- true); |
- this.addEventListener('touchstart', this.handleTouchStart_.bind(this), |
- true); |
- }, |
- |
- /** |
- * Starts the dragging of the splitter. Adds listeners for mouse or touch |
- * events and calls splitter drag start handler. |
- * @param {number} clientX X position of the mouse or touch event that |
- * started the drag. |
- * @param {boolean} isTouchEvent True if the drag started by touch event. |
- */ |
- startDrag: function(clientX, isTouchEvent) { |
- if (this.handlers_) { |
- console.log('Concurent drags'); |
- this.endDrag_(); |
- } |
- if (isTouchEvent) { |
- var endDragBound = this.endDrag_.bind(this); |
- this.handlers_ = { |
- 'touchmove': this.handleTouchMove_.bind(this), |
- 'touchend': endDragBound, |
- 'touchcancel': endDragBound, |
- |
- // Another touch start (we somehow missed touchend or touchcancel). |
- 'touchstart': endDragBound, |
- }; |
- } else { |
- this.handlers_ = { |
- 'mousemove': this.handleMouseMove_.bind(this), |
- 'mouseup': this.handleMouseUp_.bind(this), |
- }; |
- } |
- |
- var doc = this.ownerDocument; |
- |
- // Use capturing events on the document to get events when the mouse |
- // leaves the document. |
- for (var eventType in this.handlers_) { |
- doc.addEventListener(eventType, this.handlers_[eventType], true); |
- } |
- |
- this.startX_ = clientX; |
- this.handleSplitterDragStart(); |
- }, |
- |
- /** |
- * Ends the dragging of the splitter. Removes listeners set in startDrag |
- * and calls splitter drag end handler. |
- * @private |
- */ |
- endDrag_: function() { |
- var doc = this.ownerDocument; |
- for (var eventType in this.handlers_) { |
- doc.removeEventListener(eventType, this.handlers_[eventType], true); |
- } |
- this.handlers_ = null; |
- this.handleSplitterDragEnd(); |
- }, |
- |
- /** |
- * Handles the mousedown event which starts the dragging of the splitter. |
- * @param {!MouseEvent} e The mouse event. |
- * @private |
- */ |
- handleMouseDown_: function(e) { |
- this.startDrag(e.clientX, false); |
- // Default action is to start selection and to move focus. |
- e.preventDefault(); |
- }, |
- |
- /** |
- * Handles the touchstart event which starts the dragging of the splitter. |
- * @param {!TouchEvent} e The touch event. |
- * @private |
- */ |
- handleTouchStart_: function(e) { |
- if (e.touches.length == 1) |
- this.startDrag(e.touches[0].clientX, true); |
- }, |
- |
- /** |
- * Handles the mousemove event which moves the splitter as the user moves |
- * the mouse. |
- * @param {!MouseEvent} e The mouse event. |
- * @private |
- */ |
- handleMouseMove_: function(e) { |
- this.handleMove_(e.clientX); |
- }, |
- |
- /** |
- * Handles the touch move event. |
- * @param {!TouchEvent} e The touch event. |
- */ |
- handleTouchMove_: function(e) { |
- if (e.touches.length == 1) |
- this.handleMove_(e.touches[0].clientX); |
- }, |
- |
- /** |
- * Common part of handling mousemove and touchmove. Calls splitter drag |
- * move handler. |
- * @param {number} clientX X position of the mouse or touch event. |
- * @private |
- */ |
- handleMove_: function(clientX) { |
- var rtl = this.ownerDocument.defaultView.getComputedStyle(this). |
- direction == 'rtl'; |
- var dirMultiplier = rtl ? -1 : 1; |
- var deltaX = dirMultiplier * (clientX - this.startX_); |
- this.handleSplitterDragMove(deltaX); |
- }, |
- |
- /** |
- * Handles the mouse up event which ends the dragging of the splitter. |
- * @param {!MouseEvent} e The mouse event. |
- * @private |
- */ |
- handleMouseUp_: function(e) { |
- this.endDrag_(); |
- }, |
- |
- /** |
- * Handles start of the splitter dragging. Saves current width of the |
- * element being resized. |
- * @protected |
- */ |
- handleSplitterDragStart: function() { |
- // Use the computed width style as the base so that we can ignore what |
- // box sizing the element has. |
- var leftComponent = this.previousElementSibling; |
- var doc = leftComponent.ownerDocument; |
- this.startWidth_ = parseFloat( |
- doc.defaultView.getComputedStyle(leftComponent).width); |
- }, |
- |
- /** |
- * Handles splitter moves. Updates width of the element being resized. |
- * @param {number} changeX The change of splitter horizontal position. |
- * @protected |
- */ |
- handleSplitterDragMove: function(deltaX) { |
- var leftComponent = this.previousElementSibling; |
- leftComponent.style.width = this.startWidth_ + deltaX + 'px'; |
- }, |
- |
- /** |
- * Handles end of the splitter dragging. This fires a 'resize' event if the |
- * size changed. |
- * @protected |
- */ |
- handleSplitterDragEnd: function() { |
- // Check if the size changed. |
- var leftComponent = this.previousElementSibling; |
- var doc = leftComponent.ownerDocument; |
- var computedWidth = parseFloat( |
- doc.defaultView.getComputedStyle(leftComponent).width); |
- if (this.startWidth_ != computedWidth) |
- cr.dispatchSimpleEvent(this, 'resize'); |
- }, |
- }; |
- |
- return { |
- Splitter: Splitter |
- }; |
-}); |