xref: /haiku/src/add-ons/print/drivers/preview/JobSetupWindow.cpp (revision faf79e7f783976326856422ff006b4c6ae9c3031)
1 /*
2  * Copyright 2003-2008, Haiku. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Philippe Houdoin
7  *		Simon Gauvin
8  *		Michael Pfeiffer
9  *		julun <host.haiku@gmx.de>
10  */
11 
12 #include "JobSetupWindow.h"
13 #include "PrinterDriver.h"
14 
15 
16 #include <stdlib.h>
17 
18 
19 #include <Box.h>
20 #include <Button.h>
21 #include <GridView.h>
22 #include <GroupLayout.h>
23 #include <GroupLayoutBuilder.h>
24 #include <RadioButton.h>
25 #include <Screen.h>
26 #include <TextControl.h>
27 
28 
29 JobSetupWindow::JobSetupWindow(BMessage *msg, const char * printerName)
30 	: BlockingWindow(BRect(0, 0, 100, 100), "Job Setup",
31 		B_TITLED_WINDOW_LOOK,
32  		B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE |
33  			B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
34 	fPrinterName(printerName),
35 	fSetupMsg(msg)
36 {
37 	if (printerName)
38 		SetTitle(BString(printerName).Append(" Job Setup").String());
39 
40 	int32 firstPage;
41 	fSetupMsg->FindInt32("first_page", &firstPage);
42 
43 	int32 lastPage;
44 	fSetupMsg->FindInt32("last_page", &lastPage);
45 	bool allPages = firstPage == 1 && lastPage == INT32_MAX;
46 
47 	fAll = new BRadioButton("allPages", "Print all pages",
48 		new BMessage(ALL_PAGES_MGS));
49 	fAll->SetValue(allPages);
50 
51 	fRange = new BRadioButton("pagesRange", "Print selected pages:",
52 		new BMessage(RANGE_SELECTION_MSG));
53 	fRange->SetValue(!allPages);
54 
55 	fFrom = new BTextControl("from", "From:", "SomeSpaceHere", NULL);
56 	fFrom->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT);
57 	fFrom->SetEnabled(!allPages);
58 
59 	fTo = new BTextControl("to", "To:", "", NULL);
60 	fTo->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT);
61 	fTo->SetEnabled(!allPages);
62 
63 	BString buffer;
64 	buffer << firstPage;
65 	fFrom->SetText(buffer.String());
66 
67 	buffer = "";
68 	buffer << lastPage;
69 	fTo->SetText(buffer.String());
70 
71 	for (uint32 i = 0; i < '0'; i++) {
72 		fTo->TextView()->DisallowChar(i);
73 		fFrom->TextView()->DisallowChar(i);
74 	}
75 
76 	for (uint32 i = '9' + 1; i < 255; i++) {
77 		fTo->TextView()->DisallowChar(i);
78 		fFrom->TextView()->DisallowChar(i);
79 	}
80 
81 	BBox *separator = new BBox("separator");
82 	separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1));
83 
84 	BButton *cancel = new BButton("cancel", "Cancel", new BMessage(CANCEL_MSG));
85 
86 	BButton *ok = new BButton("ok", "OK", new BMessage(OK_MSG));
87 	ok->MakeDefault(true);
88 
89 	BGridView* settings = new BGridView();
90 	BGridLayout* settingsLayout = settings->GridLayout();
91 	settingsLayout->AddItem(fFrom->CreateLabelLayoutItem(), 0, 0);
92 	settingsLayout->AddItem(fFrom->CreateTextViewLayoutItem(), 1, 0);
93 	settingsLayout->AddItem(fTo->CreateLabelLayoutItem(), 0, 1);
94 	settingsLayout->AddItem(fTo->CreateTextViewLayoutItem(), 1, 1);
95 	settingsLayout->SetSpacing(0, 0);
96 
97 	SetLayout(new BGroupLayout(B_VERTICAL));
98 	AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
99 		.Add(fAll)
100 		.Add(fRange)
101 		.Add(settings)
102 		.AddGlue()
103 		.Add(separator)
104 		.AddGroup(B_HORIZONTAL, 10, 1.0f)
105 			.AddGlue()
106 			.Add(cancel)
107 			.Add(ok)
108 		.End()
109 		.SetInsets(10, 10, 10, 10)
110 	);
111 
112 
113 	BRect winFrame(Frame());
114 	BRect screenFrame(BScreen().Frame());
115 	MoveTo((screenFrame.right - winFrame.right) / 2,
116 		(screenFrame.bottom - winFrame.bottom) / 2);
117 }
118 
119 
120 void
121 JobSetupWindow::UpdateJobMessage()
122 {
123 	int32 from = 1;
124 	int32 to = INT32_MAX;
125 	if (fAll->Value() == B_CONTROL_OFF) {
126 		from = atoi(fFrom->Text());
127 		to = atoi(fTo->Text());
128 		if (from <= 0) from = 1;
129 		if (to < from) to = from;
130 	}
131 
132 	int32 copies = 1;
133 	fSetupMsg->RemoveName("copies");
134 	fSetupMsg->AddInt32("copies", copies);
135 
136 	fSetupMsg->RemoveName("first_page");
137 	fSetupMsg->AddInt32("first_page", from);
138 
139 	fSetupMsg->RemoveName("last_page");
140 	fSetupMsg->AddInt32("last_page", to);
141 }
142 
143 
144 void
145 JobSetupWindow::MessageReceived(BMessage *msg)
146 {
147 	switch (msg->what) {
148 		case OK_MSG:
149 			UpdateJobMessage();
150 			Quit(B_OK);
151 			break;
152 
153 		case CANCEL_MSG:
154 			Quit(B_ERROR);
155 			break;
156 
157 		case ALL_PAGES_MGS:
158 			fTo->SetEnabled(false);
159 			fFrom->SetEnabled(false);
160 			break;
161 
162 		case RANGE_SELECTION_MSG:
163 			fTo->SetEnabled(true);
164 			fFrom->SetEnabled(true);
165 			break;
166 
167 		default:
168 			BlockingWindow::MessageReceived(msg);
169 			break;
170 	}
171 }
172