1/*
2 * Copyright 2010, Haiku, Inc.
3 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
6
7
8#include "ViewLayoutItem.h"
9
10#include <new>
11
12#include <Layout.h>
13#include <View.h>
14#include <ViewPrivate.h>
15
16
17namespace {
18	const char* const kViewField = "BViewLayoutItem:view";
19}
20
21
22BViewLayoutItem::BViewLayoutItem(BView* view)
23	:
24	fView(view),
25	fAncestorsVisible(true)
26{
27}
28
29
30BViewLayoutItem::BViewLayoutItem(BMessage* from)
31	:
32	BLayoutItem(BUnarchiver::PrepareArchive(from)),
33	fView(NULL),
34	fAncestorsVisible(true)
35{
36	BUnarchiver unarchiver(from);
37	unarchiver.Finish(unarchiver.FindObject<BView>(kViewField, 0,
38		BUnarchiver::B_DONT_ASSUME_OWNERSHIP, fView));
39}
40
41
42BViewLayoutItem::~BViewLayoutItem()
43{
44}
45
46
47BSize
48BViewLayoutItem::MinSize()
49{
50	return fView->MinSize();
51}
52
53
54BSize
55BViewLayoutItem::MaxSize()
56{
57	return fView->MaxSize();
58}
59
60
61BSize
62BViewLayoutItem::PreferredSize()
63{
64	return fView->PreferredSize();
65}
66
67
68BAlignment
69BViewLayoutItem::Alignment()
70{
71	return fView->LayoutAlignment();
72}
73
74
75void
76BViewLayoutItem::SetExplicitMinSize(BSize size)
77{
78	fView->SetExplicitMinSize(size);
79}
80
81
82void
83BViewLayoutItem::SetExplicitMaxSize(BSize size)
84{
85	fView->SetExplicitMaxSize(size);
86}
87
88
89void
90BViewLayoutItem::SetExplicitPreferredSize(BSize size)
91{
92	fView->SetExplicitPreferredSize(size);
93}
94
95
96void
97BViewLayoutItem::SetExplicitAlignment(BAlignment alignment)
98{
99	fView->SetExplicitAlignment(alignment);
100}
101
102
103bool
104BViewLayoutItem::IsVisible()
105{
106	int16 showLevel = BView::Private(fView).ShowLevel();
107	return showLevel - (fAncestorsVisible ? 0 : 1) <= 0;
108}
109
110
111void
112BViewLayoutItem::SetVisible(bool visible)
113{
114	if (visible != IsVisible()) {
115		if (visible)
116			fView->Show();
117		else
118			fView->Hide();
119	}
120}
121
122
123BRect
124BViewLayoutItem::Frame()
125{
126	return fView->Frame();
127}
128
129
130void
131BViewLayoutItem::SetFrame(BRect frame)
132{
133	fView->MoveTo(frame.LeftTop());
134	fView->ResizeTo(frame.Width(), frame.Height());
135}
136
137
138bool
139BViewLayoutItem::HasHeightForWidth()
140{
141	return fView->HasHeightForWidth();
142}
143
144
145void
146BViewLayoutItem::GetHeightForWidth(float width, float* min, float* max,
147	float* preferred)
148{
149	fView->GetHeightForWidth(width, min, max, preferred);
150}
151
152
153BView*
154BViewLayoutItem::View()
155{
156	return fView;
157}
158
159
160void
161BViewLayoutItem::Relayout(bool immediate)
162{
163	if (immediate)
164		fView->Layout(false);
165	else
166		fView->Relayout();
167}
168
169
170status_t
171BViewLayoutItem::Archive(BMessage* into, bool deep) const
172{
173	BArchiver archiver(into);
174	status_t err = BLayoutItem::Archive(into, deep);
175
176	return archiver.Finish(err);
177}
178
179
180status_t
181BViewLayoutItem::AllArchived(BMessage* into) const
182{
183	BArchiver archiver(into);
184	status_t err = BLayoutItem::AllArchived(into);
185
186	if (err == B_OK) {
187		if (archiver.IsArchived(fView))
188			err = archiver.AddArchivable(kViewField, fView);
189		else
190			err = B_NAME_NOT_FOUND;
191	}
192
193	return err;
194}
195
196
197status_t
198BViewLayoutItem::AllUnarchived(const BMessage* from)
199{
200	if (!fView)
201		return B_ERROR;
202
203	return BLayoutItem::AllUnarchived(from);
204}
205
206
207BArchivable*
208BViewLayoutItem::Instantiate(BMessage* from)
209{
210	if (validate_instantiation(from, "BViewLayoutItem"))
211		return new(std::nothrow) BViewLayoutItem(from);
212	return NULL;
213}
214
215
216void
217BViewLayoutItem::LayoutInvalidated(bool children)
218{
219	fView->InvalidateLayout(children);
220}
221
222
223void
224BViewLayoutItem::AncestorVisibilityChanged(bool shown)
225{
226	if (fAncestorsVisible == shown)
227		return;
228
229	fAncestorsVisible = shown;
230	if (shown)
231		fView->Show();
232	if (!shown)
233		fView->Hide();
234}
235
236