[glade] Implemented GladeProject properties dialog with glade Added translation domain project property



commit 87278d0334166e1769d8863782dd8dc4fb5028b3
Author: Juan Pablo Ugarte <juanpablougarte gmail com>
Date:   Sat Mar 30 00:47:23 2013 -0300

    Implemented GladeProject properties dialog with glade
    Added translation domain project property

 gladeui/Makefile.am                     |   22 ++-
 gladeui/glade-app.c                     |    5 +
 gladeui/glade-project-properties.ui     |  308 +++++++++++++++++++++++
 gladeui/glade-project.c                 |  405 ++++++++++++++-----------------
 gladeui/glade-project.h                 |    4 +
 gladeui/gladeui-resources.gresource.xml |    6 +
 6 files changed, 524 insertions(+), 226 deletions(-)
---
diff --git a/gladeui/Makefile.am b/gladeui/Makefile.am
index f44a628..a12d62f 100644
--- a/gladeui/Makefile.am
+++ b/gladeui/Makefile.am
@@ -1,4 +1,5 @@
 ## Previewer
+include $(top_srcdir)/glade-rules.mk
 
 bin_PROGRAMS = glade-previewer
 lib_LTLIBRARIES = libgladeui-2.la
@@ -43,12 +44,22 @@ common_defines = \
        -DGLADE_BINDIR="\"$(bindir)\""\
        -DGLADE_LIBDIR="\"$(libdir)\""
 
-BUILT_SOURCES = glade-marshallers.c glade-marshallers.h
+BUILT_SOURCES = \
+       glade-marshallers.c \
+       glade-marshallers.h \
+       gladeui-resources.c \
+       gladeui-resources.h
 
-EXTRA_DIST = glade-marshallers.list gladeui.rc.in icon-naming-spec.c glade-previewer.rc.in
+EXTRA_DIST = \
+       glade-marshallers.list \
+       gladeui.rc.in \
+       icon-naming-spec.c \
+       glade-previewer.rc.in \
+       gladeui-resources.gresource.xml
 
 # The glade core library
 libgladeui_2_la_SOURCES = \
+       gladeui-resources.c \
        glade-debug.c \
        glade-object-stub.c \
        glade-xml-utils.c \
@@ -145,6 +156,7 @@ libgladeuiinclude_HEADERS = \
        glade-signal-model.h
 
 noinst_HEADERS = \
+       gladeui-resources.h \
        glade-marshallers.h \
        glade-design-layout.h \
        glade-object-stub.h \
@@ -217,3 +229,9 @@ typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 
 CLEANFILES += $(gir_DATA) $(typelib_DATA)
 endif
+
+# This could be split in two, but its better to rebuild both, sources and header
+# each time the xml or the actual resources files change, just in case. 
+gladeui-resources.c gladeui-resources.h: gladeui-resources.gresource.xml \
+       $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies gladeui-resources.gresource.xml)
+
diff --git a/gladeui/glade-app.c b/gladeui/glade-app.c
index 9ff11af..d6ca5aa 100644
--- a/gladeui/glade-app.c
+++ b/gladeui/glade-app.c
@@ -33,6 +33,7 @@
 
 #include "glade.h"
 #include "glade-debug.h"
+#include "gladeui-resources.h"
 #include "glade-cursor.h"
 #include "glade-catalog.h"
 #include "glade-design-view.h"
@@ -155,6 +156,8 @@ glade_app_finalize (GObject * app)
   singleton_app = NULL;
   check_initialised = FALSE;
 
+  gladeui_resources_unregister_resource ();
+
   G_OBJECT_CLASS (glade_app_parent_class)->finalize (app);
 }
 
@@ -353,6 +356,8 @@ glade_init (void)
   /* Register icons needed by the UI */
   glade_app_register_stock_icons (GTK_ICON_SIZE_LARGE_TOOLBAR);
 
+  gladeui_resources_register_resource ();
+  
   init = TRUE;
 }
 
