1#include "AddPrinterDlg.h"
2
3#include <GroupLayoutBuilder.h>
4
5#include "PrinterCap.h"
6#include "PrinterData.h"
7
8
9enum MSGS {
10	kMsgCancel = 1,
11	kMsgOK,
12	kMsgProtocolClassChanged,
13};
14
15
16ProtocolClassItem::ProtocolClassItem(const ProtocolClassCap* cap)
17	: BStringItem(cap->fLabel.c_str())
18	, fProtocolClassCap(cap)
19{
20}
21
22
23int
24ProtocolClassItem::GetProtocolClass() const
25{
26	return fProtocolClassCap->fProtocolClass;
27}
28
29const char *
30ProtocolClassItem::GetDescription() const
31{
32	return fProtocolClassCap->fDescription.c_str();
33}
34
35
36AddPrinterView::AddPrinterView(PrinterData* printerData,
37	const PrinterCap* printerCap)
38	:
39	BView("addPrinter", B_WILL_DRAW),
40	fPrinterData(printerData),
41	fPrinterCap(printerCap)
42{
43}
44
45
46AddPrinterView::~AddPrinterView()
47{
48}
49
50
51void
52AddPrinterView::AttachedToWindow()
53{
54	// protocol class box
55	BBox* protocolClassBox = new BBox("protocolClass");
56	protocolClassBox->SetLabel("Protocol classes:");
57
58	// protocol class
59	fProtocolClassList = new BListView("protocolClassList");
60	fProtocolClassList->SetExplicitMinSize(BSize(500, 200));
61	BScrollView* protocolClassScroller = new BScrollView(
62		"protocolClassListScroller",
63		fProtocolClassList,
64		0,
65		false,
66		true,
67		B_NO_BORDER);
68	fProtocolClassList->SetSelectionMessage(
69		new BMessage(kMsgProtocolClassChanged));
70	fProtocolClassList->SetTarget(this);
71
72	protocolClassBox->AddChild(protocolClassScroller);
73
74	int count = fPrinterCap->CountCap(PrinterCap::kProtocolClass);
75	ProtocolClassCap **protocolClasses =
76		(ProtocolClassCap **)fPrinterCap->GetCaps(PrinterCap::kProtocolClass);
77	while (count--) {
78		const ProtocolClassCap *protocolClass = *protocolClasses;
79
80		BStringItem* item = new ProtocolClassItem(protocolClass);
81		fProtocolClassList->AddItem(item);
82		if (protocolClass->fIsDefault) {
83			int index = fProtocolClassList->IndexOf(item);
84			fProtocolClassList->Select(index);
85		}
86		protocolClasses ++;
87	}
88
89	// description of protocol class box
90	BBox* descriptionBox = new BBox("descriptionBox");
91	descriptionBox->SetLabel("Description:");
92
93	// description of protocol class
94	fDescription = new BTextView("description");
95	fDescription->SetExplicitMinSize(BSize(200, 200));
96	fDescription->SetViewColor(descriptionBox->ViewColor());
97	BScrollView* descriptionScroller = new BScrollView("descriptionScroller",
98			fDescription,
99			0,
100			false,
101			true,
102			B_NO_BORDER);
103	fDescription->MakeEditable(false);
104
105	descriptionBox->AddChild(descriptionScroller);
106
107	// separator line
108	BBox *separator = new BBox("separator");
109	separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1));
110
111	// buttons
112	BButton* cancel = new BButton("cancel", "Cancel",
113		new BMessage(kMsgCancel));
114	BButton* ok = new BButton("ok", "OK", new BMessage(kMsgOK));
115	ok->MakeDefault(true);
116
117	SetLayout(new BGroupLayout(B_VERTICAL));
118	AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
119		.Add(protocolClassBox)
120		.Add(descriptionBox)
121		.AddGlue()
122		.Add(separator)
123		.AddGroup(B_HORIZONTAL, 10, 1.0f)
124			.AddGlue()
125			.Add(cancel)
126			.Add(ok)
127		.End()
128		.SetInsets(0, 0, 0, 0)
129	);
130
131
132	// update description
133	BMessage updateDescription(kMsgProtocolClassChanged);
134	MessageReceived(&updateDescription);
135}
136
137
138ProtocolClassItem*
139AddPrinterView::CurrentSelection()
140{
141	int selected = fProtocolClassList->CurrentSelection();
142	if (selected >= 0) {
143		return (ProtocolClassItem*)fProtocolClassList->ItemAt(selected);
144	}
145	return NULL;
146}
147
148
149void
150AddPrinterView::MessageReceived(BMessage* msg)
151{
152	if (msg->what == kMsgProtocolClassChanged) {
153		ProtocolClassItem *item = CurrentSelection();
154		if (item != NULL) {
155			fDescription->SetText(item->GetDescription());
156		}
157	} else {
158		BView::MessageReceived(msg);
159	}
160}
161
162
163void
164AddPrinterView::Save()
165{
166	ProtocolClassItem* item = CurrentSelection();
167	if (item != NULL) {
168		fPrinterData->SetProtocolClass(item->GetProtocolClass());
169		fPrinterData->Save();
170	}
171}
172
173
174AddPrinterDlg::AddPrinterDlg(PrinterData* printerData,
175	const PrinterCap *printerCap)
176	:
177	DialogWindow(BRect(100, 100, 120, 120),
178		"Add printer", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
179		B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS
180			| B_AUTO_UPDATE_SIZE_LIMITS)
181{
182	SetResult(B_ERROR);
183
184	fAddPrinterView = new AddPrinterView(printerData, printerCap);
185	SetLayout(new BGroupLayout(B_VERTICAL));
186	AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
187		.Add(fAddPrinterView)
188		.SetInsets(10, 10, 10, 10)
189	);
190}
191
192
193void
194AddPrinterDlg::MessageReceived(BMessage* msg)
195{
196	switch (msg->what) {
197		case kMsgOK:
198			fAddPrinterView->Save();
199			SetResult(B_NO_ERROR);
200			PostMessage(B_QUIT_REQUESTED);
201			break;
202
203		case kMsgCancel:
204			PostMessage(B_QUIT_REQUESTED);
205			break;
206
207		default:
208			DialogWindow::MessageReceived(msg);
209			break;
210	}
211}
212