1/* 2 * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6#include <GroupLayoutBuilder.h> 7 8#include <new> 9 10#include <SpaceLayoutItem.h> 11 12 13using std::nothrow; 14 15 16// constructor 17BGroupLayoutBuilder::BGroupLayoutBuilder(orientation orientation, 18 float spacing) 19 : fRootLayout((new BGroupView(orientation, spacing))->GroupLayout()) 20{ 21 _PushLayout(fRootLayout); 22} 23 24// constructor 25BGroupLayoutBuilder::BGroupLayoutBuilder(BGroupLayout* layout) 26 : fRootLayout(layout) 27{ 28 _PushLayout(fRootLayout); 29} 30 31// constructor 32BGroupLayoutBuilder::BGroupLayoutBuilder(BGroupView* view) 33 : fRootLayout(view->GroupLayout()) 34{ 35 _PushLayout(fRootLayout); 36} 37 38// RootLayout 39BGroupLayout* 40BGroupLayoutBuilder::RootLayout() const 41{ 42 return fRootLayout; 43} 44 45// TopLayout 46BGroupLayout* 47BGroupLayoutBuilder::TopLayout() const 48{ 49 int32 count = fLayoutStack.CountItems(); 50 return (count > 0 51 ? (BGroupLayout*)fLayoutStack.ItemAt(count - 1) : NULL); 52} 53 54// GetTopLayout 55BGroupLayoutBuilder& 56BGroupLayoutBuilder::GetTopLayout(BGroupLayout** _layout) 57{ 58 *_layout = TopLayout(); 59 return *this; 60} 61 62// TopView 63BView* 64BGroupLayoutBuilder::TopView() const 65{ 66 if (BGroupLayout* layout = TopLayout()) 67 return layout->Owner(); 68 return NULL; 69} 70 71// GetTopView 72BGroupLayoutBuilder& 73BGroupLayoutBuilder::GetTopView(BView** _view) 74{ 75 if (BGroupLayout* layout = TopLayout()) 76 *_view = layout->Owner(); 77 else 78 *_view = NULL; 79 80 return *this; 81} 82 83// Add 84BGroupLayoutBuilder& 85BGroupLayoutBuilder::Add(BView* view) 86{ 87 if (BGroupLayout* layout = TopLayout()) 88 layout->AddView(view); 89 return *this; 90} 91 92// Add 93BGroupLayoutBuilder& 94BGroupLayoutBuilder::Add(BView* view, float weight) 95{ 96 if (BGroupLayout* layout = TopLayout()) 97 layout->AddView(view, weight); 98 return *this; 99} 100 101// Add 102BGroupLayoutBuilder& 103BGroupLayoutBuilder::Add(BLayoutItem* item) 104{ 105 if (BGroupLayout* layout = TopLayout()) 106 layout->AddItem(item); 107 return *this; 108} 109 110// Add 111BGroupLayoutBuilder& 112BGroupLayoutBuilder::Add(BLayoutItem* item, float weight) 113{ 114 if (BGroupLayout* layout = TopLayout()) 115 layout->AddItem(item, weight); 116 return *this; 117} 118 119// AddGroup 120BGroupLayoutBuilder& 121BGroupLayoutBuilder::AddGroup(orientation orientation, float spacing, 122 float weight) 123{ 124 if (BGroupLayout* layout = TopLayout()) { 125 BGroupView* group = new(nothrow) BGroupView(orientation, spacing); 126 if (group) { 127 if (layout->AddView(group, weight)) 128 _PushLayout(group->GroupLayout()); 129 else 130 delete group; 131 } 132 } 133 134 return *this; 135} 136 137// End 138BGroupLayoutBuilder& 139BGroupLayoutBuilder::End() 140{ 141 _PopLayout(); 142 return *this; 143} 144 145// AddGlue 146BGroupLayoutBuilder& 147BGroupLayoutBuilder::AddGlue(float weight) 148{ 149 if (BGroupLayout* layout = TopLayout()) 150 layout->AddItem(BSpaceLayoutItem::CreateGlue(), weight); 151 152 return *this; 153} 154 155// AddStrut 156BGroupLayoutBuilder& 157BGroupLayoutBuilder::AddStrut(float size) 158{ 159 if (BGroupLayout* layout = TopLayout()) { 160 if (layout->Orientation() == B_HORIZONTAL) 161 layout->AddItem(BSpaceLayoutItem::CreateHorizontalStrut(size)); 162 else 163 layout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(size)); 164 } 165 166 return *this; 167} 168 169// SetInsets 170BGroupLayoutBuilder& 171BGroupLayoutBuilder::SetInsets(float left, float top, float right, float bottom) 172{ 173 if (BGroupLayout* layout = TopLayout()) 174 layout->SetInsets(left, top, right, bottom); 175 176 return *this; 177} 178 179// cast operator BGroupLayout* 180BGroupLayoutBuilder::operator BGroupLayout*() 181{ 182 return fRootLayout; 183} 184 185// _PushLayout 186bool 187BGroupLayoutBuilder::_PushLayout(BGroupLayout* layout) 188{ 189 return fLayoutStack.AddItem(layout); 190} 191 192// _PopLayout 193void 194BGroupLayoutBuilder::_PopLayout() 195{ 196 int32 count = fLayoutStack.CountItems(); 197 if (count > 0) 198 fLayoutStack.RemoveItem(count - 1); 199} 200