diff options
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.cc | 33 | ||||
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.h | 22 | ||||
-rw-r--r-- | chrome/browser/printing/print_job_worker.cc | 4 | ||||
-rw-r--r-- | chrome/browser/printing/print_job_worker.h | 3 | ||||
-rw-r--r-- | chrome/browser/printing/printer_query.cc | 4 | ||||
-rw-r--r-- | chrome/browser/printing/printer_query.h | 3 | ||||
-rw-r--r-- | chrome/browser/printing/printing_message_filter.cc | 8 | ||||
-rw-r--r-- | chrome/common/print_messages.h | 5 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 138 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 4 | ||||
-rw-r--r-- | printing/page_setup.cc | 83 | ||||
-rw-r--r-- | printing/page_setup.h | 8 | ||||
-rw-r--r-- | printing/print_dialog_gtk_interface.h | 10 | ||||
-rw-r--r-- | printing/print_settings.cc | 68 | ||||
-rw-r--r-- | printing/print_settings.h | 12 | ||||
-rw-r--r-- | printing/printing_context.cc | 52 | ||||
-rw-r--r-- | printing/printing_context.h | 4 | ||||
-rw-r--r-- | printing/printing_context_cairo.cc | 2 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 5 |
19 files changed, 262 insertions, 206 deletions
diff --git a/chrome/browser/printing/print_dialog_gtk.cc b/chrome/browser/printing/print_dialog_gtk.cc index e952484..7a64a93 100644 --- a/chrome/browser/printing/print_dialog_gtk.cc +++ b/chrome/browser/printing/print_dialog_gtk.cc @@ -21,6 +21,7 @@ #include "chrome/browser/ui/browser_window.h" #include "printing/metafile.h" #include "printing/print_job_constants.h" +#include "printing/print_settings.h" #include "printing/print_settings_initializer_gtk.h" using printing::PageRanges; @@ -146,11 +147,13 @@ void PrintDialogGtk::UseDefaultSettings() { // No page range to initialize for default settings. PageRanges ranges_vector; - InitPrintSettings(ranges_vector); + PrintSettings settings; + InitPrintSettings(ranges_vector, &settings); } -bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings, - const printing::PageRanges& ranges) { +bool PrintDialogGtk::UpdateSettings(const DictionaryValue& job_settings, + const printing::PageRanges& ranges, + printing::PrintSettings* settings) { bool collate; int color; bool landscape; @@ -159,13 +162,13 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings, int duplex_mode; std::string device_name; - if (!settings.GetBoolean(printing::kSettingLandscape, &landscape) || - !settings.GetBoolean(printing::kSettingCollate, &collate) || - !settings.GetInteger(printing::kSettingColor, &color) || - !settings.GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf) || - !settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode) || - !settings.GetInteger(printing::kSettingCopies, &copies) || - !settings.GetString(printing::kSettingDeviceName, &device_name)) { + if (!job_settings.GetBoolean(printing::kSettingLandscape, &landscape) || + !job_settings.GetBoolean(printing::kSettingCollate, &collate) || + !job_settings.GetInteger(printing::kSettingColor, &color) || + !job_settings.GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf) || + !job_settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode) || + !job_settings.GetInteger(printing::kSettingCopies, &copies) || + !job_settings.GetString(printing::kSettingDeviceName, &device_name)) { return false; } @@ -220,7 +223,7 @@ bool PrintDialogGtk::UpdateSettings(const DictionaryValue& settings, landscape ? GTK_PAGE_ORIENTATION_LANDSCAPE : GTK_PAGE_ORIENTATION_PORTRAIT); - InitPrintSettings(ranges); + InitPrintSettings(ranges, settings); return true; } @@ -395,9 +398,9 @@ void PrintDialogGtk::OnJobCompleted(GtkPrintJob* print_job, GError* error) { Release(); } -void PrintDialogGtk::InitPrintSettings(const PageRanges& page_ranges) { - PrintSettings settings; +void PrintDialogGtk::InitPrintSettings(const PageRanges& page_ranges, + PrintSettings* settings) { printing::PrintSettingsInitializerGtk::InitPrintSettings( - gtk_settings_, page_setup_, page_ranges, false, &settings); - context_->InitWithSettings(settings); + gtk_settings_, page_setup_, page_ranges, false, settings); + context_->InitWithSettings(*settings); } diff --git a/chrome/browser/printing/print_dialog_gtk.h b/chrome/browser/printing/print_dialog_gtk.h index 774fda4..a1e1b35 100644 --- a/chrome/browser/printing/print_dialog_gtk.h +++ b/chrome/browser/printing/print_dialog_gtk.h @@ -9,6 +9,7 @@ #include <gtk/gtk.h> #include <gtk/gtkprintunixdialog.h> +#include "base/compiler_specific.h" #include "base/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -19,6 +20,7 @@ namespace printing { class Metafile; +class PrintSettings; } using printing::PrintingContextCairo; @@ -34,15 +36,16 @@ class PrintDialogGtk PrintingContextCairo* context); // printing::PrintDialogGtkInterface implementation. - virtual void UseDefaultSettings(); - virtual bool UpdateSettings(const base::DictionaryValue& settings, - const printing::PageRanges& ranges); + virtual void UseDefaultSettings() OVERRIDE; + virtual bool UpdateSettings(const base::DictionaryValue& job_settings, + const printing::PageRanges& ranges, + printing::PrintSettings* settings) OVERRIDE; virtual void ShowDialog( - PrintingContextCairo::PrintSettingsCallback* callback); + PrintingContextCairo::PrintSettingsCallback* callback) OVERRIDE; virtual void PrintDocument(const printing::Metafile* metafile, - const string16& document_name); - virtual void AddRefToDialog(); - virtual void ReleaseDialog(); + const string16& document_name) OVERRIDE; + virtual void AddRefToDialog() OVERRIDE; + virtual void ReleaseDialog() OVERRIDE; private: friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; @@ -64,8 +67,9 @@ class PrintDialogGtk void OnJobCompleted(GtkPrintJob* print_job, GError* error); // Helper function for initializing |context_|'s PrintSettings with a given - // set of |page_ranges|. - void InitPrintSettings(const printing::PageRanges& page_ranges); + // set of |page_ranges| and |settings|. + void InitPrintSettings(const printing::PageRanges& page_ranges, + printing::PrintSettings* settings); // Printing dialog callback. PrintingContextCairo::PrintSettingsCallback* callback_; diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc index 7a850c0..e8074f79 100644 --- a/chrome/browser/printing/print_job_worker.cc +++ b/chrome/browser/printing/print_job_worker.cc @@ -77,7 +77,7 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings, gfx::NativeView parent_view, int document_page_count, bool has_selection, - bool use_overlays) { + MarginType margin_type) { DCHECK_EQ(message_loop(), MessageLoop::current()); DCHECK_EQ(page_number_, PageNumber::npos()); @@ -87,7 +87,7 @@ void PrintJobWorker::GetSettings(bool ask_user_for_settings, // on the thread where the PrintDlgEx is called, and definitely both calls // should happen on the same thread. See http://crbug.com/73466 // MessageLoop::current()->SetNestableTasksAllowed(true); - printing_context_->set_use_overlays(use_overlays); + printing_context_->set_margin_type(margin_type); if (ask_user_for_settings) { BrowserThread::PostTask( diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h index 44c0fb5..4c11629 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h @@ -12,6 +12,7 @@ #include "base/threading/thread.h" #include "printing/page_number.h" #include "printing/printing_context.h" +#include "printing/print_job_constants.h" #include "ui/gfx/native_widget_types.h" namespace base { @@ -44,7 +45,7 @@ class PrintJobWorker : public base::Thread { gfx::NativeView parent_view, int document_page_count, bool has_selection, - bool use_overlays); + MarginType margin_type); // Set the new print settings. This function takes ownership of // |new_settings|. diff --git a/chrome/browser/printing/printer_query.cc b/chrome/browser/printing/printer_query.cc index e20ebc5..2614607 100644 --- a/chrome/browser/printing/printer_query.cc +++ b/chrome/browser/printing/printer_query.cc @@ -75,7 +75,7 @@ void PrinterQuery::GetSettings(GetSettingsAskParam ask_user_for_settings, gfx::NativeView parent_view, int expected_page_count, bool has_selection, - bool use_overlays, + MarginType margin_type, CancelableTask* callback) { DCHECK_EQ(io_message_loop_, MessageLoop::current()); DCHECK(!is_print_dialog_box_shown_); @@ -91,7 +91,7 @@ void PrinterQuery::GetSettings(GetSettingsAskParam ask_user_for_settings, parent_view, expected_page_count, has_selection, - use_overlays)); + margin_type)); } void PrinterQuery::SetSettings(const DictionaryValue& new_settings, diff --git a/chrome/browser/printing/printer_query.h b/chrome/browser/printing/printer_query.h index c2df681..911b14d 100644 --- a/chrome/browser/printing/printer_query.h +++ b/chrome/browser/printing/printer_query.h @@ -8,6 +8,7 @@ #include "base/memory/scoped_ptr.h" #include "chrome/browser/printing/print_job_worker_owner.h" +#include "printing/print_job_constants.h" #include "ui/gfx/native_widget_types.h" class CancelableTask; @@ -49,7 +50,7 @@ class PrinterQuery : public PrintJobWorkerOwner { gfx::NativeView parent_view, int expected_page_count, bool has_selection, - bool use_overlays, + MarginType margin_type, CancelableTask* callback); // Updates the current settings with |new_settings| dictionary values. diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc index d21fd55..c35d68c 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -47,8 +47,8 @@ void RenderParamsFromPrintSettings(const printing::PrintSettings& settings, params->printable_size.SetSize( settings.page_setup_device_units().content_area().width(), settings.page_setup_device_units().content_area().height()); - params->margin_top = settings.page_setup_device_units().content_area().x(); - params->margin_left = settings.page_setup_device_units().content_area().y(); + params->margin_top = settings.page_setup_device_units().content_area().y(); + params->margin_left = settings.page_setup_device_units().content_area().x(); params->dpi = settings.dpi(); // Currently hardcoded at 1.25. See PrintSettings' constructor. params->min_shrink = settings.min_shrink; @@ -197,7 +197,7 @@ void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { NULL, 0, false, - true, + printing::DEFAULT_MARGINS, task); } @@ -248,7 +248,7 @@ void PrintingMessageFilter::OnScriptedPrint( host_view, params.expected_pages_count, params.has_selection, - params.use_overlays, + params.margin_type, task); } diff --git a/chrome/common/print_messages.h b/chrome/common/print_messages.h index a3a56d9..12c2845 100644 --- a/chrome/common/print_messages.h +++ b/chrome/common/print_messages.h @@ -12,6 +12,7 @@ #include "base/shared_memory.h" #include "ipc/ipc_message_macros.h" #include "printing/page_size_margins.h" +#include "printing/print_job_constants.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/rect.h" @@ -60,6 +61,8 @@ struct PrintMsg_PrintPages_Params { #define IPC_MESSAGE_START PrintMsgStart +IPC_ENUM_TRAITS(printing::MarginType) + // Parameters for a render request. IPC_STRUCT_TRAITS_BEGIN(PrintMsg_Print_Params) // Physical size of the page, including non-printable margins, @@ -239,7 +242,7 @@ IPC_STRUCT_BEGIN(PrintHostMsg_ScriptedPrint_Params) IPC_STRUCT_MEMBER(int, cookie) IPC_STRUCT_MEMBER(int, expected_pages_count) IPC_STRUCT_MEMBER(bool, has_selection) - IPC_STRUCT_MEMBER(bool, use_overlays) + IPC_STRUCT_MEMBER(printing::MarginType, margin_type) IPC_STRUCT_END() diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index afbb262..df2270f 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -152,83 +152,17 @@ bool PrintingNodeOrPdfFrame(const WebFrame* frame, const WebNode& node) { return mime == "application/pdf"; } -void SetMarginsForPDF(PrintMsg_Print_Params* settings) { - // This is the wrong way to do this. But the pipeline for the right way is - // too long. This will be removed soon. http://crbug.com/92000 - settings->margin_top = 0; - settings->margin_left = 0; - settings->printable_size.set_width(settings->page_size.width()); - settings->printable_size.set_height(settings->page_size.height()); -} - -// Get the margins option selected and set custom margins appropriately. -void SetCustomMarginsIfSelected(const DictionaryValue& job_settings, - PrintMsg_PrintPages_Params* settings) { - int margin_type = printing::DEFAULT_MARGINS; - if (!job_settings.GetInteger(printing::kSettingMarginsType, &margin_type)) { - NOTREACHED(); - } - - if (margin_type == printing::DEFAULT_MARGINS) - return; - - double custom_margin_top_in_points = 0; - double custom_margin_left_in_points = 0; - double custom_margin_right_in_points = 0; - double custom_margin_bottom_in_points = 0; - if (margin_type == printing::CUSTOM_MARGINS) { - DictionaryValue* custom_margins; - if (!job_settings.GetDictionary(printing::kSettingMarginsCustom, - &custom_margins)) { - NOTREACHED(); - return; - } - if (!custom_margins->GetDouble(printing::kSettingMarginTop, - &custom_margin_top_in_points) || - !custom_margins->GetDouble(printing::kSettingMarginLeft, - &custom_margin_left_in_points) || - !custom_margins->GetDouble(printing::kSettingMarginRight, - &custom_margin_right_in_points) || - !custom_margins->GetDouble(printing::kSettingMarginBottom, - &custom_margin_bottom_in_points)) { - NOTREACHED(); - return; - } - } - - int dpi = GetDPI(&settings->params); - double custom_margin_top_in_dots = ConvertUnitDouble( - custom_margin_top_in_points, printing::kPointsPerInch, dpi); - double custom_margin_left_in_dots = ConvertUnitDouble( - custom_margin_left_in_points, printing::kPointsPerInch, dpi); - double custom_margin_right_in_dots = ConvertUnitDouble( - custom_margin_right_in_points, printing::kPointsPerInch, dpi); - double custom_margin_bottom_in_dots = ConvertUnitDouble( - custom_margin_bottom_in_points, printing::kPointsPerInch, dpi); - - - if (custom_margin_left_in_dots < 0 || custom_margin_right_in_dots < 0 || - custom_margin_top_in_dots < 0 || custom_margin_bottom_in_dots < 0) { - NOTREACHED(); - return; - } - - if (settings->params.page_size.width() < custom_margin_left_in_dots + - custom_margin_right_in_dots || - settings->params.page_size.height() < custom_margin_top_in_dots + - custom_margin_bottom_in_dots) { - NOTREACHED(); - return; +void SetMarginsForPdf(DictionaryValue* job_settings, bool force_no_margins) { + // TODO(vandebo) When it's plumbed through, check if the plugin wants us to + // scale or not. For now, assume the answer is yes. + if (force_no_margins) { + job_settings->SetInteger(printing::kSettingMarginsType, + printing::NO_MARGINS); + } else { + job_settings->SetInteger(printing::kSettingMarginsType, + printing::PRINTABLE_AREA_MARGINS); } - settings->params.margin_top = custom_margin_top_in_dots; - settings->params.margin_left = custom_margin_left_in_dots; - settings->params.printable_size.set_width( - settings->params.page_size.width() - custom_margin_right_in_dots - - custom_margin_left_in_dots); - settings->params.printable_size.set_height( - settings->params.page_size.height() - custom_margin_bottom_in_dots - - custom_margin_top_in_dots); } // Get the (x, y) coordinate from where printing of the current text should @@ -582,13 +516,13 @@ void PrintWebViewHelper::OnPrintForPrintPreview( return; } - if (!UpdatePrintSettings(job_settings, false)) { + WebFrame* pdf_frame = pdf_element.document().frame(); + if (!UpdatePrintSettings(pdf_frame, pdf_element, job_settings, false)) { LOG(ERROR) << "UpdatePrintSettings failed"; DidFinishPrinting(FAIL_PRINT); return; } - WebFrame* pdf_frame = pdf_element.document().frame(); scoped_ptr<PrepareFrameAndViewForPrint> prepare; prepare.reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, pdf_frame, pdf_element)); @@ -636,7 +570,8 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { DCHECK(is_preview_); print_preview_context_.OnPrintPreview(); - if (!UpdatePrintSettings(settings, true)) { + if (!UpdatePrintSettings(print_preview_context_.frame(), + print_preview_context_.node(), settings, true)) { if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( routing_id(), print_pages_params_->params.document_cookie)); @@ -1109,20 +1044,35 @@ bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( } bool PrintWebViewHelper::UpdatePrintSettings( - const DictionaryValue& job_settings, bool generating_preview) { - if (job_settings.empty()) { + WebKit::WebFrame* frame, const WebKit::WebNode& node, + const DictionaryValue& passed_job_settings, bool generating_preview) { + DCHECK(is_preview_); + const DictionaryValue* job_settings = &passed_job_settings; + DictionaryValue modified_job_settings; + if (job_settings->empty()) { if (generating_preview) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); return false; } + bool is_pdf = PrintingNodeOrPdfFrame(frame, node); + if (is_pdf || !generating_preview) { + modified_job_settings.MergeDictionary(job_settings); + SetMarginsForPdf(&modified_job_settings, !generating_preview); + if (is_pdf) { + modified_job_settings.SetBoolean(printing::kSettingHeaderFooterEnabled, + false); + } + job_settings = &modified_job_settings; + } + // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when // possible. int cookie = print_pages_params_.get() ? print_pages_params_->params.document_cookie : 0; PrintMsg_PrintPages_Params settings; Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), - cookie, job_settings, &settings)); + cookie, *job_settings, &settings)); print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); if (PrintMsg_Print_Params_IsEmpty(settings.params)) { @@ -1150,22 +1100,17 @@ bool PrintWebViewHelper::UpdatePrintSettings( if (generating_preview) { // Validate expected print preview settings. - if (!job_settings.GetString(printing::kPreviewUIAddr, - &(settings.params.preview_ui_addr)) || - !job_settings.GetInteger(printing::kPreviewRequestID, - &(settings.params.preview_request_id)) || - !job_settings.GetBoolean(printing::kIsFirstRequest, - &(settings.params.is_first_request))) { + if (!job_settings->GetString(printing::kPreviewUIAddr, + &(settings.params.preview_ui_addr)) || + !job_settings->GetInteger(printing::kPreviewRequestID, + &(settings.params.preview_request_id)) || + !job_settings->GetBoolean(printing::kIsFirstRequest, + &(settings.params.is_first_request))) { NOTREACHED(); print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); return false; } - if (settings.params.is_first_request && - !print_preview_context_.IsModifiable()) { - settings.params.display_header_footer = false; - } - // Margins: Send default page layout to browser process. PageSizeMargins default_page_layout; GetPageSizeAndMarginsInPoints(NULL, -1, settings.params, @@ -1175,7 +1120,6 @@ bool PrintWebViewHelper::UpdatePrintSettings( Send(new PrintHostMsg_DidGetDefaultPageLayout(routing_id(), default_page_layout)); } - SetCustomMarginsIfSelected(job_settings, &settings); // Header/Footer: Set |header_footer_info_|. if (settings.params.display_header_footer) { @@ -1189,12 +1133,6 @@ bool PrintWebViewHelper::UpdatePrintSettings( } } - if ((is_preview_ && !generating_preview) || - PrintingNodeOrPdfFrame(print_preview_context_.frame(), - print_preview_context_.node())) { - SetMarginsForPDF(&settings.params); - } - print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), settings.params.document_cookie)); @@ -1218,7 +1156,7 @@ bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame, params.cookie = print_pages_params_->params.document_cookie; params.has_selection = frame->hasSelection(); params.expected_pages_count = expected_pages_count; - params.use_overlays = use_browser_overlays; + params.margin_type = printing::DEFAULT_MARGINS; Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h index 3cd117e..0ebfb8e 100644 --- a/chrome/renderer/print_web_view_helper.h +++ b/chrome/renderer/print_web_view_helper.h @@ -178,7 +178,9 @@ class PrintWebViewHelper // Update the current print settings with new |job_settings|. |job_settings| // dictionary contains print job details such as printer name, number of // copies, page range, etc. - bool UpdatePrintSettings(const base::DictionaryValue& job_settings, + bool UpdatePrintSettings(WebKit::WebFrame* frame, + const WebKit::WebNode& node, + const base::DictionaryValue& passed_job_settings, bool generating_preview); // Get final print settings from the user. diff --git a/printing/page_setup.cc b/printing/page_setup.cc index 9ac3e520..2411f6f 100644 --- a/printing/page_setup.cc +++ b/printing/page_setup.cc @@ -37,7 +37,8 @@ bool PageMargins::Equals(const PageMargins& rhs) const { bottom == rhs.bottom; } -PageSetup::PageSetup() : text_height_(0) { +PageSetup::PageSetup() { + Clear(); } PageSetup::~PageSetup() {} @@ -75,35 +76,64 @@ void PageSetup::Init(const gfx::Size& physical_size, printable_area_ = printable_area; text_height_ = text_height; + CalculateSizesWithinRect(printable_area_); +} + +void PageSetup::SetRequestedMargins(const PageMargins& requested_margins) { + requested_margins_ = requested_margins; + if (printable_area_.width() && printable_area_.height()) + CalculateSizesWithinRect(printable_area_); +} + +void PageSetup::ForceRequestedMargins(const PageMargins& requested_margins) { + requested_margins_ = requested_margins; + if (physical_size_.width() && physical_size_.height()) + CalculateSizesWithinRect(gfx::Rect(physical_size_)); +} + +void PageSetup::FlipOrientation() { + if (physical_size_.width() && physical_size_.height()) { + gfx::Size new_size(physical_size_.height(), physical_size_.width()); + int new_y = physical_size_.width() - + (printable_area_.width() + printable_area_.x()); + gfx::Rect new_printable_area(printable_area_.y(), + new_y, + printable_area_.height(), + printable_area_.width()); + Init(new_size, new_printable_area, text_height_); + } +} + +void PageSetup::CalculateSizesWithinRect(const gfx::Rect& bounds) { // Calculate the effective margins. The tricky part. effective_margins_.header = std::max(requested_margins_.header, - printable_area_.y()); + bounds.y()); effective_margins_.footer = std::max(requested_margins_.footer, - physical_size.height() - - printable_area_.bottom()); + physical_size_.height() - + bounds.bottom()); effective_margins_.left = std::max(requested_margins_.left, - printable_area_.x()); + bounds.x()); effective_margins_.top = std::max(std::max(requested_margins_.top, - printable_area_.y()), - effective_margins_.header + text_height); + bounds.y()), + effective_margins_.header + text_height_); effective_margins_.right = std::max(requested_margins_.right, - physical_size.width() - - printable_area_.right()); - effective_margins_.bottom = std::max(std::max(requested_margins_.bottom, - physical_size.height() - - printable_area_.bottom()), - effective_margins_.footer + text_height); + physical_size_.width() - + bounds.right()); + effective_margins_.bottom = + std::max(std::max(requested_margins_.bottom, + physical_size_.height() - bounds.bottom()), + effective_margins_.footer + text_height_); // Calculate the overlay area. If the margins are excessive, the overlay_area // size will be (0, 0). overlay_area_.set_x(effective_margins_.left); overlay_area_.set_y(effective_margins_.header); overlay_area_.set_width(std::max(0, - physical_size.width() - + physical_size_.width() - effective_margins_.right - overlay_area_.x())); overlay_area_.set_height(std::max(0, - physical_size.height() - + physical_size_.height() - effective_margins_.footer - overlay_area_.y())); @@ -112,32 +142,13 @@ void PageSetup::Init(const gfx::Size& physical_size, content_area_.set_x(effective_margins_.left); content_area_.set_y(effective_margins_.top); content_area_.set_width(std::max(0, - physical_size.width() - + physical_size_.width() - effective_margins_.right - content_area_.x())); content_area_.set_height(std::max(0, - physical_size.height() - + physical_size_.height() - effective_margins_.bottom - content_area_.y())); } -void PageSetup::SetRequestedMargins(const PageMargins& requested_margins) { - requested_margins_ = requested_margins; - if (physical_size_.width() && physical_size_.height()) - Init(physical_size_, printable_area_, text_height_); -} - -void PageSetup::FlipOrientation() { - if (physical_size_.width() && physical_size_.height()) { - gfx::Size new_size(physical_size_.height(), physical_size_.width()); - int new_y = physical_size_.width() - - (printable_area_.width() + printable_area_.x()); - gfx::Rect new_printable_area(printable_area_.y(), - new_y, - printable_area_.height(), - printable_area_.width()); - Init(new_size, new_printable_area, text_height_); - } -} - } // namespace printing diff --git a/printing/page_setup.h b/printing/page_setup.h index 7f33893..ef1552d 100644 --- a/printing/page_setup.h +++ b/printing/page_setup.h @@ -46,8 +46,12 @@ class PRINTING_EXPORT PageSetup { void Init(const gfx::Size& physical_size, const gfx::Rect& printable_area, int text_height); + // Use |requested_margins| as long as they fall inside the printable area. void SetRequestedMargins(const PageMargins& requested_margins); + // Ignore the printable area, and set the margins to |requested_margins|. + void ForceRequestedMargins(const PageMargins& requested_margins); + // Flips the orientation of the page and recalculates all page areas. void FlipOrientation(); @@ -60,6 +64,10 @@ class PRINTING_EXPORT PageSetup { } private: + // Calculate overlay_area_, effective_margins_, and content_area_, based on + // a constraint of |bounds|. + void CalculateSizesWithinRect(const gfx::Rect& bounds); + // Physical size of the page, including non-printable margins. gfx::Size physical_size_; diff --git a/printing/print_dialog_gtk_interface.h b/printing/print_dialog_gtk_interface.h index 4fb9341..22de95c 100644 --- a/printing/print_dialog_gtk_interface.h +++ b/printing/print_dialog_gtk_interface.h @@ -11,6 +11,7 @@ namespace printing { class Metafile; +class PrintSettings; // An interface for GTK printing dialogs. Classes that live outside of // printing/ can implement this interface and get threading requirements @@ -20,12 +21,13 @@ class PrintDialogGtkInterface { // Tell the dialog to use the default print setting. virtual void UseDefaultSettings() = 0; - // Update the dialog to use |settings| and |ranges|, where |settings| is a - // dictionary of settings with possible keys from + // Update the dialog to use |job_settings| and |ranges|, where |job_settings| + // is a dictionary of settings with possible keys from // printing/print_job_constants.h. Only used when printing without the system // print dialog. E.g. for Print Preview. Returns false on error. - virtual bool UpdateSettings(const base::DictionaryValue& settings, - const PageRanges& ranges) = 0; + virtual bool UpdateSettings(const base::DictionaryValue& job_settings, + const PageRanges& ranges, + PrintSettings* settings) = 0; // Shows the dialog and handles the response with |callback|. Only used when // printing with the native print dialog. diff --git a/printing/print_settings.cc b/printing/print_settings.cc index 06aac453d..0e1a743 100644 --- a/printing/print_settings.cc +++ b/printing/print_settings.cc @@ -5,6 +5,7 @@ #include "printing/print_settings.h" #include "base/atomic_sequence_num.h" +#include "base/logging.h" #include "printing/print_job_constants.h" #include "printing/units.h" @@ -114,7 +115,7 @@ PrintSettings::PrintSettings() max_shrink(2.0), desired_dpi(72), selection_only(false), - use_overlays(true), + margin_type(DEFAULT_MARGINS), display_header_footer(false), dpi_(0), landscape_(false), @@ -146,34 +147,67 @@ void PrintSettings::SetPrinterPrintableArea( gfx::Size const& physical_size_device_units, gfx::Rect const& printable_area_device_units, int units_per_inch) { - int header_footer_text_height = 0; - int margin_printer_units = 0; - if (use_overlays) { + if (display_header_footer) { // Hard-code text_height = 0.5cm = ~1/5 of inch. header_footer_text_height = ConvertUnit(kSettingHeaderFooterInterstice, kPointsPerInch, units_per_inch); - // Default margins 1.0cm = ~2/5 of an inch. - margin_printer_units = ConvertUnit(1000, kHundrethsMMPerInch, - units_per_inch); } - // Start by setting the user configuration page_setup_device_units_.Init(physical_size_device_units, printable_area_device_units, header_footer_text_height); - - // Apply default margins (not user configurable just yet). - // Since the font height is half the margin we put the header and footers at - // the font height from the margins. PageMargins margins; margins.header = header_footer_text_height; margins.footer = header_footer_text_height; - margins.left = margin_printer_units; - margins.top = margin_printer_units; - margins.right = margin_printer_units; - margins.bottom = margin_printer_units; - page_setup_device_units_.SetRequestedMargins(margins); + switch (margin_type) { + case DEFAULT_MARGINS: { + // Default margins 1.0cm = ~2/5 of an inch. + int margin_printer_units = ConvertUnit(1000, kHundrethsMMPerInch, + units_per_inch); + margins.top = margin_printer_units; + margins.bottom = margin_printer_units; + margins.left = margin_printer_units; + margins.right = margin_printer_units; + break; + } + case NO_MARGINS: + case PRINTABLE_AREA_MARGINS: { + margins.top = 0; + margins.bottom = 0; + margins.left = 0; + margins.right = 0; + break; + } + case CUSTOM_MARGINS: { + margins.top = ConvertUnitDouble(custom_margins_in_points_.top, + printing::kPointsPerInch, + units_per_inch); + margins.bottom = ConvertUnitDouble(custom_margins_in_points_.bottom, + printing::kPointsPerInch, + units_per_inch); + margins.left = ConvertUnitDouble(custom_margins_in_points_.left, + printing::kPointsPerInch, + units_per_inch); + margins.right = ConvertUnitDouble(custom_margins_in_points_.right, + printing::kPointsPerInch, + units_per_inch); + break; + } + default: { + NOTREACHED(); + } + } + + if (margin_type == DEFAULT_MARGINS || margin_type == PRINTABLE_AREA_MARGINS) + page_setup_device_units_.SetRequestedMargins(margins); + else + page_setup_device_units_.ForceRequestedMargins(margins); +} + +void PrintSettings::SetCustomMargins(const PageMargins& margins_in_points) { + custom_margins_in_points_ = margins_in_points; + margin_type = CUSTOM_MARGINS; } bool PrintSettings::Equals(const PrintSettings& rhs) const { diff --git a/printing/print_settings.h b/printing/print_settings.h index d73fd66..31417de 100644 --- a/printing/print_settings.h +++ b/printing/print_settings.h @@ -11,6 +11,7 @@ #include "base/string16.h" #include "printing/page_range.h" #include "printing/page_setup.h" +#include "printing/print_job_constants.h" #include "printing/printing_export.h" #include "ui/gfx/rect.h" @@ -40,6 +41,8 @@ class PRINTING_EXPORT PrintSettings { gfx::Rect const& printable_area_device_units, int units_per_inch); + void SetCustomMargins(const PageMargins& margins_in_points); + // Equality operator. // NOTE: printer_name is NOT tested for equality since it doesn't affect the // output. @@ -95,10 +98,8 @@ class PRINTING_EXPORT PrintSettings { // Indicates if the user only wants to print the current selection. bool selection_only; - // Indicates whether we should use browser-controlled page overlays - // (header, footer, margins etc). If it is false, the overlays are - // controlled by the renderer. - bool use_overlays; + // Indicates what kind of margins should be applied to the printable area. + MarginType margin_type; // Cookie generator. It is used to initialize PrintedDocument with its // associated PrintSettings, to be sure that each generated PrintedPage is @@ -137,6 +138,9 @@ class PRINTING_EXPORT PrintSettings { // True if this printer supports AlphaBlend. bool supports_alpha_blend_; + + // If margin type is custom, these are the margins. + PageMargins custom_margins_in_points_; }; } // namespace printing diff --git a/printing/printing_context.cc b/printing/printing_context.cc index 4e9d03a..46c0e6e 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc @@ -4,7 +4,9 @@ #include "printing/printing_context.h" +#include "base/logging.h" #include "base/values.h" +#include "printing/page_setup.h" #include "printing/print_settings_initializer.h" namespace printing { @@ -19,6 +21,11 @@ PrintingContext::PrintingContext(const std::string& app_locale) PrintingContext::~PrintingContext() { } +void PrintingContext::set_margin_type(MarginType type) { + DCHECK(type != CUSTOM_MARGINS); + settings_.margin_type = type; +} + void PrintingContext::ResetSettings() { ReleaseContext(); @@ -37,6 +44,51 @@ PrintingContext::Result PrintingContext::OnError() { PrintingContext::Result PrintingContext::UpdatePrintSettings( const base::DictionaryValue& job_settings, const PageRanges& ranges) { + ResetSettings(); + + if (!job_settings.GetBoolean(printing::kSettingHeaderFooterEnabled, + &settings_.display_header_footer)) { + NOTREACHED(); + } + + int margin_type = DEFAULT_MARGINS; + if (!job_settings.GetInteger(printing::kSettingMarginsType, &margin_type) || + (margin_type != DEFAULT_MARGINS && + margin_type != NO_MARGINS && + margin_type != CUSTOM_MARGINS && + margin_type != PRINTABLE_AREA_MARGINS)) { + NOTREACHED(); + } + settings_.margin_type = static_cast<MarginType>(margin_type); + + if (margin_type == CUSTOM_MARGINS) { + double top_margin_in_points = 0; + double bottom_margin_in_points = 0; + double left_margin_in_points = 0; + double right_margin_in_points = 0; + DictionaryValue* custom_margins; + if (!job_settings.GetDictionary(printing::kSettingMarginsCustom, + &custom_margins) || + !custom_margins->GetDouble(printing::kSettingMarginTop, + &top_margin_in_points) || + !custom_margins->GetDouble(printing::kSettingMarginBottom, + &bottom_margin_in_points) || + !custom_margins->GetDouble(printing::kSettingMarginLeft, + &left_margin_in_points) || + !custom_margins->GetDouble(printing::kSettingMarginRight, + &right_margin_in_points)) { + NOTREACHED(); + } + PageMargins margins_in_points; + margins_in_points.Clear(); + margins_in_points.top = top_margin_in_points; + margins_in_points.bottom = bottom_margin_in_points; + margins_in_points.left = left_margin_in_points; + margins_in_points.right = right_margin_in_points; + + settings_.SetCustomMargins(margins_in_points); + } + PrintingContext::Result result = UpdatePrinterSettings(job_settings, ranges); printing::PrintSettingsInitializer::InitHeaderFooterStrings(job_settings, &settings_); diff --git a/printing/printing_context.h b/printing/printing_context.h index 46e9f57..5dbe70d 100644 --- a/printing/printing_context.h +++ b/printing/printing_context.h @@ -98,9 +98,7 @@ class PRINTING_EXPORT PrintingContext { // caller owns the returned object. static PrintingContext* Create(const std::string& app_locale); - void set_use_overlays(bool use_overlays) { - settings_.use_overlays = use_overlays; - } + void set_margin_type(MarginType type); const PrintSettings& settings() const { return settings_; diff --git a/printing/printing_context_cairo.cc b/printing/printing_context_cairo.cc index a000d48..81d8d92 100644 --- a/printing/printing_context_cairo.cc +++ b/printing/printing_context_cairo.cc @@ -163,7 +163,7 @@ PrintingContext::Result PrintingContextCairo::UpdatePrinterSettings( print_dialog_->AddRefToDialog(); } - if (!print_dialog_->UpdateSettings(job_settings, ranges)) + if (!print_dialog_->UpdateSettings(job_settings, ranges, &settings_)) return OnError(); return OK; diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index 3a1da66..e7c0f56 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -383,11 +383,6 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( return OK; } - // Underlying |settings_| do not have these attributes, so we need to - // operate on printer directly, which involves reloading settings. - // Therefore, reset the settings anyway. - ResetSettings(); - HANDLE printer; LPWSTR device_name_wide = const_cast<wchar_t*>(device_name.c_str()); if (!OpenPrinter(device_name_wide, &printer, NULL)) |