1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module gtk.Container;
26 
27 private import cairo.Context;
28 private import glib.ListG;
29 private import glib.Str;
30 private import gobject.ObjectG;
31 private import gobject.ParamSpec;
32 private import gobject.Signals;
33 private import gobject.Value;
34 private import gtk.Adjustment;
35 private import gtk.Widget;
36 private import gtk.WidgetPath;
37 public  import gtkc.gdktypes;
38 private import gtkc.gtk;
39 public  import gtkc.gtktypes;
40 private import std.algorithm;
41 
42 
43 /**
44  * A GTK+ user interface is constructed by nesting widgets inside widgets.
45  * Container widgets are the inner nodes in the resulting tree of widgets:
46  * they contain other widgets. So, for example, you might have a #GtkWindow
47  * containing a #GtkFrame containing a #GtkLabel. If you wanted an image instead
48  * of a textual label inside the frame, you might replace the #GtkLabel widget
49  * with a #GtkImage widget.
50  * 
51  * There are two major kinds of container widgets in GTK+. Both are subclasses
52  * of the abstract GtkContainer base class.
53  * 
54  * The first type of container widget has a single child widget and derives
55  * from #GtkBin. These containers are decorators, which
56  * add some kind of functionality to the child. For example, a #GtkButton makes
57  * its child into a clickable button; a #GtkFrame draws a frame around its child
58  * and a #GtkWindow places its child widget inside a top-level window.
59  * 
60  * The second type of container can have more than one child; its purpose is to
61  * manage layout. This means that these containers assign
62  * sizes and positions to their children. For example, a #GtkHBox arranges its
63  * children in a horizontal row, and a #GtkGrid arranges the widgets it contains
64  * in a two-dimensional grid.
65  * 
66  * For implementations of #GtkContainer the virtual method #GtkContainerClass.forall()
67  * is always required, since it's used for drawing and other internal operations
68  * on the children.
69  * If the #GtkContainer implementation expect to have non internal children
70  * it's needed to implement both #GtkContainerClass.add() and #GtkContainerClass.remove().
71  * If the GtkContainer implementation has internal children, they should be added
72  * with gtk_widget_set_parent() on init() and removed with gtk_widget_unparent()
73  * in the #GtkWidgetClass.destroy() implementation.
74  * See more about implementing custom widgets at https://wiki.gnome.org/HowDoI/CustomWidgets
75  * 
76  * # Height for width geometry management
77  * 
78  * GTK+ uses a height-for-width (and width-for-height) geometry management system.
79  * Height-for-width means that a widget can change how much vertical space it needs,
80  * depending on the amount of horizontal space that it is given (and similar for
81  * width-for-height).
82  * 
83  * There are some things to keep in mind when implementing container widgets
84  * that make use of GTK+’s height for width geometry management system. First,
85  * it’s important to note that a container must prioritize one of its
86  * dimensions, that is to say that a widget or container can only have a
87  * #GtkSizeRequestMode that is %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH or
88  * %GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT. However, every widget and container
89  * must be able to respond to the APIs for both dimensions, i.e. even if a
90  * widget has a request mode that is height-for-width, it is possible that
91  * its parent will request its sizes using the width-for-height APIs.
92  * 
93  * To ensure that everything works properly, here are some guidelines to follow
94  * when implementing height-for-width (or width-for-height) containers.
95  * 
96  * Each request mode involves 2 virtual methods. Height-for-width apis run
97  * through gtk_widget_get_preferred_width() and then through gtk_widget_get_preferred_height_for_width().
98  * When handling requests in the opposite #GtkSizeRequestMode it is important that
99  * every widget request at least enough space to display all of its content at all times.
100  * 
101  * When gtk_widget_get_preferred_height() is called on a container that is height-for-width,
102  * the container must return the height for its minimum width. This is easily achieved by
103  * simply calling the reverse apis implemented for itself as follows:
104  * 
105  * |[<!-- language="C" -->
106  * static void
107  * foo_container_get_preferred_height (GtkWidget *widget,
108  * gint *min_height,
109  * gint *nat_height)
110  * {
111  * if (i_am_in_height_for_width_mode)
112  * {
113  * gint min_width;
114  * 
115  * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget,
116  * &min_width,
117  * NULL);
118  * GTK_WIDGET_GET_CLASS (widget)->get_preferred_height_for_width
119  * (widget,
120  * min_width,
121  * min_height,
122  * nat_height);
123  * }
124  * else
125  * {
126  * ... many containers support both request modes, execute the
127  * real width-for-height request here by returning the
128  * collective heights of all widgets that are stacked
129  * vertically (or whatever is appropriate for this container)
130  * ...
131  * }
132  * }
133  * ]|
134  * 
135  * Similarly, when gtk_widget_get_preferred_width_for_height() is called for a container or widget
136  * that is height-for-width, it then only needs to return the base minimum width like so:
137  * 
138  * |[<!-- language="C" -->
139  * static void
140  * foo_container_get_preferred_width_for_height (GtkWidget *widget,
141  * gint for_height,
142  * gint *min_width,
143  * gint *nat_width)
144  * {
145  * if (i_am_in_height_for_width_mode)
146  * {
147  * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget,
148  * min_width,
149  * nat_width);
150  * }
151  * else
152  * {
153  * ... execute the real width-for-height request here based on
154  * the required width of the children collectively if the
155  * container were to be allocated the said height ...
156  * }
157  * }
158  * ]|
159  * 
160  * Height for width requests are generally implemented in terms of a virtual allocation
161  * of widgets in the input orientation. Assuming an height-for-width request mode, a container
162  * would implement the get_preferred_height_for_width() virtual function by first calling
163  * gtk_widget_get_preferred_width() for each of its children.
164  * 
165  * For each potential group of children that are lined up horizontally, the values returned by
166  * gtk_widget_get_preferred_width() should be collected in an array of #GtkRequestedSize structures.
167  * Any child spacing should be removed from the input @for_width and then the collective size should be
168  * allocated using the gtk_distribute_natural_allocation() convenience function.
169  * 
170  * The container will then move on to request the preferred height for each child by using
171  * gtk_widget_get_preferred_height_for_width() and using the sizes stored in the #GtkRequestedSize array.
172  * 
173  * To allocate a height-for-width container, it’s again important
174  * to consider that a container must prioritize one dimension over the other. So if
175  * a container is a height-for-width container it must first allocate all widgets horizontally
176  * using a #GtkRequestedSize array and gtk_distribute_natural_allocation() and then add any
177  * extra space (if and where appropriate) for the widget to expand.
178  * 
179  * After adding all the expand space, the container assumes it was allocated sufficient
180  * height to fit all of its content. At this time, the container must use the total horizontal sizes
181  * of each widget to request the height-for-width of each of its children and store the requests in a
182  * #GtkRequestedSize array for any widgets that stack vertically (for tabular containers this can
183  * be generalized into the heights and widths of rows and columns).
184  * The vertical space must then again be distributed using gtk_distribute_natural_allocation()
185  * while this time considering the allocated height of the widget minus any vertical spacing
186  * that the container adds. Then vertical expand space should be added where appropriate and available
187  * and the container should go on to actually allocating the child widgets.
188  * 
189  * See [GtkWidget’s geometry management section][geometry-management]
190  * to learn more about implementing height-for-width geometry management for widgets.
191  * 
192  * # Child properties
193  * 
194  * GtkContainer introduces child properties.
195  * These are object properties that are not specific
196  * to either the container or the contained widget, but rather to their relation.
197  * Typical examples of child properties are the position or pack-type of a widget
198  * which is contained in a #GtkBox.
199  * 
200  * Use gtk_container_class_install_child_property() to install child properties
201  * for a container class and gtk_container_class_find_child_property() or
202  * gtk_container_class_list_child_properties() to get information about existing
203  * child properties.
204  * 
205  * To set the value of a child property, use gtk_container_child_set_property(),
206  * gtk_container_child_set() or gtk_container_child_set_valist().
207  * To obtain the value of a child property, use
208  * gtk_container_child_get_property(), gtk_container_child_get() or
209  * gtk_container_child_get_valist(). To emit notification about child property
210  * changes, use gtk_widget_child_notify().
211  * 
212  * # GtkContainer as GtkBuildable
213  * 
214  * The GtkContainer implementation of the GtkBuildable interface supports
215  * a <packing> element for children, which can contain multiple <property>
216  * elements that specify child properties for the child.
217  * 
218  * Since 2.16, child properties can also be marked as translatable using
219  * the same “translatable”, “comments” and “context” attributes that are used
220  * for regular properties.
221  * 
222  * Since 3.16, containers can have a <focus-chain> element containing multiple
223  * <widget> elements, one for each child that should be added to the focus
224  * chain. The ”name” attribute gives the id of the widget.
225  * 
226  * An example of these properties in UI definitions:
227  * |[
228  * <object class="GtkBox">
229  * <child>
230  * <object class="GtkEntry" id="entry1"/>
231  * <packing>
232  * <property name="pack-type">start</property>
233  * </packing>
234  * </child>
235  * <child>
236  * <object class="GtkEntry" id="entry2"/>
237  * </child>
238  * <focus-chain>
239  * <widget name="entry1"/>
240  * <widget name="entry2"/>
241  * </focus-chain>
242  * </object>
243  * ]|
244  */
245 public class Container : Widget
246 {
247 	/** the main Gtk struct */
248 	protected GtkContainer* gtkContainer;
249 
250 	/** Get the main Gtk struct */
251 	public GtkContainer* getContainerStruct()
252 	{
253 		return gtkContainer;
254 	}
255 
256 	/** the main Gtk struct as a void* */
257 	protected override void* getStruct()
258 	{
259 		return cast(void*)gtkContainer;
260 	}
261 
262 	protected override void setStruct(GObject* obj)
263 	{
264 		gtkContainer = cast(GtkContainer*)obj;
265 		super.setStruct(obj);
266 	}
267 
268 	/**
269 	 * Sets our main struct and passes it to the parent class.
270 	 */
271 	public this (GtkContainer* gtkContainer, bool ownedRef = false)
272 	{
273 		this.gtkContainer = gtkContainer;
274 		super(cast(GtkWidget*)gtkContainer, ownedRef);
275 	}
276 
277 	/**
278 	 * Removes all widgets from the container
279 	 */
280 	void removeAll()
281 	{
282 		GList* gList = gtk_container_get_children(getContainerStruct());
283 		if ( gList !is null )
284 		{
285 			ListG children = new ListG(gList);
286 			for ( int i=children.length()-1 ; i>=0 ; i-- )
287 			{
288 				gtk_container_remove(getContainerStruct(), cast(GtkWidget*)children.nthData(i));
289 			}
290 		}
291 	}
292 
293 	/**
294 	 */
295 
296 	/** */
297 	public static GType getType()
298 	{
299 		return gtk_container_get_type();
300 	}
301 
302 	/**
303 	 * Adds @widget to @container. Typically used for simple containers
304 	 * such as #GtkWindow, #GtkFrame, or #GtkButton; for more complicated
305 	 * layout containers such as #GtkBox or #GtkGrid, this function will
306 	 * pick default packing parameters that may not be correct.  So
307 	 * consider functions such as gtk_box_pack_start() and
308 	 * gtk_grid_attach() as an alternative to gtk_container_add() in
309 	 * those cases. A widget may be added to only one container at a time;
310 	 * you can’t place the same widget inside two different containers.
311 	 *
312 	 * Note that some containers, such as #GtkScrolledWindow or #GtkListBox,
313 	 * may add intermediate children between the added widget and the
314 	 * container.
315 	 *
316 	 * Params:
317 	 *     widget = a widget to be placed inside @container
318 	 */
319 	public void add(Widget widget)
320 	{
321 		gtk_container_add(gtkContainer, (widget is null) ? null : widget.getWidgetStruct());
322 	}
323 
324 	/** */
325 	public void checkResize()
326 	{
327 		gtk_container_check_resize(gtkContainer);
328 	}
329 
330 	/**
331 	 * Gets the value of a child property for @child and @container.
332 	 *
333 	 * Params:
334 	 *     child = a widget which is a child of @container
335 	 *     propertyName = the name of the property to get
336 	 *     value = a location to return the value
337 	 */
338 	public void childGetProperty(Widget child, string propertyName, Value value)
339 	{
340 		gtk_container_child_get_property(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(propertyName), (value is null) ? null : value.getValueStruct());
341 	}
342 
343 	/**
344 	 * Gets the values of one or more child properties for @child and @container.
345 	 *
346 	 * Params:
347 	 *     child = a widget which is a child of @container
348 	 *     firstPropertyName = the name of the first property to get
349 	 *     varArgs = return location for the first property, followed
350 	 *         optionally by more name/return location pairs, followed by %NULL
351 	 */
352 	public void childGetValist(Widget child, string firstPropertyName, void* varArgs)
353 	{
354 		gtk_container_child_get_valist(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(firstPropertyName), varArgs);
355 	}
356 
357 	/**
358 	 * Emits a #GtkWidget::child-notify signal for the
359 	 * [child property][child-properties]
360 	 * @child_property on the child.
361 	 *
362 	 * This is an analogue of g_object_notify() for child properties.
363 	 *
364 	 * Also see gtk_widget_child_notify().
365 	 *
366 	 * Params:
367 	 *     child = the child widget
368 	 *     childProperty = the name of a child property installed on
369 	 *         the class of @container
370 	 *
371 	 * Since: 3.2
372 	 */
373 	public void childNotify(Widget child, string childProperty)
374 	{
375 		gtk_container_child_notify(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(childProperty));
376 	}
377 
378 	/**
379 	 * Emits a #GtkWidget::child-notify signal for the
380 	 * [child property][child-properties] specified by
381 	 * @pspec on the child.
382 	 *
383 	 * This is an analogue of g_object_notify_by_pspec() for child properties.
384 	 *
385 	 * Params:
386 	 *     child = the child widget
387 	 *     pspec = the #GParamSpec of a child property instealled on
388 	 *         the class of @container
389 	 *
390 	 * Since: 3.18
391 	 */
392 	public void childNotifyByPspec(Widget child, ParamSpec pspec)
393 	{
394 		gtk_container_child_notify_by_pspec(gtkContainer, (child is null) ? null : child.getWidgetStruct(), (pspec is null) ? null : pspec.getParamSpecStruct());
395 	}
396 
397 	/**
398 	 * Sets a child property for @child and @container.
399 	 *
400 	 * Params:
401 	 *     child = a widget which is a child of @container
402 	 *     propertyName = the name of the property to set
403 	 *     value = the value to set the property to
404 	 */
405 	public void childSetProperty(Widget child, string propertyName, Value value)
406 	{
407 		gtk_container_child_set_property(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(propertyName), (value is null) ? null : value.getValueStruct());
408 	}
409 
410 	/**
411 	 * Sets one or more child properties for @child and @container.
412 	 *
413 	 * Params:
414 	 *     child = a widget which is a child of @container
415 	 *     firstPropertyName = the name of the first property to set
416 	 *     varArgs = a %NULL-terminated list of property names and values, starting
417 	 *         with @first_prop_name
418 	 */
419 	public void childSetValist(Widget child, string firstPropertyName, void* varArgs)
420 	{
421 		gtk_container_child_set_valist(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(firstPropertyName), varArgs);
422 	}
423 
424 	/**
425 	 * Returns the type of the children supported by the container.
426 	 *
427 	 * Note that this may return %G_TYPE_NONE to indicate that no more
428 	 * children can be added, e.g. for a #GtkPaned which already has two
429 	 * children.
430 	 *
431 	 * Return: a #GType.
432 	 */
433 	public GType childType()
434 	{
435 		return gtk_container_child_type(gtkContainer);
436 	}
437 
438 	/**
439 	 * Invokes @callback on each direct child of @container, including
440 	 * children that are considered “internal” (implementation details
441 	 * of the container). “Internal” children generally weren’t added
442 	 * by the user of the container, but were added by the container
443 	 * implementation itself.
444 	 *
445 	 * Most applications should use gtk_container_foreach(), rather
446 	 * than gtk_container_forall().
447 	 *
448 	 * Params:
449 	 *     callback = a callback
450 	 *     callbackData = callback user data
451 	 */
452 	public void forall(GtkCallback callback, void* callbackData)
453 	{
454 		gtk_container_forall(gtkContainer, callback, callbackData);
455 	}
456 
457 	/**
458 	 * Invokes @callback on each non-internal child of @container.
459 	 * See gtk_container_forall() for details on what constitutes
460 	 * an “internal” child. For all practical purposes, this function
461 	 * should iterate over precisely those child widgets that were
462 	 * added to the container by the application with explicit add()
463 	 * calls.
464 	 *
465 	 * Most applications should use gtk_container_foreach(),
466 	 * rather than gtk_container_forall().
467 	 *
468 	 * Params:
469 	 *     callback = a callback
470 	 *     callbackData = callback user data
471 	 */
472 	public void foreac(GtkCallback callback, void* callbackData)
473 	{
474 		gtk_container_foreach(gtkContainer, callback, callbackData);
475 	}
476 
477 	/**
478 	 * Retrieves the border width of the container. See
479 	 * gtk_container_set_border_width().
480 	 *
481 	 * Return: the current border width
482 	 */
483 	public uint getBorderWidth()
484 	{
485 		return gtk_container_get_border_width(gtkContainer);
486 	}
487 
488 	/**
489 	 * Returns the container’s non-internal children. See
490 	 * gtk_container_forall() for details on what constitutes an "internal" child.
491 	 *
492 	 * Return: a newly-allocated list of the container’s non-internal children.
493 	 */
494 	public ListG getChildren()
495 	{
496 		auto p = gtk_container_get_children(gtkContainer);
497 		
498 		if(p is null)
499 		{
500 			return null;
501 		}
502 		
503 		return new ListG(cast(GList*) p);
504 	}
505 
506 	/**
507 	 * Retrieves the focus chain of the container, if one has been
508 	 * set explicitly. If no focus chain has been explicitly
509 	 * set, GTK+ computes the focus chain based on the positions
510 	 * of the children. In that case, GTK+ stores %NULL in
511 	 * @focusable_widgets and returns %FALSE.
512 	 *
513 	 * Params:
514 	 *     focusableWidgets = location
515 	 *         to store the focus chain of the
516 	 *         container, or %NULL. You should free this list
517 	 *         using g_list_free() when you are done with it, however
518 	 *         no additional reference count is added to the
519 	 *         individual widgets in the focus chain.
520 	 *
521 	 * Return: %TRUE if the focus chain of the container
522 	 *     has been set explicitly.
523 	 */
524 	public bool getFocusChain(out ListG focusableWidgets)
525 	{
526 		GList* outfocusableWidgets = null;
527 		
528 		auto p = gtk_container_get_focus_chain(gtkContainer, &outfocusableWidgets) != 0;
529 		
530 		focusableWidgets = new ListG(outfocusableWidgets);
531 		
532 		return p;
533 	}
534 
535 	/**
536 	 * Returns the current focus child widget inside @container. This is not the
537 	 * currently focused widget. That can be obtained by calling
538 	 * gtk_window_get_focus().
539 	 *
540 	 * Return: The child widget which will receive the
541 	 *     focus inside @container when the @container is focused,
542 	 *     or %NULL if none is set.
543 	 *
544 	 * Since: 2.14
545 	 */
546 	public Widget getFocusChild()
547 	{
548 		auto p = gtk_container_get_focus_child(gtkContainer);
549 		
550 		if(p is null)
551 		{
552 			return null;
553 		}
554 		
555 		return ObjectG.getDObject!(Widget)(cast(GtkWidget*) p);
556 	}
557 
558 	/**
559 	 * Retrieves the horizontal focus adjustment for the container. See
560 	 * gtk_container_set_focus_hadjustment ().
561 	 *
562 	 * Return: the horizontal focus adjustment, or %NULL if
563 	 *     none has been set.
564 	 */
565 	public Adjustment getFocusHadjustment()
566 	{
567 		auto p = gtk_container_get_focus_hadjustment(gtkContainer);
568 		
569 		if(p is null)
570 		{
571 			return null;
572 		}
573 		
574 		return ObjectG.getDObject!(Adjustment)(cast(GtkAdjustment*) p);
575 	}
576 
577 	/**
578 	 * Retrieves the vertical focus adjustment for the container. See
579 	 * gtk_container_set_focus_vadjustment().
580 	 *
581 	 * Return: the vertical focus adjustment, or
582 	 *     %NULL if none has been set.
583 	 */
584 	public Adjustment getFocusVadjustment()
585 	{
586 		auto p = gtk_container_get_focus_vadjustment(gtkContainer);
587 		
588 		if(p is null)
589 		{
590 			return null;
591 		}
592 		
593 		return ObjectG.getDObject!(Adjustment)(cast(GtkAdjustment*) p);
594 	}
595 
596 	/**
597 	 * Returns a newly created widget path representing all the widget hierarchy
598 	 * from the toplevel down to and including @child.
599 	 *
600 	 * Params:
601 	 *     child = a child of @container
602 	 *
603 	 * Return: A newly created #GtkWidgetPath
604 	 */
605 	public WidgetPath getPathForChild(Widget child)
606 	{
607 		auto p = gtk_container_get_path_for_child(gtkContainer, (child is null) ? null : child.getWidgetStruct());
608 		
609 		if(p is null)
610 		{
611 			return null;
612 		}
613 		
614 		return ObjectG.getDObject!(WidgetPath)(cast(GtkWidgetPath*) p, true);
615 	}
616 
617 	/**
618 	 * Returns the resize mode for the container. See
619 	 * gtk_container_set_resize_mode ().
620 	 *
621 	 * Deprecated: Resize modes are deprecated. They aren’t necessary
622 	 * anymore since frame clocks and might introduce obscure bugs if
623 	 * used.
624 	 *
625 	 * Return: the current resize mode
626 	 */
627 	public GtkResizeMode getResizeMode()
628 	{
629 		return gtk_container_get_resize_mode(gtkContainer);
630 	}
631 
632 	/**
633 	 * When a container receives a call to the draw function, it must send
634 	 * synthetic #GtkWidget::draw calls to all children that don’t have their
635 	 * own #GdkWindows. This function provides a convenient way of doing this.
636 	 * A container, when it receives a call to its #GtkWidget::draw function,
637 	 * calls gtk_container_propagate_draw() once for each child, passing in
638 	 * the @cr the container received.
639 	 *
640 	 * gtk_container_propagate_draw() takes care of translating the origin of @cr,
641 	 * and deciding whether the draw needs to be sent to the child. It is a
642 	 * convenient and optimized way of getting the same effect as calling
643 	 * gtk_widget_draw() on the child directly.
644 	 *
645 	 * In most cases, a container can simply either inherit the
646 	 * #GtkWidget::draw implementation from #GtkContainer, or do some drawing
647 	 * and then chain to the ::draw implementation from #GtkContainer.
648 	 *
649 	 * Params:
650 	 *     child = a child of @container
651 	 *     cr = Cairo context as passed to the container. If you want to use @cr
652 	 *         in container’s draw function, consider using cairo_save() and
653 	 *         cairo_restore() before calling this function.
654 	 */
655 	public void propagateDraw(Widget child, Context cr)
656 	{
657 		gtk_container_propagate_draw(gtkContainer, (child is null) ? null : child.getWidgetStruct(), (cr is null) ? null : cr.getContextStruct());
658 	}
659 
660 	/**
661 	 * Removes @widget from @container. @widget must be inside @container.
662 	 * Note that @container will own a reference to @widget, and that this
663 	 * may be the last reference held; so removing a widget from its
664 	 * container can destroy that widget. If you want to use @widget
665 	 * again, you need to add a reference to it before removing it from
666 	 * a container, using g_object_ref(). If you don’t want to use @widget
667 	 * again it’s usually more efficient to simply destroy it directly
668 	 * using gtk_widget_destroy() since this will remove it from the
669 	 * container and help break any circular reference count cycles.
670 	 *
671 	 * Params:
672 	 *     widget = a current child of @container
673 	 */
674 	public void remove(Widget widget)
675 	{
676 		gtk_container_remove(gtkContainer, (widget is null) ? null : widget.getWidgetStruct());
677 	}
678 
679 	/** */
680 	public void resizeChildren()
681 	{
682 		gtk_container_resize_children(gtkContainer);
683 	}
684 
685 	/**
686 	 * Sets the border width of the container.
687 	 *
688 	 * The border width of a container is the amount of space to leave
689 	 * around the outside of the container. The only exception to this is
690 	 * #GtkWindow; because toplevel windows can’t leave space outside,
691 	 * they leave the space inside. The border is added on all sides of
692 	 * the container. To add space to only one side, use a specific
693 	 * #GtkWidget:margin property on the child widget, for example
694 	 * #GtkWidget:margin-top.
695 	 *
696 	 * Params:
697 	 *     borderWidth = amount of blank space to leave outside
698 	 *         the container. Valid values are in the range 0-65535 pixels.
699 	 */
700 	public void setBorderWidth(uint borderWidth)
701 	{
702 		gtk_container_set_border_width(gtkContainer, borderWidth);
703 	}
704 
705 	/**
706 	 * Sets a focus chain, overriding the one computed automatically by GTK+.
707 	 *
708 	 * In principle each widget in the chain should be a descendant of the
709 	 * container, but this is not enforced by this method, since it’s allowed
710 	 * to set the focus chain before you pack the widgets, or have a widget
711 	 * in the chain that isn’t always packed. The necessary checks are done
712 	 * when the focus chain is actually traversed.
713 	 *
714 	 * Params:
715 	 *     focusableWidgets = the new focus chain
716 	 */
717 	public void setFocusChain(ListG focusableWidgets)
718 	{
719 		gtk_container_set_focus_chain(gtkContainer, (focusableWidgets is null) ? null : focusableWidgets.getListGStruct());
720 	}
721 
722 	/**
723 	 * Sets, or unsets if @child is %NULL, the focused child of @container.
724 	 *
725 	 * This function emits the GtkContainer::set_focus_child signal of
726 	 * @container. Implementations of #GtkContainer can override the
727 	 * default behaviour by overriding the class closure of this signal.
728 	 *
729 	 * This is function is mostly meant to be used by widgets. Applications can use
730 	 * gtk_widget_grab_focus() to manually set the focus to a specific widget.
731 	 *
732 	 * Params:
733 	 *     child = a #GtkWidget, or %NULL
734 	 */
735 	public void setFocusChild(Widget child)
736 	{
737 		gtk_container_set_focus_child(gtkContainer, (child is null) ? null : child.getWidgetStruct());
738 	}
739 
740 	/**
741 	 * Hooks up an adjustment to focus handling in a container, so when a child
742 	 * of the container is focused, the adjustment is scrolled to show that
743 	 * widget. This function sets the horizontal alignment.
744 	 * See gtk_scrolled_window_get_hadjustment() for a typical way of obtaining
745 	 * the adjustment and gtk_container_set_focus_vadjustment() for setting
746 	 * the vertical adjustment.
747 	 *
748 	 * The adjustments have to be in pixel units and in the same coordinate
749 	 * system as the allocation for immediate children of the container.
750 	 *
751 	 * Params:
752 	 *     adjustment = an adjustment which should be adjusted when the focus is
753 	 *         moved among the descendents of @container
754 	 */
755 	public void setFocusHadjustment(Adjustment adjustment)
756 	{
757 		gtk_container_set_focus_hadjustment(gtkContainer, (adjustment is null) ? null : adjustment.getAdjustmentStruct());
758 	}
759 
760 	/**
761 	 * Hooks up an adjustment to focus handling in a container, so when a
762 	 * child of the container is focused, the adjustment is scrolled to
763 	 * show that widget. This function sets the vertical alignment. See
764 	 * gtk_scrolled_window_get_vadjustment() for a typical way of obtaining
765 	 * the adjustment and gtk_container_set_focus_hadjustment() for setting
766 	 * the horizontal adjustment.
767 	 *
768 	 * The adjustments have to be in pixel units and in the same coordinate
769 	 * system as the allocation for immediate children of the container.
770 	 *
771 	 * Params:
772 	 *     adjustment = an adjustment which should be adjusted when the focus
773 	 *         is moved among the descendents of @container
774 	 */
775 	public void setFocusVadjustment(Adjustment adjustment)
776 	{
777 		gtk_container_set_focus_vadjustment(gtkContainer, (adjustment is null) ? null : adjustment.getAdjustmentStruct());
778 	}
779 
780 	/**
781 	 * Sets the @reallocate_redraws flag of the container to the given value.
782 	 *
783 	 * Containers requesting reallocation redraws get automatically
784 	 * redrawn if any of their children changed allocation.
785 	 *
786 	 * Deprecated: Call gtk_widget_queue_draw() in your size_allocate handler.
787 	 *
788 	 * Params:
789 	 *     needsRedraws = the new value for the container’s @reallocate_redraws flag
790 	 */
791 	public void setReallocateRedraws(bool needsRedraws)
792 	{
793 		gtk_container_set_reallocate_redraws(gtkContainer, needsRedraws);
794 	}
795 
796 	/**
797 	 * Sets the resize mode for the container.
798 	 *
799 	 * The resize mode of a container determines whether a resize request
800 	 * will be passed to the container’s parent, queued for later execution
801 	 * or executed immediately.
802 	 *
803 	 * Deprecated: Resize modes are deprecated. They aren’t necessary
804 	 * anymore since frame clocks and might introduce obscure bugs if
805 	 * used.
806 	 *
807 	 * Params:
808 	 *     resizeMode = the new resize mode
809 	 */
810 	public void setResizeMode(GtkResizeMode resizeMode)
811 	{
812 		gtk_container_set_resize_mode(gtkContainer, resizeMode);
813 	}
814 
815 	/**
816 	 * Removes a focus chain explicitly set with gtk_container_set_focus_chain().
817 	 */
818 	public void unsetFocusChain()
819 	{
820 		gtk_container_unset_focus_chain(gtkContainer);
821 	}
822 
823 	protected class OnAddDelegateWrapper
824 	{
825 		void delegate(Widget, Container) dlg;
826 		gulong handlerId;
827 		ConnectFlags flags;
828 		this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags)
829 		{
830 			this.dlg = dlg;
831 			this.handlerId = handlerId;
832 			this.flags = flags;
833 		}
834 	}
835 	protected OnAddDelegateWrapper[] onAddListeners;
836 
837 	/** */
838 	gulong addOnAdd(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
839 	{
840 		onAddListeners ~= new OnAddDelegateWrapper(dlg, 0, connectFlags);
841 		onAddListeners[onAddListeners.length - 1].handlerId = Signals.connectData(
842 			this,
843 			"add",
844 			cast(GCallback)&callBackAdd,
845 			cast(void*)onAddListeners[onAddListeners.length - 1],
846 			cast(GClosureNotify)&callBackAddDestroy,
847 			connectFlags);
848 		return onAddListeners[onAddListeners.length - 1].handlerId;
849 	}
850 	
851 	extern(C) static void callBackAdd(GtkContainer* containerStruct, GtkWidget* object,OnAddDelegateWrapper wrapper)
852 	{
853 		wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer);
854 	}
855 	
856 	extern(C) static void callBackAddDestroy(OnAddDelegateWrapper wrapper, GClosure* closure)
857 	{
858 		wrapper.outer.internalRemoveOnAdd(wrapper);
859 	}
860 
861 	protected void internalRemoveOnAdd(OnAddDelegateWrapper source)
862 	{
863 		foreach(index, wrapper; onAddListeners)
864 		{
865 			if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId)
866 			{
867 				onAddListeners[index] = null;
868 				onAddListeners = std.algorithm.remove(onAddListeners, index);
869 				break;
870 			}
871 		}
872 	}
873 	
874 
875 	protected class OnCheckResizeDelegateWrapper
876 	{
877 		void delegate(Container) dlg;
878 		gulong handlerId;
879 		ConnectFlags flags;
880 		this(void delegate(Container) dlg, gulong handlerId, ConnectFlags flags)
881 		{
882 			this.dlg = dlg;
883 			this.handlerId = handlerId;
884 			this.flags = flags;
885 		}
886 	}
887 	protected OnCheckResizeDelegateWrapper[] onCheckResizeListeners;
888 
889 	/** */
890 	gulong addOnCheckResize(void delegate(Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
891 	{
892 		onCheckResizeListeners ~= new OnCheckResizeDelegateWrapper(dlg, 0, connectFlags);
893 		onCheckResizeListeners[onCheckResizeListeners.length - 1].handlerId = Signals.connectData(
894 			this,
895 			"check-resize",
896 			cast(GCallback)&callBackCheckResize,
897 			cast(void*)onCheckResizeListeners[onCheckResizeListeners.length - 1],
898 			cast(GClosureNotify)&callBackCheckResizeDestroy,
899 			connectFlags);
900 		return onCheckResizeListeners[onCheckResizeListeners.length - 1].handlerId;
901 	}
902 	
903 	extern(C) static void callBackCheckResize(GtkContainer* containerStruct,OnCheckResizeDelegateWrapper wrapper)
904 	{
905 		wrapper.dlg(wrapper.outer);
906 	}
907 	
908 	extern(C) static void callBackCheckResizeDestroy(OnCheckResizeDelegateWrapper wrapper, GClosure* closure)
909 	{
910 		wrapper.outer.internalRemoveOnCheckResize(wrapper);
911 	}
912 
913 	protected void internalRemoveOnCheckResize(OnCheckResizeDelegateWrapper source)
914 	{
915 		foreach(index, wrapper; onCheckResizeListeners)
916 		{
917 			if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId)
918 			{
919 				onCheckResizeListeners[index] = null;
920 				onCheckResizeListeners = std.algorithm.remove(onCheckResizeListeners, index);
921 				break;
922 			}
923 		}
924 	}
925 	
926 
927 	protected class OnRemoveDelegateWrapper
928 	{
929 		void delegate(Widget, Container) dlg;
930 		gulong handlerId;
931 		ConnectFlags flags;
932 		this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags)
933 		{
934 			this.dlg = dlg;
935 			this.handlerId = handlerId;
936 			this.flags = flags;
937 		}
938 	}
939 	protected OnRemoveDelegateWrapper[] onRemoveListeners;
940 
941 	/** */
942 	gulong addOnRemove(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
943 	{
944 		onRemoveListeners ~= new OnRemoveDelegateWrapper(dlg, 0, connectFlags);
945 		onRemoveListeners[onRemoveListeners.length - 1].handlerId = Signals.connectData(
946 			this,
947 			"remove",
948 			cast(GCallback)&callBackRemove,
949 			cast(void*)onRemoveListeners[onRemoveListeners.length - 1],
950 			cast(GClosureNotify)&callBackRemoveDestroy,
951 			connectFlags);
952 		return onRemoveListeners[onRemoveListeners.length - 1].handlerId;
953 	}
954 	
955 	extern(C) static void callBackRemove(GtkContainer* containerStruct, GtkWidget* object,OnRemoveDelegateWrapper wrapper)
956 	{
957 		wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer);
958 	}
959 	
960 	extern(C) static void callBackRemoveDestroy(OnRemoveDelegateWrapper wrapper, GClosure* closure)
961 	{
962 		wrapper.outer.internalRemoveOnRemove(wrapper);
963 	}
964 
965 	protected void internalRemoveOnRemove(OnRemoveDelegateWrapper source)
966 	{
967 		foreach(index, wrapper; onRemoveListeners)
968 		{
969 			if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId)
970 			{
971 				onRemoveListeners[index] = null;
972 				onRemoveListeners = std.algorithm.remove(onRemoveListeners, index);
973 				break;
974 			}
975 		}
976 	}
977 	
978 
979 	protected class OnSetFocusChildDelegateWrapper
980 	{
981 		void delegate(Widget, Container) dlg;
982 		gulong handlerId;
983 		ConnectFlags flags;
984 		this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags)
985 		{
986 			this.dlg = dlg;
987 			this.handlerId = handlerId;
988 			this.flags = flags;
989 		}
990 	}
991 	protected OnSetFocusChildDelegateWrapper[] onSetFocusChildListeners;
992 
993 	/** */
994 	gulong addOnSetFocusChild(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
995 	{
996 		onSetFocusChildListeners ~= new OnSetFocusChildDelegateWrapper(dlg, 0, connectFlags);
997 		onSetFocusChildListeners[onSetFocusChildListeners.length - 1].handlerId = Signals.connectData(
998 			this,
999 			"set-focus-child",
1000 			cast(GCallback)&callBackSetFocusChild,
1001 			cast(void*)onSetFocusChildListeners[onSetFocusChildListeners.length - 1],
1002 			cast(GClosureNotify)&callBackSetFocusChildDestroy,
1003 			connectFlags);
1004 		return onSetFocusChildListeners[onSetFocusChildListeners.length - 1].handlerId;
1005 	}
1006 	
1007 	extern(C) static void callBackSetFocusChild(GtkContainer* containerStruct, GtkWidget* object,OnSetFocusChildDelegateWrapper wrapper)
1008 	{
1009 		wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer);
1010 	}
1011 	
1012 	extern(C) static void callBackSetFocusChildDestroy(OnSetFocusChildDelegateWrapper wrapper, GClosure* closure)
1013 	{
1014 		wrapper.outer.internalRemoveOnSetFocusChild(wrapper);
1015 	}
1016 
1017 	protected void internalRemoveOnSetFocusChild(OnSetFocusChildDelegateWrapper source)
1018 	{
1019 		foreach(index, wrapper; onSetFocusChildListeners)
1020 		{
1021 			if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId)
1022 			{
1023 				onSetFocusChildListeners[index] = null;
1024 				onSetFocusChildListeners = std.algorithm.remove(onSetFocusChildListeners, index);
1025 				break;
1026 			}
1027 		}
1028 	}
1029 	
1030 }