[gnome-dictionary] src: Use widget templates for GdictSourceDialog



commit b248b2814839dcdf150bf3e3707b5ed14a95af8e
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Sun Mar 8 16:39:23 2015 +0000

    src: Use widget templates for GdictSourceDialog
    
    Instead of building the UI from a custom GtkBuilder instance and doing
    things like we used to in 2005, let's use modern API.
    
    There is no functional change in this commit: just a reshuffle of the
    way the UI is loaded.

 po/POTFILES.in                 |    2 +-
 src/gdict-source-dialog.c      |  319 +++++++++++++++++---------------------
 src/gdict-source-dialog.ui     |  330 +++++++++++++++++++++++++++++++++++++++
 src/gdict.gresource.xml        |    2 +-
 src/gnome-dictionary-source.ui |  332 ----------------------------------------
 5 files changed, 473 insertions(+), 512 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9325b6d..4f392dc 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -4,7 +4,7 @@ data/default.desktop.in
 data/org.gnome.Dictionary.appdata.xml.in
 [type: gettext/glade]src/gnome-dictionary-menus.ui
 [type: gettext/glade]src/gnome-dictionary-preferences.ui
-[type: gettext/glade]src/gnome-dictionary-source.ui
+[type: gettext/glade]src/gdict-source-dialog.ui
 data/org.gnome.Dictionary.desktop.in.in
 data/org.gnome.dictionary.gschema.xml.in.in
 data/spanish.desktop.in
diff --git a/src/gdict-source-dialog.c b/src/gdict-source-dialog.c
index a9ba180..10cf0f9 100644
--- a/src/gdict-source-dialog.c
+++ b/src/gdict-source-dialog.c
@@ -38,7 +38,7 @@
 #include "gdict-source-dialog.h"
 #include "gdict-common.h"
 
-#define GDICT_SOURCE_UI        "/org/gnome/Dictionary/gnome-dictionary-source.ui"
+#define GDICT_SOURCE_UI        "/org/gnome/Dictionary/gdict-source-dialog.ui"
 
 /*********************
  * GdictSourceDialog *
@@ -48,8 +48,6 @@ struct _GdictSourceDialog
 {
   GtkDialog parent_instance;
 
-  GtkBuilder *builder; 
-
   GSettings *settings;
 
   GdictSourceLoader *loader;
@@ -61,12 +59,22 @@ struct _GdictSourceDialog
   
   GdictSourceTransport transport;
 
+  GtkWidget *hostname_label;
+  GtkWidget *hostname_entry;
+  GtkWidget *port_label;
+  GtkWidget *port_entry;
+
+  GtkWidget *description_label;
+  GtkWidget *description_entry;
+
   GtkWidget *add_button;
   GtkWidget *close_button;
   GtkWidget *cancel_button;
   GtkWidget *help_button;
 
+  GtkWidget *db_vbox;
   GtkWidget *db_chooser;
+  GtkWidget *strat_vbox;
   GtkWidget *strat_chooser;
   
   GtkWidget *transport_combo;
@@ -86,7 +94,7 @@ enum
   PROP_ACTION
 };
 
-G_DEFINE_TYPE (GdictSourceDialog, gdict_source_dialog, GTK_TYPE_DIALOG);
+G_DEFINE_TYPE (GdictSourceDialog, gdict_source_dialog, GTK_TYPE_DIALOG)
 
 static void
 set_source_loader (GdictSourceDialog *dialog,
@@ -99,74 +107,47 @@ set_source_loader (GdictSourceDialog *dialog,
 }
 
 static void
-transport_combo_changed_cb (GtkWidget *widget,
-                           gpointer   user_data)
+on_transport_changed (GtkWidget *widget,
+                      gpointer   user_data)
 {
-  GdictSourceDialog *dialog = GDICT_SOURCE_DIALOG (user_data);
-  gint transport;
+  GdictSourceDialog *dialog = user_data;
+  GdictSourceTransport transport;
 
   transport = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
   if (transport == dialog->transport)
     return;
 
-  if (transport == GDICT_SOURCE_TRANSPORT_DICTD)
+  /* Hide everything by default */
+  gtk_widget_hide (dialog->hostname_label);
+  gtk_widget_hide (dialog->hostname_entry);
+  gtk_widget_hide (dialog->port_label);
+  gtk_widget_hide (dialog->port_entry);
+
+  if (dialog->action == GDICT_SOURCE_DIALOG_CREATE)
     {
-      gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_label")));
-      gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_entry")));
-      gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_label")));
-      gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_entry")));
-      
-      if (dialog->action == GDICT_SOURCE_DIALOG_CREATE)
-        {
-          gtk_widget_set_sensitive (dialog->add_button, TRUE);
-          
-          dialog->transport = GDICT_SOURCE_TRANSPORT_DICTD;
-        }
+      gtk_widget_set_sensitive (dialog->add_button, FALSE);
+      dialog->transport = GDICT_SOURCE_TRANSPORT_INVALID;
     }
