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 40static const uint32 kMegaByte = 0x100000; 41 42 43CreateParametersPanel::CreateParametersPanel(BWindow* window, 44 BPartition* partition, off_t offset, off_t size) 45 : 46 ChangeParametersPanel(window) 47{ 48 _CreateCreateControls(partition, offset, size); 49 50 Init(B_CREATE_PARAMETER_EDITOR, "", partition); 51} 52 53 54CreateParametersPanel::~CreateParametersPanel() 55{ 56} 57 58 59status_t 60CreateParametersPanel::Go(off_t& offset, off_t& size, BString& name, 61 BString& type, BString& parameters) 62{ 63 // The object will be deleted in Go(), so we need to get the values via 64 // a BMessage 65 66 BMessage storage; 67 status_t status = ChangeParametersPanel::Go(name, type, parameters, 68 storage); 69 if (status != B_OK) 70 return status; 71 72 // Return the value back as bytes. 73 size = storage.GetInt64("size", 0); 74 offset = storage.GetInt64("offset", 0); 75 76 return B_OK; 77} 78 79 80void 81CreateParametersPanel::MessageReceived(BMessage* message) 82{ 83 switch (message->what) { 84 case MSG_SIZE_SLIDER: 85 _UpdateSizeTextControl(); 86 break; 87 88 case MSG_SIZE_TEXTCONTROL: 89 { 90 off_t size = strtoll(fSizeTextControl->Text(), NULL, 10) * kMegaByte; 91 if (size >= 0 && size <= fSizeSlider->MaxPartitionSize()) 92 fSizeSlider->SetSize(size); 93 else 94 _UpdateSizeTextControl(); 95 break; 96 } 97 98 default: 99 ChangeParametersPanel::MessageReceived(message); 100 } 101} 102 103 104bool 105CreateParametersPanel::NeedsEditor() const 106{ 107 return false; 108} 109 110 111status_t 112CreateParametersPanel::ParametersReceived(const BString& parameters, 113 BMessage& storage) 114{ 115 // Return the value back as bytes. 116 status_t status = storage.SetInt64("size", fSizeSlider->Size()); 117 if (status == B_OK) 118 status = storage.SetInt64("offset", fSizeSlider->Offset()); 119 120 if (status != B_OK) 121 return status; 122 123 return ChangeParametersPanel::ParametersReceived(parameters, storage); 124} 125 126 127void 128CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder, 129 BView* editorView) 130{ 131 builder 132 .Add(fSizeSlider) 133 .Add(fSizeTextControl); 134 135 ChangeParametersPanel::AddControls(builder, editorView); 136} 137 138 139void 140CreateParametersPanel::_CreateCreateControls(BPartition* parent, off_t offset, 141 off_t size) 142{ 143 // Setup the controls 144 // TODO: use a lower granularity for smaller disks -- but this would 145 // require being able to parse arbitrary size strings with unit 146 fSizeSlider = new SizeSlider("Slider", B_TRANSLATE("Partition size"), NULL, 147 offset, size, kMegaByte); 148 fSizeSlider->SetPosition(1.0); 149 fSizeSlider->SetModificationMessage(new BMessage(MSG_SIZE_SLIDER)); 150 151 fSizeTextControl = new BTextControl("Size Control", "", "", NULL); 152 for(int32 i = 0; i < 256; i++) 153 fSizeTextControl->TextView()->DisallowChar(i); 154 for(int32 i = '0'; i <= '9'; i++) 155 fSizeTextControl->TextView()->AllowChar(i); 156 _UpdateSizeTextControl(); 157 fSizeTextControl->SetModificationMessage( 158 new BMessage(MSG_SIZE_TEXTCONTROL)); 159 160 CreateChangeControls(NULL, parent); 161 162 fOkButton->SetLabel(B_TRANSLATE("Create")); 163} 164 165 166void 167CreateParametersPanel::_UpdateSizeTextControl() 168{ 169 BString sizeString; 170 sizeString << fSizeSlider->Size() / kMegaByte; 171 fSizeTextControl->SetText(sizeString.String()); 172} 173