1/*
2 * Copyright 2006-2011, Stephan A��mus <superstippi@gmx.de>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6#include <stdio.h>
7
8#include <Button.h>
9#include <Catalog.h>
10#include <LayoutBuilder.h>
11#include <Screen.h>
12#include <TextControl.h>
13
14#include "NamePanel.h"
15
16#undef B_TRANSLATION_CONTEXT
17#define B_TRANSLATION_CONTEXT "LaunchBox"
18
19
20enum {
21	MSG_PANEL_OK,
22	MSG_PANEL_CANCEL,
23};
24
25
26NamePanel::NamePanel(const char* label, const char* text, BWindow* window,
27		BHandler* target, BMessage* message, const BSize& size)
28	:
29	Panel(BRect(B_ORIGIN, size), B_TRANSLATE("Name Panel"),
30		B_MODAL_WINDOW_LOOK, B_MODAL_SUBSET_WINDOW_FEEL,
31		B_ASYNCHRONOUS_CONTROLS | B_NOT_V_RESIZABLE
32			| B_AUTO_UPDATE_SIZE_LIMITS),
33	fWindow(window),
34	fTarget(target),
35	fMessage(message)
36{
37	BButton* defaultButton = new BButton(B_TRANSLATE("OK"),
38		new BMessage(MSG_PANEL_OK));
39	BButton* cancelButton = new BButton(B_TRANSLATE("Cancel"),
40		new BMessage(MSG_PANEL_CANCEL));
41	fNameTC = new BTextControl(label, text, NULL);
42	BLayoutItem* inputItem = fNameTC->CreateTextViewLayoutItem();
43	inputItem->SetExplicitMinSize(
44		BSize(fNameTC->StringWidth("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"),
45			B_SIZE_UNSET));
46
47	BLayoutBuilder::Group<>(this, B_VERTICAL, 10)
48		.AddGlue()
49
50		// controls
51		.AddGroup(B_HORIZONTAL, 5)
52			.AddStrut(5)
53
54			// text control
55			.Add(fNameTC->CreateLabelLayoutItem())
56			.Add(inputItem)
57			.AddStrut(5)
58			.End()
59
60		.AddGlue()
61
62		// buttons
63		.AddGroup(B_HORIZONTAL, 5)
64			.AddGlue()
65			.Add(cancelButton)
66			.Add(defaultButton)
67			.AddStrut(5)
68			.End()
69
70		.AddGlue();
71
72	SetDefaultButton(defaultButton);
73	fNameTC->MakeFocus(true);
74
75	if (fWindow && fWindow->Lock()) {
76		fSavedTargetWindowFeel = fWindow->Feel();
77		if (fSavedTargetWindowFeel != B_NORMAL_WINDOW_FEEL)
78			fWindow->SetFeel(B_NORMAL_WINDOW_FEEL);
79		fWindow->Unlock();
80	}
81
82	AddToSubset(fWindow);
83}
84
85
86NamePanel::~NamePanel()
87{
88	if (fWindow && fWindow->Lock()) {
89		fWindow->SetFeel(fSavedTargetWindowFeel);
90		fWindow->Unlock();
91	}
92	delete fMessage;
93}
94
95
96void NamePanel::MessageReceived(BMessage* message)
97{
98	switch (message->what) {
99		case MSG_PANEL_CANCEL:
100			Quit();
101			break;
102		case MSG_PANEL_OK: {
103			if (!fTarget)
104				fTarget = fWindow;
105			BLooper* looper = fTarget ? fTarget->Looper() : NULL;
106			if (fMessage && looper) {
107				BMessage cloneMessage(*fMessage);
108				cloneMessage.AddString("name", fNameTC->Text());
109				cloneMessage.AddRect("frame", Frame());
110				looper->PostMessage(&cloneMessage, fTarget);
111			}
112			Quit();
113			break;
114		}
115		default:
116			Panel::MessageReceived(message);
117	}
118}
119