blob: dffa7db563c6d49d7cd36a3b4dd056ada846e1a5 [file] [log] [blame]
// 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
};
});