blob: 11ddd7fc2237220ebaa613a5566eadb6a1d7a996 [file] [log] [blame]
// 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.ticket_items', function() {
'use strict';
/**
* Color ticket item whose value is a {@code boolean} that indicates whether
* the document should be printed in color.
* @param {!print_preview.AppState} appState App state persistence object to
* save the state of the color selection.
* @param {!print_preview.DestinationStore} destinationStore Used to determine
* whether color printing should be available.
* @constructor
* @extends {print_preview.ticket_items.TicketItem}
*/
function Color(appState, destinationStore) {
print_preview.ticket_items.TicketItem.call(
this,
appState,
print_preview.AppState.Field.IS_COLOR_ENABLED,
destinationStore);
};
/**
* @private {!Array.<string>} List of capability types considered color.
* @const
*/
Color.COLOR_TYPES_ = ['STANDARD_COLOR', 'CUSTOM_COLOR'];
/**
* @private {!Array.<string>} List of capability types considered monochrome.
* @const
*/
Color.MONOCHROME_TYPES_ = ['STANDARD_MONOCHROME', 'CUSTOM_MONOCHROME'];
Color.prototype = {
__proto__: print_preview.ticket_items.TicketItem.prototype,
/** @override */
wouldValueBeValid: function(value) {
return true;
},
/** @override */
isCapabilityAvailable: function() {
var capability = this.capability;
if (!capability) {
return false;
}
var hasColor = false;
var hasMonochrome = false;
capability.option.forEach(function(option) {
hasColor = hasColor || (Color.COLOR_TYPES_.indexOf(option.type) >= 0);
hasMonochrome = hasMonochrome ||
(Color.MONOCHROME_TYPES_.indexOf(option.type) >= 0);
});
return hasColor && hasMonochrome;
},
/** @return {Object} Color capability of the selected destination. */
get capability() {
var dest = this.getSelectedDestInternal();
return (dest &&
dest.capabilities &&
dest.capabilities.printer &&
dest.capabilities.printer.color) ||
null;
},
/** @return {Object} Color option corresponding to the current value. */
getSelectedOption: function() {
var capability = this.capability;
var options = capability ? capability.option : null;
if (options) {
var typesToLookFor =
this.getValue() ? Color.COLOR_TYPES_ : Color.MONOCHROME_TYPES_;
for (var i = 0; i < typesToLookFor.length; i++) {
var matchingOptions = options.filter(function(option) {
return option.type == typesToLookFor[i];
});
if (matchingOptions.length > 0) {
return matchingOptions[0];
}
}
}
return null;
},
/** @override */
getDefaultValueInternal: function() {
var capability = this.capability;
var defaultOption = capability ?
this.getDefaultColorOption_(capability.option) : null;
return defaultOption &&
(Color.COLOR_TYPES_.indexOf(defaultOption.type) >= 0);
},
/** @override */
getCapabilityNotAvailableValueInternal: function() {
// TODO(rltoscano): Get rid of this check based on destination ID. These
// destinations should really update their CDDs to have only one color
// option that has type 'STANDARD_COLOR'.
var dest = this.getSelectedDestInternal();
if (dest) {
if (dest.id == print_preview.Destination.GooglePromotedId.DOCS ||
dest.id == print_preview.Destination.GooglePromotedId.FEDEX ||
dest.type == print_preview.Destination.Type.MOBILE) {
return true;
}
}
return this.getDefaultValueInternal();
},
/**
* @param {!Array.<!Object.<{type: (string|undefined),
* is_default: (boolean|undefined)}>>} options
* @return {Object.<{type: (string|undefined),
* is_default: (boolean|undefined)}>} Default color
* option of the given list.
* @private
*/
getDefaultColorOption_: function(options) {
var defaultOptions = options.filter(function(option) {
return option.is_default;
});
return (defaultOptions.length == 0) ? null : defaultOptions[0];
}
};
// Export
return {
Color: Color
};
});