-  else
+
+  /* Then show what's needed depending on the transport */
+  switch (transport)
     {
-      gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_label")));
-      gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_entry")));
-      gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_label")));
-      gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_entry")));
+    case GDICT_SOURCE_TRANSPORT_DICTD:
+      gtk_widget_show (dialog->hostname_label);
+      gtk_widget_show (dialog->hostname_entry);
+      gtk_widget_show (dialog->port_label);
+      gtk_widget_show (dialog->port_entry);
 
       if (dialog->action == GDICT_SOURCE_DIALOG_CREATE)
         {
-          gtk_widget_set_sensitive (dialog->add_button, FALSE);
-          
-          dialog->transport = GDICT_SOURCE_TRANSPORT_INVALID;
+          gtk_widget_set_sensitive (dialog->add_button, TRUE);
+          dialog->transport = GDICT_SOURCE_TRANSPORT_DICTD;
         }
-    }
-}
-
-static gchar *
-get_text_from_entry (GdictSourceDialog *dialog,
-                    const gchar       *entry_name)
-{
-  GtkWidget *entry;
-  gchar *retval;
-
-  entry = GTK_WIDGET (gtk_builder_get_object (dialog->builder, entry_name));
-  if (!entry)
-    return NULL;
-  
-  retval = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
-  
-  return retval;
-}
-
-static void
-set_text_to_entry (GdictSourceDialog *dialog,
-                  const gchar       *entry_name,
-                  const gchar       *text)
-{
-  GtkWidget *entry;
-
-  entry = GTK_WIDGET (gtk_builder_get_object (dialog->builder, entry_name));
-  if (!entry)
-    return;
+      break;
 
-  gtk_entry_set_text (GTK_ENTRY (entry), text);
+    default:
+      break;
+    }
 }
 
 static void
@@ -186,18 +167,18 @@ set_transport_settings (GdictSourceDialog *dialog)
         port = gdict_client_context_get_port (context);
         port_str = g_strdup_printf ("%d", port);
 
-        set_text_to_entry (dialog, "hostname_entry", hostname);
-        set_text_to_entry (dialog, "port_entry", port_str);
+        gtk_entry_set_text (GTK_ENTRY (dialog->hostname_entry), hostname);
+        gtk_entry_set_text (GTK_ENTRY (dialog->port_entry), port_str);
 
-        gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_label")));
-        gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "hostname_entry")));
-        gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_label")));
-        gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (dialog->builder, "port_entry")));
+        gtk_widget_show (dialog->hostname_label);
+        gtk_widget_show (dialog->hostname_entry);
+        gtk_widget_show (dialog->port_label);
+        gtk_widget_show (dialog->port_entry);
 
         g_free (port_str);
       }
       break;
-    case GDICT_SOURCE_TRANSPORT_INVALID:
+
     default:
       break;
     }
