blob: be730721a53b357d5d20fb3b5054e7f921697a36 [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';
/**
* Encapsulates all settings and logic related to the media size selection UI.
* @param {!print_preview.ticket_items.MediaSize} ticketItem Used to read and
* write the media size ticket item.
* @constructor
* @extends {print_preview.SettingsSection}
*/
function MediaSizeSettings(ticketItem) {
print_preview.SettingsSection.call(this);
/** @private {!print_preview.ticket_items.MediaSize} */
this.ticketItem_ = ticketItem;
};
MediaSizeSettings.prototype = {
__proto__: print_preview.SettingsSection.prototype,
/** @override */
isAvailable: function() {
return this.ticketItem_.isCapabilityAvailable();
},
/** @override */
hasCollapsibleContent: function() {
return this.isAvailable();
},
/** @override */
set isEnabled(isEnabled) {
this.select_.disabled = !isEnabled;
},
/** @override */
enterDocument: function() {
print_preview.SettingsSection.prototype.enterDocument.call(this);
this.tracker.add(this.select_, 'change', this.onSelectChange_.bind(this));
this.tracker.add(
this.ticketItem_,
print_preview.ticket_items.TicketItem.EventType.CHANGE,
this.onTicketItemChange_.bind(this));
},
/**
* @return {HTMLSelectElement} Select element containing media size options.
* @private
*/
get select_() {
return this.getElement().getElementsByClassName(
'media-size-settings-select')[0];
},
/**
* Makes sure the content of the select element matches the capabilities of
* the destination.
* @private
*/
updateSelect_: function() {
var select = this.select_;
if (!this.isAvailable()) {
select.innerHTML = '';
return;
}
// Should the select content be updated?
var sameContent =
this.ticketItem_.capability.option.length == select.length &&
this.ticketItem_.capability.option.every(function(option, index) {
return select.options[index].value == JSON.stringify(option);
});
var indexToSelect = select.selectedIndex;
if (!sameContent) {
select.innerHTML = '';
// TODO: Better heuristics for the display name and options grouping.
this.ticketItem_.capability.option.forEach(function(option, index) {
var selectOption = document.createElement('option');
var displayName = option.custom_display_name;
if (!displayName && option.custom_display_name_localized) {
var getLocaleToCompare =
/** @type {function(string, boolean=): string} */
(function(locale, opt_languageOnly) {
var code = opt_languageOnly ? locale.split('-')[0] : locale;
return code.toLowerCase();
});
var getItemForLocale = function(items, locale, languageOnly) {
locale = getLocaleToCompare(locale, languageOnly);
for (var i = 0; i < items.length; i++) {
if (getLocaleToCompare(items[i].locale) == locale)
return items[i].value;
}
return '';
};
var items = option.custom_display_name_localized;
displayName =
getItemForLocale(items, navigator.language, false) ||
getItemForLocale(items, navigator.language, true);
}
selectOption.text = displayName || option.name;
selectOption.value = JSON.stringify(option);
select.appendChild(selectOption);
if (option.is_default) {
indexToSelect = index;
}
});
}
// Try to select current ticket item.
var valueToSelect = JSON.stringify(this.ticketItem_.getValue());
for (var i = 0, option; option = select.options[i]; i++) {
if (option.value == valueToSelect) {
indexToSelect = i;
break;
}
}
select.selectedIndex = indexToSelect;
this.onSelectChange_();
},
/**
* Called when the select element is changed. Updates the print ticket.
* @private
*/
onSelectChange_: function() {
var select = this.select_;
var mediaSize = JSON.parse(select.options[select.selectedIndex].value);
this.ticketItem_.updateValue(mediaSize);
},
/**
* Called when the print ticket store changes. Selects the corresponding
* select option.
* @private
*/
onTicketItemChange_: function() {
this.updateSelect_();
this.updateUiStateInternal();
}
};
// Export
return {
MediaSizeSettings: MediaSizeSettings
};
});