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