| // Copyright 2014 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'; |
| |
| /** |
| * Base class for print option section components. |
| * @constructor |
| * @extends {print_preview.Component} |
| */ |
| function SettingsSection() { |
| print_preview.Component.call(this); |
| |
| /** |
| * Cached "hasCollapsibleContent" status for COLLAPSIBLE_CONTENT_CHANGED |
| * notification. |
| * @private {?boolean} |
| */ |
| this.hasCollapsibleContentCached_ = null; |
| |
| /** |
| * Whether content of this section should be collapsed or not. |
| * @private {boolean} |
| */ |
| this.collapseContent_ = true; |
| }; |
| |
| /** |
| * Event types dispatched by this class. |
| * @enum {string} |
| */ |
| SettingsSection.EventType = { |
| COLLAPSIBLE_CONTENT_CHANGED: |
| 'print_preview.SettingsSection.COLLAPSIBLE_CONTENT_CHANGED' |
| }; |
| |
| SettingsSection.prototype = { |
| __proto__: print_preview.Component.prototype, |
| |
| /** @return {boolean} Whether this section should be displayed or not. */ |
| isAvailable: function() { |
| throw Error('Abstract method not overridden'); |
| }, |
| |
| /** |
| * @return {boolean} Whether this section has a content which can be |
| * collapsed/expanded. |
| */ |
| hasCollapsibleContent: function() { |
| throw Error('Abstract method not overridden'); |
| }, |
| |
| /** @param {boolean} isEnabled Whether this component is enabled. */ |
| set isEnabled(isEnabled) { |
| throw Error('Abstract method not overridden'); |
| }, |
| |
| /** |
| * @return {boolean} Whether the content of this section should be |
| * collapsed. |
| */ |
| get collapseContent() { |
| return this.collapseContent_; |
| }, |
| |
| /** |
| * @param {boolean} collapseContent Whether the content of this section |
| * should be collapsed, even if this section is available. |
| * @param {boolean} noAnimation Whether section visibility transition |
| * should not be animated. |
| */ |
| setCollapseContent: function(collapseContent, noAnimation) { |
| this.collapseContent_ = collapseContent && this.hasCollapsibleContent(); |
| this.updateUiStateInternal(noAnimation); |
| }, |
| |
| /** @override */ |
| enterDocument: function() { |
| print_preview.Component.prototype.enterDocument.call(this); |
| this.isAvailable_ = this.isAvailable(); |
| if (!this.isAvailable()) |
| fadeOutOption(this.getElement(), true); |
| }, |
| |
| /** |
| * Updates the component appearance according to the current state. |
| * @param {boolean=} opt_noAnimation Whether section visibility transition |
| * should not be animated. |
| * @protected |
| */ |
| updateUiStateInternal: function(opt_noAnimation) { |
| var hasCollapsibleContent = this.hasCollapsibleContent(); |
| var changed = this.hasCollapsibleContentCached_ != hasCollapsibleContent; |
| this.hasCollapsibleContentCached_ = hasCollapsibleContent; |
| |
| if (this.isSectionVisibleInternal()) |
| fadeInOption(this.getElement(), opt_noAnimation); |
| else |
| fadeOutOption(this.getElement(), opt_noAnimation); |
| |
| if (changed) { |
| cr.dispatchSimpleEvent( |
| this, SettingsSection.EventType.COLLAPSIBLE_CONTENT_CHANGED); |
| } |
| }, |
| |
| /** |
| * @return {boolean} Whether this section should be displayed or not. |
| * @protected |
| */ |
| isSectionVisibleInternal: function() { |
| return this.isAvailable() && !this.collapseContent_; |
| } |
| }; |
| |
| // Export |
| return { |
| SettingsSection: SettingsSection |
| }; |
| }); |