@@ -222,8 +203,7 @@ update_dialog_ui (GdictSourceDialog *dialog)
          return;
        }
       
-      source = gdict_source_loader_get_source (dialog->loader,
-                                              dialog->source_name);
+      source = gdict_source_loader_get_source (dialog->loader, dialog->source_name);
       if (!source)
        {
           g_warning ("Attempting to retrieve source, but no "
@@ -234,13 +214,10 @@ update_dialog_ui (GdictSourceDialog *dialog)
       
       g_object_ref (source);
       
-      dialog->source = source;
-      set_text_to_entry (dialog, "description_entry",
-                        gdict_source_get_description (source));
-
+      dialog->source = g_object_ref (source);
+      gtk_entry_set_text (GTK_ENTRY (dialog->description_entry), gdict_source_get_description (source));
       dialog->transport = gdict_source_get_transport (source);
-      gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->transport_combo),
-                                (gint) dialog->transport);
+      gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->transport_combo), (gint) dialog->transport);
 
       /* set the context for the database and strategy choosers */
       dialog->context = gdict_source_get_context (source);
@@ -261,11 +238,13 @@ update_dialog_ui (GdictSourceDialog *dialog)
                                           dialog->context);
       gdict_strategy_chooser_refresh (GDICT_STRATEGY_CHOOSER (dialog->strat_chooser));
       break;
+
     case GDICT_SOURCE_DIALOG_CREATE:
       /* DICTD transport is default */
       gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->transport_combo), 0);
       g_signal_emit_by_name (dialog->transport_combo, "changed");
       break;
+
     default:
       g_assert_not_reached ();
       break;
@@ -278,7 +257,6 @@ build_new_source (GdictSourceDialog *dialog)
   GdictSource *source;
   gchar *name, *text;
   GdictSourceTransport transport;
-  gchar *host, *port;
   gchar *data;
   gsize length;
   GError *error;
@@ -296,9 +274,7 @@ build_new_source (GdictSourceDialog *dialog)
   gdict_source_set_name (source, name);
   g_free (name);
       
-  text = get_text_from_entry (dialog, "description_entry");
-  gdict_source_set_description (source, text);
-  g_free (text);
+  gdict_source_set_description (source, gtk_entry_get_text (GTK_ENTRY (dialog->description_entry)));
 
   db_chooser = GDICT_DATABASE_CHOOSER (dialog->db_chooser);
   text = gdict_database_chooser_get_current_database (db_chooser);
@@ -315,17 +291,17 @@ build_new_source (GdictSourceDialog *dialog)
   switch (transport)
     {
     case GDICT_SOURCE_TRANSPORT_DICTD:
-      host = get_text_from_entry (dialog, "hostname_entry");
-      port = get_text_from_entry (dialog, "port_entry");
+      {
+        const char *host = gtk_entry_get_text (GTK_ENTRY (dialog->hostname_entry));
+        const char *port = gtk_entry_get_text (GTK_ENTRY (dialog->port_entry));
        
-      gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD,
-                                 "hostname", host,
-                                 "port", atoi (port),
-                                 NULL);
-          
-      g_free (host);
-      g_free (port);
+        gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD,
+                                    "hostname", host,
+                                    "port", atoi (port),
+                                    NULL);
+      }
       break;
+
     case GDICT_SOURCE_TRANSPORT_INVALID:
     default:
       g_warning ("Invalid transport");
@@ -344,7 +320,7 @@ build_new_source (GdictSourceDialog *dialog)
       return;
     }
       
-  config_dir = gdict_get_config_dir();
+  config_dir = gdict_get_config_dir ();
   name = g_strconcat (gdict_source_get_name (source), ".desktop", NULL);
   filename = g_build_filename (config_dir, name, NULL);
   g_free (config_dir);
@@ -369,15 +345,13 @@ save_source (GdictSourceDialog *dialog)
   GdictStrategyChooser *strat_chooser;
   gchar *name, *text;
   GdictSourceTransport transport;
