1/*
2 * Copyright 2012-2013, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
4 */
5#include "PromptWindow.h"
6
7#include <Button.h>
8#include <Catalog.h>
9#include <LayoutBuilder.h>
10#include <StringView.h>
11#include <TextControl.h>
12
13
14static const uint32 kAcceptInput = 'acin';
15
16
17PromptWindow::PromptWindow(const char* title, const char* label,
18	const char* info, BMessenger target, BMessage* message)
19	:
20	BWindow(BRect(), title, B_FLOATING_WINDOW, B_NOT_RESIZABLE
21			| B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
22	fTarget(target),
23	fMessage(message)
24{
25	fInfoView = new BStringView("info", info);
26	fTextControl = new BTextControl("promptcontrol", label, NULL,
27		new BMessage(kAcceptInput));
28	BButton* cancelButton = new BButton("Cancel", new
29		BMessage(B_QUIT_REQUESTED));
30	BButton* acceptButton = new BButton("Accept", new
31		BMessage(kAcceptInput));
32	BLayoutBuilder::Group<>(this, B_VERTICAL)
33		.SetInsets(B_USE_DEFAULT_SPACING)
34		.Add(fInfoView)
35		.Add(fTextControl)
36		.AddGroup(B_HORIZONTAL)
37			.AddGlue()
38			.Add(cancelButton)
39			.Add(acceptButton)
40		.End()
41	.End();
42
43	if (info == NULL)
44		fInfoView->Hide();
45
46	fTextControl->TextView()->SetExplicitMinSize(BSize(200.0, B_SIZE_UNSET));
47	fTextControl->SetTarget(this);
48	acceptButton->SetTarget(this);
49	cancelButton->SetTarget(this);
50	fTextControl->MakeFocus(true);
51
52	SetDefaultButton(acceptButton);
53}
54
55
56PromptWindow::~PromptWindow()
57{
58	delete fMessage;
59}
60
61
62void
63PromptWindow::MessageReceived(BMessage* message)
64{
65	switch (message->what)
66	{
67		case kAcceptInput:
68		{
69			fMessage->AddString("text", fTextControl->TextView()->Text());
70			fTarget.SendMessage(fMessage);
71			PostMessage(B_QUIT_REQUESTED);
72		}
73		default:
74		{
75			BWindow::MessageReceived(message);
76			break;
77		}
78	}
79}
80
81
82status_t
83PromptWindow::SetTarget(BMessenger messenger)
84{
85	fTarget = messenger;
86	return B_OK;
87}
88
89
90status_t
91PromptWindow::SetMessage(BMessage* message)
92{
93	delete fMessage;
94	fMessage = message;
95	return B_OK;
96}
97