## class Fl_Group

### Class Hierarchy

    Fl_Widget
       |
       +----Fl_Group
               |
               +----Fl_Browser_, Fl_Color_Chooser, Fl_Help_View, Fl_Input_Choice, Fl_Pack,
                    Fl_Scroll, Fl_Tabs, Fl_Spinner, Fl_Tabs, Fl_Text_Display, Fl_Tile,
                    Fl_Window, Fl_Wizard

### Include Files

    #include <FL/Fl_Group.H>

### Description

The `Fl_Group` class is the FLTK container widget. It maintains an array of child widgets. These children can themselves be any widget including `Fl_Group`. The most important subclass of `Fl_Group` is `Fl_Window`, however groups can also be used to control radio buttons or to enforce resize behavior.

### Methods

Fl_Group ~Fl_Group add add_resizable | array begin child children | clear clip_children current | end find init_sizes | insert remove resizable

#### Fl_Group::Fl_Group(int x, int y, int w, int h, const char *label = 0)

Creates a new `Fl_Group` widget using the given position, size, and label string. The default boxtype is `FL_NO_BOX`.

#### virtual Fl_Group::~Fl_Group()

The destructor also deletes all the children. This allows a whole tree to be deleted at once, without having to keep a pointer to all the children in the user code. A kludge has been done so the `Fl_Group` and all of it's children can be automatic (local) variables, but you must declare the `Fl_Group` first, so that it is destroyed last.

#### void Fl_Group::add(Fl_Widget &w)
void Fl_Group::add(Fl_Widget *w)

The widget is removed from it's current group (if any) and then added to the end of this group.

#### void Fl_Group::clear()

The `clear()` method deletes all child widgets from memory recursively.

This method differs from the `remove()` method in that it affects all child widgets and deletes them from memory.

#### void Fl_Group::clip_children(int c);
int Fl_Group::clip_children();

The first method controls whether the group widget clips the drawing of child widgets to its bounding box.

The second method returns the current clipping mode.

The default is to not clip (0) the drawing of child widgets.

#### void Fl_Group::init_sizes()

The `Fl_Group` widget keeps track of the original widget sizes and positions when resizing occurs so that if you resize a window back to its original size the widgets will be in the correct places. If you rearrange the widgets in your group, call this method to register the new arrangement with the `Fl_Group` that contains them.

#### void Fl_Group::insert(Fl_Widget &w, int n)

The widget is removed from it's current group (if any) and then inserted into this group. It is put at index `n` (or at the end if `n >= children()`. This can also be used to rearrange the widgets inside a group.

#### void Fl_Group::insert(Fl_Widget &w, Fl_Widget* beforethis)

This does `insert(w, find(beforethis))`. This will append the widget if `beforethis` is not in the group.

#### void Fl_Group::remove(Fl_Widget &w)

Removes a widget from the group but does not delete it. This method does nothing if the widget is not a child of the group.

This method differs from the `clear()` method in that it only affects a single widget and does not delete it from memory.

#### static Fl_Group *Fl_Group::current()
static void Fl_Group::current(Fl_Group *w)

`current()` returns the currently active group. The Fl_Widget constructor automatically does `current()->add(widget)` if this is not null. To prevent new widgets from being added to a group, call `Fl_Group::current(0)`.

#### void Fl_Group::begin()

`begin()` sets the current group so you can build the widget tree by just constructing the widgets. `begin()` is automatically called by the constructor for Fl_Group (and thus for Fl_Window as well). `begin()` is exactly the same as `current(this)`.

Don't forget to `end()` the group or window!

#### void Fl_Group::end()

`end()` is exactly the same as `current(this->parent())`. Any new widgets added to the widget tree will be added to the parent of the group.

#### const Fl_Widget **Fl_Group::array() const

Returns a pointer to the array of children. This pointer is only valid until the next time a child is added or removed.

#### Fl_Widget *Fl_Group::child(int n) const

Returns `array()[n]`. No range checking is done!

#### int Fl_Group::children() const

Returns how many child widgets the group has.

#### int Fl_Group::find(const Fl_Widget *w) const
int Fl_Group::find(const Fl_Widget &w) const

Searches the child array for the widget and returns the index. Returns `children()` if the widget is `NULL` or not found.

#### void Fl_Group::resizable(Fl_Widget *box)
void Fl_Group::resizable(Fl_Widget &box)
Fl_Widget *Fl_Group::resizable() const

The resizable widget defines the resizing box for the group. When the group is resized it calculates a new size and position for all of its children. Widgets that are horizontally or vertically inside the dimensions of the box are scaled to the new size. Widgets outside the box are moved.

In these examples the gray area is the resizable:

The resizable may be set to the group itself (this is the default value for an `Fl_Group`, although `NULL` is the default for `Fl_Window` and `Fl_Pack`), in which case all the contents are resized. If the resizable is `NULL` then all widgets remain a fixed size and distance from the top-left corner.

It is possible to achieve any type of resize behavior by using an invisible `Fl_Box` as the resizable and/or by using a hierarchy of child `Fl_Group`'s.

#### Fl_Group &Fl_Group::add_resizable(Fl_Widget &box)

Adds a widget to the group and makes it the resizable widget.