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