1/* 2 * Copyright 2010 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Alex Wilson, yourpalal2@gmail.com 7 * 8 * Corresponds to: 9 * headers/os/interface/LayoutBuilder.h rev 38207 10 * src/kits/interface/LayoutBuilder.cpp rev 38207 11 */ 12 13 14/*! 15 \file LayoutBuilder.h 16 \ingroup interface 17 \ingroup layout 18 \ingroup libbe 19 \brief Defines the BLayoutBuilder templates. 20*/ 21 22 23/*! 24 \class BLayoutBuilder::Base<> 25 \ingroup interface 26 \ingroup layout 27 \brief Base for all other layout builders in the BLayoutBuilder namespace. 28 29 This class provides the stack-like semantics for its subclasses. The 30 BLayoutBuilder::Group, BLayoutBuilder::Grid and BLayoutBuilder::Split all 31 provide methods such as AddGrid() AddGroup() and AddSplit(), which 32 make a new builder, place it on top of your builder stack and return it. 33 Now you are operating on the new builder. When you call the End() method on 34 the new builder, you are returned the one you had previously been using. At 35 any point, you are calling methods on whatever builder currently resides on 36 the top of the stack. Here's an example of how these classes work. 37 38\code 39BLayoutBuilder::Group<>(B_HORIZONTAL) 40\endcode 41 42 At this point our stack just contains a single builder, it looks like this: 43 \li Group<> 44 45\code 46 .AddGrid() 47\endcode 48 49 Now there is a Grid builder on top of the stack, so it looks like this \li Group<>::GridBuilder 50 \li Group<> 51 52 Notice that the Grid on top of the stack is not a plain Grid<>, but a nested 53 type from the Group<> class. This is an essential part of the builder 54 classes, as this is what allows you to pop builders off the stack and get 55 the correct type in return. 56 57\code 58 .AddSplit() 59\endcode 60 61 Now our stack looks like this: 62 \li Group<>::GridBuilder::SplitBuilder 63 \li Group<>::GridBuilder 64 \li Group<> 65 66 This could continue ad. nauseam, but at some point, you may finish with a 67 builder, and you might want to continue manipulating the builder below it 68 on the stack. To do this, you simply call the End() method like so: 69 70\code 71 .End() 72\endcode 73 74 And now the stack is back to this: 75 \li Group<>::GridBuilder 76 \li Group<> 77 78 So you are again working with the grid builder. You can add more 79 BLayoutItems or BViews, or even more builders. Here's how it will all look 80 together. 81 82\code 83BLayoutBuilder::Group<>(B_HORIZONTAL) 84 // working with the Group builder 85 .AddGrid() 86 // working with the Group<>::GridBuilder 87 .AddSplit() 88 // working with the Group<>::GridBuilder::SplitBuilder 89 .End() 90 // back to the Group<>::GridBuilder 91\endcode 92 93 \since Haiku R1 94*/ 95 96 97/*! 98 \fn void BLayoutBuilder::Base<ParentBuilder>::SetParent(ParentBuilder* 99 parent) 100 \brief Internal method for use by BLayoutBuilder::Base subclasses, 101 this is essential to the builder stack semantics. 102 103 \since Haiku R1 104*/ 105 106 107/*! 108 \fn ParentBuilder& BLayoutBuilder::Base<ParentBuilder>::End() 109 \brief Returns this builder's parent. 110 111 \since Haiku R1 112*/ 113 114 115 116/* 117 118 119template<typename ParentBuilder> 120class Grid : public Base<ParentBuilder> { 121public: 122 typedef Grid<ParentBuilder> ThisBuilder; 123 typedef Group<ThisBuilder> GroupBuilder; 124 typedef Grid<ThisBuilder> GridBuilder; 125 typedef Split<ThisBuilder> SplitBuilder; 126 127public: 128 inline Grid(float horizontalSpacing = 0.0f, 129 float verticalSpacing = 0.0f); 130 inline Grid(BWindow* window, 131 float horizontalSpacing = 0.0f, 132 float verticalSpacing = 0.0f); 133 inline Grid(BGridLayout* layout); 134 inline Grid(BGridView* view); 135 136 inline BGridLayout* Layout() const; 137 inline BView* View() const; 138 inline ThisBuilder& GetLayout(BGridLayout** _layout); 139 inline ThisBuilder& GetView(BView** _view); 140 141 inline ThisBuilder& Add(BView* view, int32 column, int32 row, 142 int32 columnCount = 1, int32 rowCount = 1); 143 inline ThisBuilder& Add(BLayoutItem* item, int32 column, int32 row, 144 int32 columnCount = 1, int32 rowCount = 1); 145 inline ThisBuilder& AddMenuField(BMenuField* menuField, 146 int32 column, int32 row, 147 alignment labelAlignment 148 = B_ALIGN_HORIZONTAL_UNSET, 149 int32 columnCount = 1, int32 rowCount = 1); 150 inline ThisBuilder& AddTextControl(BTextControl* textControl, 151 int32 column, int32 row, 152 alignment labelAlignment 153 = B_ALIGN_HORIZONTAL_UNSET, 154 int32 columnCount = 1, int32 rowCount = 1); 155 156 inline GroupBuilder AddGroup(orientation orientation, 157 float spacing, int32 column, int32 row, 158 int32 columnCount = 1, int32 rowCount = 1); 159 inline GroupBuilder AddGroup(BGroupView* groupView, int32 column, 160 int32 row, int32 columnCount = 1, 161 int32 rowCount = 1); 162 inline GroupBuilder AddGroup(BGroupLayout* groupLayout, 163 int32 column, int32 row, 164 int32 columnCount = 1, int32 rowCount = 1); 165 166 inline GridBuilder AddGrid(float horizontalSpacing, 167 float verticalSpacing, int32 column, 168 int32 row, int32 columnCount = 1, 169 int32 rowCount = 1); 170 inline GridBuilder AddGrid(BGridLayout* gridLayout, 171 int32 column, int32 row, 172 int32 columnCount = 1, int32 rowCount = 1); 173 inline GridBuilder AddGrid(BGridView* gridView, 174 int32 column, int32 row, 175 int32 columnCount = 1, int32 rowCount = 1); 176 177 inline SplitBuilder AddSplit(orientation orientation, 178 float spacing, int32 column, int32 row, 179 int32 columnCount = 1, int32 rowCount = 1); 180 inline SplitBuilder AddSplit(BSplitView* splitView, int32 column, 181 int32 row, int32 columnCount = 1, 182 int32 rowCount = 1); 183 184 inline ThisBuilder& SetColumnWeight(int32 column, float weight); 185 inline ThisBuilder& SetRowWeight(int32 row, float weight); 186 187 inline ThisBuilder& SetInsets(float left, float top, float right, 188 float bottom); 189 190 inline operator BGridLayout*(); 191 192private: 193 BGridLayout* fLayout; 194}; 195 196 197template<typename ParentBuilder> 198class Split : public Base<ParentBuilder> { 199public: 200 typedef Split<ParentBuilder> ThisBuilder; 201 typedef Group<ThisBuilder> GroupBuilder; 202 typedef Grid<ThisBuilder> GridBuilder; 203 typedef Split<ThisBuilder> SplitBuilder; 204 205public: 206 inline Split(orientation orientation = B_HORIZONTAL, 207 float spacing = 0.0f); 208 inline Split(BSplitView* view); 209 210 inline BSplitView* View() const; 211 inline ThisBuilder& GetView(BView** _view); 212 inline ThisBuilder& GetSplitView(BSplitView** _view); 213 214 inline ThisBuilder& Add(BView* view); 215 inline ThisBuilder& Add(BView* view, float weight); 216 inline ThisBuilder& Add(BLayoutItem* item); 217 inline ThisBuilder& Add(BLayoutItem* item, float weight); 218 219 inline GroupBuilder AddGroup(orientation orientation, 220 float spacing = 0.0f, float weight = 1.0f); 221 inline GroupBuilder AddGroup(BGroupView* groupView, 222 float weight = 1.0f); 223 inline GroupBuilder AddGroup(BGroupLayout* groupLayout, 224 float weight = 1.0f); 225 226 inline GridBuilder AddGrid(float horizontalSpacing = 0.0f, 227 float verticalSpacing = 0.0f, 228 float weight = 1.0f); 229 inline GridBuilder AddGrid(BGridView* gridView, 230 float weight = 1.0f); 231 inline GridBuilder AddGrid(BGridLayout* gridLayout, 232 float weight = 1.0f); 233 234 inline SplitBuilder AddSplit(orientation orientation, 235 float spacing = 0.0f, float weight = 1.0f); 236 inline SplitBuilder AddSplit(BSplitView* splitView, 237 float weight = 1.0f); 238 239 inline ThisBuilder& SetCollapsible(bool collapsible); 240 inline ThisBuilder& SetCollapsible(int32 index, bool collapsible); 241 inline ThisBuilder& SetCollapsible(int32 first, int32 last, 242 bool collapsible); 243 244 inline ThisBuilder& SetInsets(float left, float top, float right, 245 float bottom); 246 247 inline operator BSplitView*(); 248 249private: 250 BSplitView* fView; 251}; 252