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