Author: bonefish Date: 2010-07-20 10:28:55 +0200 (Tue, 20 Jul 2010) New Revision: 37613 Changeset: http://dev.haiku-os.org/changeset/37613 Modified: haiku/trunk/headers/os/interface/CardLayout.h haiku/trunk/src/kits/interface/CardLayout.cpp Log: Patch by Alex Wilson: * Added support for archiving/unarchiving. * Coding style cleanup. Modified: haiku/trunk/headers/os/interface/CardLayout.h =================================================================== --- haiku/trunk/headers/os/interface/CardLayout.h 2010-07-20 08:24:19 UTC (rev 37612) +++ haiku/trunk/headers/os/interface/CardLayout.h 2010-07-20 08:28:55 UTC (rev 37613) @@ -1,5 +1,5 @@ /* - * Copyright 2006, Haiku, Inc. All rights reserved. + * Copyright 2006-2010, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _CARD_LAYOUT_H @@ -11,6 +11,7 @@ class BCardLayout : public BLayout { public: BCardLayout(); + BCardLayout(BMessage* from); virtual ~BCardLayout(); BLayoutItem* VisibleItem() const; @@ -30,6 +31,10 @@ virtual void InvalidateLayout(); virtual void LayoutView(); + virtual status_t Archive(BMessage* into, bool deep = true) const; + virtual status_t AllUnarchived(const BMessage* from); + static BArchivable* Instantiate(BMessage* from); + protected: virtual void ItemAdded(BLayoutItem* item); virtual void ItemRemoved(BLayoutItem* item); Modified: haiku/trunk/src/kits/interface/CardLayout.cpp =================================================================== --- haiku/trunk/src/kits/interface/CardLayout.cpp 2010-07-20 08:24:19 UTC (rev 37612) +++ haiku/trunk/src/kits/interface/CardLayout.cpp 2010-07-20 08:28:55 UTC (rev 37613) @@ -6,46 +6,66 @@ #include <CardLayout.h> #include <LayoutItem.h> +#include <Message.h> #include <View.h> -// constructor + +namespace { + const char* kVisibleItemField = "BCardLayout:visibleItem"; +} + + BCardLayout::BCardLayout() - : BLayout(), - fMin(0, 0), - fMax(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED), - fPreferred(0, 0), - fVisibleItem(NULL), - fMinMaxValid(false) + : + BLayout(), + fMin(0, 0), + fMax(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED), + fPreferred(0, 0), + fVisibleItem(NULL), + fMinMaxValid(false) { } -// destructor + +BCardLayout::BCardLayout(BMessage* from) + : + BLayout(BUnarchiver::PrepareArchive(from)), + fMin(0, 0), + fMax(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED), + fPreferred(0, 0), + fVisibleItem(NULL), + fMinMaxValid(false) +{ + BUnarchiver(from).Finish(); +} + + BCardLayout::~BCardLayout() { } -// VisibleItem + BLayoutItem* BCardLayout::VisibleItem() const { return fVisibleItem; } -// VisibleIndex + int32 BCardLayout::VisibleIndex() const { return IndexOfItem(fVisibleItem); } -// SetVisibleItem + void BCardLayout::SetVisibleItem(int32 index) { SetVisibleItem(ItemAt(index)); } -// SetVisibleItem + void BCardLayout::SetVisibleItem(BLayoutItem* item) { @@ -67,7 +87,7 @@ } } -// MinSize + BSize BCardLayout::MinSize() { @@ -75,7 +95,7 @@ return fMin; } -// MaxSize + BSize BCardLayout::MaxSize() { @@ -83,7 +103,7 @@ return fMax; } -// PreferredSize + BSize BCardLayout::PreferredSize() { @@ -91,14 +111,14 @@ return fPreferred; } -// Alignment + BAlignment BCardLayout::Alignment() { return BAlignment(B_ALIGN_USE_FULL_WIDTH, B_ALIGN_USE_FULL_HEIGHT); } -// HasHeightForWidth + bool BCardLayout::HasHeightForWidth() { @@ -111,7 +131,7 @@ return false; } -// GetHeightForWidth + void BCardLayout::GetHeightForWidth(float width, float* min, float* max, float* preferred) @@ -152,7 +172,7 @@ *preferred = preferredHeight; } -// InvalidateLayout + void BCardLayout::InvalidateLayout() { @@ -161,7 +181,7 @@ fMinMaxValid = false; } -// LayoutView + void BCardLayout::LayoutView() { @@ -175,14 +195,52 @@ fVisibleItem->AlignInFrame(BRect(0, 0, size.width, size.height)); } -// ItemAdded + +status_t +BCardLayout::Archive(BMessage* into, bool deep) const +{ + BArchiver archiver(into); + status_t err = BLayout::Archive(into, deep); + + if (err == B_OK && deep) + err = into->AddInt32(kVisibleItemField, IndexOfItem(fVisibleItem)); + + return archiver.Finish(err); +} + + +status_t +BCardLayout::AllUnarchived(const BMessage* from) +{ + status_t err = BLayout::AllUnarchived(from); + if (err != B_OK) + return err; + + int32 visibleIndex; + err = from->FindInt32(kVisibleItemField, &visibleIndex); + if (err == B_OK) + SetVisibleItem(visibleIndex); + + return err; +} + + +BArchivable* +BCardLayout::Instantiate(BMessage* from) +{ + if (validate_instantiation(from, "BCardLayout")) + return new BCardLayout(from); + return NULL; +} + + void BCardLayout::ItemAdded(BLayoutItem* item) { item->SetVisible(false); } -// ItemRemoved + void BCardLayout::ItemRemoved(BLayoutItem* item) { @@ -192,7 +250,7 @@ } } -// _ValidateMinMax + void BCardLayout::_ValidateMinMax() {