xref: /haiku/src/libs/print/libprint/AddPrinterDlg.cpp (revision 4f2fd49bdc6078128b1391191e4edac647044c3d)
1 #include "AddPrinterDlg.h"
2 
3 #include "PrinterCap.h"
4 #include "PrinterData.h"
5 
6 #define DIALOG_WIDTH 400
7 
8 #define BUTTON_WIDTH		70
9 #define BUTTON_HEIGHT		20
10 #define TEXT_HEIGHT         16
11 
12 #define BOX_TOP_INSET       18
13 #define BOX_BOTTOM_INSET    10
14 #define BOX_H_INSET         10
15 
16 #define PROTOCOL_CLASS_BOX_H      10
17 #define PROTOCOL_CLASS_BOX_V      10
18 #define PROTOCOL_CLASS_BOX_WIDTH  DIALOG_WIDTH - 20
19 #define PROTOCOL_CLASS_BOX_HEIGHT 125
20 
21 #define PROTOCOL_CLASS_H          BOX_H_INSET
22 #define PROTOCOL_CLASS_V          BOX_TOP_INSET
23 #define PROTOCOL_CLASS_WIDTH      PROTOCOL_CLASS_BOX_WIDTH - 2 * BOX_H_INSET
24 #define PROTOCOL_CLASS_HEIGHT     PROTOCOL_CLASS_BOX_HEIGHT - BOX_TOP_INSET - BOX_BOTTOM_INSET
25 
26 #define DESCRIPTION_BOX_H         PROTOCOL_CLASS_BOX_H
27 #define DESCRIPTION_BOX_V         PROTOCOL_CLASS_BOX_V + PROTOCOL_CLASS_BOX_HEIGHT + 10
28 #define DESCRIPTION_BOX_WIDTH     PROTOCOL_CLASS_BOX_WIDTH
29 #define DESCRIPTION_BOX_HEIGHT    125
30 
31 #define DESCRIPTION_H         BOX_H_INSET
32 #define DESCRIPTION_V         BOX_TOP_INSET
33 #define DESCRIPTION_WIDTH     DESCRIPTION_BOX_WIDTH - 2 * BOX_H_INSET
34 #define DESCRIPTION_HEIGHT    DESCRIPTION_BOX_HEIGHT - BOX_TOP_INSET - BOX_BOTTOM_INSET
35 
36 #define DIALOG_HEIGHT         DESCRIPTION_BOX_V + DESCRIPTION_BOX_HEIGHT + BUTTON_HEIGHT + 20
37 
38 #define OK_H				(DIALOG_WIDTH  - BUTTON_WIDTH  - 11)
39 #define OK_V				(DIALOG_HEIGHT - BUTTON_HEIGHT - 11)
40 #define OK_TEXT				"OK"
41 
42 #define CANCEL_H			(OK_H - BUTTON_WIDTH - 12)
43 #define CANCEL_V			OK_V
44 #define CANCEL_TEXT			"Cancel"
45 
46 const BRect PROTOCOL_CLASS_BOX_RECT(
47 	PROTOCOL_CLASS_BOX_H,
48 	PROTOCOL_CLASS_BOX_V,
49 	PROTOCOL_CLASS_BOX_H + PROTOCOL_CLASS_BOX_WIDTH ,
50 	PROTOCOL_CLASS_BOX_V + PROTOCOL_CLASS_BOX_HEIGHT);
51 
52 const BRect PROTOCOL_CLASS_RECT(
53 	PROTOCOL_CLASS_H,
54 	PROTOCOL_CLASS_V,
55 	PROTOCOL_CLASS_H + PROTOCOL_CLASS_WIDTH - B_V_SCROLL_BAR_WIDTH,
56 	PROTOCOL_CLASS_V + PROTOCOL_CLASS_HEIGHT);
57 
58 const BRect DESCRIPTION_BOX_RECT(
59 	DESCRIPTION_BOX_H,
60 	DESCRIPTION_BOX_V,
61 	DESCRIPTION_BOX_H + DESCRIPTION_BOX_WIDTH,
62 	DESCRIPTION_BOX_V + DESCRIPTION_BOX_HEIGHT);
63 
64 const BRect DESCRIPTION_RECT(
65 	DESCRIPTION_H,
66 	DESCRIPTION_V,
67 	DESCRIPTION_H + DESCRIPTION_WIDTH - B_V_SCROLL_BAR_WIDTH,
68 	DESCRIPTION_V + DESCRIPTION_HEIGHT);
69 
70 const BRect OK_RECT(
71 	OK_H,
72 	OK_V,
73 	OK_H + BUTTON_WIDTH,
74 	OK_V + BUTTON_HEIGHT);
75 
76 const BRect CANCEL_RECT(
77 	CANCEL_H,
78 	CANCEL_V,
79 	CANCEL_H + BUTTON_WIDTH,
80 	CANCEL_V + BUTTON_HEIGHT);
81 
82 
83 enum MSGS {
84 	kMsgCancel = 1,
85 	kMsgOK,
86 	kMsgProtocolClassChanged,
87 };
88 
89 ProtocolClassItem::ProtocolClassItem(const ProtocolClassCap* cap)
90 	: BStringItem(cap->label.c_str())
91 	, fProtocolClassCap(cap)
92 {
93 }
94 
95 int
96 ProtocolClassItem::getProtocolClass()
97 {
98 	return fProtocolClassCap->protocolClass;
99 }
100 
101 const char *
102 ProtocolClassItem::getDescription()
103 {
104 	return fProtocolClassCap->description.c_str();
105 }
106 
107 
108 AddPrinterView::AddPrinterView(BRect frame, PrinterData *printer_data, const PrinterCap *printer_cap)
109 	: BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS), fPrinterData(printer_data), fPrinterCap(printer_cap)
110 {
111 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
112 }
113 
114 AddPrinterView::~AddPrinterView()
115 {
116 }
117 
118 void
119 AddPrinterView::AttachedToWindow()
120 {
121 	/* protocol class box */
122 	BBox *box;
123 	box = new BBox(PROTOCOL_CLASS_BOX_RECT, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
124 	box->SetLabel("Protocol Classes:");
125 	AddChild(box);
126 
127 	/* protocol class */
128 	fProtocolClassList = new BListView(
129 		PROTOCOL_CLASS_RECT,
130 		"protocolClassList",
131 		B_SINGLE_SELECTION_LIST,
132 		B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
133 	box->AddChild(new BScrollView(
134 		"protocolClassListScroller",
135 		fProtocolClassList,
136 		B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
137 		0,
138 		false,
139 		true));
140 	fProtocolClassList->SetSelectionMessage(new BMessage(kMsgProtocolClassChanged));
141 	fProtocolClassList->SetTarget(this);
142 
143 	int count = fPrinterCap->countCap(PrinterCap::kProtocolClass);
144 	ProtocolClassCap **protocolClasses = (ProtocolClassCap **)fPrinterCap->enumCap(PrinterCap::kProtocolClass);
145 	while (count--) {
146 		const ProtocolClassCap *protocolClass = *protocolClasses;
147 
148 		BStringItem* item = new ProtocolClassItem(protocolClass);
149 		fProtocolClassList->AddItem(item);
150 		if (protocolClass->is_default) {
151 			int index = fProtocolClassList->IndexOf(item);
152 			fProtocolClassList->Select(index);
153 		}
154 		protocolClasses ++;
155 	}
156 
157 	/* description of protocol class box */
158 	box = new BBox(DESCRIPTION_BOX_RECT, NULL, B_FOLLOW_ALL_SIDES);
159 	box->SetLabel("Description:");
160 	AddChild(box);
161 
162 	/* description of protocol class */
163 	BRect textRect(DESCRIPTION_RECT);
164 	textRect.OffsetTo(0, 0);
165 	fDescription = new BTextView(DESCRIPTION_RECT, "description", textRect, B_FOLLOW_ALL_SIDES, B_WILL_DRAW);
166 	fDescription->SetViewColor(box->ViewColor());
167 	box->AddChild(new BScrollView("descriptionScroller", fDescription,
168 		B_FOLLOW_ALL_SIDES, 0, false, true, B_NO_BORDER));
169 	fDescription->MakeEditable(false);
170 
171 	/* cancel */
172 	BButton *button;
173 	button = new BButton(CANCEL_RECT, "", CANCEL_TEXT, new BMessage(kMsgCancel), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
174 	AddChild(button);
175 
176 	/* ok */
177 
178 	button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(kMsgOK), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
179 	AddChild(button);
180 	button->MakeDefault(true);
181 
182 	// update description
183 	BMessage updateDescription(kMsgProtocolClassChanged);
184 	MessageReceived(&updateDescription);
185 }
186 
187 void
188 AddPrinterView::FrameResized(float w, float h)
189 {
190 	BView::FrameResized(w, h);
191 	// update text rectangle
192 	BRect rect(fDescription->TextRect());
193 	rect.right = rect.left + fDescription->Frame().Width();
194 	fDescription->SetTextRect(rect);
195 }
196 
197 ProtocolClassItem *
198 AddPrinterView::CurrentSelection()
199 {
200 	int selected = fProtocolClassList->CurrentSelection();
201 	if (selected >= 0) {
202 		return (ProtocolClassItem*)fProtocolClassList->ItemAt(selected);
203 	}
204 	return NULL;
205 }
206 
207 void
208 AddPrinterView::MessageReceived(BMessage *msg)
209 {
210 	if (msg->what == kMsgProtocolClassChanged) {
211 		ProtocolClassItem *item = CurrentSelection();
212 		if (item != NULL) {
213 			fDescription->SetText(item->getDescription());
214 		}
215 	} else {
216 		BView::MessageReceived(msg);
217 	}
218 }
219 
220 void
221 AddPrinterView::Save()
222 {
223 	ProtocolClassItem *item = CurrentSelection();
224 	if (item != NULL) {
225 		fPrinterData->setProtocolClass(item->getProtocolClass());
226 		fPrinterData->save();
227 	}
228 }
229 
230 AddPrinterDlg::AddPrinterDlg(PrinterData *printerData, const PrinterCap *printerCap)
231 	: DialogWindow(BRect(100, 100, 100 + DIALOG_WIDTH, 100 + DIALOG_HEIGHT),
232 		"Add Printer", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
233 		B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS)
234 {
235 	SetResult(B_ERROR);
236 
237 	// increase min. window size
238 	float minWidth, maxWidth, minHeight, maxHeight;
239 	GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight);
240 	minHeight = DIALOG_HEIGHT;
241 	minWidth = DIALOG_WIDTH;
242 	SetSizeLimits(minWidth, maxWidth, minHeight, maxHeight);
243 
244 	fAddPrinterView = new AddPrinterView(Bounds(), printerData, printerCap);
245 	AddChild(fAddPrinterView);
246 }
247 
248 void
249 AddPrinterDlg::MessageReceived(BMessage *msg)
250 {
251 	switch (msg->what) {
252 	case kMsgOK:
253 		fAddPrinterView->Save();
254 		SetResult(B_NO_ERROR);
255 		PostMessage(B_QUIT_REQUESTED);
256 		break;
257 
258 	case kMsgCancel:
259 		PostMessage(B_QUIT_REQUESTED);
260 		break;
261 
262 	default:
263 		DialogWindow::MessageReceived(msg);
264 		break;
265 	}
266 }
267