From 015e5f06d8ef8f719a69ee03779ae30192b9e46b Mon Sep 17 00:00:00 2001 From: Alex Wilson Date: Wed, 1 Feb 2012 15:07:51 +1300 Subject: [PATCH] Make BALMLayout::BadLayoutPolicy archivable. --- headers/libs/alm/ALMLayout.h | 23 ++++++++++----- src/libs/alm/ALMLayout.cpp | 56 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/headers/libs/alm/ALMLayout.h b/headers/libs/alm/ALMLayout.h index aa44620172..3a7cf821d9 100644 --- a/headers/libs/alm/ALMLayout.h +++ b/headers/libs/alm/ALMLayout.h @@ -140,17 +140,26 @@ protected: virtual void DoLayout(); public: - struct BadLayoutPolicy { - virtual ~BadLayoutPolicy(); + struct BadLayoutPolicy : public BArchivable { + BadLayoutPolicy(); + BadLayoutPolicy(BMessage* archive); + virtual ~BadLayoutPolicy(); /* return false to abandon layout, true to use layout */ - virtual bool OnBadLayout(BALMLayout* layout, - LinearProgramming::ResultType result, BLayoutContext* context) = 0; + virtual bool OnBadLayout(BALMLayout* layout, + LinearProgramming::ResultType result, + BLayoutContext* context) = 0; }; struct DefaultPolicy : public BadLayoutPolicy { - virtual ~DefaultPolicy(); - virtual bool OnBadLayout(BALMLayout* layout, - LinearProgramming::ResultType result, BLayoutContext* context); + DefaultPolicy(); + DefaultPolicy(BMessage* archive); + virtual ~DefaultPolicy(); + virtual bool OnBadLayout(BALMLayout* layout, + LinearProgramming::ResultType result, + BLayoutContext* context); + virtual status_t Archive(BMessage* message, + bool deep = false) const; + static BArchivable* Instantiate(BMessage* message); }; private: diff --git a/src/libs/alm/ALMLayout.cpp b/src/libs/alm/ALMLayout.cpp index 94215dc577..841c1836db 100644 --- a/src/libs/alm/ALMLayout.cpp +++ b/src/libs/alm/ALMLayout.cpp @@ -29,6 +29,7 @@ const BSize kUnsetSize(B_SIZE_UNSET, B_SIZE_UNSET); namespace { const char* kFriendField = "BALMLayout:friends"; +const char* kBadLayoutPolicyField = "BALMLayout:policy"; const char* kXTabsField = "BALMLayout:xtabs"; const char* kYTabsField = "BALMLayout:ytabs"; const char* kTabsField = "BALMLayout:item:tabs"; @@ -113,11 +114,35 @@ BALMLayout::TabAddTransaction::_TabList() }; // end namespace BALM +BALM::BALMLayout::BadLayoutPolicy::BadLayoutPolicy() +{ +} + + +BALM::BALMLayout::BadLayoutPolicy::BadLayoutPolicy(BMessage* archive) + : + BArchivable(archive) +{ +} + + BALM::BALMLayout::BadLayoutPolicy::~BadLayoutPolicy() { } +BALM::BALMLayout::DefaultPolicy::DefaultPolicy() +{ +} + + +BALM::BALMLayout::DefaultPolicy::DefaultPolicy(BMessage* archive) + : + BadLayoutPolicy(archive) +{ +} + + BALM::BALMLayout::DefaultPolicy::~DefaultPolicy() { } @@ -138,6 +163,22 @@ BALM::BALMLayout::DefaultPolicy::OnBadLayout(BALMLayout* layout, } +status_t +BALM::BALMLayout::DefaultPolicy::Archive(BMessage* archive, bool deep) const +{ + return BadLayoutPolicy::Archive(archive, deep); +} + + +BArchivable* +BALM::BALMLayout::DefaultPolicy::Instantiate(BMessage* archive) +{ + if (validate_instantiation(archive, "BALM::BALMLayout::DefaultPolicy")) + return new DefaultPolicy(archive); + return NULL; +} + + /*! * Constructor. * Creates new layout engine. @@ -225,6 +266,9 @@ BALMLayout::BALMLayout(BMessage* archive) for (int32 i = 0; i < tabCount && err == B_OK; i++) err = unarchiver.EnsureUnarchived(kYTabsField, i); + if (err == B_OK && archive->GetInfo(kBadLayoutPolicyField, NULL) == B_OK) + err = unarchiver.EnsureUnarchived(kBadLayoutPolicyField); + unarchiver.Finish(err); } @@ -1013,6 +1057,8 @@ BALMLayout::Archive(BMessage* into, bool deep) const for (int32 i = CountYTabs() - 1; i >= 0 && err == B_OK; i--) err = archiver.AddArchivable(kYTabsField, YTabAt(i)); + + err = archiver.AddArchivable(kBadLayoutPolicyField, fBadLayoutPolicy); } if (err == B_OK) @@ -1111,6 +1157,16 @@ BALMLayout::AllUnarchived(const BMessage* archive) } } + if (err != B_OK) + return err; + + if (archive->GetInfo(kBadLayoutPolicyField, NULL) == B_OK) { + BadLayoutPolicy* policy; + err = unarchiver.FindObject(kBadLayoutPolicyField, policy); + if (err == B_OK) + SetBadLayoutPolicy(policy); + } + LinearSpec* spec = Solver(); int32 tabCount = 0; archive->GetInfo(kXTabsField, NULL, &tabCount);