diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-21 19:18:05 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-21 19:18:05 +0000 |
commit | b719142cac87c33ec2d6e99a238b5ecd48f87d68 (patch) | |
tree | cb073e88f553db6c3acab1c18c1f9e31793a80b7 /printing | |
parent | b119a1e6bdd11040f93245e0b71d654a4883b40a (diff) | |
download | chromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.zip chromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.tar.gz chromium_src-b719142cac87c33ec2d6e99a238b5ecd48f87d68.tar.bz2 |
Printing: Implement PrintingContext::UseDefaultSettings for Linux/Cairo.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/3389005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60087 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r-- | printing/print_settings.cc | 41 | ||||
-rw-r--r-- | printing/print_settings.h | 9 | ||||
-rw-r--r-- | printing/printing.gyp | 2 | ||||
-rw-r--r-- | printing/printing_context.h | 15 | ||||
-rw-r--r-- | printing/printing_context_cairo.cc | 29 | ||||
-rw-r--r-- | printing/printing_context_mac.mm | 10 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 12 | ||||
-rw-r--r-- | printing/printing_context_win_unittest.cc | 21 |
8 files changed, 115 insertions, 24 deletions
diff --git a/printing/print_settings.cc b/printing/print_settings.cc index bfc7868..98a9ebf 100644 --- a/printing/print_settings.cc +++ b/printing/print_settings.cc @@ -4,9 +4,16 @@ #include "printing/print_settings.h" +// TODO(jhawkins): Move platform-specific implementations to their own files. +#if defined(USE_X11) +#include <gtk/gtk.h> +#endif // defined(USE_X11) + #include "base/atomic_sequence_num.h" #include "base/logging.h" +#include "base/string_piece.h" #include "base/sys_string_conversions.h" +#include "base/utf_string_conversions.h" #include "printing/units.h" namespace printing { @@ -37,7 +44,7 @@ void PrintSettings::Clear() { landscape_ = false; } -#ifdef WIN32 +#if defined(OS_WIN) void PrintSettings::Init(HDC hdc, const DEVMODE& dev_mode, const PageRanges& new_ranges, @@ -119,6 +126,38 @@ void PrintSettings::Init(PMPrinter printer, PMPageFormat page_format, printable_area_device_units, 72); } +#elif defined(OS_LINUX) +void PrintSettings::Init(GtkPrintSettings* settings, + GtkPageSetup* page_setup, + const PageRanges& new_ranges, + bool print_selection_only) { + // TODO(jhawkins): |printer_name_| and |device_name_| should be string16. + base::StringPiece name( + reinterpret_cast<const char*>(gtk_print_settings_get_printer(settings))); + printer_name_ = UTF8ToWide(name); + device_name_ = printer_name_; + ranges = new_ranges; + + GtkPageOrientation orientation = gtk_print_settings_get_orientation(settings); + landscape_ = orientation == GTK_PAGE_ORIENTATION_LANDSCAPE; + selection_only = print_selection_only; + + dpi_ = gtk_print_settings_get_resolution(settings); + + // Initialize page_setup_device_units_. + gfx::Size physical_size_device_units( + gtk_page_setup_get_paper_width(page_setup, GTK_UNIT_INCH) * dpi_, + gtk_page_setup_get_paper_height(page_setup, GTK_UNIT_INCH) * dpi_); + gfx::Rect printable_area_device_units( + gtk_page_setup_get_left_margin(page_setup, GTK_UNIT_INCH) * dpi_, + gtk_page_setup_get_top_margin(page_setup, GTK_UNIT_INCH) * dpi_, + gtk_page_setup_get_page_width(page_setup, GTK_UNIT_INCH) * dpi_, + gtk_page_setup_get_page_height(page_setup, GTK_UNIT_INCH) * dpi_); + + SetPrinterPrintableArea(physical_size_device_units, + printable_area_device_units, + dpi_); +} #endif void PrintSettings::SetPrinterPrintableArea( diff --git a/printing/print_settings.h b/printing/print_settings.h index fc52aeb..bdea485 100644 --- a/printing/print_settings.h +++ b/printing/print_settings.h @@ -16,6 +16,8 @@ typedef struct HDC__* HDC; typedef struct _devicemodeW DEVMODE; +typedef struct _GtkPrintSettings GtkPrintSettings; +typedef struct _GtkPageSetup GtkPageSetup; namespace printing { @@ -39,6 +41,13 @@ class PrintSettings { // Reads the settings from the given PMPrinter and PMPageFormat. void Init(PMPrinter printer, PMPageFormat page_format, const PageRanges& new_ranges, bool print_selection_only); +#elif defined(OS_LINUX) + // Initializes the settings from the given GtkPrintSettings and GtkPageSetup. + // TODO(jhawkins): This method is a mess across the platforms. Refactor. + void Init(GtkPrintSettings* settings, + GtkPageSetup* page_setup, + const PageRanges& new_ranges, + bool print_selection_onl); #endif // Set printer printable area in in device units. diff --git a/printing/printing.gyp b/printing/printing.gyp index 48e31a1..050f830 100644 --- a/printing/printing.gyp +++ b/printing/printing.gyp @@ -76,6 +76,8 @@ 'dependencies': [ # For FT_Init_FreeType and friends. '../build/linux/system.gyp:freetype2', + '../build/linux/system.gyp:gtk', + '../build/linux/system.gyp:gtkprint', ], }], ], diff --git a/printing/printing_context.h b/printing/printing_context.h index eb1b0c7..d5c6b00 100644 --- a/printing/printing_context.h +++ b/printing/printing_context.h @@ -15,6 +15,7 @@ #include <string> #include "base/basictypes.h" +#include "base/callback.h" #if !(defined(OS_WIN) || defined(OS_MACOSX)) // TODO(port) Remove after implementing PrintingContext::context() #include "base/logging.h" @@ -50,10 +51,18 @@ class PrintingContext { PrintingContext(); ~PrintingContext(); + // Callback of AskUserForSettings, used to notify the PrintJobWorker when + // print settings are available. + typedef Callback1<Result>::Type PrintSettingsCallback; + // Asks the user what printer and format should be used to print. Updates the - // context with the select device settings. - Result AskUserForSettings(gfx::NativeView parent_view, int max_pages, - bool has_selection); + // context with the select device settings. The result of the call is returned + // in the callback. This is necessary for Linux, which only has an + // asynchronous printing API. + void AskUserForSettings(gfx::NativeView parent_view, + int max_pages, + bool has_selection, + PrintSettingsCallback* callback); #if defined(OS_WIN) && defined(UNIT_TEST) // Sets a fake PrintDlgEx function pointer in tests. diff --git a/printing/printing_context_cairo.cc b/printing/printing_context_cairo.cc index 78b5235..d82f626 100644 --- a/printing/printing_context_cairo.cc +++ b/printing/printing_context_cairo.cc @@ -4,6 +4,9 @@ #include "printing/printing_context.h" +#include <gtk/gtk.h> +#include <gtk/gtkprintunixdialog.h> + #include "base/logging.h" namespace printing { @@ -22,22 +25,34 @@ PrintingContext::~PrintingContext() { ResetSettings(); } -PrintingContext::Result PrintingContext::AskUserForSettings( +void PrintingContext::AskUserForSettings( gfx::NativeView parent_view, int max_pages, - bool has_selection) { - + bool has_selection, + PrintSettingsCallback* callback) { NOTIMPLEMENTED(); - - return FAILED; + callback->Run(OK); } PrintingContext::Result PrintingContext::UseDefaultSettings() { DCHECK(!in_print_job_); - NOTIMPLEMENTED(); + ResetSettings(); - return FAILED; + GtkWidget* dialog = gtk_print_unix_dialog_new(NULL, NULL); + GtkPrintSettings* settings = + gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog)); + GtkPageSetup* page_setup = + gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog)); + + PageRanges ranges_vector; // Nothing to initialize for default settings. + settings_.Init(settings, page_setup, ranges_vector, false); + + g_object_unref(settings); + // |page_setup| is owned by dialog, so it does not need to be unref'ed. + gtk_widget_destroy(dialog); + + return OK; } PrintingContext::Result PrintingContext::InitWithSettings( diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm index 762cade..ea6474c 100644 --- a/printing/printing_context_mac.mm +++ b/printing/printing_context_mac.mm @@ -28,8 +28,10 @@ PrintingContext::~PrintingContext() { } -PrintingContext::Result PrintingContext::AskUserForSettings( - gfx::NativeView parent_view, int max_pages, bool has_selection) { +void PrintingContext::AskUserForSettings(gfx::NativeView parent_view, + int max_pages, + bool has_selection, + PrintSettingsCallback* callback) { DCHECK([NSThread isMainThread]); // We deliberately don't feed max_pages into the dialog, because setting @@ -62,11 +64,11 @@ PrintingContext::Result PrintingContext::AskUserForSettings( // Will require restructuring the PrintingContext API to use a callback. NSInteger selection = [panel runModalWithPrintInfo:printInfo]; if (selection != NSOKButton) { - return CANCEL; + callback->Run(CANCEL); } ParsePrintInfo([panel printInfo]); - return OK; + callback->Run(OK); } PrintingContext::Result PrintingContext::UseDefaultSettings() { diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index ef07833..a94c71f 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -136,10 +136,10 @@ PrintingContext::~PrintingContext() { ResetSettings(); } -PrintingContext::Result PrintingContext::AskUserForSettings( - HWND view, - int max_pages, - bool has_selection) { +void PrintingContext::AskUserForSettings(HWND view, + int max_pages, + bool has_selection, + PrintSettingsCallback* callback) { DCHECK(!in_print_job_); dialog_box_dismissed_ = false; @@ -190,11 +190,11 @@ PrintingContext::Result PrintingContext::AskUserForSettings( { if ((*print_dialog_func_)(&dialog_options) != S_OK) { ResetSettings(); - return FAILED; + callback->Run(FAILED); } } // TODO(maruel): Support PD_PRINTTOFILE. - return ParseDialogResultEx(dialog_options); + callback->Run(ParseDialogResultEx(dialog_options)); } PrintingContext::Result PrintingContext::UseDefaultSettings() { diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index c2e377b..625af54 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -10,6 +10,16 @@ // This test is automatically disabled if no printer is available. class PrintingContextTest : public PrintingTest<testing::Test> { + public: + void PrintSettingsCallback(printing::PrintingContext::Result result) { + result_ = result; + } + + protected: + printing::PrintingContext::Result result() const { return result_; } + + private: + printing::PrintingContext::Result result_; }; // This is a fake PrintDlgEx implementation that sets the right fields in @@ -105,8 +115,13 @@ TEST_F(PrintingContextTest, Base) { TEST_F(PrintingContextTest, PrintAll) { printing::PrintingContext context; context.SetPrintDialog(&PrintDlgExMock); - ASSERT_EQ(printing::PrintingContext::OK, - context.AskUserForSettings(NULL, 123, false)); + context.AskUserForSettings( + NULL, + 123, + false, + NewCallback(static_cast<PrintingContextTest*>(this), + &PrintingContextTest::PrintSettingsCallback)); + ASSERT_EQ(printing::PrintingContext::OK, result()); printing::PrintSettings settings = context.settings(); EXPECT_EQ(settings.ranges.size(), 0); -}
\ No newline at end of file +} |