]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-status-preset-dialog.c
Merge branch 'sasl'
[empathy.git] / libempathy-gtk / empathy-status-preset-dialog.c
index 562b9e4d9c37346dfc401e4d65c1f151eefc51a6..957a17d5858f1610d036c92df6b2d3c76bdbb042 100644 (file)
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
  *
- * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
+ * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
+ */
+/**
+ * SECTION:empathy-status-preset-dialog
+ * @title: EmpathyStatusPresetDialog
+ * @short_description: a dialog for editing the saved status messages
+ * @include: libempathy-gtk/empathy-status-preset-dialog.h
+ *
+ * #EmpathyStatusPresetDialog is a dialog allowing the user to add/remove/edit
+ * their saved status messages.
  */
 
 #include "config.h"
@@ -30,8 +39,6 @@
 #include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
 
-#include <libmissioncontrol/mc-enum-types.h>
-
 #include <libempathy/empathy-utils.h>
 #include <libempathy/empathy-status-presets.h>
 
 
 G_DEFINE_TYPE (EmpathyStatusPresetDialog, empathy_status_preset_dialog, GTK_TYPE_DIALOG);
 
-static McPresence states[] = {
-       MC_PRESENCE_AVAILABLE,
-       MC_PRESENCE_DO_NOT_DISTURB,
-       MC_PRESENCE_AWAY
+static TpConnectionPresenceType states[] = {
+       TP_CONNECTION_PRESENCE_TYPE_AVAILABLE,
+       TP_CONNECTION_PRESENCE_TYPE_BUSY,
+       TP_CONNECTION_PRESENCE_TYPE_AWAY,
 };
 
 typedef struct _EmpathyStatusPresetDialogPriv EmpathyStatusPresetDialogPriv;
 struct _EmpathyStatusPresetDialogPriv
 {
+       /* block status_preset_dialog_add_combo_changed () when > 0 */
        int block_add_combo_changed;
 
        GtkWidget *presets_treeview;
@@ -62,6 +70,7 @@ struct _EmpathyStatusPresetDialogPriv
 
        GtkTreeIter selected_iter;
        gboolean add_combo_changed;
+       char *saved_status;
 };
 
 enum
@@ -81,12 +90,23 @@ enum
        ADD_COMBO_N_COLS
 };
 
+static void
+empathy_status_preset_dialog_finalize (GObject *self)
+{
+       EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+
+       g_free (priv->saved_status);
+
+       G_OBJECT_CLASS (empathy_status_preset_dialog_parent_class)->finalize (self);
+}
+
 static void
 empathy_status_preset_dialog_class_init (EmpathyStatusPresetDialogClass *class)
 {
        GObjectClass *gobject_class;
 
        gobject_class = G_OBJECT_CLASS (class);
+       gobject_class->finalize = empathy_status_preset_dialog_finalize;
 
        g_type_class_add_private (gobject_class,
                        sizeof (EmpathyStatusPresetDialogPriv));
@@ -97,7 +117,7 @@ status_preset_dialog_presets_update (EmpathyStatusPresetDialog *self)
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
        GtkListStore *store;
-       int i;
+       guint i;
 
        store = GTK_LIST_STORE (gtk_tree_view_get_model (
                                GTK_TREE_VIEW (priv->presets_treeview)));
@@ -108,8 +128,9 @@ status_preset_dialog_presets_update (EmpathyStatusPresetDialog *self)
                GList *presets, *l;
                const char *icon_name;
 
-               presets = empathy_status_presets_get (states[i], -1);
                icon_name = empathy_icon_name_for_presence (states[i]);
+               presets = empathy_status_presets_get (states[i], -1);
+               presets = g_list_sort (presets, (GCompareFunc) g_utf8_collate);
 
                for (l = presets; l; l = l->next) {
                        char *preset = (char *) l->data;
@@ -130,6 +151,10 @@ static void
 status_preset_add_combo_reset (EmpathyStatusPresetDialog *self)
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+       GtkWidget *entry;
+
+       entry = gtk_bin_get_child (GTK_BIN (priv->add_combobox));
+       gtk_entry_set_text (GTK_ENTRY (entry), "");
 
        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->add_combobox),
                        &priv->selected_iter);
@@ -142,10 +167,10 @@ status_preset_dialog_setup_add_combobox (EmpathyStatusPresetDialog *self)
        GtkWidget *combobox = priv->add_combobox;
        GtkListStore *store;
        GtkCellRenderer *renderer;
-       int i;
+       guint i;
 
        store = gtk_list_store_new (ADD_COMBO_N_COLS,
-                       MC_TYPE_PRESENCE,       /* ADD_COMBO_STATE */
+                       G_TYPE_UINT,            /* ADD_COMBO_STATE */
                        G_TYPE_STRING,          /* ADD_COMBO_ICON_NAME */
                        G_TYPE_STRING,          /* ADD_COMBO_STATUS */
                        G_TYPE_STRING);         /* ADD_COMBO_DEFAULT_TEXT */
@@ -154,7 +179,7 @@ status_preset_dialog_setup_add_combobox (EmpathyStatusPresetDialog *self)
                                 GTK_TREE_MODEL (store));
        g_object_unref (store);
 
