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

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

Issue 7051040: Print Preview: Making the UI not block when preview is generated (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressing comment. Created 9 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 var localStrings = new LocalStrings(); 5 var localStrings = new LocalStrings();
6 6
7 // The total page count of the previewed document regardless of which pages the 7 // The total page count of the previewed document regardless of which pages the
8 // user has selected. 8 // user has selected.
9 var totalPageCount = -1; 9 var totalPageCount = -1;
10 10
11 // The previously selected pages by the user. It is used in 11 // The previously selected pages by the user. It is used in
12 // onPageSelectionMayHaveChanged() to make sure that a new preview is not 12 // onPageSelectionMayHaveChanged() to make sure that a new preview is not
13 // requested more often than necessary. 13 // requested more often than necessary.
14 var previouslySelectedPages = []; 14 var previouslySelectedPages = [];
15 15
16 // The previously selected layout mode. It is used in order to prevent the
17 // preview from updating when the user clicks on the already selected layout
18 // mode.
19 var previouslySelectedLayout = null;
20
21 // Timer id of the page range textfield. It is used to reset the timer whenever 16 // Timer id of the page range textfield. It is used to reset the timer whenever
22 // needed. 17 // needed.
23 var timerId; 18 var timerId;
24 19
25 // Store the last selected printer index. 20 // Store the last selected printer index.
26 var lastSelectedPrinterIndex = 0; 21 var lastSelectedPrinterIndex = 0;
27 22
28 // Indicates whether a preview has been requested but not received yet.
29 var isPreviewStillLoading = true;
30
31 // Currently selected printer capabilities.
32 var printerCapabilities;
33
34 // Used to disable some printing options when the preview is not modifiable. 23 // Used to disable some printing options when the preview is not modifiable.
35 var previewModifiable = false; 24 var previewModifiable = false;
36 25
37 // Destination list special value constants. 26 // Destination list special value constants.
38 const PRINT_TO_PDF = 'Print To PDF'; 27 const PRINT_TO_PDF = 'Print To PDF';
39 const MANAGE_PRINTERS = 'Manage Printers'; 28 const MANAGE_PRINTERS = 'Manage Printers';
40 29
30 // State of the print preview settings.
31 var printSettings = new PrintSettings();
32
41 /** 33 /**
42 * Window onload handler, sets up the page and starts print preview by getting 34 * Window onload handler, sets up the page and starts print preview by getting
43 * the printer list. 35 * the printer list.
44 */ 36 */
45 function onLoad() { 37 function onLoad() {
46 $('system-dialog-link').addEventListener('click', showSystemDialog); 38 $('system-dialog-link').addEventListener('click', showSystemDialog);
47 $('cancel-button').addEventListener('click', handleCancelButtonClick); 39 $('cancel-button').addEventListener('click', handleCancelButtonClick);
48 40
49 if (!checkCompatiblePluginExists()) { 41 if (!checkCompatiblePluginExists()) {
50 displayErrorMessage(localStrings.getString('noPlugin'), false); 42 displayErrorMessage(localStrings.getString('noPlugin'), false);
51 $('mainview').parentElement.removeChild($('dummy-viewer')); 43 $('mainview').parentElement.removeChild($('dummy-viewer'));
52 return; 44 return;
53 } 45 }
54 $('mainview').parentElement.removeChild($('dummy-viewer')); 46 $('mainview').parentElement.removeChild($('dummy-viewer'));
55 47
56 $('printer-list').disabled = true; 48 $('printer-list').disabled = true;
57 $('print-button').disabled = true; 49 $('print-button').disabled = true;
58 $('print-button').addEventListener('click', printFile);
59 $('all-pages').addEventListener('click', onPageSelectionMayHaveChanged);
60 $('copies').addEventListener('input', copiesFieldChanged);
61 $('print-pages').addEventListener('click', handleIndividualPagesCheckbox);
62 $('individual-pages').addEventListener('blur', function() {
63 clearTimeout(timerId);
64 onPageSelectionMayHaveChanged();
65 });
66 $('individual-pages').addEventListener('focus', addTimerToPageRangeField);
67 $('individual-pages').addEventListener('input', resetPageRangeFieldTimer);
68 $('two-sided').addEventListener('click', handleTwoSidedClick)
69 $('landscape').addEventListener('click', onLayoutModeToggle);
70 $('portrait').addEventListener('click', onLayoutModeToggle);
71 $('color').addEventListener('click', function() { setColor(true); });
72 $('bw').addEventListener('click', function() { setColor(false); });
73 $('printer-list').addEventListener(
74 'change', updateControlsWithSelectedPrinterCapabilities);
75 $('increment').addEventListener('click',
76 function() { onCopiesButtonsClicked(1); });
77 $('decrement').addEventListener('click',
78 function() { onCopiesButtonsClicked(-1); });
79 $('controls').onsubmit = function() { return false; }; 50 $('controls').onsubmit = function() { return false; };
80 $('dancing-dots').classList.remove('invisible'); 51 $('dancing-dots').classList.remove('invisible');
81 chrome.send('getPrinters'); 52 chrome.send('getPrinters');
82 } 53 }
83 54
84 /** 55 /**
56 * Adds event listeners to the settings controls.
57 */
58 function addEventListeners() {
59 var individualPages = $('individual-pages');
James Hawkins 2011/05/23 21:24:06 Move this var to where it's first used.
dpapad 2011/05/23 23:04:07 Done.
60 $('print-button').onclick = printFile;
61
62 // Controls that require preview rendering.
63 $('all-pages').onclick = onPageSelectionMayHaveChanged;
64 $('print-pages').onclick = handleIndividualPagesCheckbox;
65 individualPages.onblur = function() {
66 clearTimeout(timerId);
67 onPageSelectionMayHaveChanged();
68 };
69 individualPages.onfocus = addTimerToPageRangeField;
70 individualPages.oninput = resetPageRangeFieldTimer;
71 $('landscape').onclick = onLayoutModeToggle;
72 $('portrait').onclick = onLayoutModeToggle;
73 $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities;
74
75 // Controls that dont require preview rendering.
76 $('copies').oninput = copiesFieldChanged;
77 $('two-sided').onclick = handleTwoSidedClick;
78 $('color').onclick = function() { setColor(true); };
79 $('bw').onclick = function() { setColor(false); };
80 $('increment').onclick = function() { onCopiesButtonsClicked(1); };
81 $('decrement').onclick = function() { onCopiesButtonsClicked(-1); };
82 }
83
84 /**
85 * Removes event listeners from the settings controls.
86 */
87 function removeEventListeners() {
88 var individualPages = $('individual-pages');
James Hawkins 2011/05/23 21:24:06 Same here.
dpapad 2011/05/23 23:04:07 Done.
89
90 // Controls that require preview rendering.
91 $('print-button').disabled = true;
92 $('all-pages').onclick = null;
93 $('print-pages').onclick = null;
94 individualPages.onblur = null;
95 individualPages.onfocus = null;
96 individualPages.oninput = null;
97 clearTimeout(timerId);
98 $('landscape').onclick = null;
99 $('portrait').onclick = null;
100 $('printer-list').onchange = null;
101
102 // Controls that dont require preview rendering.
103 $('copies').oninput = null;
104 $('two-sided').onclick = null;
105 $('color').onclick = null;
106 $('bw').onclick = null;
107 $('increment').onclick = null;
108 $('decrement').onclick = null;
109 }
110
111 /**
85 * Asks the browser to close the preview tab. 112 * Asks the browser to close the preview tab.
86 */ 113 */
87 function handleCancelButtonClick() { 114 function handleCancelButtonClick() {
88 chrome.send('closePrintPreviewTab'); 115 chrome.send('closePrintPreviewTab');
89 } 116 }
90 117
91 /** 118 /**
92 * Asks the browser to show the native print dialog for printing. 119 * Asks the browser to show the native print dialog for printing.
93 */ 120 */
94 function showSystemDialog() { 121 function showSystemDialog() {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 161
135 // Regenerate the preview data based on selected printer settings. 162 // Regenerate the preview data based on selected printer settings.
136 setDefaultValuesAndRegeneratePreview(); 163 setDefaultValuesAndRegeneratePreview();
137 } 164 }
138 165
139 /** 166 /**
140 * Updates the controls with printer capabilities information. 167 * Updates the controls with printer capabilities information.
141 * @param {Object} settingInfo printer setting information. 168 * @param {Object} settingInfo printer setting information.
142 */ 169 */
143 function updateWithPrinterCapabilities(settingInfo) { 170 function updateWithPrinterCapabilities(settingInfo) {
144 printerCapabilities = settingInfo;
145
146 if (isPreviewStillLoading)
147 return;
148
149 var disableColorOption = settingInfo.disableColorOption; 171 var disableColorOption = settingInfo.disableColorOption;
150 var setColorAsDefault = settingInfo.setColorAsDefault; 172 var setColorAsDefault = settingInfo.setColorAsDefault;
151 var colorOption = $('color'); 173 var colorOption = $('color');
152 var bwOption = $('bw'); 174 var bwOption = $('bw');
153 175
154 if (disableColorOption) 176 if (disableColorOption)
155 $('color-options').classList.add("hidden"); 177 $('color-options').classList.add("hidden");
156 else 178 else
157 $('color-options').classList.remove("hidden"); 179 $('color-options').classList.remove("hidden");
158 180
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 * Asks the browser to print the preview PDF based on current print settings. 335 * Asks the browser to print the preview PDF based on current print settings.
314 */ 336 */
315 function printFile() { 337 function printFile() {
316 chrome.send('print', [getSettingsJSON()]); 338 chrome.send('print', [getSettingsJSON()]);
317 } 339 }
318 340
319 /** 341 /**
320 * Asks the browser to generate a preview PDF based on current print settings. 342 * Asks the browser to generate a preview PDF based on current print settings.
321 */ 343 */
322 function requestPrintPreview() { 344 function requestPrintPreview() {
323 isPreviewStillLoading = true; 345 removeEventListeners();
324 setControlsDisabled(true); 346 printSettings.save();
325 $('dancing-dots').classList.remove('invisible'); 347 $('dancing-dots').classList.remove('invisible');
326 chrome.send('getPreview', [getSettingsJSON()]); 348 chrome.send('getPreview', [getSettingsJSON()]);
327 } 349 }
328 350
329 /** 351 /**
330 * Fill the printer list drop down. 352 * Fill the printer list drop down.
331 * Called from PrintPreviewHandler::SendPrinterList(). 353 * Called from PrintPreviewHandler::SendPrinterList().
332 * @param {Array} printers Array of printer info objects. 354 * @param {Array} printers Array of printer info objects.
333 * @param {number} defaultPrinterIndex The index of the default printer. 355 * @param {number} defaultPrinterIndex The index of the default printer.
334 */ 356 */
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 pdfViewer.grayscale(!color); 405 pdfViewer.grayscale(!color);
384 } 406 }
385 407
386 /** 408 /**
387 * Display an error message in the center of the preview area. 409 * Display an error message in the center of the preview area.
388 * @param {string} errorMessage The error message to be displayed. 410 * @param {string} errorMessage The error message to be displayed.
389 * @param {boolean} showButton Indivates whether the "Reopen the page" button 411 * @param {boolean} showButton Indivates whether the "Reopen the page" button
390 * should be displayed. 412 * should be displayed.
391 */ 413 */
392 function displayErrorMessage(errorMessage, showButton) { 414 function displayErrorMessage(errorMessage, showButton) {
393 isPreviewStillLoading = false;
394 $('dancing-dots').classList.remove('invisible'); 415 $('dancing-dots').classList.remove('invisible');
395 $('dancing-dots-text').classList.add('hidden'); 416 $('dancing-dots-text').classList.add('hidden');
396 $('error-text').innerHTML = errorMessage; 417 $('error-text').innerHTML = errorMessage;
397 $('error-text').classList.remove('hidden'); 418 $('error-text').classList.remove('hidden');
398 if (showButton) 419 if (showButton)
399 $('reopen-page').classList.remove('hidden'); 420 $('reopen-page').classList.remove('hidden');
400 else 421 else
401 $('reopen-page').classList.add('hidden'); 422 $('reopen-page').classList.add('hidden');
402 423
403 setControlsDisabled(true); 424 setControlsDisabled(true);
(...skipping 14 matching lines...) Expand all
418 /** 439 /**
419 * Called when the PDF plugin loads its document. 440 * Called when the PDF plugin loads its document.
420 */ 441 */
421 function onPDFLoad() { 442 function onPDFLoad() {
422 if (isLandscape()) 443 if (isLandscape())
423 $('pdf-viewer').fitToWidth(); 444 $('pdf-viewer').fitToWidth();
424 else 445 else
425 $('pdf-viewer').fitToHeight(); 446 $('pdf-viewer').fitToHeight();
426 447
427 $('dancing-dots').classList.add('invisible'); 448 $('dancing-dots').classList.add('invisible');
428 setControlsDisabled(false);
429 449
430 if (!previewModifiable) { 450 if (!previewModifiable) {
431 $('landscape').disabled = true; 451 $('landscape').disabled = true;
432 $('portrait').disabled = true; 452 $('portrait').disabled = true;
433 } 453 }
434 454
435 updateCopiesButtonsState(); 455 updateCopiesButtonsState();
436 updateWithPrinterCapabilities(printerCapabilities);
437 } 456 }
438 457
439 /** 458 /**
440 * Update the print preview when new preview data is available. 459 * Update the print preview when new preview data is available.
441 * Create the PDF plugin as needed. 460 * Create the PDF plugin as needed.
442 * Called from PrintPreviewUI::PreviewDataIsAvailable(). 461 * Called from PrintPreviewUI::PreviewDataIsAvailable().
443 * @param {number} pageCount The expected total pages count. 462 * @param {number} pageCount The expected total pages count.
444 * @param {string} jobTitle The print job title. 463 * @param {string} jobTitle The print job title.
445 * @param {boolean} modifiable If the preview is modifiable. 464 * @param {boolean} modifiable If the preview is modifiable.
446 * 465 *
447 */ 466 */
448 function updatePrintPreview(pageCount, jobTitle, modifiable) { 467 function updatePrintPreview(pageCount, jobTitle, modifiable) {
468 var tempPrintSettings = new PrintSettings();
469 tempPrintSettings.save();
470
449 previewModifiable = modifiable; 471 previewModifiable = modifiable;
450 472
451 if (totalPageCount == -1) 473 if (totalPageCount == -1)
452 totalPageCount = pageCount; 474 totalPageCount = pageCount;
453 475
454 if (previouslySelectedPages.length == 0) 476 if (previouslySelectedPages.length == 0)
455 for (var i = 0; i < totalPageCount; i++) 477 for (var i = 0; i < totalPageCount; i++)
456 previouslySelectedPages.push(i+1); 478 previouslySelectedPages.push(i+1);
457 479
458 if (previouslySelectedLayout == null) 480 if (printSettings.deviceName != tempPrintSettings.deviceName) {
459 previouslySelectedLayout = $('portrait'); 481 updateControlsWithSelectedPrinterCapabilities();
482 return;
483 } else if (printSettings.isLandscape != tempPrintSettings.isLandscape) {
484 requestPrintPreview();
485 return;
486 } else if (getSelectedPagesValidityLevel() == 1) {
487 var currentlySelectedPages = getSelectedPagesSet();
488 if (!areArraysEqual(previouslySelectedPages, currentlySelectedPages)) {
489 previouslySelectedPages = currentlySelectedPages;
490 requestPrintPreview();
491 return;
492 }
493 }
494
495 if (getSelectedPagesValidityLevel() != 1)
496 pageRangesFieldChanged();
dpapad 2011/05/23 21:17:06 I think it is more readable now.
460 497
461 // Update the current tab title. 498 // Update the current tab title.
462 document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle); 499 document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle);
463 500
464 createPDFPlugin(); 501 createPDFPlugin();
465 isPreviewStillLoading = false;
466 updatePrintSummary(); 502 updatePrintSummary();
503 addEventListeners();
467 } 504 }
468 505
469 /** 506 /**
470 * Create the PDF plugin or reload the existing one. 507 * Create the PDF plugin or reload the existing one.
471 */ 508 */
472 function createPDFPlugin() { 509 function createPDFPlugin() {
473 // Enable the print button. 510 // Enable the print button.
474 if (!$('printer-list').disabled) { 511 if (!$('printer-list').disabled) {
475 $('print-button').disabled = false; 512 $('print-button').disabled = false;
476 } 513 }
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 $('individual-pages').focus(); 703 $('individual-pages').focus();
667 } 704 }
668 705
669 /** 706 /**
670 * When the user switches printing orientation mode the page field selection is 707 * When the user switches printing orientation mode the page field selection is
671 * reset to "all pages selected". After the change the number of pages will be 708 * reset to "all pages selected". After the change the number of pages will be
672 * different and currently selected page numbers might no longer be valid. 709 * different and currently selected page numbers might no longer be valid.
673 * Even if they are still valid the content of these pages will be different. 710 * Even if they are still valid the content of these pages will be different.
674 */ 711 */
675 function onLayoutModeToggle() { 712 function onLayoutModeToggle() {
676 var currentlySelectedLayout = $('portrait').checked ? $('portrait') :
677 $('landscape');
678
679 // If the chosen layout is same as before, nothing needs to be done. 713 // If the chosen layout is same as before, nothing needs to be done.
680 if (previouslySelectedLayout == currentlySelectedLayout) 714 if (printSettings.isLandscape == isLandscape())
681 return; 715 return;
682 716
683 previouslySelectedLayout = currentlySelectedLayout;
684 $('individual-pages').classList.remove('invalid'); 717 $('individual-pages').classList.remove('invalid');
685 setDefaultValuesAndRegeneratePreview(); 718 setDefaultValuesAndRegeneratePreview();
686 } 719 }
687 720
688 /** 721 /**
689 * Sets the default values and sends a request to regenerate preview data. 722 * Sets the default values and sends a request to regenerate preview data.
690 */ 723 */
691 function setDefaultValuesAndRegeneratePreview() { 724 function setDefaultValuesAndRegeneratePreview() {
692 $('individual-pages').value = ''; 725 $('individual-pages').value = '';
693 hideInvalidHint($('individual-pages-hint')); 726 hideInvalidHint($('individual-pages-hint'));
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 copiesField.value = 1; 934 copiesField.value = 1;
902 else { 935 else {
903 var newValue = getCopies() + sign * 1; 936 var newValue = getCopies() + sign * 1;
904 if (newValue < copiesField.min || newValue > copiesField.max) 937 if (newValue < copiesField.min || newValue > copiesField.max)
905 return; 938 return;
906 copiesField.value = newValue; 939 copiesField.value = newValue;
907 } 940 }
908 copiesFieldChanged(); 941 copiesFieldChanged();
909 } 942 }
910 943
944 /**
945 * Class that represents the state of the print settings.
946 */
947 function PrintSettings() {
948 this.deviceName = '';
949 this.isLandscape = '';
950 }
951
952 /**
953 * Takes a snapshot of the print settings.
954 */
955 PrintSettings.prototype.save = function() {
956 var printerList = $('printer-list')
957 var selectedPrinter = printerList.selectedIndex;
958 if (selectedPrinter >= 0)
959 this.deviceName = printerList.options[selectedPrinter].value;
960 else
961 this.deviceName = '';
962 this.isLandscape = isLandscape();
963 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698