1/*
2 * Copyright 2008-2013 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Stephan Aßmus <superstippi@gmx.de>
7 *		Axel Dörfler, axeld@pinc-software.de.
8 *		Bryce Groff	<bgroff@hawaii.edu>
9 *		Karsten Heimrich <host.haiku@gmx.de>
10 */
11
12
13#include "CreateParametersPanel.h"
14
15#include <Button.h>
16#include <Catalog.h>
17#include <ControlLook.h>
18#include <DiskDeviceTypes.h>
19#include <MenuField.h>
20#include <MenuItem.h>
21#include <MessageFilter.h>
22#include <PopUpMenu.h>
23#include <String.h>
24#include <TextControl.h>
25#include <Variant.h>
26
27#include "Support.h"
28
29
30#undef B_TRANSLATION_CONTEXT
31#define B_TRANSLATION_CONTEXT "CreateParametersPanel"
32
33
34enum {
35	MSG_PARTITION_TYPE			= 'type',
36	MSG_SIZE_SLIDER				= 'ssld',
37	MSG_SIZE_TEXTCONTROL		= 'stct'
38};
39
40
41CreateParametersPanel::CreateParametersPanel(BWindow* window,
42	BPartition* partition, off_t offset, off_t size)
43	:
44	AbstractParametersPanel(window)
45{
46	Init(B_CREATE_PARAMETER_EDITOR, "", partition);
47
48	// Scale offset, and size from bytes to megabytes (2^20)
49	// so that we do not run over a signed int32.
50	offset /= kMegaByte;
51	size /= kMegaByte;
52	_CreateViewControls(partition, offset, size);
53}
54
55
56CreateParametersPanel::~CreateParametersPanel()
57{
58}
59
60
61status_t
62CreateParametersPanel::Go(off_t& offset, off_t& size, BString& name,
63	BString& type, BString& parameters)
64{
65	// The object will be deleted in Go(), so we need to get the values before
66
67	// Return the value back as bytes.
68	size = (off_t)fSizeSlider->Size() * kMegaByte;
69	offset = (off_t)fSizeSlider->Offset() * kMegaByte;
70
71	// get name
72	name.SetTo(fNameTextControl->Text());
73
74	// get type
75	if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) {
76		const char* _type;
77		BMessage* message = item->Message();
78		if (!message || message->FindString("type", &_type) < B_OK)
79			_type = kPartitionTypeBFS;
80		type << _type;
81	}
82
83	return AbstractParametersPanel::Go(parameters);
84}
85
86
87void
88CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
89	BView* editorView)
90{
91	builder
92		.Add(fSizeSlider)
93		.Add(fSizeTextControl)
94		.AddGrid(0.0, 5.0)
95			.Add(fNameTextControl->CreateLabelLayoutItem(), 0, 0)
96			.Add(fNameTextControl->CreateTextViewLayoutItem(), 1, 0)
97			.Add(fTypeMenuField->CreateLabelLayoutItem(), 0, 1)
98			.Add(fTypeMenuField->CreateMenuBarLayoutItem(), 1, 1)
99		.End()
100		.Add(editorView);
101}
102
103
104void
105CreateParametersPanel::_CreateViewControls(BPartition* parent, off_t offset,
106	off_t size)
107{
108	// Setup the controls
109	fSizeSlider = new SizeSlider("Slider", B_TRANSLATE("Partition size"), NULL,
110		offset, offset + size);
111	fSizeSlider->SetPosition(1.0);
112	fSizeSlider->SetModificationMessage(new BMessage(MSG_SIZE_SLIDER));
113
114	fSizeTextControl = new BTextControl("Size Control", "", "", NULL);
115	for(int32 i = 0; i < 256; i++)
116		fSizeTextControl->TextView()->DisallowChar(i);
117	for(int32 i = '0'; i <= '9'; i++)
118		fSizeTextControl->TextView()->AllowChar(i);
119	_UpdateSizeTextControl();
120	fSizeTextControl->SetModificationMessage(
121		new BMessage(MSG_SIZE_TEXTCONTROL));
122
123	fNameTextControl = new BTextControl("Name Control",
124		B_TRANSLATE("Partition name:"),	"", NULL);
125	if (!parent->SupportsChildName())
126		fNameTextControl->SetEnabled(false);
127
128	fTypePopUpMenu = new BPopUpMenu("Partition Type");
129
130	int32 cookie = 0;
131	BString supportedType;
132	while (parent->GetNextSupportedChildType(&cookie, &supportedType) == B_OK) {
133		BMessage* message = new BMessage(MSG_PARTITION_TYPE);
134		message->AddString("type", supportedType);
135		BMenuItem* item = new BMenuItem(supportedType, message);
136		fTypePopUpMenu->AddItem(item);
137
138		if (strcmp(supportedType, kPartitionTypeBFS) == 0)
139			item->SetMarked(true);
140	}
141
142	fTypeMenuField = new BMenuField(B_TRANSLATE("Partition type:"),
143		fTypePopUpMenu);
144
145	fOkButton->SetLabel(B_TRANSLATE("Create"));
146}
147
148
149void
150CreateParametersPanel::MessageReceived(BMessage* message)
151{
152	switch (message->what) {
153		case MSG_PARTITION_TYPE:
154			if (fEditor != NULL) {
155				const char* type;
156				if (message->FindString("type", &type) == B_OK)
157					fEditor->ParameterChanged("type", BVariant(type));
158			}
159			break;
160
161		case MSG_SIZE_SLIDER:
162			_UpdateSizeTextControl();
163			break;
164
165		case MSG_SIZE_TEXTCONTROL:
166		{
167			int32 size = atoi(fSizeTextControl->Text());
168			if (size >= 0 && size <= fSizeSlider->MaxPartitionSize())
169				fSizeSlider->SetValue(size + fSizeSlider->Offset());
170			else
171				_UpdateSizeTextControl();
172			break;
173		}
174
175		default:
176			AbstractParametersPanel::MessageReceived(message);
177	}
178}
179
180
181void
182CreateParametersPanel::_UpdateSizeTextControl()
183{
184	BString sizeString;
185	sizeString << fSizeSlider->Value() - fSizeSlider->Offset();
186	fSizeTextControl->SetText(sizeString.String());
187}
188