diff --git a/gladeui/glade-project-properties.ui b/gladeui/glade-project-properties.ui
new file mode 100644
index 0000000..f8fdf63
--- /dev/null
+++ b/gladeui/glade-project-properties.ui
@@ -0,0 +1,308 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="glade">
+  <!-- interface-requires gtk+ 3.6 -->
+  <object class="GtkDialog" id="prefs_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="resizable">False</property>
+    <property name="type_hint">dialog</property>
+    <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+    <signal name="response" handler="gtk_widget_hide" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">4</property>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkGrid" id="grid2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin_left">12</property>
+                <property name="margin_top">6</property>
+                <property name="row_spacing">4</property>
+                <property name="column_spacing">4</property>
+                <child>
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Translation domain:</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="domain_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">●</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">0</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label5">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Project properties:</property>
+                <property name="use_markup">True</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkGrid" id="grid1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin_left">12</property>
+                <property name="margin_top">6</property>
+                <property name="row_spacing">4</property>
+                <property name="column_spacing">4</property>
+                <child>
+                  <object class="GtkRadioButton" id="resource_default_radio">
+                    <property name="label" translatable="yes">From the project directory</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">0</property>
+                    <property name="width">2</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="resource_relative_radio">
+                    <property name="label" translatable="yes">From a project relative directory</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">resource_default_radio</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">1</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="resource_fullpath_radio">
+                    <property name="label" translatable="yes">From this directory</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">resource_default_radio</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="top_attach">2</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFileChooserButton" id="full_path_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="hexpand">True</property>
+                    <property name="orientation">vertical</property>
+                    <property name="action">select-folder</property>
+                    <property name="title" translatable="yes">Choose a path to load image 
resources</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">2</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="relative_path_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="invisible_char">●</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="top_attach">1</property>
+                    <property name="width">1</property>
+                    <property name="height">1</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Image resources are loaded locally:</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkBox" id="toolkit_box">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin_left">12</property>
+                <property name="margin_top">6</property>
+                <property name="orientation">vertical</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Toolkit version required:</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="box2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="halign">center</property>
+            <property name="spacing">4</property>
+            <child>
+              <object class="GtkLabel" id="label4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="halign">start</property>
+                <property name="xalign">1</property>
+                <property name="label" translatable="yes">Verify versions and deprecations:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="verify_button">
+                <property name="label">gtk-execute</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="halign">start</property>
+                <property name="valign">center</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="close_button">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">6</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-3">close_button</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index cc3525b..642adcb 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -79,6 +79,7 @@ enum
   PROP_READ_ONLY,
   PROP_ADD_ITEM,
   PROP_POINTER_MODE,
+  PROP_TRANSLATION_DOMAIN,
   N_PROPERTIES
 };
 
