From 260f2d09946e16086830bfcb9d0bd659c03736d1 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Thu, 20 Jan 2011 11:58:03 +0000 Subject: [PATCH] Add a draft test page. The gradients are not recorded or played back by BPicture currently, so they're not visible outside the dummyWindow (code commented out). Needs to be polished before R1. Another issue is that ConfigPage() allow user to switch to another printer than the one selected when Print Test Page button was pressed. We needs a programmatic way to setup a printjob config for a specific printer... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40251 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/printers/Jamfile | 2 + src/preferences/printers/PrintersWindow.cpp | 34 +++-- src/preferences/printers/TestPageView.cpp | 131 ++++++++++++++++++++ src/preferences/printers/TestPageView.h | 26 ++++ 4 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 src/preferences/printers/TestPageView.cpp create mode 100644 src/preferences/printers/TestPageView.h diff --git a/src/preferences/printers/Jamfile b/src/preferences/printers/Jamfile index 895e41a45b..1a4068512d 100644 --- a/src/preferences/printers/Jamfile +++ b/src/preferences/printers/Jamfile @@ -9,6 +9,7 @@ Preference Printers : PrinterListView.cpp JobListView.cpp SpoolFolder.cpp + TestPageView.cpp TransportMenu.cpp Globals.cpp : @@ -28,6 +29,7 @@ DoCatalogs Printers : JobListView.cpp PrinterListView.cpp PrintersWindow.cpp + TestPageView.cpp TransportMenu.cpp ; diff --git a/src/preferences/printers/PrintersWindow.cpp b/src/preferences/printers/PrintersWindow.cpp index cea1bae27d..c69c666557 100644 --- a/src/preferences/printers/PrintersWindow.cpp +++ b/src/preferences/printers/PrintersWindow.cpp @@ -28,6 +28,7 @@ #include "JobListView.h" #include "Messages.h" #include "PrinterListView.h" +#include "TestPageView.h" #include "SpoolFolder.h" @@ -165,20 +166,39 @@ PrintersWindow::MessageReceived(BMessage* msg) void PrintersWindow::PrintTestPage(PrinterItem* printer) { - BPrintJob job("TestPage"); + BPrintJob job(B_TRANSLATE("Test Page")); job.ConfigPage(); + + // job.ConfigJob(); + + // enforce job config BMessage* settings = job.Settings(); + settings->AddInt32("copies", 1); + settings->AddInt32("first_page", 1); + settings->AddInt32("last_page", -1); - printf("print job settings:\n"); - settings->PrintToStream(); + settings = job.Settings(); - // BRect pageRect = job.PrintableRect(); job.BeginJob(); - // TestPageView testPage(pageRect, printer); - // job.DrawView(testPage, pageRect, BPoint(0.0, 0.0)); + + BRect pageRect = job.PrintableRect(); + // BWindow* dummyWindow = new BWindow(pageRect, "dummy", B_TITLED_WINDOW, 0); + // dummyWindow->Show(); + TestPageView* testPage = new TestPageView(pageRect, printer); + // views cannot be printed unless they're attached to a window + // just hide our test page... + testPage->Hide(); + AddChild(testPage); + // dummyWindow->AddChild(testPage); + + job.DrawView(testPage, pageRect, BPoint(0.0, 0.0)); job.SpoolPage(); + + RemoveChild(testPage); + delete testPage; + if (!job.CanContinue()) return; @@ -276,7 +296,7 @@ PrintersWindow::_BuildGUI() fPrintTestPage = new BButton(BRect(5,60,5,60), "print_test_page", B_TRANSLATE("Print test page"), new BMessage(kMsgPrintTestPage), B_FOLLOW_RIGHT); - // printersBox->AddChild(fPrintTestPage); + printersBox->AddChild(fPrintTestPage); fPrintTestPage->ResizeToPreferred(); if (fPrintTestPage->Bounds().Width() > maxWidth) diff --git a/src/preferences/printers/TestPageView.cpp b/src/preferences/printers/TestPageView.cpp new file mode 100644 index 0000000000..e51ec24239 --- /dev/null +++ b/src/preferences/printers/TestPageView.cpp @@ -0,0 +1,131 @@ +/* + * Copyright 2011, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Philippe Houdoin + */ + + +#include "TestPageView.h" + +#include +#include + +#include "PrinterListView.h" + + +#undef B_TRANSLATE_CONTEXT +#define B_TRANSLATE_CONTEXT "TestPageView" + + +TestPageView::TestPageView(BRect frame, PrinterItem* printer) + : BView(frame, "testpage", B_FOLLOW_NONE, B_WILL_DRAW), + fPrinter(printer) +{ +} + + +void +TestPageView::Draw(BRect updateRect) +{ + // TODO: build using layout manager the page content, + // using subviews, to adapt any page format. + + // Draw corners + + float width = Bounds().Width(); + float height = Bounds().Height(); + float minDimension = MIN(width, height); + + float size = minDimension * 0.02; + + BPoint pt = Bounds().LeftTop(); + StrokeLine(pt, BPoint(pt.x + size, pt.y)); + StrokeLine(pt, BPoint(pt.x, pt.y + size)); + + pt = Bounds().RightTop(); + StrokeLine(pt, BPoint(pt.x - size, pt.y)); + StrokeLine(pt, BPoint(pt.x, pt.y + size)); + + pt = Bounds().RightBottom(); + StrokeLine(pt, BPoint(pt.x - size, pt.y)); + StrokeLine(pt, BPoint(pt.x, pt.y - size)); + + pt = Bounds().LeftBottom(); + StrokeLine(pt, BPoint(pt.x + size, pt.y)); + StrokeLine(pt, BPoint(pt.x, pt.y - size)); + + // Draw some text + + BString text; + + text = B_TRANSLATE("Test Page for '%printer_name%'"); + text.ReplaceFirst("%printer_name%", fPrinter->Name()); + + SetFont(be_bold_font); + MovePenTo(50, 50); + DrawString(text); + + SetFont(be_plain_font); + text = B_TRANSLATE("Driver: %driver%"); + text.ReplaceFirst("%driver%", fPrinter->Driver()); + MovePenTo(50, 80); + DrawString(text); + + if (strlen(fPrinter->Transport()) > 0) { + text = B_TRANSLATE("Transport: %transport% %transport_address%"); + text.ReplaceFirst("%transport%", fPrinter->Transport()); + text.ReplaceFirst("%transport_address%", fPrinter->TransportAddress()); + MovePenTo(50, 110); + DrawString(text); + } + + // Draw some gradients + + BRect rect(50, 140, 50 + 200, 140 + 20); + BGradientLinear gradient(rect.LeftTop(), rect.RightBottom()); + rgb_color white = make_color(255, 255, 255); + gradient.AddColor(white, 0.0); + + // Red gradient + gradient.AddColor(make_color(255, 0, 0), 255.0); + FillRect(rect, gradient); + StrokeRect(rect); + + // Green gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(0, 255, 0)); + FillRect(rect, gradient); + StrokeRect(rect); + + // Blue gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(0, 0, 255)); + FillRect(rect, gradient); + StrokeRect(rect); + + // Yellow gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(255, 255, 0)); + FillRect(rect, gradient); + StrokeRect(rect); + + // Magenta gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(255, 0, 255)); + FillRect(rect, gradient); + StrokeRect(rect); + + // Cyan gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(0, 255, 255)); + FillRect(rect, gradient); + StrokeRect(rect); + + // Gray gradient + rect.OffsetBy(0, 20); + gradient.SetColor(1, make_color(0, 0, 0)); + FillRect(rect, gradient); + StrokeRect(rect); +} diff --git a/src/preferences/printers/TestPageView.h b/src/preferences/printers/TestPageView.h new file mode 100644 index 0000000000..86929476df --- /dev/null +++ b/src/preferences/printers/TestPageView.h @@ -0,0 +1,26 @@ +/* + * Copyright 2011, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Philippe Houdoin + */ +#ifndef _PRINTERS_TESTPAGEVIEW_H +#define _PRINTERS_TESTPAGEVIEW_H + + +#include + +class PrinterItem; + +class TestPageView : public BView { +public: + TestPageView(BRect rect, PrinterItem* printer); + + void Draw(BRect rect); + +private: + PrinterItem* fPrinter; +}; + +#endif