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  * Conversion parameters:
26  * inFile  = GtkBuilder.html
27  * outPack = gtk
28  * outFile = Builder
29  * strct   = GtkBuilder
30  * realStrct=
31  * ctorStrct=
32  * clss    = Builder
33  * interf  = 
34  * class Code: Yes
35  * interface Code: No
36  * template for:
37  * extend  = 
38  * implements:
39  * prefixes:
40  * 	- gtk_builder_
41  * 	- gtk_
42  * omit structs:
43  * omit prefixes:
44  * omit code:
45  * 	- gtk_builder_get_object
46  * 	- gtk_builder_get_objects
47  * 	- gtk_builder_new
48  * omit signals:
49  * imports:
50  * 	- glib.ErrorG
51  * 	- glib.GException
52  * 	- glib.ListSG
53  * 	- glib.Str
54  * 	- gobject.ObjectG
55  * 	- gobject.ParamSpec
56  * 	- gobject.Value
57  * 	- std.string
58  * 	- gtkc.glib;
59  * 	- gtkc.gobject
60  * 	- gtkc.paths
61  * 	- glib.Module
62  * 	- gobject.Type
63  * structWrap:
64  * 	- GObject* -> ObjectG
65  * 	- GParamSpec* -> ParamSpec
66  * 	- GSList* -> ListSG
67  * 	- GValue* -> Value
68  * module aliases:
69  * local aliases:
70  * overrides:
71  */
72 
73 module gtk.Builder;
74 
75 public  import gtkc.gtktypes;
76 
77 private import gtkc.gtk;
78 private import glib.ConstructionException;
79 private import gobject.ObjectG;
80 
81 
82 private import glib.ErrorG;
83 private import glib.GException;
84 private import glib.ListSG;
85 private import glib.Str;
86 private import gobject.ObjectG;
87 private import gobject.ParamSpec;
88 private import gobject.Value;
89 private import gtkc.glib;;
90 private import gtkc.gobject;
91 private import gtkc.paths;
92 private import glib.Module;
93 private import gobject.Type;
94 
95 
96 version(Tango) {
97 	private import tango.text.Util;
98 	private import tango.text.Unicode;
99 } else {
100 	private import std.string;
101 }
102 
103 
104 private import gobject.ObjectG;
105 
106 /**
107  * Description
108  * A GtkBuilder is an auxiliary object that reads textual descriptions
109  * of a user interface and instantiates the described objects. To pass a
110  * description to a GtkBuilder, call gtk_builder_add_from_file() or
111  * gtk_builder_add_from_string(). These functions can be called multiple
112  * times; the builder merges the content of all descriptions.
113  * A GtkBuilder holds a reference to all objects that it has constructed
114  * and drops these references when it is finalized. This finalization can
115  * cause the destruction of non-widget objects or widgets which are not
116  * contained in a toplevel window. For toplevel windows constructed by a
117  * builder, it is the responsibility of the user to call gtk_widget_destroy()
118  * to get rid of them and all the widgets they contain.
119  * The functions gtk_builder_get_object() and gtk_builder_get_objects()
120  * can be used to access the widgets in the interface by the names assigned
121  * to them inside the UI description. Toplevel windows returned by these
122  * functions will stay around until the user explicitly destroys them
123  * with gtk_widget_destroy(). Other widgets will either be part of a
124  * larger hierarchy constructed by the builder (in which case you should
125  * not have to worry about their lifecycle), or without a parent, in which
126  * case they have to be added to some container to make use of them.
127  * Non-widget objects need to be reffed with g_object_ref() to keep them
128  * beyond the lifespan of the builder.
129  * The function gtk_builder_connect_signals() and variants thereof can be
130  * used to connect handlers to the named signals in the description.
131  * GtkBuilder UI Definitions
132  * GtkBuilder parses textual descriptions of user interfaces which
133  * are specified in an XML format which can be roughly described
134  * by the DTD below. We refer to these descriptions as
135  * GtkBuilder UI definitions or just
136  * UI definitions if the context is clear.
137  * Do not confuse GtkBuilder UI Definitions with
138  * GtkUIManager UI Definitions,
139  * which are more limited in scope.
140  * <!ELEMENT interface (requires|object)* >
141  * <!ELEMENT object (property|signal|child|ANY)* >
142  * <!ELEMENT property PCDATA >
143  * <!ELEMENT signal EMPTY >
144  * <!ELEMENT requires EMPTY >
145  * <!ELEMENT child (object|ANY*) >
146  * <!ATTLIST interface domain 	 #IMPLIED >
147  * <!ATTLIST object id 	 #REQUIRED
148  *  class 	 #REQUIRED
149  *  type-func 	 #IMPLIED
150  *  constructor 	 #IMPLIED >
151  * <!ATTLIST requires lib 	 #REQUIRED
152  *  version 	 #REQUIRED >
153  * <!ATTLIST property name 	 #REQUIRED
154  *  translatable 	 #IMPLIED
155  *  comments #IMPLIED
156  *  context #IMPLIED >
157  * <!ATTLIST signal name 	 #REQUIRED
158  *  handler 	 #REQUIRED
159  *  after 	 #IMPLIED
160  *  swapped 	 #IMPLIED
161  *  object 	 #IMPLIED
162  *  last_modification_time #IMPLIED >
163  * <!ATTLIST child type 	 #IMPLIED
164  *  internal-child 	 #IMPLIED >
165  * The toplevel element is <interface>.
166  * It optionally takes a "domain" attribute, which will make
167  * the builder look for translated strings using dgettext() in the
168  * domain specified. This can also be done by calling
169  * gtk_builder_set_translation_domain() on the builder.
170  * Objects are described by <object> elements, which can
171  * contain <property> elements to set properties, <signal>
172  * elements which connect signals to handlers, and <child>
173  * elements, which describe child objects (most often widgets
174  * inside a container, but also e.g. actions in an action group,
175  * or columns in a tree model). A <child> element contains
176  * an <object> element which describes the child object.
177  * The target toolkit version(s) are described by <requires>
178  * elements, the "lib" attribute specifies the widget library in
179  * question (currently the only supported value is "gtk+") and the "version"
180  * attribute specifies the target version in the form "<major>.<minor>".
181  * The builder will error out if the version requirements are not met.
182  * Typically, the specific kind of object represented by an
183  * <object> element is specified by the "class" attribute.
184  * If the type has not been loaded yet, GTK+ tries to find the
185  * _get_type() from the class name by applying
186  * heuristics. This works in most cases, but if necessary, it is
187  * possible to specify the name of the _get_type()
188  * explictly with the "type-func" attribute. As a special case,
189  * GtkBuilder allows to use an object that has been constructed
190  * by a GtkUIManager in another part of the UI definition by
191  * specifying the id of the GtkUIManager in the "constructor"
192  * attribute and the name of the object in the "id" attribute.
193  * Objects must be given a name with the "id" attribute, which
194  * allows the application to retrieve them from the builder with
195  * gtk_builder_get_object(). An id is also necessary to use the
196  * object as property value in other parts of the UI definition.
197  * Note
198  * Prior to 2.20, GtkBuilder was setting the "name"
199  * property of constructed widgets to the "id" attribute. In GTK+
200  * 2.20 or newer, you have to use gtk_buildable_get_name() instead
201  * of gtk_widget_get_name() to obtain the "id", or set the "name"
202  * property in your UI definition.
203  * Setting properties of objects is pretty straightforward with
204  * the <property> element: the "name" attribute specifies
205  * the name of the property, and the content of the element
206  * specifies the value. If the "translatable" attribute is
207  * set to a true value, GTK+ uses gettext() (or dgettext() if
208  * the builder has a translation domain set) to find a translation
209  * for the value. This happens before the value is parsed, so
210  * it can be used for properties of any type, but it is probably
211  * most useful for string properties. It is also possible to
212  * specify a context to disambiguate short strings, and comments
213  * which may help the translators.
214  * GtkBuilder can parse textual representations for the most
215  * common property types: characters, strings, integers, floating-point
216  * numbers, booleans (strings like "TRUE", "t", "yes", "y", "1" are
217  * interpreted as TRUE, strings like "FALSE, "f", "no", "n", "0" are
218  * interpreted as FALSE), enumerations (can be specified by their
219  * name, nick or integer value), flags (can be specified by their name,
220  * nick, integer value, optionally combined with "|", e.g.
221  * "GTK_VISIBLE|GTK_REALIZED") and colors (in a format understood by
222  * gdk_color_parse()). Objects can be referred to by their name.
223  * Pixbufs can be specified as a filename of an image file to load.
224  * In general, GtkBuilder allows forward references to objects —
225  * an object doesn't have to constructed before it can be referred to.
226  * The exception to this rule is that an object has to be constructed
227  * before it can be used as the value of a construct-only property.
228  * Signal handlers are set up with the <signal> element.
229  * The "name" attribute specifies the name of the signal, and the
230  * "handler" attribute specifies the function to connect to the signal.
231  * By default, GTK+ tries to find the handler using g_module_symbol(),
232  * but this can be changed by passing a custom GtkBuilderConnectFunc
233  * to gtk_builder_connect_signals_full(). The remaining attributes,
234  * "after", "swapped" and "object", have the same meaning as the
235  * corresponding parameters of the g_signal_connect_object() or
236  * g_signal_connect_data() functions. A "last_modification_time" attribute
237  * is also allowed, but it does not have a meaning to the builder.
238  * Sometimes it is necessary to refer to widgets which have implicitly
239  * been constructed by GTK+ as part of a composite widget, to set
240  * properties on them or to add further children (e.g. the vbox
241  * of a GtkDialog). This can be achieved by setting the "internal-child"
242  * propery of the <child> element to a true value. Note that
243  * GtkBuilder still requires an <object> element for the internal
244  * child, even if it has already been constructed.
245  * A number of widgets have different places where a child can be
246  * added (e.g. tabs vs. page content in notebooks). This can be reflected
247  * in a UI definition by specifying the "type" attribute on a <child>
248  * The possible values for the "type" attribute are described in
249  * the sections describing the widget-specific portions of UI definitions.
250  * $(DDOC_COMMENT example)
251  * Beyond this general structure, several object classes define
252  * their own XML DTD fragments for filling in the ANY placeholders
253  * in the DTD above. Note that a custom element in a <child>
254  * element gets parsed by the custom tag handler of the parent
255  * object, while a custom element in an <object> element
256  * gets parsed by the custom tag handler of the object.
257  * These XML fragments are explained in the documentation of the
258  * respective objects, see
259  * GtkWidget,
260  * GtkLabel,
261  * GtkWindow,
262  * GtkContainer,
263  * GtkDialog,
264  * GtkCellLayout,
265  * GtkColorSelectionDialog,
266  * GtkFontSelectionDialog,
267  * GtkComboBoxEntry,
268  * GtkExpander,
269  * GtkFrame,
270  * GtkListStore,
271  * GtkTreeStore,
272  * GtkNotebook,
273  * GtkSizeGroup,
274  * GtkTreeView,
275  * GtkUIManager,
276  * GtkActionGroup.
277  * GtkMenuItem,
278  * GtkAssistant,
279  * GtkScale.
280  */
281 public class Builder : ObjectG
282 {
283 	
284 	/** the main Gtk struct */
285 	protected GtkBuilder* gtkBuilder;
286 	
287 	
288 	public GtkBuilder* getBuilderStruct()
289 	{
290 		return gtkBuilder;
291 	}
292 	
293 	
294 	/** the main Gtk struct as a void* */
295 	protected override void* getStruct()
296 	{
297 		return cast(void*)gtkBuilder;
298 	}
299 	
300 	/**
301 	 * Sets our main struct and passes it to the parent class
302 	 */
303 	public this (GtkBuilder* gtkBuilder)
304 	{
305 		super(cast(GObject*)gtkBuilder);
306 		this.gtkBuilder = gtkBuilder;
307 	}
308 	
309 	protected override void setStruct(GObject* obj)
310 	{
311 		super.setStruct(obj);
312 		gtkBuilder = cast(GtkBuilder*)obj;
313 	}
314 	
315 	private struct GtkBuilderClass
316 	{
317 		GObjectClass parentClass;
318 		extern(C) GType function( GtkBuilder*, char* ) get_type_from_name;
319 		
320 		/* Padding for future expansion */
321 		extern(C) void  function()  _gtk_reserved1;
322 		extern(C) void  function()  _gtk_reserved2;
323 		extern(C) void  function()  _gtk_reserved3;
324 		extern(C) void  function()  _gtk_reserved4;
325 		extern(C) void  function()  _gtk_reserved5;
326 		extern(C) void  function()  _gtk_reserved6;
327 		extern(C) void  function()  _gtk_reserved7;
328 		extern(C) void  function()  _gtk_reserved8;
329 	}
330 	
331 	/**
332 	 * Creates a new builder object.
333 	 * Since 2.12
334 	 * Throws: ConstructionException GTK+ fails to create the object.
335 	 */
336 	public this ()
337 	{
338 		// GtkBuilder* gtk_builder_new (void);
339 		auto p = gtk_builder_new();
340 		if(p is null)
341 		{
342 			throw new ConstructionException("null returned by gtk_builder_new()");
343 		}
344 		this(cast(GtkBuilder*) p);
345 		
346 		GtkBuilderClass* klass = Type.getInstanceClass!(GtkBuilderClass)( this );
347 		klass.get_type_from_name = &gtk_builder_real_get_type_from_name_override;
348 	}
349 	
350 	/**
351 	 * This function is a modification of _gtk_builder_resolve_type_lazily from "gtk/gtkbuilder.c".
352 	 * It is needed because it assumes we are linking at compile time to the gtk libs.
353 	 * specifically the NULL in g_module_open( NULL, 0 );
354 	 * It replaces the default function pointer "get_type_from_name" in GtkBuilderClass.
355 	 */
356 	extern(C) private static GType gtk_builder_real_get_type_from_name_override ( GtkBuilder* builder, char *name )
357 	{
358 		GType gtype;
359 		gtype = g_type_from_name( name );
360 		if (gtype != GType.INVALID)
361 		{
362 			return gtype;
363 		}
364 		
365 		/*
366 		 * Try to map a type name to a _get_type function
367 		 * and call it, eg:
368 		 *
369 		 * GtkWindow -> gtk_window_get_type
370 		 * GtkHBox -> gtk_hbox_get_type
371 		 * GtkUIManager -> gtk_ui_manager_get_type
372 		 *
373 		 */
374 		char   c;
375 		string symbol_name;
376 		
377 		for (int i = 0; name[i] != '\0'; i++)
378 		{
379 			c = name[i];
380 			/* skip if uppercase, first or previous is uppercase */
381 			if ((c == Str.asciiToupper (c) &&
382 			i > 0 && name[i-1] != Str.asciiToupper (name[i-1])) ||
383 			(i > 2 && name[i]   == Str.asciiToupper (name[i]) &&
384 			name[i-1] == Str.asciiToupper (name[i-1]) &&
385 			name[i-2] == Str.asciiToupper (name[i-2]))
386 			)
387 			
388 			symbol_name ~= '_';
389 			symbol_name ~= Str.asciiTolower (c);
390 		}
391 		symbol_name ~=  "_get_type" ;
392 		
393 		/* scan linked librarys for function symbol */
394 		foreach ( lib; importLibs )
395 		{
396 			GType function() func;
397 			Module mod = Module.open( libPath ~ lib, GModuleFlags.BIND_LAZY );
398 			if( mod is null )
399 			continue;
400 			
401 			scope(exit) mod.close();
402 			
403 			if ( mod.symbol( symbol_name, cast(void**) &func ) ) {
404 				return func();
405 			}
406 		}
407 		
408 		return GType.INVALID;
409 	}
410 	
411 	/**
412 	 * Gets the object named name. Note that this function does not
413 	 * increment the reference count of the returned object.
414 	 * Since 2.12
415 	 * Params:
416 	 * name = name of object to get
417 	 * Returns: the object named name or NULL if it could not be found in the object tree.. transfer none.
418 	 */
419 	public ObjectG getObject(string name)
420 	{
421 		// GObject* gtk_builder_get_object (GtkBuilder *builder,  const gchar *name);
422 		return newFromObject( gtk_builder_get_object(gtkBuilder, Str.toStringz(name)) );
423 	}
424 	
425 	/**
426 	 * Gets all objects that have been constructed by builder.
427 	 * Since 2.12
428 	 * Returns: an array containing all the objects constructed by the GtkBuilder instance.
429 	 */
430 	public ObjectG[] getObjects()
431 	{
432 		ObjectG[] objects;
433 		
434 		// GSList* gtk_builder_get_objects (GtkBuilder *builder);
435 		GSList* list = gtk_builder_get_objects(gtkBuilder);
436 		
437 		while ( list.next !is null )
438 		{
439 			objects ~= newFromObject( cast(GObject*)list.data );
440 			list = list.next;
441 		}
442 		
443 		g_slist_free(list);
444 		
445 		return objects;
446 	}
447 	
448 	/**
449 	 * This function creates an D object corresponding to the Struct pointer passed in.
450 	 */
451 	public ObjectG newFromObject(GObject* cobj)
452 	{
453 		version(LDC)
454 		{
455 			version(D_Version2)
456 			{
457 				alias ClassInfo.find findClassInfo;
458 			}
459 		}
460 		else
461 		{
462 			alias ClassInfo.find findClassInfo;
463 		}
464 		
465 		if(cobj is null)
466 		{
467 			return null;
468 		}
469 		
470 		void* dObj = g_object_get_data(cobj, Str.toStringz("GObject"));
471 		
472 		if ( dObj !is null )
473 		{
474 			return cast(ObjectG)dObj;
475 		}
476 		
477 		string type = convertClassName(Type.name((cast(GTypeInstance*)cobj).gClass.gType));
478 		ClassInfo ci = cast(ClassInfo)findClassInfo(type);
479 		
480 		//Gobject and Gio types both start with g, so try both.
481 		if(ci is null && startsWith(type, "gobject"))
482 		{
483 			ci = cast(ClassInfo)findClassInfo("gio"~ type[7..$]);
484 		}
485 		
486 		if(ci is null)
487 		{
488 			return null;
489 		}
490 		
491 		ObjectG obj = cast(ObjectG)_d_newclass(ci);
492 		
493 		version(D_Version2)
494 		{
495 			obj.__ctor(cobj);
496 		}
497 		else
498 		{
499 			obj._ctor(cobj);
500 		}
501 		
502 		return obj;
503 	}
504 	
505 	/**
506 	 * Turn the name of a C Type in to the name of the corresponding D type.
507 	 * Note: If the prefix of the type is "G" this always usses "gobject" as
508 	 *     the prefix, extra care should be taken for types from GIO.
509 	 */
510 	private string convertClassName(string gName)
511 	{
512 		string conv;
513 		string prefix;
514 		
515 		version(Tango)
516 		{
517 			alias toUpper toupper;
518 			alias toLower tolower;
519 		}
520 		version(D_Version2)
521 		{
522 			alias toUpper toupper;
523 			alias toLower tolower;
524 		}
525 		
526 		if      ( startsWith(gName, "GtkSource" ) ) prefix = "Gsv";
527 		else if ( startsWith(gName, "Gtk") )        prefix = "Gtk";
528 		else if ( startsWith(gName, "Gdk") )        prefix = "Gdk";
529 		else if ( startsWith(gName, "Gst") )        prefix = "Gst";
530 		else if ( startsWith(gName, "Gda") )        prefix = "Gda";
531 		else if ( startsWith(gName, "Atk") )        prefix = "Atk";
532 		else if ( startsWith(gName, "G") )          prefix = "G";
533 		else if ( startsWith(gName, "Pango") )      prefix = "Pg";
534 		else if ( startsWith(gName, "cairo") )      prefix = "cairo";
535 		
536 		conv = gName[prefix.length..gName.length];
537 		
538 		if ( conv == "Object" ) conv ~= prefix;
539 		if ( prefix == "Pg" )   conv = "Pg" ~ gName[5..gName.length];
540 		if ( prefix == "cairo") conv = toupper(gName[6..7]) ~ gName[7..gName.length - 2];
541 		
542 		prefix = tolower(prefix);
543 		
544 		if( prefix == "gst") prefix = "gstreamer";
545 		if( prefix == "g")   prefix = "gobject";
546 		if( prefix == "pg" ) prefix = "pango";
547 		
548 		return prefix ~"."~ conv ~"."~ conv;
549 	}
550 	
551 	private bool startsWith(string str, string prefix)
552 	{
553 		return str.length >= prefix.length && str[0..prefix.length] == prefix;
554 	}
555 	
556 	version(LDC)
557 	{
558 		//version( !D_Version2 )
559 		version(D_Version2) {} else
560 		{
561 			private Object _d_newclass(ClassInfo ci)
562 			{
563 				void* p = cast(void*)_d_allocclass(ci);
564 				(cast(byte*) p)[0 .. ci.init.length] = ci.init[];
565 				
566 				return cast(Object) p;
567 			}
568 			
569 			private ClassInfo findClassInfo(string classname)
570 			{
571 				foreach ( m; ModuleInfo )
572 				{
573 					foreach ( c; m.localClasses )
574 					{
575 						if ( c.name == classname )
576 						return c;
577 					}
578 				}
579 				
580 				return null;
581 			}
582 		}
583 	}
584 	
585 	/**
586 	 */
587 	
588 	/**
589 	 * Parses a file containing a GtkBuilder
590 	 * UI definition and merges it with the current contents of builder.
591 	 * Upon errors 0 will be returned and error will be assigned a
592 	 * GError from the GTK_BUILDER_ERROR, G_MARKUP_ERROR or G_FILE_ERROR
593 	 * domain.
594 	 * Since 2.12
595 	 * Params:
596 	 * filename = the name of the file to parse
597 	 * Returns: A positive value on success, 0 if an error occurred
598 	 * Throws: GException on failure.
599 	 */
600 	public uint addFromFile(string filename)
601 	{
602 		// guint gtk_builder_add_from_file (GtkBuilder *builder,  const gchar *filename,  GError **error);
603 		GError* err = null;
604 		
605 		auto p = gtk_builder_add_from_file(gtkBuilder, Str.toStringz(filename), &err);
606 		
607 		if (err !is null)
608 		{
609 			throw new GException( new ErrorG(err) );
610 		}
611 		
612 		return p;
613 	}
614 	
615 	/**
616 	 * Parses a string containing a GtkBuilder
617 	 * UI definition and merges it with the current contents of builder.
618 	 * Upon errors 0 will be returned and error will be assigned a
619 	 * GError from the GTK_BUILDER_ERROR or G_MARKUP_ERROR domain.
620 	 * Since 2.12
621 	 * Params:
622 	 * buffer = the string to parse
623 	 * length = the length of buffer (may be -1 if buffer is nul-terminated)
624 	 * Returns: A positive value on success, 0 if an error occurred
625 	 * Throws: GException on failure.
626 	 */
627 	public uint addFromString(string buffer, gsize length)
628 	{
629 		// guint gtk_builder_add_from_string (GtkBuilder *builder,  const gchar *buffer,  gsize length,  GError **error);
630 		GError* err = null;
631 		
632 		auto p = gtk_builder_add_from_string(gtkBuilder, Str.toStringz(buffer), length, &err);
633 		
634 		if (err !is null)
635 		{
636 			throw new GException( new ErrorG(err) );
637 		}
638 		
639 		return p;
640 	}
641 	
642 	/**
643 	 * Parses a file containing a GtkBuilder
644 	 * UI definition building only the requested objects and merges
645 	 * them with the current contents of builder.
646 	 * Upon errors 0 will be returned and error will be assigned a
647 	 * GError from the GTK_BUILDER_ERROR, G_MARKUP_ERROR or G_FILE_ERROR
648 	 * domain.
649 	 * Note
650 	 * If you are adding an object that depends on an object that is not
651 	 * its child (for instance a GtkTreeView that depends on its
652 	 * GtkTreeModel), you have to explicitely list all of them in object_ids.
653 	 * Since 2.14
654 	 * Params:
655 	 * filename = the name of the file to parse
656 	 * objectIds = nul-terminated array of objects to build
657 	 * Returns: A positive value on success, 0 if an error occurred
658 	 * Throws: GException on failure.
659 	 */
660 	public uint addObjectsFromFile(string filename, string[] objectIds)
661 	{
662 		// guint gtk_builder_add_objects_from_file (GtkBuilder *builder,  const gchar *filename,  gchar **object_ids,  GError **error);
663 		GError* err = null;
664 		
665 		auto p = gtk_builder_add_objects_from_file(gtkBuilder, Str.toStringz(filename), Str.toStringzArray(objectIds), &err);
666 		
667 		if (err !is null)
668 		{
669 			throw new GException( new ErrorG(err) );
670 		}
671 		
672 		return p;
673 	}
674 	
675 	/**
676 	 * Parses a string containing a GtkBuilder
677 	 * UI definition building only the requested objects and merges
678 	 * them with the current contents of builder.
679 	 * Upon errors 0 will be returned and error will be assigned a
680 	 * GError from the GTK_BUILDER_ERROR or G_MARKUP_ERROR domain.
681 	 * Note
682 	 * If you are adding an object that depends on an object that is not
683 	 * its child (for instance a GtkTreeView that depends on its
684 	 * GtkTreeModel), you have to explicitely list all of them in object_ids.
685 	 * Since 2.14
686 	 * Params:
687 	 * buffer = the string to parse
688 	 * length = the length of buffer (may be -1 if buffer is nul-terminated)
689 	 * objectIds = nul-terminated array of objects to build
690 	 * Returns: A positive value on success, 0 if an error occurred
691 	 * Throws: GException on failure.
692 	 */
693 	public uint addObjectsFromString(string buffer, gsize length, string[] objectIds)
694 	{
695 		// guint gtk_builder_add_objects_from_string (GtkBuilder *builder,  const gchar *buffer,  gsize length,  gchar **object_ids,  GError **error);
696 		GError* err = null;
697 		
698 		auto p = gtk_builder_add_objects_from_string(gtkBuilder, Str.toStringz(buffer), length, Str.toStringzArray(objectIds), &err);
699 		
700 		if (err !is null)
701 		{
702 			throw new GException( new ErrorG(err) );
703 		}
704 		
705 		return p;
706 	}
707 	
708 	/**
709 	 * This method is a simpler variation of gtk_builder_connect_signals_full().
710 	 * It uses GModule's introspective features (by opening the module NULL)
711 	 * to look at the application's symbol table. From here it tries to match
712 	 * the signal handler names given in the interface description with
713 	 * symbols in the application and connects the signals.
714 	 * Note that this function will not work correctly if GModule is not
715 	 * supported on the platform.
716 	 * When compiling applications for Windows, you must declare signal callbacks
717 	 * with G_MODULE_EXPORT, or they will not be put in the symbol table.
718 	 * On Linux and Unices, this is not necessary; applications should instead
719 	 * be compiled with the -Wl,--export-dynamic CFLAGS, and linked against
720 	 * gmodule-export-2.0.
721 	 * Since 2.12
722 	 * Params:
723 	 * userData = a pointer to a structure sent in as user data to all signals
724 	 */
725 	public void connectSignals(void* userData)
726 	{
727 		// void gtk_builder_connect_signals (GtkBuilder *builder,  gpointer user_data);
728 		gtk_builder_connect_signals(gtkBuilder, userData);
729 	}
730 	
731 	/**
732 	 * This function can be thought of the interpreted language binding
733 	 * version of gtk_builder_connect_signals(), except that it does not
734 	 * require GModule to function correctly.
735 	 * Since 2.12
736 	 * Params:
737 	 * func = the function used to connect the signals. [scope call]
738 	 * userData = arbitrary data that will be passed to the connection function
739 	 */
740 	public void connectSignalsFull(GtkBuilderConnectFunc func, void* userData)
741 	{
742 		// void gtk_builder_connect_signals_full (GtkBuilder *builder,  GtkBuilderConnectFunc func,  gpointer user_data);
743 		gtk_builder_connect_signals_full(gtkBuilder, func, userData);
744 	}
745 	
746 	/**
747 	 * Sets the translation domain of builder.
748 	 * See "translation-domain".
749 	 * Since 2.12
750 	 * Params:
751 	 * domain = the translation domain or NULL. [allow-none]
752 	 */
753 	public void setTranslationDomain(string domain)
754 	{
755 		// void gtk_builder_set_translation_domain (GtkBuilder *builder,  const gchar *domain);
756 		gtk_builder_set_translation_domain(gtkBuilder, Str.toStringz(domain));
757 	}
758 	
759 	/**
760 	 * Gets the translation domain of builder.
761 	 * Since 2.12
762 	 * Returns: the translation domain. This string is owned by the builder object and must not be modified or freed.
763 	 */
764 	public string getTranslationDomain()
765 	{
766 		// const gchar * gtk_builder_get_translation_domain (GtkBuilder *builder);
767 		return Str.toString(gtk_builder_get_translation_domain(gtkBuilder));
768 	}
769 	
770 	/**
771 	 * Looks up a type by name, using the virtual function that
772 	 * GtkBuilder has for that purpose. This is mainly used when
773 	 * implementing the GtkBuildable interface on a type.
774 	 * Since 2.12
775 	 * Params:
776 	 * typeName = type name to lookup
777 	 * Returns: the GType found for type_name or G_TYPE_INVALID if no type was found
778 	 */
779 	public GType getTypeFromName(string typeName)
780 	{
781 		// GType gtk_builder_get_type_from_name (GtkBuilder *builder,  const char *type_name);
782 		return gtk_builder_get_type_from_name(gtkBuilder, Str.toStringz(typeName));
783 	}
784 	
785 	/**
786 	 * This function demarshals a value from a string. This function
787 	 * calls g_value_init() on the value argument, so it need not be
788 	 * initialised beforehand.
789 	 * This function can handle char, uchar, boolean, int, uint, long,
790 	 * ulong, enum, flags, float, double, string, GdkColor and
791 	 * GtkAdjustment type values. Support for GtkWidget type values is
792 	 * still to come.
793 	 * Upon errors FALSE will be returned and error will be assigned a
794 	 * GError from the GTK_BUILDER_ERROR domain.
795 	 * Since 2.12
796 	 * Params:
797 	 * pspec = the GParamSpec for the property
798 	 * string = the string representation of the value
799 	 * value = the GValue to store the result in. [out]
800 	 * Returns: TRUE on success
801 	 * Throws: GException on failure.
802 	 */
803 	public int valueFromString(ParamSpec pspec, string string, Value value)
804 	{
805 		// gboolean gtk_builder_value_from_string (GtkBuilder *builder,  GParamSpec *pspec,  const gchar *string,  GValue *value,  GError **error);
806 		GError* err = null;
807 		
808 		auto p = gtk_builder_value_from_string(gtkBuilder, (pspec is null) ? null : pspec.getParamSpecStruct(), Str.toStringz(string), (value is null) ? null : value.getValueStruct(), &err);
809 		
810 		if (err !is null)
811 		{
812 			throw new GException( new ErrorG(err) );
813 		}
814 		
815 		return p;
816 	}
817 	
818 	/**
819 	 * Like gtk_builder_value_from_string(), this function demarshals
820 	 * a value from a string, but takes a GType instead of GParamSpec.
821 	 * This function calls g_value_init() on the value argument, so it
822 	 * need not be initialised beforehand.
823 	 * Upon errors FALSE will be returned and error will be assigned a
824 	 * GError from the GTK_BUILDER_ERROR domain.
825 	 * Since 2.12
826 	 * Params:
827 	 * type = the GType of the value
828 	 * string = the string representation of the value
829 	 * value = the GValue to store the result in. [out]
830 	 * Returns: TRUE on success
831 	 * Throws: GException on failure.
832 	 */
833 	public int valueFromStringType(GType type, string string, Value value)
834 	{
835 		// gboolean gtk_builder_value_from_string_type (GtkBuilder *builder,  GType type,  const gchar *string,  GValue *value,  GError **error);
836 		GError* err = null;
837 		
838 		auto p = gtk_builder_value_from_string_type(gtkBuilder, type, Str.toStringz(string), (value is null) ? null : value.getValueStruct(), &err);
839 		
840 		if (err !is null)
841 		{
842 			throw new GException( new ErrorG(err) );
843 		}
844 		
845 		return p;
846 	}
847 }