-  gchar *host, *port;
   gchar *data;
   gsize length;
   GError *error;
   gchar *filename;
   gchar *config_dir;
   
-  source = gdict_source_loader_get_source (dialog->loader,
-                                          dialog->source_name);
+  source = gdict_source_loader_get_source (dialog->loader, dialog->source_name);
   if (!source)
     {
       g_warning ("Attempting to save source `%s', but no "
@@ -387,9 +361,7 @@ save_source (GdictSourceDialog *dialog)
       return;
     }
       
-  text = get_text_from_entry (dialog, "description_entry");
-  gdict_source_set_description (source, text);
-  g_free (text);
+  gdict_source_set_description (source, gtk_entry_get_text (GTK_ENTRY (dialog->description_entry)));
 
   db_chooser = GDICT_DATABASE_CHOOSER (dialog->db_chooser);
   text = gdict_database_chooser_get_current_database (db_chooser);
@@ -407,17 +379,17 @@ save_source (GdictSourceDialog *dialog)
   switch (transport)
     {
     case GDICT_SOURCE_TRANSPORT_DICTD:
-      host = get_text_from_entry (dialog, "hostname_entry");
-      port = get_text_from_entry (dialog, "port_entry");
-       
-      gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD,
-                                 "hostname", host,
-                                 "port", atoi (port),
-                                 NULL);
-          
-      g_free (host);
-      g_free (port);
+      {
+        const char *host = gtk_entry_get_text (GTK_ENTRY (dialog->hostname_entry));
+        const char *port = gtk_entry_get_text (GTK_ENTRY (dialog->port_entry));
+
+        gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD,
+                                    "hostname", host,
+                                    "port", atoi (port),
+                                    NULL);
+      }
       break;
+
     case GDICT_SOURCE_TRANSPORT_INVALID:
     default:
       g_warning ("Invalid transport");
@@ -458,9 +430,9 @@ save_source (GdictSourceDialog *dialog)
 }
 
 static void
-gdict_source_dialog_response_cb (GtkDialog *dialog,
-                                gint       response_id,
-                                gpointer   user_data)
+on_dialog_response (GtkDialog *dialog,
+                    gint       response_id,
+                    gpointer   user_data)
 {
   GError *err = NULL;
   
@@ -469,6 +441,7 @@ gdict_source_dialog_response_cb (GtkDialog *dialog,
     case GTK_RESPONSE_ACCEPT:
       build_new_source (GDICT_SOURCE_DIALOG (dialog));
       break;
+
     case GTK_RESPONSE_HELP:
       gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (dialog)),
                     "help:gnome-dictionary/gnome-dictionary-add-source",
@@ -484,11 +457,14 @@ gdict_source_dialog_response_cb (GtkDialog *dialog,
       /* we don't want the dialog to close itself */
       g_signal_stop_emission_by_name (dialog, "response");
       break;
+
     case GTK_RESPONSE_CLOSE:
       save_source (GDICT_SOURCE_DIALOG (dialog));
       break;
+
     case GTK_RESPONSE_CANCEL:
       break;
+
     default:
       break;
     }
@@ -499,21 +475,12 @@ gdict_source_dialog_finalize (GObject *object)
 {
   GdictSourceDialog *dialog = GDICT_SOURCE_DIALOG (object);
 
-  if (dialog->settings)
-    g_object_unref (dialog->settings);
-  
-  if (dialog->builder)
-    g_object_unref (dialog->builder);
+  g_clear_object (&dialog->settings);
+  g_clear_object (&dialog->source);
+  g_clear_object (&dialog->loader);
 
-  if (dialog->source_name)
-    g_free (dialog->source_name);
+  g_free (dialog->source_name);
 
-  if (dialog->source)
-    g_object_unref (dialog->source);
-  
-  if (dialog->loader)
-    g_object_unref (dialog->loader);
-  
   G_OBJECT_CLASS (gdict_source_dialog_parent_class)->finalize (object);
 }
 
@@ -530,13 +497,16 @@ gdict_source_dialog_set_property (GObject      *object,
     case PROP_SOURCE_LOADER:
       set_source_loader (dialog, g_value_get_object (value));
       break;
+
     case PROP_SOURCE_NAME:
       g_free (dialog->source_name);
       dialog->source_name = g_strdup (g_value_get_string (value));
       break;
+
     case PROP_ACTION:
       dialog->action = (GdictSourceDialogAction) g_value_get_int (value);
       break;
+
     default:
       break;
     }
@@ -555,62 +525,24 @@ gdict_source_dialog_get_property (GObject    *object,
     case PROP_SOURCE_LOADER:
       g_value_set_object (value, dialog->loader);
       break;
+
     case PROP_SOURCE_NAME:
       g_value_set_string (value, dialog->source_name);
       break;
+
     case PROP_ACTION:
       g_value_set_int (value, dialog->action);
       break;
+
     default:
       break;
     }
 }
 
