⛏️ index : haiku.git

/*
 * Copyright 2012, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _SHARED_SOLVER_H
#define _SHARED_SOLVER_H


#include <set>

#include <Archivable.h>
#include <LayoutContext.h>
#include <ObjectList.h>
#include <Referenceable.h>

#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<const Constraint*>& 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 <class Validator>
			void				_Validate(bool& isValid, ResultType& result);


			bool				fConstraintsValid;
			bool				fMinValid;
			bool				fMaxValid;
			bool				fPreferredValid;
			bool				fLayoutValid;

			BLayoutContext*		fLayoutContext;
			BObjectList<BALM::BALMLayout> fLayouts;
			LinearSpec			fLinearSpec;

			ResultType			fMinResult;
			ResultType			fMaxResult;
			ResultType			fPreferredResult;
			ResultType			fLayoutResult;
};


};


using BPrivate::SharedSolver;


#endif