xref: /haiku/src/kits/interface/AbstractLayoutItem.cpp (revision c90684742e7361651849be4116d0e5de3a817194)
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 <AbstractLayoutItem.h>
9 
10 #include <LayoutUtils.h>
11 #include <Message.h>
12 
13 
14 namespace {
15 	const char* const kSizesField = "BAbstractLayoutItem:sizes";
16 		// kSizesField == {min, max, preferred}
17 	const char* const kAlignmentField = "BAbstractLayoutItem:alignment";
18 }
19 
20 
21 BAbstractLayoutItem::BAbstractLayoutItem()
22 	:
23 	fMinSize(),
24 	fMaxSize(),
25 	fPreferredSize(),
26 	fAlignment()
27 {
28 }
29 
30 
31 BAbstractLayoutItem::BAbstractLayoutItem(BMessage* from)
32 	:
33 	BLayoutItem(from),
34 	fMinSize(),
35 	fMaxSize(),
36 	fPreferredSize(),
37 	fAlignment()
38 {
39 	from->FindSize(kSizesField, 0, &fMinSize);
40 	from->FindSize(kSizesField, 1, &fMaxSize);
41 	from->FindSize(kSizesField, 2, &fPreferredSize);
42 	from->FindAlignment(kAlignmentField, &fAlignment);
43 }
44 
45 
46 BAbstractLayoutItem::~BAbstractLayoutItem()
47 {
48 }
49 
50 
51 BSize
52 BAbstractLayoutItem::MinSize()
53 {
54 	return BLayoutUtils::ComposeSize(fMinSize, BaseMinSize());
55 }
56 
57 
58 BSize
59 BAbstractLayoutItem::MaxSize()
60 {
61 	return BLayoutUtils::ComposeSize(fMaxSize, BaseMaxSize());
62 }
63 
64 
65 BSize
66 BAbstractLayoutItem::PreferredSize()
67 {
68 	return BLayoutUtils::ComposeSize(fMaxSize, BasePreferredSize());
69 }
70 
71 
72 BAlignment
73 BAbstractLayoutItem::Alignment()
74 {
75 	return BLayoutUtils::ComposeAlignment(fAlignment, BaseAlignment());
76 }
77 
78 
79 void
80 BAbstractLayoutItem::SetExplicitMinSize(BSize size)
81 {
82 	fMinSize = size;
83 }
84 
85 
86 void
87 BAbstractLayoutItem::SetExplicitMaxSize(BSize size)
88 {
89 	fMaxSize = size;
90 }
91 
92 
93 void
94 BAbstractLayoutItem::SetExplicitPreferredSize(BSize size)
95 {
96 	fPreferredSize = size;
97 }
98 
99 
100 void
101 BAbstractLayoutItem::SetExplicitAlignment(BAlignment alignment)
102 {
103 	fAlignment = alignment;
104 }
105 
106 
107 BSize
108 BAbstractLayoutItem::BaseMinSize()
109 {
110 	return BSize(0, 0);
111 }
112 
113 
114 BSize
115 BAbstractLayoutItem::BaseMaxSize()
116 {
117 	return BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED);
118 }
119 
120 
121 BSize
122 BAbstractLayoutItem::BasePreferredSize()
123 {
124 	return BSize(0, 0);
125 }
126 
127 
128 BAlignment
129 BAbstractLayoutItem::BaseAlignment()
130 {
131 	return BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER);
132 }
133 
134 
135 status_t
136 BAbstractLayoutItem::Archive(BMessage* into, bool deep) const
137 {
138 	BArchiver archiver(into);
139 	status_t err = BLayoutItem::Archive(into, deep);
140 
141 	if (err == B_OK)
142 		err = into->AddSize(kSizesField, fMinSize);
143 
144 	if (err == B_OK)
145 		err = into->AddSize(kSizesField, fMaxSize);
146 
147 	if (err == B_OK)
148 		err = into->AddSize(kSizesField, fPreferredSize);
149 
150 	if (err == B_OK)
151 		err = into->AddAlignment(kAlignmentField, fAlignment);
152 
153 	return archiver.Finish(err);
154 }
155