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