@@ -88,6 +89,8 @@ struct _GladeProjectPrivate
 {
   gchar *path;                  /* The full canonical path of the glade file for this project */
 
+  gchar *translation_domain;    /* The project translation domain */
+
   gint unsaved_number;          /* A unique number for this project if it is untitled */
 
   GladeWidgetAdaptor *add_item; /* The next item to add to the project. */
@@ -144,6 +147,7 @@ struct _GladeProjectPrivate
   GtkWidget *resource_fullpath_radio;
   GtkWidget *relative_path_entry;
   GtkWidget *full_path_button;
+  GtkWidget *domain_entry;
 
   /* Store previews, so we can kill them on close */
   GHashTable *previews;
@@ -374,7 +378,9 @@ glade_project_finalize (GObject *object)
 
 static void
 glade_project_get_property (GObject *object,
-                            guint prop_id, GValue *value, GParamSpec *pspec)
+                            guint prop_id,
+                            GValue *value,
+                            GParamSpec *pspec)
 {
   GladeProject *project = GLADE_PROJECT (object);
 
@@ -398,6 +404,28 @@ glade_project_get_property (GObject *object,
     case PROP_POINTER_MODE:
       g_value_set_enum (value, project->priv->pointer_mode);
       break;
+    case PROP_TRANSLATION_DOMAIN:
+      g_value_set_string (value, project->priv->translation_domain);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+glade_project_set_property (GObject *object,
+                            guint prop_id,
+                            const GValue *value,
+                            GParamSpec *pspec)
+{
+
+  switch (prop_id)
+    {
+    case PROP_TRANSLATION_DOMAIN:
+      glade_project_set_translation_domain (GLADE_PROJECT (object),
+                                            g_value_get_string (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -799,6 +827,7 @@ glade_project_class_init (GladeProjectClass *klass)
   object_class = G_OBJECT_CLASS (klass);
 
   object_class->get_property = glade_project_get_property;
+  object_class->set_property = glade_project_set_property;
   object_class->finalize = glade_project_finalize;
   object_class->dispose = glade_project_dispose;
 
@@ -1023,6 +1052,13 @@ glade_project_class_init (GladeProjectClass *klass)
                        GLADE_TYPE_POINTER_MODE,
                        GLADE_POINTER_SELECT,
                        G_PARAM_READABLE);
+
+  properties[PROP_TRANSLATION_DOMAIN] =
+    g_param_spec_string ("translation-domain",
+                         _("Translation Domain"),
+                         _("The project translation domain"),
+                         NULL,
+                         G_PARAM_READWRITE);
   
   /* Install all properties */
   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
@@ -1571,6 +1607,7 @@ glade_project_load_internal (GladeProject *project)
   GladeXmlNode *node;
   GladeWidget *widget;
   gboolean has_gtk_dep = FALSE;
+  gchar *domain;
   gint count;
 
   priv->selection = NULL;
@@ -1603,6 +1640,9 @@ glade_project_load_internal (GladeProject *project)
   /* Emit "parse-began" signal */
   g_signal_emit (project, glade_project_signals[PARSE_BEGAN], 0);
 
+  if ((domain = glade_xml_get_property_string (root, GLADE_TAG_DOMAIN)))
+    glade_project_set_translation_domain (project, domain);
+
   /* XXX Need to load project->priv->comment ! */
   glade_project_read_comment (project, doc);
 
@@ -1672,6 +1712,19 @@ glade_project_load_internal (GladeProject *project)
 
 }
 
+static void
+glade_project_update_properties_title (GladeProject *project)
+{
+  gchar *name, *title;
+
+  /* Update prefs dialogs here... */
+  name = glade_project_get_name (project);
+  title = g_strdup_printf (_("%s document properties"), name);
+  gtk_window_set_title (GTK_WINDOW (project->priv->prefs_dialog), title);
+  g_free (title);
+  g_free (name); 
+}
+
 gboolean
 glade_project_load_from_file (GladeProject *project, const gchar *path)
 {
@@ -1683,19 +1736,9 @@ glade_project_load_from_file (GladeProject *project, const gchar *path)
   project->priv->path = glade_util_canonical_path (path);
   g_object_notify_by_pspec (G_OBJECT (project), properties[PROP_PATH]);
 
-  retval = glade_project_load_internal (project);
+  if ((retval = glade_project_load_internal (project)))
+    glade_project_update_properties_title (project);
 
-  if (retval)
-    {
-      gchar *name, *title;
-
-      /* Update prefs dialogs here... */
-      name = glade_project_get_name (project);
-      title = g_strdup_printf (_("%s document properties"), name);
-      gtk_window_set_title (GTK_WINDOW (project->priv->prefs_dialog), title);
-      g_free (title);
-      g_free (name);
-    }
   return retval;
 }
 
@@ -1712,7 +1755,6 @@ GladeProject *
 glade_project_load (const gchar *path)
 {
   GladeProject *project;
-  gboolean retval;
 
   g_return_val_if_fail (path != NULL, NULL);
 
@@ -1720,19 +1762,9 @@ glade_project_load (const gchar *path)
 
   project->priv->path = glade_util_canonical_path (path);
 
-  retval = glade_project_load_internal (project);
-
-  if (retval)
+  if (glade_project_load_internal (project))
     {
-      gchar *name, *title;
-
-      /* Update prefs dialogs here... */
-      name = glade_project_get_name (project);
-      title = g_strdup_printf (_("%s document properties"), name);
-      gtk_window_set_title (GTK_WINDOW (project->priv->prefs_dialog), title);
-      g_free (title);
-      g_free (name);
-
+      glade_project_update_properties_title (project);
       return project;
     }
   else
@@ -1878,6 +1910,7 @@ sort_project_dependancies (GObject *a, GObject *b)
 static GladeXmlContext *
 glade_project_write (GladeProject *project)
 {
+  GladeProjectPrivate *priv = project->priv;
   GladeXmlContext *context;
   GladeXmlDoc *doc;
   GladeXmlNode *root;           /* *comment_node; */
@@ -1888,6 +1921,9 @@ glade_project_write (GladeProject *project)
   root = glade_xml_node_new (context, GLADE_XML_TAG_PROJECT);
   glade_xml_doc_set_root (doc, root);
 
+  if (priv->translation_domain)
+    glade_xml_node_set_property_string (root, GLADE_TAG_DOMAIN, priv->translation_domain);
+  
   glade_project_update_comment (project);
   /* comment_node = glade_xml_node_new_comment (context, project->priv->comment); */
 
@@ -1957,18 +1993,11 @@ glade_project_save (GladeProject *project, const gchar *path, GError **error)
   if (project->priv->path == NULL ||
       strcmp (canonical_path, project->priv->path))
     {
-      gchar *name, *title;
-
       project->priv->path = (g_free (project->priv->path),
                              g_strdup (canonical_path));
       g_object_notify_by_pspec (G_OBJECT (project), properties[PROP_PATH]);
 
-      /* Update prefs dialogs here... */
-      name = glade_project_get_name (project);
-      title = g_strdup_printf (_("%s document properties"), name);
-      gtk_window_set_title (GTK_WINDOW (project->priv->prefs_dialog), title);
-      g_free (title);
-      g_free (name);
+      glade_project_update_properties_title (project);
     }
 
   glade_project_set_readonly (project,
@@ -3828,180 +3857,63 @@ resource_full_path_set (GtkFileChooserButton *button, GladeProject *project)
 static void
 update_prefs_for_resource_path (GladeProject *project)
 {
-  gtk_widget_set_sensitive (project->priv->full_path_button, FALSE);
-  gtk_widget_set_sensitive (project->priv->relative_path_entry, FALSE);
+  GladeProjectPrivate *priv = project->priv;
+  
+  gtk_widget_set_sensitive (priv->full_path_button, FALSE);
+  gtk_widget_set_sensitive (priv->relative_path_entry, FALSE);
 
 
-  g_signal_handlers_block_by_func (project->priv->resource_default_radio,
+  g_signal_handlers_block_by_func (priv->resource_default_radio,
                                    G_CALLBACK (resource_default_toggled),
                                    project);
-  g_signal_handlers_block_by_func (project->priv->resource_relative_radio,
+  g_signal_handlers_block_by_func (priv->resource_relative_radio,
                                    G_CALLBACK (resource_relative_toggled),
                                    project);
-  g_signal_handlers_block_by_func (project->priv->resource_fullpath_radio,
+  g_signal_handlers_block_by_func (priv->resource_fullpath_radio,
                                    G_CALLBACK (resource_fullpath_toggled),
                                    project);
-  g_signal_handlers_block_by_func (project->priv->relative_path_entry,
+  g_signal_handlers_block_by_func (priv->relative_path_entry,
                                    G_CALLBACK (resource_path_activated),
                                    project);
 
   if (project->priv->resource_path == NULL)
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
-                                  (project->priv->resource_default_radio),
-                                  TRUE);
-  else if (g_path_is_absolute (project->priv->resource_path))
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->resource_default_radio), TRUE);
+  else if (g_path_is_absolute (priv->resource_path))
     {
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
-                                    (project->priv->resource_fullpath_radio),
-                                    TRUE);
-      gtk_widget_set_sensitive (project->priv->full_path_button, TRUE);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->resource_fullpath_radio), TRUE);
+      gtk_widget_set_sensitive (priv->full_path_button, TRUE);
     }
   else
     {
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
-                                    (project->priv->resource_relative_radio),
-                                    TRUE);
-      gtk_widget_set_sensitive (project->priv->relative_path_entry, TRUE);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->resource_relative_radio), TRUE);
+      gtk_widget_set_sensitive (priv->relative_path_entry, TRUE);
     }
 
-  gtk_entry_set_text (GTK_ENTRY (project->priv->relative_path_entry),
-                      project->priv->resource_path ? project->priv->
-                      resource_path : "");
+  gtk_entry_set_text (GTK_ENTRY (priv->relative_path_entry),
+                      priv->resource_path ? priv->resource_path : "");
 
-  g_signal_handlers_unblock_by_func (project->priv->resource_default_radio,
+  g_signal_handlers_unblock_by_func (priv->resource_default_radio,
                                      G_CALLBACK (resource_default_toggled),
                                      project);
-  g_signal_handlers_unblock_by_func (project->priv->resource_relative_radio,
+  g_signal_handlers_unblock_by_func (priv->resource_relative_radio,
                                      G_CALLBACK (resource_relative_toggled),
                                      project);
-  g_signal_handlers_unblock_by_func (project->priv->resource_fullpath_radio,
+  g_signal_handlers_unblock_by_func (priv->resource_fullpath_radio,
                                      G_CALLBACK (resource_fullpath_toggled),
                                      project);
-  g_signal_handlers_unblock_by_func (project->priv->relative_path_entry,
+  g_signal_handlers_unblock_by_func (priv->relative_path_entry,
                                      G_CALLBACK (resource_path_activated),
                                      project);
 }
 
-
-static GtkWidget *
-glade_project_build_prefs_box (GladeProject *project)
+static void
+glade_project_target_version_box_fill (GladeProject *project, GtkWidget *vbox)
 {
-  GtkWidget *main_box, *button;
-  GtkWidget *vbox, *hbox, *frame;
-  GtkWidget *target_radio, *active_radio;
-  GtkWidget *label, *alignment;
+  GtkWidget *label, *active_radio, *target_radio, *hbox;
   GList *list, *targets;
-  gchar *string;
-  GtkWidget *main_frame, *main_alignment;
-  GtkSizeGroup *sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
-  main_frame = gtk_frame_new (NULL);
-  gtk_frame_set_shadow_type (GTK_FRAME (main_frame), GTK_SHADOW_NONE);
-  main_alignment = gtk_alignment_new (0.5F, 0.5F, 0.8F, 0.8F);
-  main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-
-  gtk_alignment_set_padding (GTK_ALIGNMENT (main_alignment), 0, 0, 4, 0);
-
-  gtk_container_add (GTK_CONTAINER (main_alignment), main_box);
-  gtk_container_add (GTK_CONTAINER (main_frame), main_alignment);
-
-  /* Resource path */
-  string =
-      g_strdup_printf ("<b>%s</b>", _("Image resources are loaded locally:"));
-  frame = gtk_frame_new (NULL);
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-  alignment = gtk_alignment_new (0.5F, 0.5F, 0.8F, 0.8F);
-  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 8, 0, 12, 0);
-  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
-  label = gtk_label_new (string);
-  g_free (string);
-  gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-
-  gtk_box_pack_start (GTK_BOX (main_box), frame, TRUE, TRUE, 2);
-  gtk_frame_set_label_widget (GTK_FRAME (frame), label);
-  gtk_container_add (GTK_CONTAINER (frame), alignment);
-  gtk_container_add (GTK_CONTAINER (alignment), vbox);
-
-  /* Project directory... */
-  project->priv->resource_default_radio =
-      gtk_radio_button_new_with_label (NULL, _("From the project directory"));
-  gtk_box_pack_start (GTK_BOX (vbox), project->priv->resource_default_radio,
-                      FALSE, FALSE, 0);
-  gtk_size_group_add_widget (sizegroup, project->priv->resource_default_radio);
-
-  /* Project relative directory... */
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  project->priv->resource_relative_radio =
-      gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON
-                                                   (project->priv->
-                                                    resource_default_radio),
-                                                   _("From a project relative directory"));
-
-  gtk_box_pack_start (GTK_BOX (hbox), project->priv->resource_relative_radio,
-                      TRUE, TRUE, 0);
-  project->priv->relative_path_entry = gtk_entry_new ();
-  gtk_box_pack_start (GTK_BOX (hbox), project->priv->relative_path_entry, FALSE,
-                      TRUE, 2);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-  gtk_size_group_add_widget (sizegroup, hbox);
-
-
-  /* fullpath directory... */
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  project->priv->resource_fullpath_radio =
-      gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON
-                                                   (project->priv->resource_default_radio),
-                                                   _("From this directory"));
-  gtk_box_pack_start (GTK_BOX (hbox), project->priv->resource_fullpath_radio,
-                      TRUE, TRUE, 0);
-
-  project->priv->full_path_button =
-      gtk_file_chooser_button_new (_("Choose a path to load image resources"),
-                                   GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
-  gtk_box_pack_start (GTK_BOX (hbox), project->priv->full_path_button, FALSE,
-                      TRUE, 2);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-  gtk_size_group_add_widget (sizegroup, hbox);
-
-  /* Pass ownership to the widgets in the group */
-  g_object_unref (sizegroup);
-
-  update_prefs_for_resource_path (project);
-
-  g_signal_connect (G_OBJECT (project->priv->resource_default_radio), "toggled",
-                    G_CALLBACK (resource_default_toggled), project);
-  g_signal_connect (G_OBJECT (project->priv->resource_relative_radio),
-                    "toggled", G_CALLBACK (resource_relative_toggled), project);
-  g_signal_connect (G_OBJECT (project->priv->resource_fullpath_radio),
-                    "toggled", G_CALLBACK (resource_fullpath_toggled), project);
-
-  g_signal_connect (G_OBJECT (project->priv->relative_path_entry), "activate",
-                    G_CALLBACK (resource_path_activated), project);
-  g_signal_connect (G_OBJECT (project->priv->full_path_button), "file-set",
-                    G_CALLBACK (resource_full_path_set), project);
-
-  /* Target versions */
-  string = g_strdup_printf ("<b>%s</b>", _("Toolkit versions required:"));
-  frame = gtk_frame_new (NULL);
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-  alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F);
-
-  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 8, 0, 12, 0);
-
-  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
-
-  label = gtk_label_new (string);
-  g_free (string);
-  gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
-
-  gtk_frame_set_label_widget (GTK_FRAME (frame), label);
-  gtk_container_add (GTK_CONTAINER (alignment), vbox);
-  gtk_container_add (GTK_CONTAINER (frame), alignment);
-
-  gtk_box_pack_start (GTK_BOX (main_box), frame, TRUE, TRUE, 6);
 
   /* Add stuff to vbox */
-  for (list = glade_app_get_catalogs (); list; list = list->next)
+  for (list = glade_app_get_catalogs (); list; list = g_list_next (list))
     {
       GladeCatalog *catalog = list->data;
       gint minor, major;
@@ -4021,11 +3933,11 @@ glade_project_build_prefs_box (GladeProject *project)
         label = gtk_label_new (glade_catalog_get_name (catalog));
       gtk_misc_set_alignment (GTK_MISC (label), 0.0F, 0.5F);
 
+      gtk_widget_show (label);
       gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
-      active_radio = NULL;
-      target_radio = NULL;
+      active_radio = target_radio = NULL;
 
       for (targets = glade_catalog_get_targets (catalog);
            targets; targets = targets->next)
@@ -4050,6 +3962,7 @@ glade_project_build_prefs_box (GladeProject *project)
           g_object_set_data (G_OBJECT (target_radio), "catalog",
                              (gchar *) glade_catalog_get_name (catalog));
 
+          gtk_widget_show (target_radio);
           gtk_box_pack_end (GTK_BOX (hbox), target_radio, TRUE, TRUE, 2);
 
           if (major == version->major && minor == version->minor)
@@ -4068,69 +3981,72 @@ glade_project_build_prefs_box (GladeProject *project)
       else
         g_warning ("Corrupt catalog versions");
 
+      gtk_widget_show (hbox);
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
     }
+}
 
-  /* Run verify */
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
-  button = gtk_button_new_from_stock (GTK_STOCK_EXECUTE);
-  g_signal_connect (G_OBJECT (button), "clicked",
-                    G_CALLBACK (verify_clicked), project);
-
-  label = gtk_label_new (_("Verify versions and deprecations:"));
-
-  gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 4);
-  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 4);
-
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4);
-
-  gtk_widget_show_all (main_frame);
-
-  return main_frame;
+static void
+on_domain_entry_activate (GtkWidget *entry, GladeProject *project)
+{
+  glade_project_set_translation_domain (project, gtk_entry_get_text (GTK_ENTRY (entry)));
 }
 
