Make BALMLayout::BadLayoutPolicy archivable.

This commit is contained in:
Alex Wilson 2012-02-01 15:07:51 +13:00
parent 35bf0b5c1c
commit 015e5f06d8
2 changed files with 72 additions and 7 deletions

View File

@ -140,17 +140,26 @@ protected:
virtual void DoLayout(); virtual void DoLayout();
public: public:
struct BadLayoutPolicy { struct BadLayoutPolicy : public BArchivable {
virtual ~BadLayoutPolicy(); BadLayoutPolicy();
BadLayoutPolicy(BMessage* archive);
virtual ~BadLayoutPolicy();
/* return false to abandon layout, true to use layout */ /* return false to abandon layout, true to use layout */
virtual bool OnBadLayout(BALMLayout* layout, virtual bool OnBadLayout(BALMLayout* layout,
LinearProgramming::ResultType result, BLayoutContext* context) = 0; LinearProgramming::ResultType result,
BLayoutContext* context) = 0;
}; };
struct DefaultPolicy : public BadLayoutPolicy { struct DefaultPolicy : public BadLayoutPolicy {
virtual ~DefaultPolicy(); DefaultPolicy();
virtual bool OnBadLayout(BALMLayout* layout, DefaultPolicy(BMessage* archive);
LinearProgramming::ResultType result, BLayoutContext* context); 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: private:

View File

@ -29,6 +29,7 @@ const BSize kUnsetSize(B_SIZE_UNSET, B_SIZE_UNSET);
namespace { namespace {
const char* kFriendField = "BALMLayout:friends"; const char* kFriendField = "BALMLayout:friends";
const char* kBadLayoutPolicyField = "BALMLayout:policy";
const char* kXTabsField = "BALMLayout:xtabs"; const char* kXTabsField = "BALMLayout:xtabs";
const char* kYTabsField = "BALMLayout:ytabs"; const char* kYTabsField = "BALMLayout:ytabs";
const char* kTabsField = "BALMLayout:item:tabs"; const char* kTabsField = "BALMLayout:item:tabs";
@ -113,11 +114,35 @@ BALMLayout::TabAddTransaction<YTab>::_TabList()
}; // end namespace BALM }; // end namespace BALM
BALM::BALMLayout::BadLayoutPolicy::BadLayoutPolicy()
{
}
BALM::BALMLayout::BadLayoutPolicy::BadLayoutPolicy(BMessage* archive)
:
BArchivable(archive)
{
}
BALM::BALMLayout::BadLayoutPolicy::~BadLayoutPolicy() BALM::BALMLayout::BadLayoutPolicy::~BadLayoutPolicy()
{ {
} }
BALM::BALMLayout::DefaultPolicy::DefaultPolicy()
{
}
BALM::BALMLayout::DefaultPolicy::DefaultPolicy(BMessage* archive)
:
BadLayoutPolicy(archive)
{
}
BALM::BALMLayout::DefaultPolicy::~DefaultPolicy() 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. * Constructor.
* Creates new layout engine. * Creates new layout engine.
@ -225,6 +266,9 @@ BALMLayout::BALMLayout(BMessage* archive)
for (int32 i = 0; i < tabCount && err == B_OK; i++) for (int32 i = 0; i < tabCount && err == B_OK; i++)
err = unarchiver.EnsureUnarchived(kYTabsField, i); err = unarchiver.EnsureUnarchived(kYTabsField, i);
if (err == B_OK && archive->GetInfo(kBadLayoutPolicyField, NULL) == B_OK)
err = unarchiver.EnsureUnarchived(kBadLayoutPolicyField);
unarchiver.Finish(err); 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--) for (int32 i = CountYTabs() - 1; i >= 0 && err == B_OK; i--)
err = archiver.AddArchivable(kYTabsField, YTabAt(i)); err = archiver.AddArchivable(kYTabsField, YTabAt(i));
err = archiver.AddArchivable(kBadLayoutPolicyField, fBadLayoutPolicy);
} }
if (err == B_OK) 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(); LinearSpec* spec = Solver();
int32 tabCount = 0; int32 tabCount = 0;
archive->GetInfo(kXTabsField, NULL, &tabCount); archive->GetInfo(kXTabsField, NULL, &tabCount);