Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1848)

Side by Side Diff: chrome/browser/resources/print_preview/preview_area.js

Issue 10108001: Refactor print preview web ui (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review feedback Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 cr.define('print_preview', function() {
6 'use strict';
7
8 /**
9 * Creates a PreviewArea object. It represents the area where the preview
10 * document is displayed.
11 * @constructor
12 */
13 function PreviewArea() {
14 // The embedded pdf plugin object.
15 this.pdfPlugin_ = null;
16
17 // @type {HTMLDivElement} A layer on top of |this.pdfPlugin_| used for
18 // displaying messages to the user.
19 this.overlayLayer = $('overlay-layer');
20 // @type {HTMLDivElement} Contains text displayed to the user followed by
21 // three animated dots.
22 this.customMessageWithDots_ = $('custom-message-with-dots');
23 // @type {HTMLDivElement} Contains text displayed to the user.
24 this.customMessage_ = $('custom-message');
25 // @type {HTMLInputElement} Button associated with a displayed error
26 // message.
27 this.errorButton = $('error-button');
28 // @type {HTMLDivElement} Contains three animated (dancing) dots.
29 this.dancingDotsText = $('dancing-dots-text');
30
31 // True if the pdf document is loaded in the preview area.
32 this.pdfLoaded_ = false;
33
34 // Contains the zoom level just before a new preview is requested so the
35 // same zoom level can be restored.
36 this.zoomLevel_ = null;
37 // @type {{x: number, y: number}} Contains the page offset values just
38 // before a new preview is requested so that the scroll amount can be
39 // restored later.
40 this.pageOffset_ = null;
41 // @type {print_preview.Rect} A rectangle describing the postion of the
42 // most visible page normalized with respect to the total height and width
43 // of the plugin.
44 this.pageLocationNormalized = null;
45
46 // @type {EventTracker} Used to keep track of certain event listeners.
47 this.eventTracker = new EventTracker();
48
49 this.addEventListeners_();
50 }
51
52 cr.addSingletonGetter(PreviewArea);
53
54 PreviewArea.prototype = {
55 /**
56 * The width of the plugin area in pixels, excluding any visible scrollbars,
57 * @type {number}
58 */
59 get width() {
60 return this.widthPercent * this.pdfPlugin_.offsetWidth;
61 },
62
63 /**
64 * The height of the plugin area in pixels, excluding any visible
65 * scrollbars.
66 * @type {number}
67 */
68 get height() {
69 return this.heightPercent * this.pdfPlugin_.offsetHeight;
70 },
71
72 /**
73 * The width of the plugin area in percent, excluding any visible
74 * scrollbars.
75 * @type {number}
76 */
77 get widthPercent() {
78 var width = this.pdfPlugin_.getWidth();
79 var scrollbarWidth = this.pdfPlugin_.getVerticalScrollbarThickness();
80 return (width - scrollbarWidth) / width;
81 },
82
83 /**
84 * The height of the plugin area in percent, excluding any visible
85 * scrollbars.
86 * @type {number}
87 */
88 get heightPercent() {
89 var height = this.pdfPlugin_.getHeight();
90 var scrollbarHeight = this.pdfPlugin_.getHorizontalScrollbarThickness();
91 return (height - scrollbarHeight) / height;
92 },
93
94 get pdfPlugin() {
95 return this.pdfPlugin_;
96 },
97
98 get pdfLoaded() {
99 return this.pdfLoaded_;
100 },
101
102 set pdfLoaded(pdfLoaded) {
103 this.pdfLoaded_ = pdfLoaded;
104 },
105
106 /**
107 * Initializes the PDF plugin and places it on the page.
108 * @param {!string} srcURL The URL of the document to be loaded in the
109 * plugin.
110 * @private
111 */
112 createPDFPlugin_: function(srcURL) {
113 this.pdfPlugin_ = document.createElement('embed');
114 this.pdfPlugin_.setAttribute('id', 'pdf-viewer');
115 this.pdfPlugin_.setAttribute(
116 'type', 'application/x-google-chrome-print-preview-pdf');
117 this.pdfPlugin_.setAttribute('src', srcURL);
118 this.pdfPlugin_.setAttribute('aria-live', 'polite');
119 this.pdfPlugin_.setAttribute('aria-atomic', 'true');
120 $('mainview').appendChild(this.pdfPlugin_);
121
122 this.pdfPlugin_.onload('onPDFLoad()');
123 this.pdfPlugin_.onScroll('onPreviewPositionChanged()');
124 this.pdfPlugin_.onPluginSizeChanged('onPreviewPositionChanged()');
125 this.pdfPlugin_.removePrintButton();
126 this.pdfPlugin_.grayscale(true);
127 },
128
129 /**
130 * Reloads the plugin with a new url.
131 * @param {string} srcURL The URL to load in the plugin.
132 * @private
133 */
134 reloadPDFPlugin_: function(srcURL) {
135 // Need to call this before the reload(), where the plugin resets its
136 // internal page count.
137 this.pdfPlugin_.goToPage('0');
138 this.pdfPlugin_.resetPrintPreviewUrl(srcURL);
139 this.pdfPlugin_.reload();
140 this.pdfPlugin_.grayscale(
141 colorSettings.colorMode == print_preview.ColorSettings.GRAY);
142 },
143
144 /**
145 * Creates the PDF plugin or reloads the existing one.
146 * @param {number} srcDataIndex Preview data source index.
147 */
148 createOrReloadPDFPlugin: function(srcDataIndex) {
149 var srcURL = getPageSrcURL(currentPreviewUid, srcDataIndex);
150 this.pdfPlugin_ ? this.reloadPDFPlugin_(srcURL) :
151 this.createPDFPlugin_(srcURL);
152 },
153
154 /**
155 * Queries the plugin for the location of the most visible page and updates
156 * |this.pageLocationNormalized|.
157 */
158 update: function() {
159 if (!this.pdfLoaded_)
160 return;
161 var pluginLocation =
162 this.pdfPlugin_.getPageLocationNormalized().split(';');
163 this.pageLocationNormalized = new print_preview.Rect(
164 parseFloat(pluginLocation[0]),
165 parseFloat(pluginLocation[1]),
166 parseFloat(pluginLocation[2]),
167 parseFloat(pluginLocation[3]));
168 },
169
170 /**
171 * Resets the state variables of |this|.
172 */
173 resetState: function() {
174 if (this.pdfPlugin_) {
175 this.zoomLevel_ = this.pdfPlugin_.getZoomLevel();
176 this.pageOffset_ = {
177 x: this.pdfPlugin_.pageXOffset(),
178 y: this.pdfPlugin_.pageYOffset()
179 };
180 }
181 this.pdfLoaded_ = false;
182 },
183
184 /**
185 * Adds event listeners for various events.
186 * @private
187 */
188 addEventListeners_: function() {
189 document.addEventListener(customEvents.PDF_LOADED,
190 this.onPDFLoaded_.bind(this));
191 },
192
193 /**
194 * Listener executing when a |customEvents.PDF_LOADED| event occurs.
195 * @private
196 */
197 onPDFLoaded_: function() {
198 this.pdfPlugin_ = $('pdf-viewer');
199 this.pdfLoaded_ = true;
200 if (this.zoomLevel_ != null && this.pageOffset_ != null) {
201 this.pdfPlugin_.setZoomLevel(this.zoomLevel_);
202 this.pdfPlugin_.setPageXOffset(this.pageOffset_.x);
203 this.pdfPlugin_.setPageYOffset(this.pageOffset_.y);
204 } else {
205 this.pdfPlugin_.fitToHeight();
206 }
207 },
208
209 /**
210 * Hides the |this.overlayLayer| and any messages currently displayed.
211 */
212 hideOverlayLayer: function() {
213 this.eventTracker.add(this.overlayLayer, 'webkitTransitionEnd',
214 this.hideOverlayLayerCleanup_.bind(this), false);
215 if (this.pdfPlugin_)
216 this.pdfPlugin_.classList.remove('invisible');
217 this.overlayLayer.classList.add('invisible');
218 },
219
220 /**
221 * Displays the "Preview loading..." animation.
222 */
223 showLoadingAnimation: function() {
224 this.showCustomMessage(localStrings.getString('loading'));
225 },
226
227 /**
228 * Necessary cleanup so that the dancing dots animation is not being
229 * rendered in the background when not displayed.
230 */
231 hideOverlayLayerCleanup_: function() {
232 this.customMessageWithDots_.hidden = true;
233 this.eventTracker.remove(this.overlayLayer, 'webkitTransitionEnd');
234 },
235
236 /**
237 * Displays |message| followed by three dancing dots animation.
238 * @param {string} message The message to be displayed.
239 */
240 showCustomMessage: function(message) {
241 this.customMessageWithDots_.innerHTML = message +
242 this.dancingDotsText.innerHTML;
243 this.customMessageWithDots_.hidden = false;
244 if (this.pdfPlugin_)
245 this.pdfPlugin_.classList.add('invisible');
246 this.overlayLayer.classList.remove('invisible');
247 },
248
249 /**
250 * Clears the custom message with dots animation.
251 */
252 clearCustomMessageWithDots: function() {
253 this.customMessageWithDots_.innerHTML = '';
254 this.customMessageWithDots_.hidden = true;
255 },
256
257 /**
258 * Display an error message in the center of the preview area.
259 * @param {string} errorMessage The error message to be displayed.
260 */
261 displayErrorMessageAndNotify: function(errorMessage) {
262 this.overlayLayer.classList.remove('invisible');
263 this.customMessage_.textContent = errorMessage;
264 this.customMessage_.hidden = false;
265 this.customMessageWithDots_.innerHTML = '';
266 this.customMessageWithDots_.hidden = true;
267 if (this.pdfPlugin_) {
268 $('mainview').removeChild(this.pdfPlugin_);
269 this.pdfPlugin_ = null;
270 }
271 cr.dispatchSimpleEvent(document, customEvents.PDF_GENERATION_ERROR);
272 },
273
274 /**
275 * Display an error message in the center of the preview area followed by a
276 * button.
277 * @param {string} errorMessage The error message to be displayed.
278 * @param {string} buttonText The text to be displayed within the button.
279 * @param {string} buttonListener The listener to be executed when the
280 * button is clicked.
281 */
282 displayErrorMessageWithButtonAndNotify: function(
283 errorMessage, buttonText, buttonListener) {
284 this.errorButton.disabled = false;
285 this.errorButton.textContent = buttonText;
286 this.errorButton.onclick = buttonListener;
287 this.errorButton.hidden = false;
288 $('system-dialog-throbber').hidden = true;
289 $('native-print-dialog-throbber').hidden = true;
290 if (cr.isMac)
291 $('open-preview-app-throbber').hidden = true;
292 this.displayErrorMessageAndNotify(errorMessage);
293 }
294 };
295
296 return {
297 PreviewArea: PreviewArea
298 };
299 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698