-static GObject *
-gdict_source_dialog_constructor (GType                  type,
-                                guint                  n_construct_properties,
-                                GObjectConstructParam *construct_params)
+static void
+gdict_source_dialog_constructed (GObject *object)
 {
-  GObject *object;
-  GdictSourceDialog *dialog;
-  GtkWidget *vbox;
-
-  object = G_OBJECT_CLASS (gdict_source_dialog_parent_class)->constructor (type,
-                                                                          n_construct_properties,
-                                                                          construct_params);
-  dialog = GDICT_SOURCE_DIALOG (object);
-
-  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
-  gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 2);
-  
-  /* get the UI from the GtkBuilder file */
-  dialog->builder = gtk_builder_new ();
-  gtk_builder_add_from_resource (dialog->builder, GDICT_SOURCE_UI, NULL);
-  
-  /* the main widget */
-  gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
-                     GTK_WIDGET (gtk_builder_get_object (dialog->builder, "source_root")));
-
-  /* the transport combo changes the UI by changing the visible widgets
-   * bound to the transport's own options.
-   */
-  dialog->transport_combo = GTK_WIDGET (gtk_builder_get_object (dialog->builder, "transport_combo"));
-  g_signal_connect (dialog->transport_combo, "changed",
-                   G_CALLBACK (transport_combo_changed_cb),
-                   dialog);
-
-  /* the help button is always visible */
-  dialog->help_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Help"), GTK_RESPONSE_HELP);
-  
-  vbox = GTK_WIDGET (gtk_builder_get_object (dialog->builder, "db-vbox"));
-  dialog->db_chooser = gdict_database_chooser_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), dialog->db_chooser, TRUE, TRUE, 0);
-  gtk_widget_show (dialog->db_chooser);
-
-  vbox = GTK_WIDGET (gtk_builder_get_object (dialog->builder, "strat-vbox"));
-  dialog->strat_chooser = gdict_strategy_chooser_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), dialog->strat_chooser, TRUE, TRUE, 0);
-  gtk_widget_show (dialog->strat_chooser);
+  GdictSourceDialog *dialog = GDICT_SOURCE_DIALOG (object);
 
   /* the UI changes depending on the action that the source dialog
    * should perform
@@ -619,15 +551,15 @@ gdict_source_dialog_constructor (GType                  type,
     {
     case GDICT_SOURCE_DIALOG_VIEW:
       /* disable every editable widget */
