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.Builder;
26 
27 private import glib.ConstructionException;
28 private import glib.ErrorG;
29 private import glib.GException;
30 private import glib.Module;
31 private import glib.Str;
32 private import gobject.ObjectG;
33 private import gobject.ParamSpec;
34 private import gobject.Type;
35 private import gobject.Value;
36 private import gtk.Application;
37 private import gtk.Widget;
38 private import gtkc.glib;
39 private import gtkc.gobject;
40 private import gtkc.gtk;
41 public  import gtkc.gtktypes;
42 private import gtkc.paths;
43 private import std.string;
44 
45 
46 /**
47  * A GtkBuilder is an auxiliary object that reads textual descriptions
48  * of a user interface and instantiates the described objects. To create
49  * a GtkBuilder from a user interface description, call
50  * gtk_builder_new_from_file(), gtk_builder_new_from_resource() or
51  * gtk_builder_new_from_string().
52  * 
53  * In the (unusual) case that you want to add user interface
54  * descriptions from multiple sources to the same GtkBuilder you can
55  * call gtk_builder_new() to get an empty builder and populate it by
56  * (multiple) calls to gtk_builder_add_from_file(),
57  * gtk_builder_add_from_resource() or gtk_builder_add_from_string().
58  * 
59  * A GtkBuilder holds a reference to all objects that it has constructed
60  * and drops these references when it is finalized. This finalization can
61  * cause the destruction of non-widget objects or widgets which are not
62  * contained in a toplevel window. For toplevel windows constructed by a
63  * builder, it is the responsibility of the user to call gtk_widget_destroy()
64  * to get rid of them and all the widgets they contain.
65  * 
66  * The functions gtk_builder_get_object() and gtk_builder_get_objects()
67  * can be used to access the widgets in the interface by the names assigned
68  * to them inside the UI description. Toplevel windows returned by these
69  * functions will stay around until the user explicitly destroys them
70  * with gtk_widget_destroy(). Other widgets will either be part of a
71  * larger hierarchy constructed by the builder (in which case you should
72  * not have to worry about their lifecycle), or without a parent, in which
73  * case they have to be added to some container to make use of them.
74  * Non-widget objects need to be reffed with g_object_ref() to keep them
75  * beyond the lifespan of the builder.
76  * 
77  * The function gtk_builder_connect_signals() and variants thereof can be
78  * used to connect handlers to the named signals in the description.
79  * 
80  * # GtkBuilder UI Definitions # {#BUILDER-UI}
81  * 
82  * GtkBuilder parses textual descriptions of user interfaces which are
83  * specified in an XML format which can be roughly described by the
84  * RELAX NG schema below. We refer to these descriptions as “GtkBuilder
85  * UI definitions” or just “UI definitions” if the context is clear.
86  * Do not confuse GtkBuilder UI Definitions with
87  * [GtkUIManager UI Definitions][XML-UI], which are more limited in scope.
88  * It is common to use `.ui` as the filename extension for files containing
89  * GtkBuilder UI definitions.
90  * 
91  * [RELAX NG Compact Syntax](https://git.gnome.org/browse/gtk+/tree/gtk/gtkbuilder.rnc)
92  * 
93  * The toplevel element is <interface>. It optionally takes a “domain”
94  * attribute, which will make the builder look for translated strings
95  * using dgettext() in the domain specified. This can also be done by
96  * calling gtk_builder_set_translation_domain() on the builder.
97  * Objects are described by <object> elements, which can contain
98  * <property> elements to set properties, <signal> elements which
99  * connect signals to handlers, and <child> elements, which describe
100  * child objects (most often widgets inside a container, but also e.g.
101  * actions in an action group, or columns in a tree model). A <child>
102  * element contains an <object> element which describes the child object.
103  * The target toolkit version(s) are described by <requires> elements,
104  * the “lib” attribute specifies the widget library in question (currently
105  * the only supported value is “gtk+”) and the “version” attribute specifies
106  * the target version in the form “<major>.<minor>”. The builder will error
107  * out if the version requirements are not met.
108  * 
109  * Typically, the specific kind of object represented by an <object>
110  * element is specified by the “class” attribute. If the type has not
111  * been loaded yet, GTK+ tries to find the get_type() function from the
112  * class name by applying heuristics. This works in most cases, but if
113  * necessary, it is possible to specify the name of the get_type() function
114  * explictly with the "type-func" attribute. As a special case, GtkBuilder
115  * allows to use an object that has been constructed by a #GtkUIManager in
116  * another part of the UI definition by specifying the id of the #GtkUIManager
117  * in the “constructor” attribute and the name of the object in the “id”
118  * attribute.
119  * 
120  * Objects may be given a name with the “id” attribute, which allows the
121  * application to retrieve them from the builder with gtk_builder_get_object().
122  * An id is also necessary to use the object as property value in other
123  * parts of the UI definition. GTK+ reserves ids starting and ending
124  * with ___ (3 underscores) for its own purposes.
125  * 
126  * Setting properties of objects is pretty straightforward with the
127  * <property> element: the “name” attribute specifies the name of the
128  * property, and the content of the element specifies the value.
129  * If the “translatable” attribute is set to a true value, GTK+ uses
130  * gettext() (or dgettext() if the builder has a translation domain set)
131  * to find a translation for the value. This happens before the value
132  * is parsed, so it can be used for properties of any type, but it is
133  * probably most useful for string properties. It is also possible to
134  * specify a context to disambiguate short strings, and comments which
135  * may help the translators.
136  * 
137  * GtkBuilder can parse textual representations for the most common
138  * property types: characters, strings, integers, floating-point numbers,
139  * booleans (strings like “TRUE”, “t”, “yes”, “y”, “1” are interpreted
140  * as %TRUE, strings like “FALSE”, “f”, “no”, “n”, “0” are interpreted
141  * as %FALSE), enumerations (can be specified by their name, nick or
142  * integer value), flags (can be specified by their name, nick, integer
143  * value, optionally combined with “|”, e.g. “GTK_VISIBLE|GTK_REALIZED”)
144  * and colors (in a format understood by gdk_rgba_parse()). Pixbufs can
145  * be specified as a filename of an image file to load. Objects can be
146  * referred to by their name and by default refer to objects declared
147  * in the local xml fragment and objects exposed via
148  * gtk_builder_expose_object().
149  * 
150  * In general, GtkBuilder allows forward references to objects —
151  * declared in the local xml; an object doesn’t have to be constructed
152  * before it can be referred to. The exception to this rule is that an
153  * object has to be constructed before it can be used as the value of
154  * a construct-only property.
155  * 
156  * It is also possible to bind a property value to another object's
157  * property value using the attributes
158  * "bind-source" to specify the source object of the binding,
159  * "bind-property" to specify the source property and optionally
160  * "bind-flags" to specify the binding flags
161  * Internally builder implement this using GBinding objects.
162  * For more information see g_object_bind_property()
163  * 
164  * Signal handlers are set up with the <signal> element. The “name”
165  * attribute specifies the name of the signal, and the “handler” attribute
166  * specifies the function to connect to the signal. By default, GTK+ tries
167  * to find the handler using g_module_symbol(), but this can be changed by
168  * passing a custom #GtkBuilderConnectFunc to
169  * gtk_builder_connect_signals_full(). The remaining attributes, “after”,
170  * “swapped” and “object”, have the same meaning as the corresponding
171  * parameters of the g_signal_connect_object() or
172  * g_signal_connect_data() functions. A “last_modification_time”
173  * attribute is also allowed, but it does not have a meaning to the
174  * builder.
175  * 
176  * Sometimes it is necessary to refer to widgets which have implicitly
177  * been constructed by GTK+ as part of a composite widget, to set
178  * properties on them or to add further children (e.g. the @vbox of
179  * a #GtkDialog). This can be achieved by setting the “internal-child”
180  * propery of the <child> element to a true value. Note that GtkBuilder
181  * still requires an <object> element for the internal child, even if it
182  * has already been constructed.
183  * 
184  * A number of widgets have different places where a child can be added
185  * (e.g. tabs vs. page content in notebooks). This can be reflected in
186  * a UI definition by specifying the “type” attribute on a <child>
187  * The possible values for the “type” attribute are described in the
188  * sections describing the widget-specific portions of UI definitions.
189  * 
190  * # A GtkBuilder UI Definition
191  * 
192  * |[
193  * <interface>
194  * <object class="GtkDialog" id="dialog1">
195  * <child internal-child="vbox">
196  * <object class="GtkBox" id="vbox1">
197  * <property name="border-width">10</property>
198  * <child internal-child="action_area">
199  * <object class="GtkButtonBox" id="hbuttonbox1">
200  * <property name="border-width">20</property>
201  * <child>
202  * <object class="GtkButton" id="ok_button">
203  * <property name="label">gtk-ok</property>
204  * <property name="use-stock">TRUE</property>
205  * <signal name="clicked" handler="ok_button_clicked"/>
206  * </object>
207  * </child>
208  * </object>
209  * </child>
210  * </object>
211  * </child>
212  * </object>
213  * </interface>
214  * ]|
215  * 
216  * Beyond this general structure, several object classes define their
217  * own XML DTD fragments for filling in the ANY placeholders in the DTD
218  * above. Note that a custom element in a <child> element gets parsed by
219  * the custom tag handler of the parent object, while a custom element in
220  * an <object> element gets parsed by the custom tag handler of the object.
221  * 
222  * These XML fragments are explained in the documentation of the
223  * respective objects.
224  * 
225  * Additionally, since 3.10 a special <template> tag has been added
226  * to the format allowing one to define a widget class’s components.
227  * See the [GtkWidget documentation][composite-templates] for details.
228  */
229 public class Builder : ObjectG
230 {
231 	/** the main Gtk struct */
232 	protected GtkBuilder* gtkBuilder;
233 
234 	/** Get the main Gtk struct */
235 	public GtkBuilder* getBuilderStruct()
236 	{
237 		return gtkBuilder;
238 	}
239 
240 	/** the main Gtk struct as a void* */
241 	protected override void* getStruct()
242 	{
243 		return cast(void*)gtkBuilder;
244 	}
245 
246 	protected override void setStruct(GObject* obj)
247 	{
248 		gtkBuilder = cast(GtkBuilder*)obj;
249 		super.setStruct(obj);
250 	}
251 
252 	/**
253 	 * Sets our main struct and passes it to the parent class.
254 	 */
255 	public this (GtkBuilder* gtkBuilder, bool ownedRef = false)
256 	{
257 		this.gtkBuilder = gtkBuilder;
258 		super(cast(GObject*)gtkBuilder, ownedRef);
259 	}
260 
261 	/**
262 	 * Creates a new builder object.
263 	 * Since 2.12
264 	 * Throws: ConstructionException GTK+ fails to create the object.
265 	 */
266 	public this ()
267 	{
268 		// GtkBuilder* gtk_builder_new (void);
269 		auto p = gtk_builder_new();
270 		if(p is null)
271 		{
272 			throw new ConstructionException("null returned by gtk_builder_new()");
273 		}
274 		this(cast(GtkBuilder*) p);
275 		
276 		GtkBuilderClass* klass = Type.getInstanceClass!(GtkBuilderClass)( this );
277 		klass.getTypeFromName = &gtk_builder_real_get_type_from_name_override;
278 	}
279 	
280 	/**
281 	 * This function is a modification of _gtk_builder_resolve_type_lazily from "gtk/gtkbuilder.c".
282 	 * It is needed because it assumes we are linking at compile time to the gtk libs.
283 	 * specifically the NULL in g_module_open( NULL, 0 );
284 	 * It replaces the default function pointer "get_type_from_name" in GtkBuilderClass.
285 	 */
286 	extern(C) private static GType gtk_builder_real_get_type_from_name_override ( GtkBuilder* builder, const(char)* name )
287 	{
288 		GType gtype;
289 		gtype = g_type_from_name( name );
290 		if (gtype != GType.INVALID)
291 		{
292 			return gtype;
293 		}
294 		
295 		/*
296 		 * Try to map a type name to a _get_type function
297 		 * and call it, eg:
298 		 *
299 		 * GtkWindow -> gtk_window_get_type
300 		 * GtkHBox -> gtk_hbox_get_type
301 		 * GtkUIManager -> gtk_ui_manager_get_type
302 		 *
303 		 */
304 		char   c;
305 		string symbol_name;
306 		
307 		for (int i = 0; name[i] != '\0'; i++)
308 		{
309 			c = name[i];
310 			/* skip if uppercase, first or previous is uppercase */
311 			if ((c == Str.asciiToupper (c) &&
312 				i > 0 && name[i-1] != Str.asciiToupper (name[i-1])) ||
313 			(i > 2 && name[i]   == Str.asciiToupper (name[i]) &&
314 			name[i-1] == Str.asciiToupper (name[i-1]) &&
315 			name[i-2] == Str.asciiToupper (name[i-2]))
316 			)
317 			
318 			symbol_name ~= '_';
319 			symbol_name ~= Str.asciiTolower (c);
320 		}
321 		symbol_name ~=  "_get_type" ;
322 		
323 		/* scan linked librarys for function symbol */
324 		foreach ( lib; importLibs )
325 		{
326 			GType function() func;
327 			Module mod = Module.open( lib, GModuleFlags.LAZY );
328 			if( mod is null )
329 				continue;
330 			
331 			scope(exit) mod.close();
332 			
333 			if ( mod.symbol( symbol_name, cast(void**)&func ) ) {
334 				return func();
335 		}
336 	}
337 	
338 	return GType.INVALID;
339 }
340 
341 /**
342  * Gets the object named name. Note that this function does not
343  * increment the reference count of the returned object.
344  * Since 2.12
345  * Params:
346  * name = name of object to get
347  * Returns: the object named name or NULL if it could not be found in the object tree.. transfer none.
348  */
349 public ObjectG getObject(string name)
350 {
351 	// GObject* gtk_builder_get_object (GtkBuilder *builder,  const gchar *name);
352 	return newFromObject( gtk_builder_get_object(gtkBuilder, Str.toStringz(name)) );
353 }
354 
355 /**
356  * Gets all objects that have been constructed by builder.
357  * Since 2.12
358  * Returns: an array containing all the objects constructed by the GtkBuilder instance.
359  */
360 public ObjectG[] getObjects()
361 {
362 	ObjectG[] objects;
363 	
364 	// GSList* gtk_builder_get_objects (GtkBuilder *builder);
365 	GSList* list = gtk_builder_get_objects(gtkBuilder);
366 	
367 	while ( list.next !is null )
368 	{
369 		objects ~= newFromObject( cast(GObject*)list.data );
370 		list = list.next;
371 	}
372 	
373 	g_slist_free(list);
374 	
375 	return objects;
376 }
377 
378 /**
379  * This function creates an D object corresponding to the Struct pointer passed in.
380  */
381 public ObjectG newFromObject(GObject* cobj)
382 {
383 	if(cobj is null)
384 	{
385 		return null;
386 	}
387 	
388 	void* dObj = g_object_get_data(cobj, Str.toStringz("GObject"));
389 	
390 	if ( dObj !is null )
391 	{
392 		return cast(ObjectG)dObj;
393 	}
394 	
395 	string type = convertClassName(Type.name((cast(GTypeInstance*)cobj).gClass.gType));
396 	ClassInfo ci = cast(ClassInfo)ClassInfo.find(type);
397 	
398 	//Gobject and Gio types both start with g, so try both.
399 	if(ci is null && startsWith(type, "gobject"))
400 	{
401 		ci = cast(ClassInfo)ClassInfo.find("gio"~ type[7..$]);
402 	}
403 	
404 	if(ci is null)
405 	{
406 		return null;
407 	}
408 	
409 	ObjectG obj = cast(ObjectG)gtkc.gtktypes._d_newclass(ci);
410 	
411 	obj.__ctor(cobj);
412 	
413 	return obj;
414 }
415 
416 /**
417  * Turn the name of a C Type in to the name of the corresponding D type.
418  * Note: If the prefix of the type is "G" this always usses "gobject" as
419  *     the prefix, extra care should be taken for types from GIO.
420  */
421 private string convertClassName(string gName)
422 {
423 	string conv;
424 	string prefix;
425 	
426 	if      ( startsWith(gName, "GtkSource" ) ) prefix = "Gsv";
427 	else if ( startsWith(gName, "Gtk") )        prefix = "Gtk";
428 	else if ( startsWith(gName, "Gdk") )        prefix = "Gdk";
429 	else if ( startsWith(gName, "Gst") )        prefix = "Gst";
430 	else if ( startsWith(gName, "Gda") )        prefix = "Gda";
431 	else if ( startsWith(gName, "Atk") )        prefix = "Atk";
432 	else if ( startsWith(gName, "G") )          prefix = "G";
433 	else if ( startsWith(gName, "Pango") )      prefix = "Pg";
434 	else if ( startsWith(gName, "cairo") )      prefix = "cairo";
435 	
436 	conv = gName[prefix.length..gName.length];
437 	
438 	if ( conv == "Object" ) conv ~= prefix;
439 	if ( prefix == "Pg" )   conv = "Pg" ~ gName[5..gName.length];
440 	if ( prefix == "cairo") conv = toUpper(gName[6..7]) ~ gName[7..gName.length - 2];
441 	
442 	prefix = toLower(prefix);
443 	
444 	if( prefix == "gst") prefix = "gstreamer";
445 	if( prefix == "g")   prefix = "gobject";
446 	if( prefix == "pg" ) prefix = "pango";
447 	
448 	return prefix ~"."~ conv ~"."~ conv;
449 }
450 
451 private bool startsWith(string str, string prefix)
452 {
453 	return str.length >= prefix.length && str[0..prefix.length] == prefix;
454 }
455 
456 /**
457  */
458 
459 /** */
460 public static GType getType()
461 {
462 	return gtk_builder_get_type();
463 }
464 
465 /**
466  * Builds the [GtkBuilder UI definition][BUILDER-UI]
467  * in the file @filename.
468  *
469  * If there is an error opening the file or parsing the description then
470  * the program will be aborted.  You should only ever attempt to parse
471  * user interface descriptions that are shipped as part of your program.
472  *
473  * Params:
474  *     filename = filename of user interface description file
475  *
476  * Return: a #GtkBuilder containing the described interface
477  *
478  * Since: 3.10
479  *
480  * Throws: ConstructionException GTK+ fails to create the object.
481  */
482 public this(string filename)
483 {
484 	auto p = gtk_builder_new_from_file(Str.toStringz(filename));
485 	
486 	if(p is null)
487 	{
488 		throw new ConstructionException("null returned by new_from_file");
489 	}
490 	
491 	this(cast(GtkBuilder*) p, true);
492 }
493 
494 /**
495  * Adds the @callback_symbol to the scope of @builder under the given @callback_name.
496  *
497  * Using this function overrides the behavior of gtk_builder_connect_signals()
498  * for any callback symbols that are added. Using this method allows for better
499  * encapsulation as it does not require that callback symbols be declared in
500  * the global namespace.
501  *
502  * Params:
503  *     callbackName = The name of the callback, as expected in the XML
504  *     callbackSymbol = The callback pointer
505  *
506  * Since: 3.10
507  */
508 public void addCallbackSymbol(string callbackName, GCallback callbackSymbol)
509 {
510 	gtk_builder_add_callback_symbol(gtkBuilder, Str.toStringz(callbackName), callbackSymbol);
511 }
512 
513 /**
514  * Parses a file containing a [GtkBuilder UI definition][BUILDER-UI]
515  * and merges it with the current contents of @builder.
516  *
517  * Most users will probably want to use gtk_builder_new_from_file().
518  *
519  * If an error occurs, 0 will be returned and @error will be assigned a
520  * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_FILE_ERROR
521  * domain.
522  *
523  * It’s not really reasonable to attempt to handle failures of this
524  * call. You should not use this function with untrusted files (ie:
525  * files that are not part of your application). Broken #GtkBuilder
526  * files can easily crash your program, and it’s possible that memory
527  * was leaked leading up to the reported failure. The only reasonable
528  * thing to do when an error is detected is to call g_error().
529  *
530  * Params:
531  *     filename = the name of the file to parse
532  *
533  * Return: A positive value on success, 0 if an error occurred
534  *
535  * Since: 2.12
536  *
537  * Throws: GException on failure.
538  */
539 public uint addFromFile(string filename)
540 {
541 	GError* err = null;
542 	
543 	auto p = gtk_builder_add_from_file(gtkBuilder, Str.toStringz(filename), &err);
544 	
545 	if (err !is null)
546 	{
547 		throw new GException( new ErrorG(err) );
548 	}
549 	
550 	return p;
551 }
552 
553 /**
554  * Parses a resource file containing a [GtkBuilder UI definition][BUILDER-UI]
555  * and merges it with the current contents of @builder.
556  *
557  * Most users will probably want to use gtk_builder_new_from_resource().
558  *
559  * If an error occurs, 0 will be returned and @error will be assigned a
560  * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_RESOURCE_ERROR
561  * domain.
562  *
563  * It’s not really reasonable to attempt to handle failures of this
564  * call.  The only reasonable thing to do when an error is detected is
565  * to call g_error().
566  *
567  * Params:
568  *     resourcePath = the path of the resource file to parse
569  *
570  * Return: A positive value on success, 0 if an error occurred
571  *
572  * Since: 3.4
573  *
574  * Throws: GException on failure.
575  */
576 public uint addFromResource(string resourcePath)
577 {
578 	GError* err = null;
579 	
580 	auto p = gtk_builder_add_from_resource(gtkBuilder, Str.toStringz(resourcePath), &err);
581 	
582 	if (err !is null)
583 	{
584 		throw new GException( new ErrorG(err) );
585 	}
586 	
587 	return p;
588 }
589 
590 /**
591  * Parses a string containing a [GtkBuilder UI definition][BUILDER-UI]
592  * and merges it with the current contents of @builder.
593  *
594  * Most users will probably want to use gtk_builder_new_from_string().
595  *
596  * Upon errors 0 will be returned and @error will be assigned a
597  * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or
598  * #G_VARIANT_PARSE_ERROR domain.
599  *
600  * It’s not really reasonable to attempt to handle failures of this
601  * call.  The only reasonable thing to do when an error is detected is
602  * to call g_error().
603  *
604  * Params:
605  *     buffer = the string to parse
606  *     length = the length of @buffer (may be -1 if @buffer is nul-terminated)
607  *
608  * Return: A positive value on success, 0 if an error occurred
609  *
610  * Since: 2.12
611  *
612  * Throws: GException on failure.
613  */
614 public uint addFromString(string buffer)
615 {
616 	GError* err = null;
617 	
618 	auto p = gtk_builder_add_from_string(gtkBuilder, Str.toStringz(buffer), cast(size_t)buffer.length, &err);
619 	
620 	if (err !is null)
621 	{
622 		throw new GException( new ErrorG(err) );
623 	}
624 	
625 	return p;
626 }
627 
628 /**
629  * Parses a file containing a [GtkBuilder UI definition][BUILDER-UI]
630  * building only the requested objects and merges
631  * them with the current contents of @builder.
632  *
633  * Upon errors 0 will be returned and @error will be assigned a
634  * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_FILE_ERROR
635  * domain.
636  *
637  * If you are adding an object that depends on an object that is not
638  * its child (for instance a #GtkTreeView that depends on its
639  * #GtkTreeModel), you have to explicitly list all of them in @object_ids.
640  *
641  * Params:
642  *     filename = the name of the file to parse
643  *     objectIds = nul-terminated array of objects to build
644  *
645  * Return: A positive value on success, 0 if an error occurred
646  *
647  * Since: 2.14
648  *
649  * Throws: GException on failure.
650  */
651 public uint addObjectsFromFile(string filename, string[] objectIds)
652 {
653 	GError* err = null;
654 	
655 	auto p = gtk_builder_add_objects_from_file(gtkBuilder, Str.toStringz(filename), Str.toStringzArray(objectIds), &err);
656 	
657 	if (err !is null)
658 	{
659 		throw new GException( new ErrorG(err) );
660 	}
661 	
662 	return p;
663 }
664 
665 /**
666  * Parses a resource file containing a [GtkBuilder UI definition][BUILDER-UI]
667  * building only the requested objects and merges
668  * them with the current contents of @builder.
669  *
670  * Upon errors 0 will be returned and @error will be assigned a
671  * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_RESOURCE_ERROR
672  * domain.
673  *
674  * If you are adding an object that depends on an object that is not
675  * its child (for instance a #GtkTreeView that depends on its
676  * #GtkTreeModel), you have to explicitly list all of them in @object_ids.
677  *
678  * Params:
679  *     resourcePath = the path of the resource file to parse
680  *     objectIds = nul-terminated array of objects to build
681  *
682  * Return: A positive value on success, 0 if an error occurred
683  *
684  * Since: 3.4
685  *
686  * Throws: GException on failure.
687  */
688 public uint addObjectsFromResource(string resourcePath, string[] objectIds)
689 {
690 	GError* err = null;
691 	
692 	auto p = gtk_builder_add_objects_from_resource(gtkBuilder, Str.toStringz(resourcePath), Str.toStringzArray(objectIds), &err);
693 	
694 	if (err !is null)
695 	{
696 		throw new GException( new ErrorG(err) );
697 	}
698 	
699 	return p;
700 }
701 
702 /**
703  * Parses a string containing a [GtkBuilder UI definition][BUILDER-UI]
704  * building only the requested objects and merges
705  * them with the current contents of @builder.
706  *
707  * Upon errors 0 will be returned and @error will be assigned a
708  * #GError from the #GTK_BUILDER_ERROR or #G_MARKUP_ERROR domain.
709  *
710  * If you are adding an object that depends on an object that is not
711  * its child (for instance a #GtkTreeView that depends on its
712  * #GtkTreeModel), you have to explicitly list all of them in @object_ids.
713  *
714  * Params:
715  *     buffer = the string to parse
716  *     length = the length of @buffer (may be -1 if @buffer is nul-terminated)
717  *     objectIds = nul-terminated array of objects to build
718  *
719  * Return: A positive value on success, 0 if an error occurred
720  *
721  * Since: 2.14
722  *
723  * Throws: GException on failure.
724  */
725 public uint addObjectsFromString(string buffer, size_t length, string[] objectIds)
726 {
727 	GError* err = null;
728 	
729 	auto p = gtk_builder_add_objects_from_string(gtkBuilder, Str.toStringz(buffer), length, Str.toStringzArray(objectIds), &err);
730 	
731 	if (err !is null)
732 	{
733 		throw new GException( new ErrorG(err) );
734 	}
735 	
736 	return p;
737 }
738 
739 /**
740  * This method is a simpler variation of gtk_builder_connect_signals_full().
741  * It uses symbols explicitly added to @builder with prior calls to
742  * gtk_builder_add_callback_symbol(). In the case that symbols are not
743  * explicitly added; it uses #GModule’s introspective features (by opening the module %NULL)
744  * to look at the application’s symbol table. From here it tries to match
745  * the signal handler names given in the interface description with
746  * symbols in the application and connects the signals. Note that this
747  * function can only be called once, subsequent calls will do nothing.
748  *
749  * Note that unless gtk_builder_add_callback_symbol() is called for
750  * all signal callbacks which are referenced by the loaded XML, this
751  * function will require that #GModule be supported on the platform.
752  *
753  * If you rely on #GModule support to lookup callbacks in the symbol table,
754  * the following details should be noted:
755  *
756  * When compiling applications for Windows, you must declare signal callbacks
757  * with #G_MODULE_EXPORT, or they will not be put in the symbol table.
758  * On Linux and Unices, this is not necessary; applications should instead
759  * be compiled with the -Wl,--export-dynamic CFLAGS, and linked against
760  * gmodule-export-2.0.
761  *
762  * Params:
763  *     userData = user data to pass back with all signals
764  *
765  * Since: 2.12
766  */
767 public void connectSignals(void* userData)
768 {
769 	gtk_builder_connect_signals(gtkBuilder, userData);
770 }
771 
772 /**
773  * This function can be thought of the interpreted language binding
774  * version of gtk_builder_connect_signals(), except that it does not
775  * require GModule to function correctly.
776  *
777  * Params:
778  *     func = the function used to connect the signals
779  *     userData = arbitrary data that will be passed to the connection function
780  *
781  * Since: 2.12
782  */
783 public void connectSignalsFull(GtkBuilderConnectFunc func, void* userData)
784 {
785 	gtk_builder_connect_signals_full(gtkBuilder, func, userData);
786 }
787 
788 /**
789  * Add @object to the @builder object pool so it can be referenced just like any
790  * other object built by builder.
791  *
792  * Params:
793  *     name = the name of the object exposed to the builder
794  *     object = the object to expose
795  *
796  * Since: 3.8
797  */
798 public void exposeObject(string name, ObjectG object)
799 {
800 	gtk_builder_expose_object(gtkBuilder, Str.toStringz(name), (object is null) ? null : object.getObjectGStruct());
801 }
802 
803 /**
804  * Main private entry point for building composite container
805  * components from template XML.
806  *
807  * This is exported purely to let gtk-builder-tool validate
808  * templates, applications have no need to call this function.
809  *
810  * Params:
811  *     widget = the widget that is being extended
812  *     templateType = the type that the template is for
813  *     buffer = the string to parse
814  *     length = the length of @buffer (may be -1 if @buffer is nul-terminated)
815  *
816  * Return: A positive value on success, 0 if an error occurred
817  *
818  * Throws: GException on failure.
819  */
820 public uint extendWithTemplate(Widget widget, GType templateType, string buffer, size_t length)
821 {
822 	GError* err = null;
823 	
824 	auto p = gtk_builder_extend_with_template(gtkBuilder, (widget is null) ? null : widget.getWidgetStruct(), templateType, Str.toStringz(buffer), length, &err);
825 	
826 	if (err !is null)
827 	{
828 		throw new GException( new ErrorG(err) );
829 	}
830 	
831 	return p;
832 }
833 
834 /**
835  * Gets the #GtkApplication associated with the builder.
836  *
837  * The #GtkApplication is used for creating action proxies as requested
838  * from XML that the builder is loading.
839  *
840  * By default, the builder uses the default application: the one from
841  * g_application_get_default(). If you want to use another application
842  * for constructing proxies, use gtk_builder_set_application().
843  *
844  * Return: the application being used by the builder,
845  *     or %NULL
846  *
847  * Since: 3.10
848  */
849 public Application getApplication()
850 {
851 	auto p = gtk_builder_get_application(gtkBuilder);
852 	
853 	if(p is null)
854 	{
855 		return null;
856 	}
857 	
858 	return ObjectG.getDObject!(Application)(cast(GtkApplication*) p);
859 }
860 
861 /**
862  * Gets the translation domain of @builder.
863  *
864  * Return: the translation domain. This string is owned
865  *     by the builder object and must not be modified or freed.
866  *
867  * Since: 2.12
868  */
869 public string getTranslationDomain()
870 {
871 	return Str.toString(gtk_builder_get_translation_domain(gtkBuilder));
872 }
873 
874 /**
875  * Looks up a type by name, using the virtual function that
876  * #GtkBuilder has for that purpose. This is mainly used when
877  * implementing the #GtkBuildable interface on a type.
878  *
879  * Params:
880  *     typeName = type name to lookup
881  *
882  * Return: the #GType found for @type_name or #G_TYPE_INVALID
883  *     if no type was found
884  *
885  * Since: 2.12
886  */
887 public GType getTypeFromName(string typeName)
888 {
889 	return gtk_builder_get_type_from_name(gtkBuilder, Str.toStringz(typeName));
890 }
891 
892 /**
893  * Fetches a symbol previously added to @builder
894  * with gtk_builder_add_callback_symbols()
895  *
896  * This function is intended for possible use in language bindings
897  * or for any case that one might be cusomizing signal connections
898  * using gtk_builder_connect_signals_full()
899  *
900  * Params:
901  *     callbackName = The name of the callback
902  *
903  * Return: The callback symbol in @builder for @callback_name, or %NULL
904  *
905  * Since: 3.10
906  */
907 public GCallback lookupCallbackSymbol(string callbackName)
908 {
909 	return gtk_builder_lookup_callback_symbol(gtkBuilder, Str.toStringz(callbackName));
910 }
911 
912 /**
913  * Sets the application associated with @builder.
914  *
915  * You only need this function if there is more than one #GApplication
916  * in your process. @application cannot be %NULL.
917  *
918  * Params:
919  *     application = a #GtkApplication
920  *
921  * Since: 3.10
922  */
923 public void setApplication(Application application)
924 {
925 	gtk_builder_set_application(gtkBuilder, (application is null) ? null : application.getGtkApplicationStruct());
926 }
927 
928 /**
929  * Sets the translation domain of @builder.
930  * See #GtkBuilder:translation-domain.
931  *
932  * Params:
933  *     domain = the translation domain or %NULL
934  *
935  * Since: 2.12
936  */
937 public void setTranslationDomain(string domain)
938 {
939 	gtk_builder_set_translation_domain(gtkBuilder, Str.toStringz(domain));
940 }
941 
942 /**
943  * This function demarshals a value from a string. This function
944  * calls g_value_init() on the @value argument, so it need not be
945  * initialised beforehand.
946  *
947  * This function can handle char, uchar, boolean, int, uint, long,
948  * ulong, enum, flags, float, double, string, #GdkColor, #GdkRGBA and
949  * #GtkAdjustment type values. Support for #GtkWidget type values is
950  * still to come.
951  *
952  * Upon errors %FALSE will be returned and @error will be assigned a
953  * #GError from the #GTK_BUILDER_ERROR domain.
954  *
955  * Params:
956  *     pspec = the #GParamSpec for the property
957  *     str = the string representation of the value
958  *     value = the #GValue to store the result in
959  *
960  * Return: %TRUE on success
961  *
962  * Since: 2.12
963  *
964  * Throws: GException on failure.
965  */
966 public bool valueFromString(ParamSpec pspec, string str, out Value value)
967 {
968 	GValue* outvalue = gMalloc!GValue();
969 	GError* err = null;
970 	
971 	auto p = gtk_builder_value_from_string(gtkBuilder, (pspec is null) ? null : pspec.getParamSpecStruct(), Str.toStringz(str), outvalue, &err) != 0;
972 	
973 	if (err !is null)
974 	{
975 		throw new GException( new ErrorG(err) );
976 	}
977 	
978 	value = ObjectG.getDObject!(Value)(outvalue, true);
979 	
980 	return p;
981 }
982 
983 /**
984  * Like gtk_builder_value_from_string(), this function demarshals
985  * a value from a string, but takes a #GType instead of #GParamSpec.
986  * This function calls g_value_init() on the @value argument, so it
987  * need not be initialised beforehand.
988  *
989  * Upon errors %FALSE will be returned and @error will be assigned a
990  * #GError from the #GTK_BUILDER_ERROR domain.
991  *
992  * Params:
993  *     type = the #GType of the value
994  *     str = the string representation of the value
995  *     value = the #GValue to store the result in
996  *
997  * Return: %TRUE on success
998  *
999  * Since: 2.12
1000  *
1001  * Throws: GException on failure.
1002  */
1003 public bool valueFromStringType(GType type, string str, out Value value)
1004 {
1005 	GValue* outvalue = gMalloc!GValue();
1006 	GError* err = null;
1007 	
1008 	auto p = gtk_builder_value_from_string_type(gtkBuilder, type, Str.toStringz(str), outvalue, &err) != 0;
1009 	
1010 	if (err !is null)
1011 	{
1012 		throw new GException( new ErrorG(err) );
1013 	}
1014 	
1015 	value = ObjectG.getDObject!(Value)(outvalue, true);
1016 	
1017 	return p;
1018 }
1019 }