xref: /haiku/src/tests/kits/interface/bprintjob/PrintTestApp.cpp (revision 379c42b927b2cc1dc7b4ce66a4fa9532c081d936)
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