+#define GET_OBJECT(b,c,o) c(gtk_builder_get_object(b,o));g_warn_if_fail(gtk_builder_get_object(b,o))
+
 static GtkWidget *
 glade_project_build_prefs_dialog (GladeProject *project)
 {
-  GtkWidget *widget, *dialog;
-  gchar *title, *name;
+  GladeProjectPrivate *priv = project->priv;  
+  GtkWidget *verify_button, *toolkit_box;
+  GError *error = NULL;
+  GtkBuilder *builder;
+  GtkWidget *dialog;
 
-  name = glade_project_get_name (project);
-  title = g_strdup_printf (_("%s document properties"), name);
+  /* Build UI */
+  builder = gtk_builder_new ();
+  if (gtk_builder_add_from_resource (builder, "/org/gnome/gladeui/glade-project-properties.ui", &error) == 0)
+    {
+      g_warning ("gtk_builder_add_from_resource() failed %s", (error) ? error->message : "");
+      return NULL;
+    }
 
-  dialog = gtk_dialog_new_with_buttons (title,
-                                        GTK_WINDOW (glade_app_get_window ()),
-                                        GTK_DIALOG_DESTROY_WITH_PARENT,
-                                        GTK_STOCK_CLOSE,
-                                        GTK_RESPONSE_ACCEPT, NULL);
-  g_free (title);
-  g_free (name);
+  /* Fetch Pointers */
+  dialog = GET_OBJECT (builder, GTK_WIDGET, "prefs_dialog");
+  g_object_ref_sink (dialog);
+  priv->resource_default_radio = GET_OBJECT (builder, GTK_WIDGET, "resource_default_radio");
+  priv->resource_relative_radio = GET_OBJECT (builder, GTK_WIDGET, "resource_relative_radio");
+  priv->resource_fullpath_radio = GET_OBJECT (builder, GTK_WIDGET, "resource_fullpath_radio");
+  priv->relative_path_entry = GET_OBJECT (builder, GTK_WIDGET, "relative_path_entry");
+  priv->full_path_button = GET_OBJECT (builder, GTK_WIDGET, "full_path_button");
+  priv->domain_entry = GET_OBJECT (builder, GTK_WIDGET, "domain_entry");
 
-  widget = glade_project_build_prefs_box (project);
-  gtk_box_pack_end (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
-                    widget, TRUE, TRUE, 2);
+  verify_button = GET_OBJECT (builder, GTK_WIDGET, "verify_button");
+  toolkit_box = GET_OBJECT (builder, GTK_WIDGET, "toolkit_box");
+  glade_project_target_version_box_fill (project, toolkit_box);
 
-  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
-  gtk_box_set_spacing (GTK_BOX
-                       (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2);
+  update_prefs_for_resource_path (project);
 
-  /* HIG spacings */
-  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
-  gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2); /* 2 * 5 + 2 = 12 */
-  gtk_container_set_border_width (GTK_CONTAINER
-                                  (gtk_dialog_get_action_area
-                                   (GTK_DIALOG (dialog))), 5);
-  gtk_box_set_spacing (GTK_BOX
-                       (gtk_dialog_get_action_area (GTK_DIALOG (dialog))), 6);
+  g_signal_connect (priv->resource_default_radio, "toggled",
+                    G_CALLBACK (resource_default_toggled), project);
+  g_signal_connect (priv->resource_relative_radio, "toggled",
+                    G_CALLBACK (resource_relative_toggled), project);
+  g_signal_connect (priv->resource_fullpath_radio, "toggled",
+                    G_CALLBACK (resource_fullpath_toggled), project);
 
+  g_signal_connect (priv->relative_path_entry, "activate",
+                    G_CALLBACK (resource_path_activated), project);
+  g_signal_connect (priv->full_path_button, "file-set",
+                    G_CALLBACK (resource_full_path_set), project);
+
+  g_signal_connect (verify_button, "clicked",
+                    G_CALLBACK (verify_clicked), project);
 
-  /* Were explicitly destroying it anyway */
-  g_signal_connect (G_OBJECT (dialog), "delete-event",
-                    G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+  g_signal_connect (priv->domain_entry, "activate",
+                    G_CALLBACK (on_domain_entry_activate), project);
 
-  /* Only one action, used to "close" the dialog */
-  g_signal_connect (G_OBJECT (dialog), "response",
-                    G_CALLBACK (gtk_widget_hide), NULL);
+  gtk_builder_connect_signals (builder, NULL);
+  g_object_unref (builder);
 
   return dialog;
 }
@@ -4200,6 +4116,47 @@ glade_project_toplevels (GladeProject *project)
   return project->priv->tree;
 }
 
