summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/print_preview/component.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/resources/print_preview/component.js')
-rw-r--r--chrome/browser/resources/print_preview/component.js192
1 files changed, 192 insertions, 0 deletions
diff --git a/chrome/browser/resources/print_preview/component.js b/chrome/browser/resources/print_preview/component.js
new file mode 100644
index 0000000..f51c3ae1
--- /dev/null
+++ b/chrome/browser/resources/print_preview/component.js
@@ -0,0 +1,192 @@
+// 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.
+
+cr.define('print_preview', function() {
+ 'use strict';
+
+ /**
+ * Class that represents a UI component.
+ * @constructor
+ * @extends {cr.EventTarget}
+ */
+ function Component() {
+ cr.EventTarget.call(this);
+
+ /**
+ * Component's HTML element.
+ * @type {Element}
+ * @private
+ */
+ this.element_ = null;
+
+ this.isInDocument_ = false;
+
+ /**
+ * Component's event tracker.
+ * @type {EventTracker}
+ * @private
+ */
+ this.tracker_ = new EventTracker();
+
+ /**
+ * Child components of the component.
+ * @type {Array.<print_preview.Component>}
+ * @private
+ */
+ this.children_ = [];
+ };
+
+ Component.prototype = {
+ __proto__: cr.EventTarget.prototype,
+
+ /** Gets the component's element. */
+ getElement: function() {
+ return this.element_;
+ },
+
+ /** @return {EventTracker} Component's event tracker. */
+ get tracker() {
+ return this.tracker_;
+ },
+
+ /**
+ * @return {boolean} Whether the element of the component is already in the
+ * HTML document.
+ */
+ get isInDocument() {
+ return this.isInDocument_;
+ },
+
+ /**
+ * Creates the root element of the component. Sub-classes should override
+ * this method.
+ */
+ createDom: function() {
+ this.element_ = cr.doc.createElement('div');
+ },
+
+ /**
+ * Called when the component's element is known to be in the document.
+ * Anything using document.getElementById etc. should be done at this stage.
+ * Sub-classes should extend this method and attach listeners.
+ */
+ enterDocument: function() {
+ this.isInDocument_ = true;
+ for (var child, i = 0; child = this.children_[i]; i++) {
+ if (!child.isInDocument && child.getElement()) {
+ child.enterDocument();
+ }
+ }
+ },
+
+ /** Removes all event listeners. */
+ exitDocument: function() {
+ for (var child, i = 0; child = this.children_[i]; i++) {
+ if (child.isInDocument) {
+ child.exitDocument();
+ }
+ }
+ this.tracker_.removeAll();
+ this.isInDocument_ = false;
+ },
+
+ /**
+ * Renders this UI component and appends the element to the given parent
+ * element.
+ * @param {!Element} parentElement Element to render the component's
+ * element into.
+ */
+ render: function(parentElement) {
+ assert(!this.isInDocument, 'Component is already in the document');
+ if (!this.element_) {
+ this.createDom();
+ }
+ parentElement.appendChild(this.element_);
+ this.enterDocument();
+ },
+
+ /**
+ * Decorates an existing DOM element. Sub-classes should override the
+ * override the decorateInternal method.
+ * @param {Element} element Element to decorate.
+ */
+ decorate: function(element) {
+ assert(!this.isInDocument, 'Component is already in the document');
+ this.setElementInternal(element);
+ this.decorateInternal();
+ this.enterDocument();
+ },
+
+ /**
+ * @param {print_preview.Component} child Component to add as a child of
+ * this component.
+ */
+ addChild: function(child) {
+ this.children_.push(child);
+ },
+
+ /**
+ * @param {!print_preview.Component} child Component to remove from this
+ * component's children.
+ */
+ removeChild: function(child) {
+ var childIdx = this.children_.indexOf(child);
+ if (childIdx != -1) {
+ this.children_.splice(childIdx, 1);
+ }
+ if (child.isInDocument) {
+ child.exitDocument();
+ if (child.getElement()) {
+ child.getElement().parentNode.removeChild(child.getElement());
+ }
+ }
+ },
+
+ /** Removes all of the component's children. */
+ removeChildren: function() {
+ while (this.children_.length > 0) {
+ this.removeChild(this.children_[0]);
+ }
+ },
+
+ /**
+ * Sets the component's element.
+ * @param {Element} element HTML element to set as the component's element.
+ * @protected
+ */
+ setElementInternal: function(element) {
+ this.element_ = element;
+ },
+
+ /**
+ * Decorates the given element for use as the element of the component.
+ * @protected
+ */
+ decorateInternal: function() { /*abstract*/ },
+
+ /**
+ * Clones a template HTML DOM tree.
+ * @param {string} templateId Template element ID.
+ * @param {boolean=} opt_keepHidden Whether to leave the cloned template
+ * hidden after cloning.
+ * @return {Element} Cloned element with its 'id' attribute stripped.
+ * @protected
+ */
+ cloneTemplateInternal: function(templateId, opt_keepHidden) {
+ var templateEl = $(templateId);
+ assert(templateEl != null,
+ 'Could not find element with ID: ' + templateId);
+ var el = templateEl.cloneNode(true);
+ el.id = '';
+ if (!opt_keepHidden) {
+ setIsVisible(el, true);
+ }
+ return el;
+ }
+ };
+
+ return {
+ Component: Component
+ };
+});