OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 cr.define('print_preview', function() { | 5 cr.define('print_preview', function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 /** | 8 /** |
9 * Encapsulates all settings and logic related to the media size selection UI. | 9 * Encapsulates all settings and logic related to the media size selection UI. |
10 * @param {!print_preview.ticket_items.MediaSize} ticketItem Used to read and | 10 * @param {!print_preview.ticket_items.MediaSize} ticketItem Used to read and |
11 * write the media size ticket item. | 11 * write the media size ticket item. |
12 * @constructor | 12 * @constructor |
13 * @extends {print_preview.SettingsSection} | 13 * @extends {print_preview.SettingsSectionSelect} |
14 */ | 14 */ |
15 function MediaSizeSettings(ticketItem) { | 15 function MediaSizeSettings(ticketItem) { |
16 print_preview.SettingsSection.call(this); | 16 print_preview.SettingsSectionSelect.call(this, ticketItem); |
17 | |
18 /** @private {!print_preview.ticket_items.MediaSize} */ | |
19 this.ticketItem_ = ticketItem; | |
20 }; | 17 }; |
21 | 18 |
22 MediaSizeSettings.prototype = { | 19 MediaSizeSettings.prototype = { |
23 __proto__: print_preview.SettingsSection.prototype, | 20 __proto__: print_preview.SettingsSectionSelect.prototype, |
24 | 21 |
25 /** @override */ | 22 /** @override */ |
26 isAvailable: function() { | 23 getDefaultDisplayName_: function(option) { |
27 return this.ticketItem_.isCapabilityAvailable(); | 24 return option.name; |
28 }, | |
29 | |
30 /** @override */ | |
31 hasCollapsibleContent: function() { | |
32 return this.isAvailable(); | |
33 }, | |
34 | |
35 /** @override */ | |
36 set isEnabled(isEnabled) { | |
37 this.select_.disabled = !isEnabled; | |
38 }, | |
39 | |
40 /** @override */ | |
41 enterDocument: function() { | |
42 print_preview.SettingsSection.prototype.enterDocument.call(this); | |
43 this.tracker.add(this.select_, 'change', this.onSelectChange_.bind(this)); | |
44 this.tracker.add( | |
45 this.ticketItem_, | |
46 print_preview.ticket_items.TicketItem.EventType.CHANGE, | |
47 this.onTicketItemChange_.bind(this)); | |
48 }, | |
49 | |
50 /** | |
51 * @return {HTMLSelectElement} Select element containing media size options. | |
52 * @private | |
53 */ | |
54 get select_() { | |
55 return this.getElement().getElementsByClassName( | |
56 'media-size-settings-select')[0]; | |
57 }, | |
58 | |
59 /** | |
60 * Makes sure the content of the select element matches the capabilities of | |
61 * the destination. | |
62 * @private | |
63 */ | |
64 updateSelect_: function() { | |
65 var select = this.select_; | |
66 if (!this.isAvailable()) { | |
67 select.innerHTML = ''; | |
68 return; | |
69 } | |
70 // Should the select content be updated? | |
71 var sameContent = | |
72 this.ticketItem_.capability.option.length == select.length && | |
73 this.ticketItem_.capability.option.every(function(option, index) { | |
74 return select.options[index].value == JSON.stringify(option); | |
75 }); | |
76 var indexToSelect = select.selectedIndex; | |
77 if (!sameContent) { | |
78 select.innerHTML = ''; | |
79 // TODO: Better heuristics for the display name and options grouping. | |
80 this.ticketItem_.capability.option.forEach(function(option, index) { | |
81 var selectOption = document.createElement('option'); | |
82 var displayName = option.custom_display_name; | |
83 if (!displayName && option.custom_display_name_localized) { | |
84 var getLocaleToCompare = | |
85 /** @type {function(string, boolean=): string} */ | |
86 (function(locale, opt_languageOnly) { | |
87 var code = opt_languageOnly ? locale.split('-')[0] : locale; | |
88 return code.toLowerCase(); | |
89 }); | |
90 var getItemForLocale = function(items, locale, languageOnly) { | |
91 locale = getLocaleToCompare(locale, languageOnly); | |
92 for (var i = 0; i < items.length; i++) { | |
93 if (getLocaleToCompare(items[i].locale) == locale) | |
94 return items[i].value; | |
95 } | |
96 return ''; | |
97 }; | |
98 var items = option.custom_display_name_localized; | |
99 displayName = | |
100 getItemForLocale(items, navigator.language, false) || | |
101 getItemForLocale(items, navigator.language, true); | |
102 } | |
103 selectOption.text = displayName || option.name; | |
104 selectOption.value = JSON.stringify(option); | |
105 select.appendChild(selectOption); | |
106 if (option.is_default) { | |
107 indexToSelect = index; | |
108 } | |
109 }); | |
110 } | |
111 // Try to select current ticket item. | |
112 var valueToSelect = JSON.stringify(this.ticketItem_.getValue()); | |
113 for (var i = 0, option; option = select.options[i]; i++) { | |
114 if (option.value == valueToSelect) { | |
115 indexToSelect = i; | |
116 break; | |
117 } | |
118 } | |
119 select.selectedIndex = indexToSelect; | |
120 this.onSelectChange_(); | |
121 }, | |
122 | |
123 /** | |
124 * Called when the select element is changed. Updates the print ticket. | |
125 * @private | |
126 */ | |
127 onSelectChange_: function() { | |
128 var select = this.select_; | |
129 var mediaSize = JSON.parse(select.options[select.selectedIndex].value); | |
130 this.ticketItem_.updateValue(mediaSize); | |
131 }, | |
132 | |
133 /** | |
134 * Called when the print ticket store changes. Selects the corresponding | |
135 * select option. | |
136 * @private | |
137 */ | |
138 onTicketItemChange_: function() { | |
139 this.updateSelect_(); | |
140 this.updateUiStateInternal(); | |
141 } | 25 } |
142 }; | 26 }; |
143 | 27 |
144 // Export | 28 // Export |
145 return { | 29 return { |
146 MediaSizeSettings: MediaSizeSettings | 30 MediaSizeSettings: MediaSizeSettings |
147 }; | 31 }; |
148 }); | 32 }); |
OLD | NEW |