OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 #include "printing/printing_context_win.h" | 5 #include "printing/printing_context_win.h" |
6 | 6 |
7 #include <winspool.h> | 7 #include <winspool.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 : PrintingContext(app_locale), | 182 : PrintingContext(app_locale), |
183 context_(NULL), | 183 context_(NULL), |
184 dialog_box_(NULL), | 184 dialog_box_(NULL), |
185 print_dialog_func_(&PrintDlgEx) { | 185 print_dialog_func_(&PrintDlgEx) { |
186 } | 186 } |
187 | 187 |
188 PrintingContextWin::~PrintingContextWin() { | 188 PrintingContextWin::~PrintingContextWin() { |
189 ReleaseContext(); | 189 ReleaseContext(); |
190 } | 190 } |
191 | 191 |
192 // TODO(vitalybuka): Implement as ui::BaseShellDialog crbug.com/180997. | |
193 void PrintingContextWin::AskUserForSettings( | 192 void PrintingContextWin::AskUserForSettings( |
194 gfx::NativeView view, int max_pages, bool has_selection, | 193 gfx::NativeView view, int max_pages, bool has_selection, |
195 const PrintSettingsCallback& callback) { | 194 const PrintSettingsCallback& callback) { |
196 DCHECK(!in_print_job_); | 195 DCHECK(!in_print_job_); |
| 196 // TODO(scottmg): Possibly this has to move into the threaded runner too? |
197 if (win8::IsSingleWindowMetroMode()) { | 197 if (win8::IsSingleWindowMetroMode()) { |
198 // The system dialog can not be opened while running in Metro. | 198 // The system dialog can not be opened while running in Metro. |
199 // But we can programatically launch the Metro print device charm though. | 199 // But we can programatically launch the Metro print device charm though. |
200 HMODULE metro_module = base::win::GetMetroModule(); | 200 HMODULE metro_module = base::win::GetMetroModule(); |
201 if (metro_module != NULL) { | 201 if (metro_module != NULL) { |
202 typedef void (*MetroShowPrintUI)(); | 202 typedef void (*MetroShowPrintUI)(); |
203 MetroShowPrintUI metro_show_print_ui = | 203 MetroShowPrintUI metro_show_print_ui = |
204 reinterpret_cast<MetroShowPrintUI>( | 204 reinterpret_cast<MetroShowPrintUI>( |
205 ::GetProcAddress(metro_module, "MetroShowPrintUI")); | 205 ::GetProcAddress(metro_module, "MetroShowPrintUI")); |
206 if (metro_show_print_ui) { | 206 if (metro_show_print_ui) { |
(...skipping 12 matching lines...) Expand all Loading... |
219 | 219 |
220 // Show the OS-dependent dialog box. | 220 // Show the OS-dependent dialog box. |
221 // If the user press | 221 // If the user press |
222 // - OK, the settings are reset and reinitialized with the new settings. OK is | 222 // - OK, the settings are reset and reinitialized with the new settings. OK is |
223 // returned. | 223 // returned. |
224 // - Apply then Cancel, the settings are reset and reinitialized with the new | 224 // - Apply then Cancel, the settings are reset and reinitialized with the new |
225 // settings. CANCEL is returned. | 225 // settings. CANCEL is returned. |
226 // - Cancel, the settings are not changed, the previous setting, if it was | 226 // - Cancel, the settings are not changed, the previous setting, if it was |
227 // initialized before, are kept. CANCEL is returned. | 227 // initialized before, are kept. CANCEL is returned. |
228 // On failure, the settings are reset and FAILED is returned. | 228 // On failure, the settings are reset and FAILED is returned. |
229 PRINTDLGEX dialog_options = { sizeof(PRINTDLGEX) }; | 229 PRINTDLGEX* dialog_options = |
230 dialog_options.hwndOwner = window; | 230 reinterpret_cast<PRINTDLGEX*>(malloc(sizeof(PRINTDLGEX))); |
| 231 ZeroMemory(dialog_options, sizeof(PRINTDLGEX)); |
| 232 dialog_options->lStructSize = sizeof(PRINTDLGEX); |
| 233 dialog_options->hwndOwner = window; |
231 // Disable options we don't support currently. | 234 // Disable options we don't support currently. |
232 // TODO(maruel): Reuse the previously loaded settings! | 235 // TODO(maruel): Reuse the previously loaded settings! |
233 dialog_options.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | | 236 dialog_options->Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | |
234 PD_NOCURRENTPAGE | PD_HIDEPRINTTOFILE; | 237 PD_NOCURRENTPAGE | PD_HIDEPRINTTOFILE; |
235 if (!has_selection) | 238 if (!has_selection) |
236 dialog_options.Flags |= PD_NOSELECTION; | 239 dialog_options->Flags |= PD_NOSELECTION; |
237 | 240 |
238 PRINTPAGERANGE ranges[32]; | 241 const size_t max_page_ranges = 32; |
239 dialog_options.nStartPage = START_PAGE_GENERAL; | 242 PRINTPAGERANGE* ranges = new PRINTPAGERANGE[max_page_ranges]; |
| 243 dialog_options->lpPageRanges = ranges; |
| 244 dialog_options->nStartPage = START_PAGE_GENERAL; |
240 if (max_pages) { | 245 if (max_pages) { |
241 // Default initialize to print all the pages. | 246 // Default initialize to print all the pages. |
242 memset(ranges, 0, sizeof(ranges)); | 247 memset(ranges, 0, sizeof(ranges)); |
243 ranges[0].nFromPage = 1; | 248 ranges[0].nFromPage = 1; |
244 ranges[0].nToPage = max_pages; | 249 ranges[0].nToPage = max_pages; |
245 dialog_options.nPageRanges = 1; | 250 dialog_options->nPageRanges = 1; |
246 dialog_options.nMaxPageRanges = arraysize(ranges); | 251 dialog_options->nMaxPageRanges = max_page_ranges; |
247 dialog_options.nMinPage = 1; | 252 dialog_options->nMinPage = 1; |
248 dialog_options.nMaxPage = max_pages; | 253 dialog_options->nMaxPage = max_pages; |
249 dialog_options.lpPageRanges = ranges; | |
250 } else { | 254 } else { |
251 // No need to bother, we don't know how many pages are available. | 255 // No need to bother, we don't know how many pages are available. |
252 dialog_options.Flags |= PD_NOPAGENUMS; | 256 dialog_options->Flags |= PD_NOPAGENUMS; |
253 } | 257 } |
254 | 258 |
255 HRESULT hr = (*print_dialog_func_)(&dialog_options); | 259 callback_ = callback; |
256 if (hr != S_OK) { | 260 print_settings_dialog_ = new ui::PrintSettingsDialogWin(this); |
257 ResetSettings(); | 261 print_settings_dialog_->GetPrintSettings( |
258 callback.Run(FAILED); | 262 print_dialog_func_, window, dialog_options); |
259 } | |
260 | |
261 // TODO(maruel): Support PD_PRINTTOFILE. | |
262 callback.Run(ParseDialogResultEx(dialog_options)); | |
263 } | 263 } |
264 | 264 |
265 PrintingContext::Result PrintingContextWin::UseDefaultSettings() { | 265 PrintingContext::Result PrintingContextWin::UseDefaultSettings() { |
266 DCHECK(!in_print_job_); | 266 DCHECK(!in_print_job_); |
267 | 267 |
268 PRINTDLG dialog_options = { sizeof(PRINTDLG) }; | 268 PRINTDLG dialog_options = { sizeof(PRINTDLG) }; |
269 dialog_options.Flags = PD_RETURNDC | PD_RETURNDEFAULT; | 269 dialog_options.Flags = PD_RETURNDC | PD_RETURNDEFAULT; |
270 if (PrintDlg(&dialog_options)) | 270 if (PrintDlg(&dialog_options)) |
271 return ParseDialogResult(dialog_options); | 271 return ParseDialogResult(dialog_options); |
272 | 272 |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 if (context_) { | 558 if (context_) { |
559 DeleteDC(context_); | 559 DeleteDC(context_); |
560 context_ = NULL; | 560 context_ = NULL; |
561 } | 561 } |
562 } | 562 } |
563 | 563 |
564 gfx::NativeDrawingContext PrintingContextWin::context() const { | 564 gfx::NativeDrawingContext PrintingContextWin::context() const { |
565 return context_; | 565 return context_; |
566 } | 566 } |
567 | 567 |
| 568 void PrintingContextWin::PrintSettingsConfirmed(PRINTDLGEX* dialog_options) { |
| 569 // TODO(maruel): Support PD_PRINTTOFILE. |
| 570 callback_.Run(ParseDialogResultEx(*dialog_options)); |
| 571 delete [] dialog_options->lpPageRanges; |
| 572 free(dialog_options); |
| 573 } |
| 574 |
| 575 void PrintingContextWin::PrintSettingsCancelled(PRINTDLGEX* dialog_options) { |
| 576 ResetSettings(); |
| 577 callback_.Run(FAILED); |
| 578 delete [] dialog_options->lpPageRanges; |
| 579 free(dialog_options); |
| 580 } |
| 581 |
568 // static | 582 // static |
569 BOOL PrintingContextWin::AbortProc(HDC hdc, int nCode) { | 583 BOOL PrintingContextWin::AbortProc(HDC hdc, int nCode) { |
570 if (nCode) { | 584 if (nCode) { |
571 // TODO(maruel): Need a way to find the right instance to set. Should | 585 // TODO(maruel): Need a way to find the right instance to set. Should |
572 // leverage PrintJobManager here? | 586 // leverage PrintJobManager here? |
573 // abort_printing_ = true; | 587 // abort_printing_ = true; |
574 } | 588 } |
575 return true; | 589 return true; |
576 } | 590 } |
577 | 591 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 | 783 |
770 if (dialog_options.hDevMode != NULL) | 784 if (dialog_options.hDevMode != NULL) |
771 GlobalFree(dialog_options.hDevMode); | 785 GlobalFree(dialog_options.hDevMode); |
772 if (dialog_options.hDevNames != NULL) | 786 if (dialog_options.hDevNames != NULL) |
773 GlobalFree(dialog_options.hDevNames); | 787 GlobalFree(dialog_options.hDevNames); |
774 | 788 |
775 return context_ ? OK : FAILED; | 789 return context_ ? OK : FAILED; |
776 } | 790 } |
777 | 791 |
778 } // namespace printing | 792 } // namespace printing |
OLD | NEW |