Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Unified Diff: chrome/browser/resources/file_manager/js/scrollbar.js

Issue 14096016: Restyled Files.app's file list, including scrollbars. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/file_manager/js/scrollbar.js
diff --git a/chrome/browser/resources/file_manager/js/scrollbar.js b/chrome/browser/resources/file_manager/js/scrollbar.js
new file mode 100644
index 0000000000000000000000000000000000000000..69636e1921efc135e0087dfa3ebdc70f14894f75
--- /dev/null
+++ b/chrome/browser/resources/file_manager/js/scrollbar.js
@@ -0,0 +1,165 @@
+// Copyright (c) 2013 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.
+
+'use strict';
+
+var ScrollBar = cr.ui.define('div');
yoshiki 2013/04/17 08:12:00 Add JSdoc. /** * Creates a new scroll bar elemen
mtomasz 2013/04/17 08:52:21 Done.
+
+/**
+ * Creates a vertical scrollbar.
+ *
+ * @param {Element} parent Parent element, must have a relative or absolute
+ * positioning.
+ * @param {Element=} opt_scrollableArea Element with scrollable contents.
+ * If not passed, then call attachToView manually when the scrollable
+ * element becomes available.
+ */
+ScrollBar.createVertical = function(parent, opt_scrollableArea) {
+ var scrollbar = new ScrollBar();
+ parent.appendChild(scrollbar);
+ if (opt_scrollableArea)
+ scrollbar.attachToView(opt_scrollableArea);
+};
+
+/**
+ * Mode of the scrollbar. As for now, only vertical scrollbars are supported.
+ * @type {number}
+ */
+ScrollBar.Mode = {
+ VERTICAL: 0,
+ HORIZONTAL: 1
+};
+
+ScrollBar.prototype = {
+ set mode(value) {
+ this.mode_ = value;
+ if (this.mode_ == ScrollBar.Mode.VERTICAL) {
+ this.classList.remove('scrollbar-horizontal');
+ this.classList.add('scrollbar-vertical');
+ } else {
+ this.classList.remove('scrollbar-vertical');
+ this.classList.add('scrollbar-horizontal');
+ }
+ this.redraw_();
+ },
+ get mode() {
+ return this.mode_;
+ }
+};
+
+/**
+ * Inherits after HTMLDivElement.
+ */
+ScrollBar.prototype.__proto__ = HTMLDivElement.prototype;
+
+/**
+ * Initializes the DOM structure of the scrollbar.
+ */
+ScrollBar.prototype.decorate = function() {
+ this.classList.add('scrollbar');
+ this.button_ = util.createChild(this, 'scrollbar-button', 'div');
+ this.mode = ScrollBar.Mode.VERTICAL;
+
+ this.button_.addEventListener('mousedown',
+ this.onButtonPressed_.bind(this));
+ window.addEventListener('mouseup', this.onMouseUp_.bind(this));
+ window.addEventListener('mousemove', this.onMouseMove_.bind(this));
+
+ // Unfortunately we need to pool, since we can't easily detect resizing
+ // and content changes.
+ setInterval(this.redraw_.bind(this), 50);
+};
+
+/**
+ * Attaches the scrollbar to a scrollable element and attaches handlers.
+ * @param {Element} view Scrollable element.
+ */
+ScrollBar.prototype.attachToView = function(view) {
+ this.view_ = view;
+ this.view_.addEventListener('scroll', this.onScroll_.bind(this));
+ this.redraw_();
+};
+
+/**
+ * Scroll handler.
+ * @private
+ */
+ScrollBar.prototype.onScroll_ = function() {
+ this.redraw_();
+};
+
+/**
+ * Pressing on the scrollbar's button handler.
+ *
+ * @param {Event} event Pressing event.
+ * @private
+ */
+ScrollBar.prototype.onButtonPressed_ = function(event) {
+ this.buttonPressed_ = true;
+ this.buttonPressedEvent_ = event;
+ this.buttonPressedPosition_ = this.button_.offsetTop - this.view_.offsetTop;
+ this.button_.classList.add('pressed');
+
+ event.preventDefault();
+};
+
+/**
+ * Releasing the button handler. Note, that it may not be called when releasing
+ * outside of the window. Therefore this is also called from onMouseMove_.
+ *
+ * @param {Event} event Mouse event.
+ * @private
+ */
+ScrollBar.prototype.onMouseUp_ = function(event) {
+ this.buttonPressed_ = false;
+ this.button_.classList.remove('pressed');
+};
+
+/**
+ * Mouse move handler. Updates the scroll position.
+ *
+ * @param {Event} event Mouse event.
+ * @private
+ */
+ScrollBar.prototype.onMouseMove_ = function(event) {
+ if (!this.buttonPressed_)
+ return;
+ if (!event.which) {
+ this.onMouseUp_(event);
+ return;
+ }
+ var clientSize = this.view_.clientHeight;
+ var totalSize = this.view_.scrollHeight;
+ var buttonSize = Math.max(50, clientSize / totalSize * clientSize);
+
+ var buttonPosition = this.buttonPressedPosition_ +
+ (event.screenY - this.buttonPressedEvent_.screenY);
+ var scrollPosition = totalSize * (buttonPosition / clientSize);
+
+ this.view_.scrollTop = scrollPosition;
+ this.redraw_();
+};
+
+/**
+ * Redraws the scrollbar.
+ * @private
+ */
+ScrollBar.prototype.redraw_ = function() {
+ if (!this.view_)
+ return;
+
+ var clientSize = this.view_.clientHeight;
+ var clientTop = this.view_.offsetTop;
+ var scrollPosition = this.view_.scrollTop;
+ var totalSize = this.view_.scrollHeight;
+
+ this.hidden = totalSize <= clientSize;
+
+ var buttonSize = Math.max(50, clientSize / totalSize * clientSize);
+ var buttonPosition = scrollPosition / (totalSize - clientSize) *
+ (clientSize - buttonSize);
+
+ this.button_.style.top = buttonPosition + clientTop + 'px';
+ this.button_.style.height = buttonSize + 'px';
+};

Powered by Google App Engine
This is Rietveld 408576698