xref: /haiku/src/add-ons/network_settings/dialup/TextRequestDialog.cpp (revision a325aa030fbd5c4ee84dce6b360a5dc8c0b313f5)
1*a325aa03SAugustin Cavalier /* -----------------------------------------------------------------------
2*a325aa03SAugustin Cavalier  * Copyright (c) 2004 Waldemar Kornewald, Waldemar.Kornewald@web.de
3*a325aa03SAugustin Cavalier  *
4*a325aa03SAugustin Cavalier  * Permission is hereby granted, free of charge, to any person obtaining a
5*a325aa03SAugustin Cavalier  * copy of this software and associated documentation files (the "Software"),
6*a325aa03SAugustin Cavalier  * to deal in the Software without restriction, including without limitation
7*a325aa03SAugustin Cavalier  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*a325aa03SAugustin Cavalier  * and/or sell copies of the Software, and to permit persons to whom the
9*a325aa03SAugustin Cavalier  * Software is furnished to do so, subject to the following conditions:
10*a325aa03SAugustin Cavalier  *
11*a325aa03SAugustin Cavalier  * The above copyright notice and this permission notice shall be included in
12*a325aa03SAugustin Cavalier  * all copies or substantial portions of the Software.
13*a325aa03SAugustin Cavalier  *
14*a325aa03SAugustin Cavalier  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*a325aa03SAugustin Cavalier  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*a325aa03SAugustin Cavalier  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17*a325aa03SAugustin Cavalier  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*a325aa03SAugustin Cavalier  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*a325aa03SAugustin Cavalier  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20*a325aa03SAugustin Cavalier  * DEALINGS IN THE SOFTWARE.
21*a325aa03SAugustin Cavalier  * ----------------------------------------------------------------------- */
22*a325aa03SAugustin Cavalier 
23*a325aa03SAugustin Cavalier #include "TextRequestDialog.h"
24*a325aa03SAugustin Cavalier #include "InterfaceUtils.h"
25*a325aa03SAugustin Cavalier 
26*a325aa03SAugustin Cavalier #include <Button.h>
27*a325aa03SAugustin Cavalier #include <TextControl.h>
28*a325aa03SAugustin Cavalier #include <TextView.h>
29*a325aa03SAugustin Cavalier 
30*a325aa03SAugustin Cavalier 
31*a325aa03SAugustin Cavalier // GUI constants
32*a325aa03SAugustin Cavalier static const uint32 kWindowWidth = 250;
33*a325aa03SAugustin Cavalier static const uint32 kWindowHeight = 10 + 20 + 10 + 25 + 5;
34*a325aa03SAugustin Cavalier static const BRect kWindowRect(0, 0, kWindowWidth, kWindowHeight);
35*a325aa03SAugustin Cavalier static const uint32 kDefaultButtonWidth = 80;
36*a325aa03SAugustin Cavalier 
37*a325aa03SAugustin Cavalier // message constants
38*a325aa03SAugustin Cavalier static const uint32 kMsgButton = 'MBTN';
39*a325aa03SAugustin Cavalier static const uint32 kMsgUpdateControls = 'UCTL';
40*a325aa03SAugustin Cavalier 
41*a325aa03SAugustin Cavalier // labels
42*a325aa03SAugustin Cavalier static const char *kLabelOK = "OK";
43*a325aa03SAugustin Cavalier static const char *kLabelCancel = "Cancel";
44*a325aa03SAugustin Cavalier 
45*a325aa03SAugustin Cavalier 
46*a325aa03SAugustin Cavalier TextRequestDialog::TextRequestDialog(const char *title, const char *information,
47*a325aa03SAugustin Cavalier 		const char *request, const char *text)
48*a325aa03SAugustin Cavalier 	: BWindow(kWindowRect, title, B_MODAL_WINDOW, B_NOT_RESIZABLE | B_NOT_CLOSABLE, 0),
49*a325aa03SAugustin Cavalier 	fInvoker(NULL)
50*a325aa03SAugustin Cavalier {
51*a325aa03SAugustin Cavalier 	BRect rect = Bounds();
52*a325aa03SAugustin Cavalier 	BView *backgroundView = new BView(rect, "background", B_FOLLOW_ALL_SIDES, 0);
53*a325aa03SAugustin Cavalier 	backgroundView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
54*a325aa03SAugustin Cavalier 	rect.InsetBy(5, 5);
55*a325aa03SAugustin Cavalier 	rect.bottom = rect.top;
56*a325aa03SAugustin Cavalier 		// init
57*a325aa03SAugustin Cavalier 
58*a325aa03SAugustin Cavalier 	if(information) {
59*a325aa03SAugustin Cavalier 		BRect textRect(rect);
60*a325aa03SAugustin Cavalier 		textRect.OffsetTo(0, 0);
61*a325aa03SAugustin Cavalier 		fTextView = new BTextView(rect, "TextView", textRect, B_FOLLOW_NONE,
62*a325aa03SAugustin Cavalier 			B_WILL_DRAW);
63*a325aa03SAugustin Cavalier 		fTextView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
64*a325aa03SAugustin Cavalier 		fTextView->MakeSelectable(false);
65*a325aa03SAugustin Cavalier 		fTextView->MakeEditable(false);
66*a325aa03SAugustin Cavalier 		fTextView->SetText(information);
67*a325aa03SAugustin Cavalier 		float textHeight = fTextView->TextHeight(0, fTextView->CountLines());
68*a325aa03SAugustin Cavalier 		backgroundView->ResizeBy(0, textHeight + 5);
69*a325aa03SAugustin Cavalier 		ResizeBy(0, textHeight + 5);
70*a325aa03SAugustin Cavalier 		fTextView->ResizeBy(0, textHeight - textRect.Height());
71*a325aa03SAugustin Cavalier 		rect.bottom += textHeight + 5;
72*a325aa03SAugustin Cavalier 		backgroundView->AddChild(fTextView);
73*a325aa03SAugustin Cavalier 	} else
74*a325aa03SAugustin Cavalier 		fTextView = NULL;
75*a325aa03SAugustin Cavalier 
76*a325aa03SAugustin Cavalier 	rect.top = rect.bottom + 5;
77*a325aa03SAugustin Cavalier 	rect.bottom = rect.top + 20;
78*a325aa03SAugustin Cavalier 	fTextControl = new BTextControl(rect, "request", request, text, NULL);
79*a325aa03SAugustin Cavalier 	fTextControl->SetModificationMessage(new BMessage(kMsgUpdateControls));
80*a325aa03SAugustin Cavalier 	fTextControl->SetDivider(fTextControl->StringWidth(fTextControl->Label()) + 5);
81*a325aa03SAugustin Cavalier 	if(text && strlen(text) > 0)
82*a325aa03SAugustin Cavalier 		fTextControl->TextView()->SelectAll();
83*a325aa03SAugustin Cavalier 
84*a325aa03SAugustin Cavalier 	rect.top = rect.bottom + 10;
85*a325aa03SAugustin Cavalier 	rect.bottom = rect.top + 25;
86*a325aa03SAugustin Cavalier 	rect.left = rect.right - kDefaultButtonWidth;
87*a325aa03SAugustin Cavalier 	BMessage message(kMsgButton);
88*a325aa03SAugustin Cavalier 	message.AddInt32("which", 1);
89*a325aa03SAugustin Cavalier 	fOKButton = new BButton(rect, "okButton", kLabelOK, new BMessage(message));
90*a325aa03SAugustin Cavalier 	rect.right = rect.left - 10;
91*a325aa03SAugustin Cavalier 	rect.left = rect.right - kDefaultButtonWidth;
92*a325aa03SAugustin Cavalier 	message.ReplaceInt32("which", 0);
93*a325aa03SAugustin Cavalier 	BButton *cancelButton = new BButton(rect, "cancelButton", kLabelCancel,
94*a325aa03SAugustin Cavalier 		new BMessage(message));
95*a325aa03SAugustin Cavalier 	backgroundView->AddChild(cancelButton);
96*a325aa03SAugustin Cavalier 	backgroundView->AddChild(fOKButton);
97*a325aa03SAugustin Cavalier 	backgroundView->AddChild(fTextControl);
98*a325aa03SAugustin Cavalier 	AddChild(backgroundView);
99*a325aa03SAugustin Cavalier 
100*a325aa03SAugustin Cavalier 	fTextControl->MakeFocus(true);
101*a325aa03SAugustin Cavalier 	SetDefaultButton(fOKButton);
102*a325aa03SAugustin Cavalier 
103*a325aa03SAugustin Cavalier 	UpdateControls();
104*a325aa03SAugustin Cavalier }
105*a325aa03SAugustin Cavalier 
106*a325aa03SAugustin Cavalier 
107*a325aa03SAugustin Cavalier TextRequestDialog::~TextRequestDialog()
108*a325aa03SAugustin Cavalier {
109*a325aa03SAugustin Cavalier 	delete fInvoker;
110*a325aa03SAugustin Cavalier }
111*a325aa03SAugustin Cavalier 
112*a325aa03SAugustin Cavalier 
113*a325aa03SAugustin Cavalier void
114*a325aa03SAugustin Cavalier TextRequestDialog::MessageReceived(BMessage *message)
115*a325aa03SAugustin Cavalier {
116*a325aa03SAugustin Cavalier 	switch(message->what) {
117*a325aa03SAugustin Cavalier 		case kMsgButton: {
118*a325aa03SAugustin Cavalier 			if(!fInvoker || !fInvoker->Message())
119*a325aa03SAugustin Cavalier 				return;
120*a325aa03SAugustin Cavalier 
121*a325aa03SAugustin Cavalier 			int32 which;
122*a325aa03SAugustin Cavalier 			message->FindInt32("which", &which);
123*a325aa03SAugustin Cavalier 			BMessage toSend(*fInvoker->Message());
124*a325aa03SAugustin Cavalier 			toSend.AddInt32("which", which);
125*a325aa03SAugustin Cavalier 			if(which == 1)
126*a325aa03SAugustin Cavalier 				toSend.AddString("text", fTextControl->Text());
127*a325aa03SAugustin Cavalier 
128*a325aa03SAugustin Cavalier 			fInvoker->Invoke(&toSend);
129*a325aa03SAugustin Cavalier 			PostMessage(B_QUIT_REQUESTED);
130*a325aa03SAugustin Cavalier 		} break;
131*a325aa03SAugustin Cavalier 
132*a325aa03SAugustin Cavalier 		case kMsgUpdateControls:
133*a325aa03SAugustin Cavalier 			UpdateControls();
134*a325aa03SAugustin Cavalier 		break;
135*a325aa03SAugustin Cavalier 
136*a325aa03SAugustin Cavalier 		default:
137*a325aa03SAugustin Cavalier 			BWindow::MessageReceived(message);
138*a325aa03SAugustin Cavalier 	}
139*a325aa03SAugustin Cavalier }
140*a325aa03SAugustin Cavalier 
141*a325aa03SAugustin Cavalier 
142*a325aa03SAugustin Cavalier bool
143*a325aa03SAugustin Cavalier TextRequestDialog::QuitRequested()
144*a325aa03SAugustin Cavalier {
145*a325aa03SAugustin Cavalier 	return true;
146*a325aa03SAugustin Cavalier }
147*a325aa03SAugustin Cavalier 
148*a325aa03SAugustin Cavalier 
149*a325aa03SAugustin Cavalier status_t
150*a325aa03SAugustin Cavalier TextRequestDialog::Go(BInvoker *invoker)
151*a325aa03SAugustin Cavalier {
152*a325aa03SAugustin Cavalier 	fInvoker = invoker;
153*a325aa03SAugustin Cavalier 	MoveTo(center_on_screen(Bounds()));
154*a325aa03SAugustin Cavalier 	Show();
155*a325aa03SAugustin Cavalier 
156*a325aa03SAugustin Cavalier 	return B_OK;
157*a325aa03SAugustin Cavalier }
158*a325aa03SAugustin Cavalier 
159*a325aa03SAugustin Cavalier 
160*a325aa03SAugustin Cavalier void
161*a325aa03SAugustin Cavalier TextRequestDialog::UpdateControls()
162*a325aa03SAugustin Cavalier {
163*a325aa03SAugustin Cavalier 	fOKButton->SetEnabled(fTextControl->TextView()->TextLength() > 0);
164*a325aa03SAugustin Cavalier }
165