+/**
+ * glade_project_set_translation_domain:
+ * @project: a #GladeProject
+ * @domain: the translation domain
+ *
+ * Set the project translation domain.
+ */
+void
+glade_project_set_translation_domain (GladeProject *project, const gchar *domain)
+{
+  GladeProjectPrivate *priv;
+
+  g_return_if_fail (GLADE_IS_PROJECT (project));
+
+  priv = project->priv;
+
+  if (g_strcmp0 (priv->translation_domain, domain))
+    {
+      g_free (priv->translation_domain);
+      priv->translation_domain = g_strdup (domain);
+
+      gtk_entry_set_text (GTK_ENTRY (priv->domain_entry), domain);
+      g_object_notify_by_pspec (G_OBJECT (project),
+                                properties[PROP_TRANSLATION_DOMAIN]);
+    }
+}
+
+/**
+ * glade_project_get_translation_domain:
+ * @project: a #GladeProject
+ *
+ * Returns: the translation domain
+ */
+const gchar *
+glade_project_get_translation_domain (GladeProject *project)
+{
+  g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
+
+  return project->priv->translation_domain;
+}
+
 /* GtkTreeModel implementation */
 
 static GObject *
diff --git a/gladeui/glade-project.h b/gladeui/glade-project.h
index cdde53d..dfd0468 100644
--- a/gladeui/glade-project.h
+++ b/gladeui/glade-project.h
@@ -214,6 +214,10 @@ gchar              *glade_project_display_dependencies (GladeProject       *proj
 
 GList              *glade_project_toplevels            (GladeProject       *project);
 
+void                glade_project_set_translation_domain (GladeProject *project,
+                                                          const gchar *domain);
+const gchar        *glade_project_get_translation_domain (GladeProject *project);
+
 /* Verifications */
 gchar              *glade_project_verify_widget_adaptor(GladeProject       *project,
                                                         GladeWidgetAdaptor *adaptor,
diff --git a/gladeui/gladeui-resources.gresource.xml b/gladeui/gladeui-resources.gresource.xml
new file mode 100644
index 0000000..f975ad6
--- /dev/null
+++ b/gladeui/gladeui-resources.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/gladeui">
+    <file compressed="true" preprocess="xml-stripblanks">glade-project-properties.ui</file>
+  </gresource>
+</gresources>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]