1 /* 2 * Copyright 2012, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #include "ALMLayoutBuilder.h" 6 7 8 #include <Window.h> 9 10 #include "Area.h" 11 12 13 namespace BALM { 14 15 16 BALMLayoutBuilder::BALMLayoutBuilder(BView* view, float hSpacing, 17 float vSpacing, BALMLayout* friendLayout) 18 { 19 fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); 20 view->SetLayout(fLayout); 21 } 22 23 24 BALMLayoutBuilder::BALMLayoutBuilder(BView* view, BALMLayout* layout) 25 { 26 fLayout = layout; 27 view->SetLayout(layout); 28 } 29 30 31 BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, float hSpacing, 32 float vSpacing, BALMLayout* friendLayout) 33 { 34 fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); 35 window->SetLayout(fLayout); 36 37 fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 38 // TODO: we get a white background if we don't do this 39 } 40 41 42 BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, BALMLayout* layout) 43 { 44 fLayout = layout; 45 window->SetLayout(fLayout); 46 47 fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 48 // TODO: we get a white background if we don't do this 49 } 50 51 52 BALMLayoutBuilder::BALMLayoutBuilder(BALMLayout* layout) 53 { 54 fLayout = layout; 55 } 56 57 58 BALMLayoutBuilder& 59 BALMLayoutBuilder::Add(BView* view, XTab* left, YTab* top, 60 XTab* right, YTab* bottom) 61 { 62 fLayout->AddView(view, left, top, right, bottom); 63 return *this; 64 } 65 66 67 BALMLayoutBuilder& 68 BALMLayoutBuilder::Add(BView* view, Row* row, Column* column) 69 { 70 fLayout->AddView(view, row, column); 71 return *this; 72 } 73 74 75 BALMLayoutBuilder& 76 BALMLayoutBuilder::Add(BLayoutItem* item, XTab* left, YTab* top, 77 XTab* right, YTab* bottom) 78 { 79 fLayout->AddItem(item, left, top, right, bottom); 80 return *this; 81 } 82 83 84 BALMLayoutBuilder& 85 BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column) 86 { 87 fLayout->AddItem(item, row, column); 88 return *this; 89 } 90 91 92 93 BALMLayoutBuilder& 94 BALMLayoutBuilder::SetInsets(float insets) 95 { 96 fLayout->SetInsets(insets); 97 return *this; 98 } 99 100 101 BALMLayoutBuilder& 102 BALMLayoutBuilder::SetInsets(float horizontal, float vertical) 103 { 104 fLayout->SetInsets(horizontal, vertical); 105 return *this; 106 } 107 108 109 BALMLayoutBuilder& 110 BALMLayoutBuilder::SetInsets(float left, float top, float right, 111 float bottom) 112 { 113 fLayout->SetInsets(left, top, right, bottom); 114 return *this; 115 } 116 117 118 BALMLayoutBuilder& 119 BALMLayoutBuilder::SetSpacing(float horizontal, float vertical) 120 { 121 fLayout->SetSpacing(horizontal, vertical); 122 return *this; 123 } 124 125 126 BALMLayoutBuilder::Snake 127 BALMLayoutBuilder::StartingAt(BView* view) 128 { 129 return Snake(fLayout->AreaFor(view), this); 130 } 131 132 133 BALMLayoutBuilder::Snake 134 BALMLayoutBuilder::StartingAt(BLayoutItem* item) 135 { 136 return Snake(fLayout->AreaFor(item), this); 137 } 138 139 140 BALMLayoutBuilder::Snake::Snake(Area* area, BALMLayoutBuilder* root) 141 { 142 fCurrentArea = area; 143 fRootBuilder = root; 144 fPreviousSnake = NULL; 145 } 146 147 148 BALMLayoutBuilder::Snake::Snake(Area* area, Snake* previous) 149 { 150 fCurrentArea = area; 151 fRootBuilder = previous->fRootBuilder; 152 fPreviousSnake = previous; 153 } 154 155 156 BALMLayoutBuilder::Snake& 157 BALMLayoutBuilder::Snake::AddToLeft(BView* view, XTab* _left, YTab* top, 158 YTab* bottom) 159 { 160 BReference<XTab> left = _left; 161 if (_left == NULL) 162 left = _Layout()->AddXTab(); 163 XTab* right = fCurrentArea->Left(); 164 if (!top) 165 top = fCurrentArea->Top(); 166 if (!bottom) 167 bottom = fCurrentArea->Bottom(); 168 169 fCurrentArea = _AddToLayout(view, left, top, right, bottom); 170 return *this; 171 } 172 173 174 BALMLayoutBuilder::Snake& 175 BALMLayoutBuilder::Snake::AddToRight(BView* view, XTab* _right, YTab* top, 176 YTab* bottom) 177 { 178 XTab* left = fCurrentArea->Right(); 179 BReference<XTab> right = _right; 180 if (_right == NULL) 181 right = _Layout()->AddXTab(); 182 if (!top) 183 top = fCurrentArea->Top(); 184 if (!bottom) 185 bottom = fCurrentArea->Bottom(); 186 187 fCurrentArea = _AddToLayout(view, left, top, right, bottom); 188 return *this; 189 } 190 191 192 BALMLayoutBuilder::Snake& 193 BALMLayoutBuilder::Snake::AddAbove(BView* view, YTab* _top, XTab* left, 194 XTab* right) 195 { 196 if (!left) 197 left = fCurrentArea->Left(); 198 if (!right) 199 right = fCurrentArea->Right(); 200 BReference<YTab> top = _top; 201 if (_top == NULL) 202 top = _Layout()->AddYTab(); 203 YTab* bottom = fCurrentArea->Top(); 204 205 fCurrentArea = _AddToLayout(view, left, top, right, bottom); 206 return *this; 207 } 208 209 210 BALMLayoutBuilder::Snake& 211 BALMLayoutBuilder::Snake::AddBelow(BView* view, YTab* _bottom, XTab* left, 212 XTab* right) 213 { 214 if (!left) 215 left = fCurrentArea->Left(); 216 if (!right) 217 right = fCurrentArea->Right(); 218 YTab* top = fCurrentArea->Bottom(); 219 BReference<YTab> bottom = _bottom; 220 if (_bottom == NULL) 221 bottom = _Layout()->AddYTab(); 222 223 fCurrentArea = _AddToLayout(view, left, top, right, bottom); 224 return *this; 225 } 226 227 228 BALMLayoutBuilder::Snake& 229 BALMLayoutBuilder::Snake::AddToLeft(BLayoutItem* item, XTab* _left, YTab* top, 230 YTab* bottom) 231 { 232 BReference<XTab> left = _left; 233 if (_left == NULL) 234 left = _Layout()->AddXTab(); 235 XTab* right = fCurrentArea->Left(); 236 if (!top) 237 top = fCurrentArea->Top(); 238 if (!bottom) 239 bottom = fCurrentArea->Bottom(); 240 241 fCurrentArea = _AddToLayout(item, left, top, right, bottom); 242 return *this; 243 } 244 245 246 BALMLayoutBuilder::Snake& 247 BALMLayoutBuilder::Snake::AddToRight(BLayoutItem* item, XTab* _right, YTab* top, 248 YTab* bottom) 249 { 250 XTab* left = fCurrentArea->Right(); 251 BReference<XTab> right = _right; 252 if (_right == NULL) 253 right = _Layout()->AddXTab(); 254 if (!top) 255 top = fCurrentArea->Top(); 256 if (!bottom) 257 bottom = fCurrentArea->Bottom(); 258 259 fCurrentArea = _AddToLayout(item, left, top, right, bottom); 260 return *this; 261 } 262 263 264 BALMLayoutBuilder::Snake& 265 BALMLayoutBuilder::Snake::AddAbove(BLayoutItem* item, YTab* _top, XTab* left, 266 XTab* right) 267 { 268 if (!left) 269 left = fCurrentArea->Left(); 270 if (!right) 271 right = fCurrentArea->Right(); 272 BReference<YTab> top = _top; 273 if (_top == NULL) 274 top = _Layout()->AddYTab(); 275 YTab* bottom = fCurrentArea->Top(); 276 277 fCurrentArea = _AddToLayout(item, left, top, right, bottom); 278 return *this; 279 } 280 281 282 BALMLayoutBuilder::Snake& 283 BALMLayoutBuilder::Snake::AddBelow(BLayoutItem* item, YTab* _bottom, XTab* left, 284 XTab* right) 285 { 286 if (!left) 287 left = fCurrentArea->Left(); 288 if (!right) 289 right = fCurrentArea->Right(); 290 YTab* top = fCurrentArea->Bottom(); 291 BReference<YTab> bottom = _bottom; 292 if (_bottom == NULL) 293 bottom = _Layout()->AddYTab(); 294 295 fCurrentArea = _AddToLayout(item, left, top, right, bottom); 296 return *this; 297 } 298 299 300 BALMLayoutBuilder::Snake 301 BALMLayoutBuilder::Snake::StartingAt(BView* view) 302 { 303 return fRootBuilder->StartingAt(view); 304 } 305 306 307 BALMLayoutBuilder::Snake 308 BALMLayoutBuilder::Snake::StartingAt(BLayoutItem* item) 309 { 310 return fRootBuilder->StartingAt(item); 311 } 312 313 314 BALMLayoutBuilder::Snake 315 BALMLayoutBuilder::Snake::Push() 316 { 317 return Snake(fCurrentArea, this); 318 } 319 320 321 BALMLayoutBuilder::Snake& 322 BALMLayoutBuilder::Snake::Pop() 323 { 324 return *fPreviousSnake; 325 } 326 327 328 BALMLayoutBuilder& 329 BALMLayoutBuilder::Snake::End() 330 { 331 return *fRootBuilder; 332 } 333 334 335 BALMLayout* 336 BALMLayoutBuilder::Snake::_Layout() 337 { 338 return fRootBuilder->fLayout; 339 } 340 341 342 Area* 343 BALMLayoutBuilder::Snake::_AddToLayout(BView* view, XTab* left, YTab* top, 344 XTab* right, YTab* bottom) 345 { 346 return _Layout()->AddView(view, left, top, right, bottom); 347 } 348 349 350 Area* 351 BALMLayoutBuilder::Snake::_AddToLayout(BLayoutItem* item, XTab* left, 352 YTab* top, XTab* right, YTab* bottom) 353 { 354 return _Layout()->AddItem(item, left, top, right, bottom); 355 } 356 357 358 }; 359