xref: /haiku/src/add-ons/print/transports/lpr/LprSetupDlg.cpp (revision bab64f65bb775dc23060e276f1f1c4498ab7af6c)
1 // Sun, 18 Jun 2000
2 // Y.Takagi
3 
4 #include <Button.h>
5 #include <Rect.h>
6 #include <TextControl.h>
7 #include <View.h>
8 #include <Directory.h>
9 #include <Alert.h>
10 
11 #include <algorithm>
12 #include <string.h>
13 
14 #include "LpsClient.h"
15 #include "LprSetupDlg.h"
16 #include "LprDefs.h"
17 #include "DbgMsg.h"
18 
19 
20 #define	DLG_WIDTH		370
21 #define DLG_HEIGHT		100
22 
23 #define BUTTON_WIDTH	70
24 #define BUTTON_HEIGHT	20
25 
26 #define SERVER_H		10
27 #define SERVER_V		10
28 #define SERVER_WIDTH	(DLG_WIDTH - SERVER_H - SERVER_H)
29 #define SERVER_HEIGHT	20
30 #define SERVER_TEXT		"Server name"
31 
32 #define QUEUE_H			10
33 #define QUEUE_V			SERVER_V + SERVER_HEIGHT + 2
34 #define QUEUE_WIDTH		(DLG_WIDTH - QUEUE_H - QUEUE_H)
35 #define QUEUE_HEIGHT	20
36 #define QUEUE_TEXT		"Queue name"
37 
38 #define OK_H			(DLG_WIDTH  - BUTTON_WIDTH  - 11)
39 #define OK_V			(DLG_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 SERVER_RECT(
47 	SERVER_H,
48 	SERVER_V,
49 	SERVER_H + SERVER_WIDTH,
50 	SERVER_V + SERVER_HEIGHT);
51 
52 const BRect QUEUE_RECT(
53 	QUEUE_H,
54 	QUEUE_V,
55 	QUEUE_H + QUEUE_WIDTH,
56 	QUEUE_V + QUEUE_HEIGHT);
57 
58 const BRect OK_RECT(
59 	OK_H,
60 	OK_V,
61 	OK_H + BUTTON_WIDTH,
62 	OK_V + BUTTON_HEIGHT);
63 
64 const BRect CANCEL_RECT(
65 	CANCEL_H,
66 	CANCEL_V,
67 	CANCEL_H + BUTTON_WIDTH,
68 	CANCEL_V + BUTTON_HEIGHT);
69 
70 enum MSGS {
71 	M_CANCEL = 1,
72 	M_OK
73 };
74 
75 
76 class LprSetupView : public BView {
77 public:
78 					LprSetupView(BRect, BDirectory *);
~LprSetupView()79 					~LprSetupView() {}
80 	virtual void	AttachedToWindow();
81 			bool	UpdateViewData();
82 
83 private:
84 	BTextControl*	fServer;
85 	BTextControl*	fQueue;
86 	BDirectory*		fDir;
87 };
88 
89 
LprSetupView(BRect frame,BDirectory * d)90 LprSetupView::LprSetupView(BRect frame, BDirectory *d)
91 	:
92 	BView(frame, "", B_FOLLOW_ALL, B_WILL_DRAW), fDir(d)
93 {
94 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
95 }
96 
97 
98 void
AttachedToWindow()99 LprSetupView::AttachedToWindow()
100 {
101 	float width = max(StringWidth(SERVER_TEXT), StringWidth(QUEUE_TEXT)) + 10;
102 
103 	/* server name box */
104 
105     // TODO remember previous value
106 	fServer = new BTextControl(SERVER_RECT, "", SERVER_TEXT, "192.168.0.0",
107 		NULL);
108 	AddChild(fServer);
109 	fServer->SetDivider(width);
110 
111 	/* queue name box */
112 
113     // TODO remember previous value
114 	fQueue = new BTextControl(QUEUE_RECT, "", QUEUE_TEXT, "LPT1_PASSTHRU",
115 		NULL);
116 	AddChild(fQueue);
117 	fQueue->SetDivider(width);
118 
119 	/* cancel */
120 
121 	BButton *button = new BButton(CANCEL_RECT, "", CANCEL_TEXT,
122 		new BMessage(M_CANCEL));
123 	AddChild(button);
124 
125 	/* ok */
126 
127 	button = new BButton(OK_RECT, "", OK_TEXT, new BMessage(M_OK));
128 	AddChild(button);
129 	button->MakeDefault(true);
130 }
131 
132 
133 bool
UpdateViewData()134 LprSetupView::UpdateViewData()
135 {
136 	if (*fServer->Text() && *fQueue->Text()) {
137 
138 		try {
139 			LpsClient lpr(fServer->Text());
140 			lpr.connect();
141 		}
142 
143 		catch (LPSException &err) {
144 			BAlert *alert = new BAlert("", err.what(), "OK");
145 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
146 			alert->Go();
147 			return false;
148 		}
149 
150 		fDir->WriteAttr(LPR_SERVER_NAME, B_STRING_TYPE, 0, fServer->Text(),
151 			strlen(fServer->Text()) + 1);
152 		fDir->WriteAttr(LPR_QUEUE_NAME,  B_STRING_TYPE, 0, fQueue->Text(),
153 			strlen(fQueue->Text())  + 1);
154 		return true;
155 	}
156 
157 	BAlert *alert = new BAlert("", "Please enter server address and printer"
158 		"queue name.", "OK");
159 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
160 	alert->Go();
161 	return false;
162 }
163 
164 
LprSetupDlg(BDirectory * dir)165 LprSetupDlg::LprSetupDlg(BDirectory *dir)
166 	:
167 	DialogWindow(BRect(100, 100, 100 + DLG_WIDTH, 100 + DLG_HEIGHT),
168 		"LPR Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
169 		B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE
170 		| B_CLOSE_ON_ESCAPE)
171 {
172 	fSetupView = new LprSetupView(Bounds(), dir);
173 	AddChild(fSetupView);
174 }
175 
176 
177 void
MessageReceived(BMessage * msg)178 LprSetupDlg::MessageReceived(BMessage *msg)
179 {
180 	switch (msg->what) {
181 		case M_OK:
182 			if (fSetupView->UpdateViewData()) {
183 				SetResult(B_OK);
184 				PostMessage(B_QUIT_REQUESTED);
185 			}
186 			break;
187 
188 		case M_CANCEL:
189 			SetResult(B_ERROR);
190 			PostMessage(B_QUIT_REQUESTED);
191 			break;
192 
193 		default:
194 			DialogWindow::MessageReceived(msg);
195 	}
196 }
197