-       gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (combobox),
+       gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (combobox),
                        ADD_COMBO_DEFAULT_TEXT);
 
        for (i = 0; i < G_N_ELEMENTS (states); i++) {
@@ -195,7 +220,7 @@ status_preset_dialog_status_edited (GtkCellRendererText *renderer,
        GtkTreeModel *model;
        GtkTreePath *path;
        GtkTreeIter iter;
-       McPresence state;
+       TpConnectionPresenceType state;
        char *old_status;
        gboolean valid;
 
@@ -242,7 +267,7 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
        GtkCellRenderer *renderer;
 
        store = gtk_list_store_new (PRESETS_STORE_N_COLS,
-                       MC_TYPE_PRESENCE,       /* PRESETS_STORE_STATE */
+                       G_TYPE_UINT,            /* PRESETS_STORE_STATE */
                        G_TYPE_STRING,          /* PRESETS_STORE_ICON_NAME */
                        G_TYPE_STRING);         /* PRESETS_STORE_STATUS */
 
@@ -267,6 +292,8 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
        g_object_set (renderer,
                        "editable", TRUE,
                        NULL);
+       g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+
        g_signal_connect (renderer, "edited",
                        G_CALLBACK (status_preset_dialog_status_edited), self);
 }
@@ -288,7 +315,7 @@ status_preset_dialog_preset_remove (GtkButton *button,
        GtkTreeSelection *selection;
        GtkTreeModel *model;
        GtkTreeIter iter;
-       McPresence state;
+       TpConnectionPresenceType state;
        char *status;
 
        selection = gtk_tree_view_get_selection (
@@ -369,12 +396,17 @@ status_preset_dialog_add_combo_changed (GtkComboBox *combo,
                g_free (icon_name);
 
                status_preset_dialog_set_add_combo_changed (self, FALSE, TRUE);
+               if (priv->saved_status && strlen (priv->saved_status) > 0) {
+                       gtk_entry_set_text (GTK_ENTRY (entry),
+                                       priv->saved_status);
+               }
        } else {
-               const char *status;
+               g_free (priv->saved_status);
+               priv->saved_status = g_strdup (
+                               gtk_entry_get_text (GTK_ENTRY (entry)));
 
-               status = gtk_entry_get_text (GTK_ENTRY (entry));
                status_preset_dialog_set_add_combo_changed (self,
-                               strlen (status) > 0, FALSE);
+                               strlen (priv->saved_status) > 0, FALSE);
        }
 }
 
@@ -384,9 +416,12 @@ status_preset_dialog_add_preset (GtkWidget *widget,
 {
        EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
        GtkTreeModel *model;
+       GtkTreeIter iter;
        GtkWidget *entry;
-       McPresence state;
+       TpConnectionPresenceType state, cstate;
        const char *status;
+       char *cstatus;
+       gboolean valid, match = FALSE;
 
        g_return_if_fail (priv->add_combo_changed);
 
@@ -402,6 +437,40 @@ status_preset_dialog_add_preset (GtkWidget *widget,
        empathy_status_presets_set_last (state, status);
 
        status_preset_dialog_presets_update (self);
+
+       /* select the added status*/
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->presets_treeview));
+       for (valid = gtk_tree_model_get_iter_first (model, &iter);
+             valid;
+             valid = gtk_tree_model_iter_next (model, &iter)) {
+
+               gtk_tree_model_get (model, &iter,
+                               PRESETS_STORE_STATE, &cstate,
+                               PRESETS_STORE_STATUS, &cstatus,
+                               -1);
+
+               match = (cstate == state) && (strcmp (cstatus, status) == 0);
+
+               g_free (cstatus);
+
+               if (match) {
+                       GtkTreePath *path;
+
+                       path = gtk_tree_model_get_path (model, &iter);
+
+                       gtk_tree_selection_select_iter (
+                               gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->presets_treeview)),
+                               &iter);
+                       gtk_tree_view_scroll_to_cell (
+                                       GTK_TREE_VIEW (priv->presets_treeview),
+                                       path, NULL,
+                                       FALSE, 0., 0.);
+                       break;
+               }
+        }
+
+       if (!match) g_warning ("No match");
+
        status_preset_add_combo_reset (self);
 }
 
@@ -410,7 +479,7 @@ status_preset_dialog_add_combo_press_event (GtkWidget *widget,
                                            GdkEventButton *event,
                                            EmpathyStatusPresetDialog *self)
 {
-       if (!GTK_WIDGET_HAS_FOCUS (widget)) {
+       if (!gtk_widget_has_focus (widget)) {
                /* if the widget isn't focused, focus it and select the text */
                gtk_widget_grab_focus (widget);
                gtk_editable_select_region (GTK_EDITABLE (widget), 0, -1);
@@ -452,7 +521,6 @@ empathy_status_preset_dialog_init (EmpathyStatusPresetDialog *self)
 
        gtk_window_set_title (GTK_WINDOW (self),
                        _("Edit Custom Messages"));
-       gtk_dialog_set_has_separator (GTK_DIALOG (self), FALSE);
        gtk_dialog_add_button (GTK_DIALOG (self),
                        GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
 
@@ -492,8 +560,8 @@ empathy_status_preset_dialog_init (EmpathyStatusPresetDialog *self)
        status_preset_dialog_setup_presets_treeview (self);
        status_preset_dialog_setup_add_combobox (self);
 
-       gtk_box_pack_start(GTK_BOX (GTK_DIALOG (self)->vbox), toplevel_vbox,
-                       TRUE, TRUE, 0);
+       gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))),
+           toplevel_vbox, TRUE, TRUE, 0);
 
        g_object_unref (gui);
 }