/* * Copyright 2012, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _SHARED_SOLVER_H #define _SHARED_SOLVER_H #include #include #include #include #include #include "LinearSpec.h" class BMessage; namespace BALM { class BALMLayout; class Area; }; using BALM::BALMLayout; using BALM::Area; namespace BPrivate { class SharedSolver : BLayoutContextListener, public BReferenceable, public BArchivable { public: SharedSolver(BMessage* archive); SharedSolver(); ~SharedSolver(); void Invalidate(bool children); LinearSpec* Solver() const; ResultType Result(); void RegisterLayout(BALMLayout* layout); void LayoutLeaving(const BALMLayout* layout); ResultType ValidateMinSize(); ResultType ValidateMaxSize(); ResultType ValidatePreferredSize(); ResultType ValidateLayout(BLayoutContext* context); status_t AddFriendReferences(const BALMLayout* layout, BMessage* archive, const char* field); status_t Archive(BMessage* archive, bool deep) const; status_t AllArchived(BMessage* archive) const; status_t AllUnarchived(const BMessage* archive); static BArchivable* Instantiate(BMessage* archive); private: struct MinSizeValidator; struct MaxSizeValidator; struct PreferredSizeValidator; friend struct MinSizeValidator; friend struct MaxSizeValidator; friend struct PreferredSizeValidator; static void _AddConstraintsToSet(Area* area, std::set& constraints); static status_t _AddConstraintToArchive(Constraint* constraint, BMessage* archive); status_t _InstantiateConstraint(const void* rawData, ssize_t numBytes, BUnarchiver& unarchiver); void SetMaxSize(BALM::BALMLayout* layout, const BSize& max); void SetMinSize(BALM::BALMLayout* layout, const BSize& min); void SetPreferredSize(BALM::BALMLayout* layout, const BSize& preferred); virtual void LayoutContextLeft(BLayoutContext* context); void _UpdateConstraints(); void _SetContext(BLayoutContext* context); bool _IsMinSet(); bool _IsMaxSet(); void _ValidateConstraints(); template void _Validate(bool& isValid, ResultType& result); bool fConstraintsValid; bool fMinValid; bool fMaxValid; bool fPreferredValid; bool fLayoutValid; BLayoutContext* fLayoutContext; BObjectList fLayouts; LinearSpec fLinearSpec; ResultType fMinResult; ResultType fMaxResult; ResultType fPreferredResult; ResultType fLayoutResult; }; }; using BPrivate::SharedSolver; #endif