1/*
2 * Copyright 2006-2010, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef	_LAYOUT_H
6#define	_LAYOUT_H
7
8
9#include <Alignment.h>
10#include <Archivable.h>
11#include <LayoutItem.h>
12#include <List.h>
13#include <Size.h>
14
15
16class BLayoutContext;
17class BLayoutItem;
18class BView;
19
20
21class BLayout : public BLayoutItem {
22public:
23								BLayout();
24								BLayout(BMessage* archive);
25	virtual						~BLayout();
26
27			BView*				Owner() const;
28			BView*				TargetView() const;
29	virtual	BView*				View(); // from BLayoutItem
30
31	// methods dealing with items
32	virtual	BLayoutItem*		AddView(BView* child);
33	virtual	BLayoutItem*		AddView(int32 index, BView* child);
34
35	virtual	bool				AddItem(BLayoutItem* item);
36	virtual	bool				AddItem(int32 index, BLayoutItem* item);
37
38	virtual	bool				RemoveView(BView* child);
39	virtual	bool				RemoveItem(BLayoutItem* item);
40	virtual	BLayoutItem*		RemoveItem(int32 index);
41
42			BLayoutItem*		ItemAt(int32 index) const;
43			int32				CountItems() const;
44			int32				IndexOfItem(const BLayoutItem* item) const;
45			int32				IndexOfView(BView* child) const;
46
47			bool				AncestorsVisible() const;
48
49	// Layouting related methods
50
51	virtual	void				InvalidateLayout(bool children = false);
52	virtual	void				Relayout(bool immediate = false);
53									// from BLayoutItem
54			void				RequireLayout();
55			bool				IsValid();
56			void				EnableLayoutInvalidation();
57			void				DisableLayoutInvalidation();
58
59			void				LayoutItems(bool force = false);
60			BRect				LayoutArea();
61			BLayoutContext*		LayoutContext() const;
62
63	virtual status_t			Archive(BMessage* into, bool deep = true) const;
64
65	virtual status_t			Perform(perform_code d, void* arg);
66
67protected:
68	// Archiving hook methods
69	virtual	status_t			AllArchived(BMessage* archive) const;
70	virtual	status_t			AllUnarchived(const BMessage* from);
71
72	virtual status_t			ItemArchived(BMessage* into, BLayoutItem* item,
73									int32 index) const;
74	virtual	status_t			ItemUnarchived(const BMessage* from,
75									BLayoutItem* item, int32 index);
76	// BLayout hook methods
77	virtual	bool				ItemAdded(BLayoutItem* item, int32 atIndex);
78	virtual	void				ItemRemoved(BLayoutItem* item, int32 fromIndex);
79	virtual	void				LayoutInvalidated(bool children);
80	virtual	void				DoLayout() = 0;
81	virtual	void				OwnerChanged(BView* was);
82
83	// BLayoutItem hook methods
84	virtual	void				AttachedToLayout();
85	virtual void				DetachedFromLayout(BLayout* layout);
86	virtual	void				AncestorVisibilityChanged(bool shown);
87
88	// To be called by sub-classes in SetVisible().
89			void				VisibilityChanged(bool show);
90	// To be called when layout data is known to be good
91			void				ResetLayoutInvalidation();
92
93private:
94
95	// FBC padding
96	virtual	void				_ReservedLayout1();
97	virtual	void				_ReservedLayout2();
98	virtual	void				_ReservedLayout3();
99	virtual	void				_ReservedLayout4();
100	virtual	void				_ReservedLayout5();
101	virtual	void				_ReservedLayout6();
102	virtual	void				_ReservedLayout7();
103	virtual	void				_ReservedLayout8();
104	virtual	void				_ReservedLayout9();
105	virtual	void				_ReservedLayout10();
106
107	// forbidden methods
108								BLayout(const BLayout&);
109			void				operator =(const BLayout&);
110
111			friend class BView;
112
113			void				SetOwner(BView* owner);
114			void				SetTarget(BView* target);
115
116			void				_LayoutWithinContext(bool force,
117									BLayoutContext* context);
118
119			uint32				fState;
120			bool				fAncestorsVisible;
121			int32				fInvalidationDisabled;
122			BLayoutContext*		fContext;
123			BView*				fOwner;
124			BView*				fTarget;
125			BList				fItems;
126			BList				fNestedLayouts;
127
128			uint32				_reserved[10];
129};
130
131
132#endif	//	_LAYOUT_H
133