-      gtk_editable_set_editable (GTK_EDITABLE (gtk_builder_get_object (dialog->builder, 
"description_entry")), FALSE);
-      gtk_editable_set_editable (GTK_EDITABLE (gtk_builder_get_object (dialog->builder, "hostname_entry")), 
FALSE);
-      gtk_editable_set_editable (GTK_EDITABLE (gtk_builder_get_object (dialog->builder, "port_entry")), 
FALSE);
-      
+      gtk_editable_set_editable (GTK_EDITABLE (dialog->description_entry), FALSE);
+      gtk_editable_set_editable (GTK_EDITABLE (dialog->hostname_entry), FALSE);
+      gtk_editable_set_editable (GTK_EDITABLE (dialog->port_entry), FALSE);
       gtk_widget_set_sensitive (dialog->transport_combo, FALSE);
 
       /* we just allow closing the dialog */
       dialog->close_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Close"), GTK_RESPONSE_CANCEL);
       break;
+
     case GDICT_SOURCE_DIALOG_CREATE:
       dialog->cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Cancel"), GTK_RESPONSE_CANCEL);
       dialog->add_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Add"), GTK_RESPONSE_ACCEPT);
@@ -636,29 +568,30 @@ gdict_source_dialog_constructor (GType                  type,
        */
       gtk_widget_set_sensitive (dialog->add_button, FALSE);
       break;
+
     case GDICT_SOURCE_DIALOG_EDIT:
       dialog->cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("C_ancel"), GTK_RESPONSE_CANCEL);
       dialog->close_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Close"), GTK_RESPONSE_CLOSE);
       break;
+
     default:
       g_assert_not_reached ();
       break;
     }
-  
+
   /* this will take care of updating the contents of the dialog
    * based on the action
    */
   update_dialog_ui (dialog);
-  
-  return object;
 }
 
 static void
 gdict_source_dialog_class_init (GdictSourceDialogClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   
-  gobject_class->constructor = gdict_source_dialog_constructor;
+  gobject_class->constructed = gdict_source_dialog_constructed;
   gobject_class->set_property = gdict_source_dialog_set_property;
   gobject_class->get_property = gdict_source_dialog_get_property;
   gobject_class->finalize = gdict_source_dialog_finalize;
@@ -669,14 +602,18 @@ gdict_source_dialog_class_init (GdictSourceDialogClass *klass)
                                                        "Source Loader",
                                                        "The GdictSourceLoader used by the application",
                                                        GDICT_TYPE_SOURCE_LOADER,
-                                                       (G_PARAM_READABLE | G_PARAM_WRITABLE | 
G_PARAM_CONSTRUCT_ONLY)));
+                                                       G_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY |
+                                                        G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class,
                                   PROP_SOURCE_NAME,
                                   g_param_spec_string ("source-name",
                                                        "Source Name",
                                                        "The source name",
                                                        NULL,
-                                                       (G_PARAM_READABLE | G_PARAM_WRITABLE | 
G_PARAM_CONSTRUCT)));
+                                                        G_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY |
+                                                        G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class,
                                   PROP_ACTION,
                                   g_param_spec_int ("action",
@@ -685,20 +622,46 @@ gdict_source_dialog_class_init (GdictSourceDialogClass *klass)
                                                     -1,
                                                     GDICT_SOURCE_DIALOG_EDIT,
                                                     GDICT_SOURCE_DIALOG_VIEW,
-                                                    (G_PARAM_READABLE | G_PARAM_WRITABLE | 
G_PARAM_CONSTRUCT_ONLY)));
+                                                     G_PARAM_READWRITE |
+                                                     G_PARAM_CONSTRUCT_ONLY |
+                                                     G_PARAM_STATIC_STRINGS));
+
+  gtk_widget_class_set_template_from_resource (widget_class, GDICT_SOURCE_UI);
+
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, transport_combo);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, hostname_label);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, hostname_entry);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, port_label);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, port_entry);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, description_label);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, description_entry);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, db_vbox);
+  gtk_widget_class_bind_template_child (widget_class, GdictSourceDialog, strat_vbox);
+
+  gtk_widget_class_bind_template_callback (widget_class, on_dialog_response);
+  gtk_widget_class_bind_template_callback (widget_class, on_transport_changed);
 }
 
 static void
 gdict_source_dialog_init (GdictSourceDialog *dialog)
 {
+  gtk_widget_init_template (GTK_WIDGET (dialog));
+
   gtk_widget_set_size_request (GTK_WIDGET (dialog), 400, 300);
-  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
 
   dialog->transport = GDICT_SOURCE_TRANSPORT_INVALID;
 
-  g_signal_connect (dialog, "response",
-                   G_CALLBACK (gdict_source_dialog_response_cb),
-                   NULL);
+  /* The help button is always visible */
+  dialog->help_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Help"), GTK_RESPONSE_HELP);
+  
+  /* Add our custom widgets */
+  dialog->db_chooser = gdict_database_chooser_new ();
+  gtk_box_pack_start (GTK_BOX (dialog->db_vbox), dialog->db_chooser, TRUE, TRUE, 0);
+  gtk_widget_show (dialog->db_chooser);
+
+  dialog->strat_chooser = gdict_strategy_chooser_new ();
+  gtk_box_pack_start (GTK_BOX (dialog->strat_vbox), dialog->strat_chooser, TRUE, TRUE, 0);
+  gtk_widget_show (dialog->strat_chooser);
 }
 
 GtkWidget *
