diff --git a/src/apps/drivesetup/AbstractParametersPanel.cpp b/src/apps/drivesetup/AbstractParametersPanel.cpp index 1c38f640299..b161494eb60 100644 --- a/src/apps/drivesetup/AbstractParametersPanel.cpp +++ b/src/apps/drivesetup/AbstractParametersPanel.cpp @@ -136,54 +136,8 @@ AbstractParametersPanel::MessageReceived(BMessage* message) status_t AbstractParametersPanel::Go(BString& parameters) { - // Without an editor, we cannot change anything, anyway - if (fEditor == NULL) { - parameters = ""; - if (fReturnStatus == B_CANCELED) - fReturnStatus = B_OK; - - if (!Lock()) - return B_ERROR; - } else { - // run the window thread, to get an initial layout of the controls - Hide(); - Show(); - if (!Lock()) - return B_CANCELED; - - // center the panel above the parent window - CenterIn(fWindow->Frame()); - - Show(); - Unlock(); - - // block this thread now, but keep the window repainting - while (true) { - status_t status = acquire_sem_etc(fExitSemaphore, 1, - B_CAN_INTERRUPT | B_RELATIVE_TIMEOUT, 50000); - if (status != B_TIMED_OUT && status != B_INTERRUPTED) - break; - fWindow->UpdateIfNeeded(); - } - - if (!Lock()) - return B_CANCELED; - - if (fReturnStatus == B_OK) { - if (fEditor->ValidateParameters()) { - status_t err = fEditor->GetParameters(parameters); - if (err != B_OK) - fReturnStatus = err; - } - } - } - - status_t status = fReturnStatus; - - Quit(); - // NOTE: this object is toast now! - - return status; + BMessage storage; + return Go(parameters, storage); } @@ -240,6 +194,77 @@ AbstractParametersPanel::Init(B_PARAMETER_EDITOR_TYPE type, } +status_t +AbstractParametersPanel::Go(BString& parameters, BMessage& storage) +{ + // Without an editor, we cannot change anything, anyway + if (fEditor == NULL && NeedsEditor()) { + parameters = ""; + if (fReturnStatus == B_CANCELED) + fReturnStatus = B_OK; + + if (!Lock()) + return B_ERROR; + } else { + // run the window thread, to get an initial layout of the controls + Hide(); + Show(); + if (!Lock()) + return B_CANCELED; + + // center the panel above the parent window + CenterIn(fWindow->Frame()); + + Show(); + Unlock(); + + // block this thread now, but keep the window repainting + while (true) { + status_t status = acquire_sem_etc(fExitSemaphore, 1, + B_CAN_INTERRUPT | B_RELATIVE_TIMEOUT, 50000); + if (status != B_TIMED_OUT && status != B_INTERRUPTED) + break; + fWindow->UpdateIfNeeded(); + } + + if (!Lock()) + return B_CANCELED; + + if (fReturnStatus == B_OK) { + if (fEditor != NULL && fEditor->ValidateParameters()) { + status_t status = fEditor->GetParameters(parameters); + if (status != B_OK) + fReturnStatus = status; + } + if (fReturnStatus == B_OK) + fReturnStatus = ParametersReceived(parameters, storage); + } + } + + status_t status = fReturnStatus; + + Quit(); + // NOTE: this object is toast now! + + return status; +} + + +bool +AbstractParametersPanel::NeedsEditor() const +{ + return true; +} + + +status_t +AbstractParametersPanel::ParametersReceived(const BString& parameters, + BMessage& storage) +{ + return B_OK; +} + + void AbstractParametersPanel::AddControls(BLayoutBuilder::Group<>& builder, BView* editorView) diff --git a/src/apps/drivesetup/AbstractParametersPanel.h b/src/apps/drivesetup/AbstractParametersPanel.h index 123e9574c69..9e24a3383dd 100644 --- a/src/apps/drivesetup/AbstractParametersPanel.h +++ b/src/apps/drivesetup/AbstractParametersPanel.h @@ -37,7 +37,11 @@ class AbstractParametersPanel : public BWindow { void Init(B_PARAMETER_EDITOR_TYPE type, const BString& diskSystem, BPartition* partition); + status_t Go(BString& parameters, BMessage& storage); + virtual bool NeedsEditor() const; + virtual status_t ParametersReceived(const BString& parameters, + BMessage& storage); virtual void AddControls(BLayoutBuilder::Group<>& builder, BView* editorView); diff --git a/src/apps/drivesetup/CreateParametersPanel.cpp b/src/apps/drivesetup/CreateParametersPanel.cpp index 44baa334923..145809c97c7 100644 --- a/src/apps/drivesetup/CreateParametersPanel.cpp +++ b/src/apps/drivesetup/CreateParametersPanel.cpp @@ -60,25 +60,25 @@ status_t CreateParametersPanel::Go(off_t& offset, off_t& size, BString& name, BString& type, BString& parameters) { - // The object will be deleted in Go(), so we need to get the values before + // The object will be deleted in Go(), so we need to get the values via + // a BMessage + + BMessage storage; + status_t status = AbstractParametersPanel::Go(parameters, storage); + if (status != B_OK) + return status; // Return the value back as bytes. - size = fSizeSlider->Size(); - offset = fSizeSlider->Offset(); + size = storage.GetInt64("size", 0); + offset = storage.GetInt64("offset", 0); // get name - name.SetTo(fNameTextControl->Text()); + name.SetTo(storage.GetString("name", NULL)); // get type - if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) { - const char* _type; - BMessage* message = item->Message(); - if (!message || message->FindString("type", &_type) < B_OK) - _type = kPartitionTypeBFS; - type << _type; - } + type.SetTo(storage.GetString("type", NULL)); - return AbstractParametersPanel::Go(parameters); + return B_OK; } @@ -114,6 +114,41 @@ CreateParametersPanel::MessageReceived(BMessage* message) } +bool +CreateParametersPanel::NeedsEditor() const +{ + return false; +} + + +status_t +CreateParametersPanel::ParametersReceived(const BString& parameters, + BMessage& storage) +{ + // Return the value back as bytes. + status_t status = storage.SetInt64("size", fSizeSlider->Size()); + if (status == B_OK) + status = storage.SetInt64("offset", fSizeSlider->Offset()); + + // get name + if (status == B_OK) + status = storage.SetString("name", fNameTextControl->Text()); + + // get type + if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) { + const char* type; + BMessage* message = item->Message(); + if (!message || message->FindString("type", &type) != B_OK) + type = kPartitionTypeBFS; + + if (status == B_OK) + status = storage.SetString("type", type); + } + + return status; +} + + void CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder, BView* editorView) @@ -136,7 +171,8 @@ CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder, } } - builder.Add(editorView); + if (editorView != NULL) + builder.Add(editorView); } diff --git a/src/apps/drivesetup/CreateParametersPanel.h b/src/apps/drivesetup/CreateParametersPanel.h index 1ecd8004a6b..3ae1ca75d76 100644 --- a/src/apps/drivesetup/CreateParametersPanel.h +++ b/src/apps/drivesetup/CreateParametersPanel.h @@ -33,6 +33,9 @@ class CreateParametersPanel : public AbstractParametersPanel { virtual void MessageReceived(BMessage* message); protected: + virtual bool NeedsEditor() const; + virtual status_t ParametersReceived(const BString& parameters, + BMessage& storage); virtual void AddControls(BLayoutBuilder::Group<>& builder, BView* editorView);