]> git.0d.be Git - empathy.git/commitdiff
new-message-dialog: inherit from GtkDialog (#604097)
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 9 Dec 2009 11:06:23 +0000 (11:06 +0000)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 9 Dec 2009 11:06:24 +0000 (11:06 +0000)
libempathy-gtk/empathy-new-message-dialog.c
libempathy-gtk/empathy-new-message-dialog.h
libempathy-gtk/empathy-new-message-dialog.ui

index c1069f87950e53667f055995fdecb84b95e4a999..c7055017e4019ea3903ea9b55d835c69eb0bc9a3 100644 (file)
 #include <libempathy/empathy-debug.h>
 
 #include <libempathy-gtk/empathy-ui-utils.h>
+#include <libempathy-gtk/empathy-images.h>
 
 #include "empathy-new-message-dialog.h"
 #include "empathy-account-chooser.h"
 
+static EmpathyNewMessageDialog *dialog_singleton = NULL;
+
+G_DEFINE_TYPE(EmpathyNewMessageDialog, empathy_new_message_dialog,
+                                      GTK_TYPE_DIALOG)
+
 /**
  * SECTION:empathy-new-message-dialog
  * @title: EmpathyNewMessageDialog
@@ -51,7 +57,9 @@
  * call to be started with any contact on any enabled account.
  */
 
-typedef struct {
+typedef struct _EmpathyNewMessageDialogPriv EmpathyNewMessageDialogPriv;
+
+struct _EmpathyNewMessageDialogPriv {
        GtkWidget *dialog;
        GtkWidget *table_contact;
        GtkWidget *account_chooser;
@@ -59,7 +67,11 @@ typedef struct {
        GtkWidget *button_chat;
        GtkWidget *button_call;
        EmpathyContactManager *contact_manager;
-} EmpathyNewMessageDialog;
+};
+
+#define GET_PRIV(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), EMPATHY_TYPE_NEW_MESSAGE_DIALOG, \
+    EmpathyNewMessageDialogPriv))
 
 enum {
        COMPLETION_COL_TEXT,
@@ -71,6 +83,7 @@ static void
 new_message_dialog_account_changed_cb (GtkWidget               *widget,
                                       EmpathyNewMessageDialog *dialog)
 {
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (dialog);
        EmpathyAccountChooser *chooser;
        TpConnection          *connection;
        EmpathyTpContactList *contact_list;
@@ -81,17 +94,17 @@ new_message_dialog_account_changed_cb (GtkWidget               *widget,
        gchar                *tmpstr;
 
        /* Remove completions */
-       completion = gtk_entry_get_completion (GTK_ENTRY (dialog->entry_id));
+       completion = gtk_entry_get_completion (GTK_ENTRY (priv->entry_id));
        store = GTK_LIST_STORE (gtk_entry_completion_get_model (completion));
        gtk_list_store_clear (store);
 
        /* Get members of the new account */
-       chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser);
+       chooser = EMPATHY_ACCOUNT_CHOOSER (priv->account_chooser);
        connection = empathy_account_chooser_get_connection (chooser);
        if (!connection) {
                return;
        }
-       contact_list = empathy_contact_manager_get_list (dialog->contact_manager,
+       contact_list = empathy_contact_manager_get_list (priv->contact_manager,
                                                         connection);
        members = empathy_contact_list_get_members (EMPATHY_CONTACT_LIST (contact_list));
 
@@ -126,6 +139,7 @@ new_message_dialog_match_selected_cb (GtkEntryCompletion *widget,
                                      GtkTreeIter        *iter,
                                      EmpathyNewMessageDialog *dialog)
 {
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (dialog);
        gchar *id;
 
        if (!iter || !model) {
@@ -133,7 +147,7 @@ new_message_dialog_match_selected_cb (GtkEntryCompletion *widget,
        }
 
        gtk_tree_model_get (model, iter, COMPLETION_COL_ID, &id, -1);
-       gtk_entry_set_text (GTK_ENTRY (dialog->entry_id), id);
+       gtk_entry_set_text (GTK_ENTRY (priv->entry_id), id);
 
        DEBUG ("Got selected match **%s**", id);
 
@@ -199,12 +213,13 @@ new_message_dialog_response_cb (GtkWidget               *widget,
                                gint                    response,
                                EmpathyNewMessageDialog *dialog)
 {
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (dialog);
        TpConnection *connection;
        const gchar *id;
 
        connection = empathy_account_chooser_get_connection (
-               EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser));
-       id = gtk_entry_get_text (GTK_ENTRY (dialog->entry_id));
+               EMPATHY_ACCOUNT_CHOOSER (priv->account_chooser));
+       id = gtk_entry_get_text (GTK_ENTRY (priv->entry_id));
        if (!connection || EMP_STR_EMPTY (id)) {
                gtk_widget_destroy (widget);
                return;
@@ -229,62 +244,94 @@ static void
 new_message_change_state_button_cb  (GtkEditable             *editable,
                                     EmpathyNewMessageDialog *dialog)
 {
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (dialog);
        const gchar *id;
        gboolean     sensitive;
 
        id = gtk_entry_get_text (GTK_ENTRY (editable));
        sensitive = !EMP_STR_EMPTY (id);
 
-       gtk_widget_set_sensitive (dialog->button_chat, sensitive);
-       gtk_widget_set_sensitive (dialog->button_call, sensitive);
+       gtk_widget_set_sensitive (priv->button_chat, sensitive);
+       gtk_widget_set_sensitive (priv->button_call, sensitive);
 }
 
-static void
-new_message_dialog_destroy_cb (GtkWidget               *widget,
-                              EmpathyNewMessageDialog *dialog)
+static GObject *
+empathy_new_message_dialog_constructor (GType type,
+                                       guint n_props,
+                                       GObjectConstructParam *props)
 {
-       g_object_unref (dialog->contact_manager);
-       g_free (dialog);
+       GObject *retval;
+
+       if (dialog_singleton) {
+               retval = G_OBJECT (dialog_singleton);
+               g_object_ref (retval);
+       }
+       else {
+               retval = G_OBJECT_CLASS (
+               empathy_new_message_dialog_parent_class)->constructor (type,
+                       n_props, props);
+
+               dialog_singleton = EMPATHY_NEW_MESSAGE_DIALOG (retval);
+               g_object_add_weak_pointer (retval, (gpointer) &dialog_singleton);
+       }
+
+       return retval;
 }
 
-/**
- * empathy_new_message_dialog_show:
- * @parent: parent #GtkWindow of the dialog
- *
- * Create a new #EmpathyNewMessageDialog and show it.
- *
- * Return value: the new #EmpathyNewMessageDialog
- */
-GtkWidget *
-empathy_new_message_dialog_show (GtkWindow *parent)
+static void
+empathy_new_message_dialog_init (EmpathyNewMessageDialog *dialog)
 {
-       static EmpathyNewMessageDialog *dialog = NULL;
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (dialog);
        GtkBuilder                     *gui;
        gchar                          *filename;
        GtkEntryCompletion             *completion;
        GtkListStore                   *model;
-
-       if (dialog) {
-               gtk_window_present (GTK_WINDOW (dialog->dialog));
-               return dialog->dialog;
-       }
-
-       dialog = g_new0 (EmpathyNewMessageDialog, 1);
+       GtkWidget                      *content_area;
+       GtkWidget                      *image;
 
        /* create a contact manager */
-       dialog->contact_manager = empathy_contact_manager_dup_singleton ();
+       priv->contact_manager = empathy_contact_manager_dup_singleton ();
 
        filename = empathy_file_lookup ("empathy-new-message-dialog.ui",
                                        "libempathy-gtk");
        gui = empathy_builder_get_file (filename,
-                                       "new_message_dialog", &dialog->dialog,
-                                       "table_contact", &dialog->table_contact,
-                                       "entry_id", &dialog->entry_id,
-                                       "button_chat", &dialog->button_chat,
-                                       "button_call",&dialog->button_call,
+                                       "table_contact", &priv->table_contact,
+                                       "entry_id", &priv->entry_id,
                                        NULL);
        g_free (filename);
 
+       content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+       gtk_container_add (GTK_CONTAINER (content_area), priv->table_contact);
+
+       /* add buttons */
+       gtk_dialog_add_button (GTK_DIALOG (dialog),
+               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
+       priv->button_call = gtk_button_new_with_mnemonic (_("C_all"));
+       image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VOIP,
+               GTK_ICON_SIZE_BUTTON);
+       gtk_button_set_image (GTK_BUTTON (priv->button_call), image);
+
+       gtk_dialog_add_action_widget (GTK_DIALOG (dialog), priv->button_call, 1);
+       gtk_widget_show (priv->button_call);
+
+       priv->button_chat = gtk_button_new_with_mnemonic (_("C_hat"));
+       image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_NEW_MESSAGE,
+               GTK_ICON_SIZE_BUTTON);
+       gtk_button_set_image (GTK_BUTTON (priv->button_chat), image);
+
+       gtk_dialog_add_action_widget (GTK_DIALOG (dialog), priv->button_chat, 2);
+       gtk_widget_show (priv->button_chat);
+
+       /* Tweak the dialog */
+       gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+
+       gtk_window_set_title (GTK_WINDOW (dialog), _("New Conversation"));
+       gtk_window_set_role (GTK_WINDOW (dialog), "new_message");
+       gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+       gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+       gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+
        /* text completion */
        completion = gtk_entry_completion_new ();
        model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
@@ -293,47 +340,88 @@ empathy_new_message_dialog_show (GtkWindow *parent)
                                             new_message_dialog_match_func,
                                             NULL, NULL);
        gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (model));
-       gtk_entry_set_completion (GTK_ENTRY (dialog->entry_id), completion);
+       gtk_entry_set_completion (GTK_ENTRY (priv->entry_id), completion);
        g_signal_connect (completion, "match-selected",
                          G_CALLBACK (new_message_dialog_match_selected_cb),
                          dialog);
        g_object_unref (completion);
        g_object_unref (model);
 
+       g_signal_connect (dialog, "response",
+                   G_CALLBACK (new_message_dialog_response_cb), dialog);
+
        empathy_builder_connect (gui, dialog,
-                              "new_message_dialog", "destroy", new_message_dialog_destroy_cb,
-                              "new_message_dialog", "response", new_message_dialog_response_cb,
                               "entry_id", "changed", new_message_change_state_button_cb,
                               NULL);
 
-       g_object_add_weak_pointer (G_OBJECT (dialog->dialog), (gpointer) &dialog);
-
        g_object_unref (gui);
 
        /* Create account chooser */
-       dialog->account_chooser = empathy_account_chooser_new ();
-       gtk_table_attach_defaults (GTK_TABLE (dialog->table_contact),
-                                  dialog->account_chooser,
+       priv->account_chooser = empathy_account_chooser_new ();
+       gtk_table_attach_defaults (GTK_TABLE (priv->table_contact),
+                                  priv->account_chooser,
                                   1, 2, 0, 1);
-       empathy_account_chooser_set_filter (EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser),
+       empathy_account_chooser_set_filter (EMPATHY_ACCOUNT_CHOOSER (priv->account_chooser),
                                            empathy_account_chooser_filter_is_connected,
                                            NULL);
-       gtk_widget_show (dialog->account_chooser);
+       gtk_widget_show (priv->account_chooser);
 
-       new_message_dialog_account_changed_cb (dialog->account_chooser, dialog);
-       g_signal_connect (dialog->account_chooser, "changed",
+       new_message_dialog_account_changed_cb (priv->account_chooser, dialog);
+       g_signal_connect (priv->account_chooser, "changed",
                          G_CALLBACK (new_message_dialog_account_changed_cb),
                          dialog);
 
-       if (parent) {
-               gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog),
-                                             GTK_WINDOW (parent));
+       gtk_widget_set_sensitive (priv->button_chat, FALSE);
+       gtk_widget_set_sensitive (priv->button_call, FALSE);
+}
+
+static void
+empathy_new_message_dialog_dispose (GObject *object)
+{
+       EmpathyNewMessageDialogPriv *priv = GET_PRIV (object);
+
+       if (priv->contact_manager != NULL) {
+               g_object_unref (priv->contact_manager);
+               priv->contact_manager = NULL;
        }
 
-       gtk_widget_set_sensitive (dialog->button_chat, FALSE);
-       gtk_widget_set_sensitive (dialog->button_call, FALSE);
+       if (G_OBJECT_CLASS (empathy_new_message_dialog_parent_class)->dispose)
+               G_OBJECT_CLASS (empathy_new_message_dialog_parent_class)->dispose (object);
+}
+
+static void
+empathy_new_message_dialog_class_init (
+  EmpathyNewMessageDialogClass *class)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+       g_type_class_add_private (class, sizeof (EmpathyNewMessageDialogPriv));
+
+       object_class->constructor = empathy_new_message_dialog_constructor;
+
+       object_class->dispose = empathy_new_message_dialog_dispose;
+}
 
-       gtk_widget_show (dialog->dialog);
+/**
+ * empathy_new_message_dialog_new:
+ * @parent: parent #GtkWindow of the dialog
+ *
+ * Create a new #EmpathyNewMessageDialog it.
+ *
+ * Return value: the new #EmpathyNewMessageDialog
+ */
+GtkWidget *
+empathy_new_message_dialog_show (GtkWindow *parent)
+{
+       GtkWidget *dialog;
+
+       dialog = g_object_new (EMPATHY_TYPE_NEW_MESSAGE_DIALOG, NULL);
+
+       if (parent) {
+               gtk_window_set_transient_for (GTK_WINDOW (dialog),
+                                             GTK_WINDOW (parent));
+       }
 
-       return dialog->dialog;
+       gtk_widget_show (dialog);
+       return dialog;
 }
index 08887c5e8c8f093ceb90f452349f5fdec6c41217..6e01619dbd5d33094491b9e290e2318850ecfcfd 100644 (file)
 #ifndef __EMPATHY_NEW_MESSAGE_DIALOG_H__
 #define __EMPATHY_NEW_MESSAGE_DIALOG_H__
 
+#include <glib-object.h>
 #include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
-GtkWidget *empathy_new_message_dialog_show (GtkWindow *parent);
+typedef struct _EmpathyNewMessageDialog EmpathyNewMessageDialog;
+typedef struct _EmpathyNewMessageDialogClass EmpathyNewMessageDialogClass;
+
+struct _EmpathyNewMessageDialogClass {
+    GtkDialogClass parent_class;
+};
+
+struct _EmpathyNewMessageDialog {
+    GtkDialog parent;
+};
+
+GType empathy_new_message_dialog_get_type (void);
+
+/* TYPE MACROS */
+#define EMPATHY_TYPE_NEW_MESSAGE_DIALOG \
+  (empathy_new_message_dialog_get_type ())
+#define EMPATHY_NEW_MESSAGE_DIALOG(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_NEW_MESSAGE_DIALOG, \
+    EmpathyNewMessageDialog))
+#define EMPATHY_NEW_MESSAGE_DIALOG_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), EMPATHY_TYPE_NEW_MESSAGE_DIALOG, \
+    EmpathyNewMessageDialogClass))
+#define EMPATHY_IS_NEW_MESSAGE_DIALOG(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), EMPATHY_TYPE_NEW_MESSAGE_DIALOG))
+#define EMPATHY_IS_NEW_MESSAGE_DIALOG_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), EMPATHY_TYPE_NEW_MESSAGE_DIALOG))
+#define EMPATHY_NEW_MESSAGE_DIALOG_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_NEW_MESSAGE_DIALOG, \
+    EmpathyNewMessageDialogClass))
+
+GtkWidget * empathy_new_message_dialog_show (GtkWindow *parent);
 
 G_END_DECLS
 