diff --git a/src/gdict-source-dialog.ui b/src/gdict-source-dialog.ui
new file mode 100644
index 0000000..291cefd
--- /dev/null
+++ b/src/gdict-source-dialog.ui
@@ -0,0 +1,330 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface domain="gnome-dictionary">
+  <object class="GtkListStore" id="model1">
+    <columns>
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0">Dictionary Server</col>
+      </row>
+    </data>
+  </object>
+  <template class="GdictSourceDialog" parent="GtkDialog">
+    <property name="border-width">5</property>
+    <property name="resizable">False</property>
+    <property name="type_hint">dialog</property>
+    <signal name="response" handler="on_dialog_response" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="source_root">
+        <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+        <property name="visible">True</property>
+        <property name="homogeneous">False</property>
+        <property name="spacing">12</property>
+        <child>
+          <object class="GtkNotebook" id="notebook1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="show_tabs">True</property>
+            <property name="show_border">True</property>
+            <property name="tab_pos">GTK_POS_TOP</property>
+            <property name="scrollable">False</property>
+            <property name="enable_popup">False</property>
+            <child>
+              <object class="GtkTable" id="table2">
+                <property name="border_width">5</property>
+                <property name="visible">True</property>
+                <property name="n_rows">4</property>
+                <property name="n_columns">2</property>
+                <property name="homogeneous">False</property>
+                <property name="row_spacing">6</property>
+                <property name="column_spacing">12</property>
+                <child>
+                  <object class="GtkLabel" id="description_label">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Description:</property>
+                    <property name="use_underline">True</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="mnemonic_widget">description_entry</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">0</property>
+                    <property name="bottom_attach">1</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="transport_label">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Transport:</property>
+                    <property name="use_underline">True</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="mnemonic_widget">transport_combo</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="hostname_label">
+                    <property name="label" translatable="yes">H_ostname:</property>
+                    <property name="use_underline">True</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="mnemonic_widget">hostname_entry</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="port_label">
+                    <property name="label" translatable="yes">_Port:</property>
+                    <property name="use_underline">True</property>
+                    <property name="use_markup">False</property>
+                    <property name="justify">GTK_JUSTIFY_LEFT</property>
+                    <property name="wrap">False</property>
+                    <property name="selectable">False</property>
+                    <property name="xalign">0</property>
+                    <property name="yalign">0.5</property>
+                    <property name="mnemonic_widget">port_entry</property>
+                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                    <property name="width_chars">-1</property>
+                    <property name="single_line_mode">False</property>
+                    <property name="angle">0</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">0</property>
+                    <property name="right_attach">1</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="description_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="has_focus">True</property>
+                    <property name="editable">True</property>
+                    <property name="visibility">True</property>
+                    <property name="max_length">0</property>
+                    <property name="text" translatable="yes">Source Name</property>
+                    <property name="has_frame">True</property>
+                    <property name="invisible_char">*</property>
+                    <property name="activates_default">False</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">0</property>
+                    <property name="bottom_attach">1</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="hostname_entry">
+                    <property name="can_focus">True</property>
+                    <property name="editable">True</property>
+                    <property name="visibility">True</property>
+                    <property name="max_length">0</property>
+                    <property name="text">dict.org</property>
+                    <property name="has_frame">True</property>
+                    <property name="invisible_char">*</property>
+                    <property name="activates_default">False</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="port_entry">
+                    <property name="can_focus">True</property>
+                    <property name="editable">True</property>
+                    <property name="visibility">True</property>
+                    <property name="max_length">0</property>
+                    <property name="text">2628</property>
+                    <property name="has_frame">True</property>
+                    <property name="invisible_char">*</property>
+                    <property name="activates_default">False</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="transport_combo">
+                    <property name="visible">True</property>
+                    <property name="add_tearoffs">False</property>
+                    <property name="focus_on_click">True</property>
+                    <property name="model">model1</property>
+                    <signal name="changed" handler="on_transport_changed" swapped="no"/>
+                    <child>
+                      <object class="GtkCellRendererText" id="renderer1"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="x_options">fill</property>
+                    <property name="y_options">fill</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="tab_expand">False</property>
+                <property name="tab_fill">True</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label18">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Source</property>
+                <property name="use_underline">False</property>
+                <property name="use_markup">False</property>
+                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                <property name="wrap">False</property>
+                <property name="selectable">False</property>
+                <property name="xalign">0.5</property>
+                <property name="yalign">0.5</property>
+                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                <property name="width_chars">-1</property>
+                <property name="single_line_mode">False</property>
+                <property name="angle">0</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkBox" id="db_vbox">
+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+                <property name="border_width">5</property>
+                <property name="visible">True</property>
+                <property name="homogeneous">False</property>
+                <property name="spacing">0</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="tab_expand">False</property>
+                <property name="tab_fill">True</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label19">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Dictionaries</property>
+                <property name="use_underline">False</property>
+                <property name="use_markup">False</property>
+                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                <property name="wrap">False</property>
+                <property name="selectable">False</property>
+                <property name="xalign">0.5</property>
+                <property name="yalign">0.5</property>
+                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                <property name="width_chars">-1</property>
+                <property name="single_line_mode">False</property>
+                <property name="angle">0</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkBox" id="strat_vbox">
+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+                <property name="border_width">5</property>
+                <property name="visible">True</property>
+                <property name="homogeneous">False</property>
+                <property name="spacing">0</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="tab_expand">False</property>
+                <property name="tab_fill">True</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label20">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Strategies</property>
+                <property name="use_underline">False</property>
+                <property name="use_markup">False</property>
+                <property name="justify">GTK_JUSTIFY_LEFT</property>
+                <property name="wrap">False</property>
+                <property name="selectable">False</property>
+                <property name="xalign">0.5</property>
+                <property name="yalign">0.5</property>
+                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                <property name="width_chars">-1</property>
+                <property name="single_line_mode">False</property>
+                <property name="angle">0</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="padding">0</property>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
+
diff --git a/src/gdict.gresource.xml b/src/gdict.gresource.xml
index 59b4b3e..4022513 100644
--- a/src/gdict.gresource.xml
+++ b/src/gdict.gresource.xml
@@ -3,6 +3,6 @@
   <gresource prefix="/org/gnome/Dictionary">
     <file preprocess="xml-stripblanks">gnome-dictionary-menus.ui</file>
     <file preprocess="xml-stripblanks">gnome-dictionary-preferences.ui</file>
-    <file preprocess="xml-stripblanks">gnome-dictionary-source.ui</file>
+    <file preprocess="xml-stripblanks">gdict-source-dialog.ui</file>
   </gresource>
 </gresources>



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