1*52a38012Sejakowatz #include "PrintTestApp.hpp"
2*52a38012Sejakowatz #include "PrintTestWindow.hpp"
3*52a38012Sejakowatz
4*52a38012Sejakowatz #include <PrintJob.h>
5*52a38012Sejakowatz
6*52a38012Sejakowatz #define your_document_last_page 100
7*52a38012Sejakowatz
main()8*52a38012Sejakowatz int main()
9*52a38012Sejakowatz {
10*52a38012Sejakowatz new PrintTestApp;
11*52a38012Sejakowatz be_app->Run();
12*52a38012Sejakowatz delete be_app;
13*52a38012Sejakowatz
14*52a38012Sejakowatz return 0;
15*52a38012Sejakowatz }
16*52a38012Sejakowatz
PrintTestApp()17*52a38012Sejakowatz PrintTestApp::PrintTestApp()
18*52a38012Sejakowatz : Inherited(PRINTTEST_SIGNATURE)
19*52a38012Sejakowatz {
20*52a38012Sejakowatz }
21*52a38012Sejakowatz
MessageReceived(BMessage * msg)22*52a38012Sejakowatz void PrintTestApp::MessageReceived(BMessage* msg)
23*52a38012Sejakowatz {
24*52a38012Sejakowatz switch(msg->what) {
25*52a38012Sejakowatz case 'PStp':
26*52a38012Sejakowatz DoTestPageSetup();
27*52a38012Sejakowatz break;
28*52a38012Sejakowatz
29*52a38012Sejakowatz case 'Prnt':
30*52a38012Sejakowatz Print();
31*52a38012Sejakowatz break;
32*52a38012Sejakowatz }
33*52a38012Sejakowatz }
34*52a38012Sejakowatz
ReadyToRun()35*52a38012Sejakowatz void PrintTestApp::ReadyToRun()
36*52a38012Sejakowatz {
37*52a38012Sejakowatz (new PrintTestWindow)->Show();
38*52a38012Sejakowatz }
39*52a38012Sejakowatz
40*52a38012Sejakowatz
DoTestPageSetup()41*52a38012Sejakowatz status_t PrintTestApp::DoTestPageSetup()
42*52a38012Sejakowatz {
43*52a38012Sejakowatz BPrintJob job("document's name");
44*52a38012Sejakowatz status_t result = job.ConfigPage();
45*52a38012Sejakowatz if (result == B_OK) {
46*52a38012Sejakowatz // Get the user Settings
47*52a38012Sejakowatz fSetupData = job.Settings();
48*52a38012Sejakowatz
49*52a38012Sejakowatz // Use the new settings for your internal use
50*52a38012Sejakowatz fPaperRect = job.PaperRect();
51*52a38012Sejakowatz fPrintableRect = job.PrintableRect();
52*52a38012Sejakowatz }
53*52a38012Sejakowatz
54*52a38012Sejakowatz return result;
55*52a38012Sejakowatz }
56*52a38012Sejakowatz
Print()57*52a38012Sejakowatz status_t PrintTestApp::Print()
58*52a38012Sejakowatz {
59*52a38012Sejakowatz status_t result = B_OK;
60*52a38012Sejakowatz
61*52a38012Sejakowatz // If we have no setup message, we should call ConfigPage()
62*52a38012Sejakowatz // You must use the same instance of the BPrintJob object
63*52a38012Sejakowatz // (you can't call the previous "PageSetup()" function, since it
64*52a38012Sejakowatz // creates its own BPrintJob object).
65*52a38012Sejakowatz
66*52a38012Sejakowatz if (!fSetupData) {
67*52a38012Sejakowatz result = DoTestPageSetup();
68*52a38012Sejakowatz }
69*52a38012Sejakowatz
70*52a38012Sejakowatz BPrintJob job("document's name");
71*52a38012Sejakowatz if (result == B_OK) {
72*52a38012Sejakowatz // Setup the driver with user settings
73*52a38012Sejakowatz job.SetSettings(fSetupData);
74*52a38012Sejakowatz
75*52a38012Sejakowatz result = job.ConfigJob();
76*52a38012Sejakowatz if (result == B_OK) {
77*52a38012Sejakowatz // WARNING: here, setup CANNOT be NULL.
78*52a38012Sejakowatz if (fSetupData == NULL) {
79*52a38012Sejakowatz // something's wrong, handle the error and bail out
80*52a38012Sejakowatz }
81*52a38012Sejakowatz delete fSetupData;
82*52a38012Sejakowatz
83*52a38012Sejakowatz // Get the user Settings
84*52a38012Sejakowatz fSetupData = job.Settings();
85*52a38012Sejakowatz
86*52a38012Sejakowatz // Use the new settings for your internal use
87*52a38012Sejakowatz // They may have changed since the last time you read it
88*52a38012Sejakowatz fPaperRect = job.PaperRect();
89*52a38012Sejakowatz fPrintableRect = job.PrintableRect();
90*52a38012Sejakowatz
91*52a38012Sejakowatz // Now you have to calculate the number of pages
92*52a38012Sejakowatz // (note: page are zero-based)
93*52a38012Sejakowatz int32 firstPage = job.FirstPage();
94*52a38012Sejakowatz int32 lastPage = job.LastPage();
95*52a38012Sejakowatz
96*52a38012Sejakowatz // Verify the range is correct
97*52a38012Sejakowatz // 0 ... LONG_MAX -> Print all the document
98*52a38012Sejakowatz // n ... LONG_MAX -> Print from page n to the end
99*52a38012Sejakowatz // n ... m -> Print from page n to page m
100*52a38012Sejakowatz
101*52a38012Sejakowatz if (lastPage > your_document_last_page)
102*52a38012Sejakowatz lastPage = your_document_last_page;
103*52a38012Sejakowatz
104*52a38012Sejakowatz int32 nbPages = lastPage - firstPage + 1;
105*52a38012Sejakowatz
106*52a38012Sejakowatz // Verify the range is correct
107*52a38012Sejakowatz if (nbPages <= 0)
108*52a38012Sejakowatz return B_ERROR;
109*52a38012Sejakowatz
110*52a38012Sejakowatz // Now you can print the page
111*52a38012Sejakowatz job.BeginJob();
112*52a38012Sejakowatz
113*52a38012Sejakowatz // Print all pages
114*52a38012Sejakowatz bool can_continue = job.CanContinue();
115*52a38012Sejakowatz
116*52a38012Sejakowatz for (int i=firstPage ; can_continue && i<=lastPage ; i++) {
117*52a38012Sejakowatz // Draw all the needed views
118*52a38012Sejakowatz //IRA job.DrawView(someView, viewRect, pointOnPage);
119*52a38012Sejakowatz //IRA job.DrawView(anotherView, anotherRect, differentPoint);
120*52a38012Sejakowatz
121*52a38012Sejakowatz /*
122*52a38012Sejakowatz // If the document have a lot of pages, you can update a BStatusBar, here
123*52a38012Sejakowatz // or else what you want...
124*52a38012Sejakowatz update_status_bar(i-firstPage, nbPages);
125*52a38012Sejakowatz */
126*52a38012Sejakowatz
127*52a38012Sejakowatz // Spool the page
128*52a38012Sejakowatz job.SpoolPage();
129*52a38012Sejakowatz
130*52a38012Sejakowatz /*
131*52a38012Sejakowatz // Cancel the job if needed.
132*52a38012Sejakowatz // You can for exemple verify if the user pressed the ESC key
133*52a38012Sejakowatz // or (SHIFT + '.')...
134*52a38012Sejakowatz if (user_has_canceled)
135*52a38012Sejakowatz {
136*52a38012Sejakowatz // tell the print_server to cancel the printjob
137*52a38012Sejakowatz job.CancelJob();
138*52a38012Sejakowatz can_continue = false;
139*52a38012Sejakowatz break;
140*52a38012Sejakowatz }
141*52a38012Sejakowatz */
142*52a38012Sejakowatz // Verify that there was no error (disk full for example)
143*52a38012Sejakowatz can_continue = job.CanContinue();
144*52a38012Sejakowatz }
145*52a38012Sejakowatz
146*52a38012Sejakowatz // Now, you just have to commit the job!
147*52a38012Sejakowatz if (can_continue)
148*52a38012Sejakowatz job.CommitJob();
149*52a38012Sejakowatz else
150*52a38012Sejakowatz result = B_ERROR;
151*52a38012Sejakowatz }
152*52a38012Sejakowatz }
153*52a38012Sejakowatz
154*52a38012Sejakowatz return result;
155*52a38012Sejakowatz }
156