index a7b43818c2f643b9b4106d738da37fcbe8a7682f..009028ec1d58b7516818169c6c831ded13225710 100644 (file)
 <?xml version="1.0"?>
-<!--*- mode: xml -*-->
 <interface>
-  <object class="GtkImage" id="call_image">
-    <property name="icon_name">audio-input-microphone</property>
-    <property name="icon-size">4</property>
-  </object>
-  <object class="GtkImage" id="chat_image">
-    <property name="icon_name">im-message-new</property>
-    <property name="icon-size">4</property>
-  </object>
-  <object class="GtkDialog" id="new_message_dialog">
-    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">New Conversation</property>
-    <property name="resizable">False</property>
-    <property name="role">new_message</property>
-    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox1">
+  <!-- interface-requires gtk+ 2.12 -->
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkTable" id="table_contact">
+    <property name="visible">True</property>
+    <property name="n_rows">2</property>
+    <property name="n_columns">2</property>
+    <property name="column_spacing">6</property>
+    <property name="row_spacing">6</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="visible">True</property>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">Account:</property>
+      </object>
+      <packing>
+        <property name="x_options"></property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkLabel" id="label2">
         <property name="visible">True</property>
-        <property name="spacing">2</property>
-        <child>
-          <object class="GtkTable" id="table_contact">
-            <property name="visible">True</property>
-            <property name="n_rows">2</property>
-            <property name="n_columns">2</property>
-            <property name="column_spacing">6</property>
-            <property name="row_spacing">6</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Account:</property>
-              </object>
-              <packing>
-                <property name="x_options"/>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Contact ID:</property>
-              </object>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-                <property name="x_options"/>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="entry_id">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="activates_default">True</property>
-              </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>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <child>
-              <object class="GtkButton" id="button1">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="label">gtk-cancel</property>
-                <property name="use_stock">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="button_call">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="image">call_image</property>
-                <property name="label" translatable="yes">C_all</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="button_chat">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="image">chat_image</property>
-                <property name="label" translatable="yes">C_hat</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
+        <property name="xalign">0</property>
+        <property name="label" translatable="yes">Contact ID:</property>
       </object>
+      <packing>
+        <property name="top_attach">1</property>
+        <property name="bottom_attach">2</property>
+        <property name="x_options"></property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkEntry" id="entry_id">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="invisible_char">&#x2022;</property>
+        <property name="activates_default">True</property>
+      </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>
+      </packing>
+    </child>
+    <child>
+      <placeholder/>
     </child>
-    <action-widgets>
-      <action-widget response="-6">button1</action-widget>
-      <action-widget response="1">button_call</action-widget>
-      <action-widget response="2">button_chat</action-widget>
-    </action-widgets>
   </object>
 </interface>