X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-folder-view.c;h=b748c30e14c52cadc7291043894b487bd7dd4cac;hp=5140a68a47bffa30dd43ddf5614bfaa1e995ee52;hb=d0032260ef537f5f0b8c39a82990d81482ddd8f1;hpb=8d4419037aad046e1587b0df5dc9acff343adaf4 diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 5140a68..b748c30 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -97,6 +97,7 @@ const GtkTargetEntry folder_view_drag_types[] = static void modest_folder_view_class_init (ModestFolderViewClass *klass); static void modest_folder_view_init (ModestFolderView *obj); static void modest_folder_view_finalize (GObject *obj); +static void modest_folder_view_dispose (GObject *obj); static void tny_account_store_view_init (gpointer g, gpointer iface_data); @@ -198,10 +199,9 @@ static gboolean get_inner_models (ModestFolderView *self, GtkTreeModel **sort_model, GtkTreeModel **tny_model); #ifdef MODEST_TOOLKIT_HILDON2 -static void -on_activity_changed (TnyGtkFolderListStore *store, - gboolean activity, - ModestFolderView *folder_view); +static void on_activity_changed (TnyGtkFolderListStore *store, + gboolean activity, + ModestFolderView *folder_view); #endif enum { @@ -220,13 +220,6 @@ struct _ModestFolderViewPrivate { TnyFolder *folder_to_select; /* folder to select after the next update */ - gulong changed_signal; - gulong account_inserted_signal; - gulong account_removed_signal; - gulong account_changed_signal; - gulong conf_key_signal; - gulong display_name_changed_signal; - /* not unref this object, its a singlenton */ ModestEmailClipboard *clipboard; @@ -236,6 +229,7 @@ struct _ModestFolderViewPrivate { ModestFolderViewFilter filter; TnyFolderStoreQuery *query; + gboolean do_refresh; guint timer_expander; gchar *local_account_name; @@ -252,9 +246,8 @@ struct _ModestFolderViewPrivate { GtkCellRenderer *messages_renderer; - gulong outbox_deleted_handler; - - guint activity_changed_handler; + GSList *signal_handlers; + GdkColor active_color; }; #define MODEST_FOLDER_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -311,6 +304,7 @@ modest_folder_view_class_init (ModestFolderViewClass *klass) parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_folder_view_finalize; + gobject_class->finalize = modest_folder_view_dispose; g_type_class_add_private (gobject_class, sizeof(ModestFolderViewPrivate)); @@ -508,15 +502,28 @@ static void convert_parent_folders_to_dots (gchar **item_name) { gint n_parents = 0; + gint n_inbox_parents = 0; gchar *c; + gchar *path_start; gchar *last_separator; if (item_name == NULL) return; + path_start = *item_name; for (c = *item_name; *c != '\0'; c++) { if (g_str_has_prefix (c, MODEST_FOLDER_PATH_SEPARATOR)) { + gchar *compare; + if (c != path_start) { + compare = g_strndup (path_start, c - path_start); + compare = g_strstrip (compare); + if (g_ascii_strcasecmp (compare, "inbox") == 0) { + n_inbox_parents++; + } + g_free (compare); + } n_parents++; + path_start = c + 1; } } @@ -530,7 +537,7 @@ convert_parent_folders_to_dots (gchar **item_name) gint i; buffer = g_string_new (""); - for (i = 0; i < n_parents; i++) { + for (i = 0; i < n_parents - n_inbox_parents; i++) { buffer = g_string_append (buffer, MODEST_FOLDER_DOT); } buffer = g_string_append (buffer, last_separator); @@ -604,15 +611,13 @@ format_compact_style (gchar **item_name, buffer = g_string_append (buffer, *item_name); if (concat_folder_name) { - if (bold) buffer = g_string_append (buffer, ""); buffer = g_string_append (buffer, folder_name); - if (bold) buffer = g_string_append (buffer, ""); } g_free (*item_name); g_object_unref (account); *item_name = g_string_free (buffer, FALSE); - *use_markup = bold; + *use_markup = FALSE; } else { *use_markup = FALSE; } @@ -739,10 +744,22 @@ text_cell_data (GtkTreeViewColumn *column, if (item_name && item_weight) { /* Set the name in the treeview cell: */ - if (use_markup) - g_object_set (rendobj, "markup", item_name, "weight-set", FALSE, NULL); - else - g_object_set (rendobj, "text", item_name, "weight-set", TRUE, "weight", item_weight, NULL); + if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT && item_weight == 800 && + (priv->active_color.red != 0 || priv->active_color.blue != 0 || priv->active_color.green != 0)) { + g_object_set (rendobj, + "text", item_name, + "weight-set", FALSE, + "foreground-set", TRUE, + "foreground-gdk", &(priv->active_color), + NULL); + } else { + g_object_set (rendobj, + "text", item_name, + "foreground-set", FALSE, + "weight-set", TRUE, + "weight", item_weight, + NULL); + } /* Notify display name observers */ /* TODO: What listens for this signal, and how can it use only the new name? */ @@ -837,14 +854,13 @@ messages_cell_data (GtkTreeViewColumn *column, drafts = FALSE; } - if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) { - if (number > 0) { - item_name = g_strdup_printf (drafts?_("mcen_ti_messages"):_("mcen_ti_new_messages"), - number); - } - } - - } + if ((priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) && (number > 0)) { + item_name = + g_strdup_printf (ngettext ((drafts) ? "mcen_ti_message" : "mcen_va_new_message", + (drafts) ? "mcen_ti_messages" : "mcen_va_new_messages", + number), number); + } + } if (!item_name) item_name = g_strdup (""); @@ -899,15 +915,22 @@ get_composite_icons (const gchar *icon_code, { ThreePixbufs *retval; - if (!*pixbuf) - *pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (icon_code, FOLDER_ICON_SIZE)); + if (!*pixbuf) { + GdkPixbuf *icon; + icon = modest_platform_get_icon (icon_code, FOLDER_ICON_SIZE); + if (icon) { + *pixbuf = gdk_pixbuf_copy (icon); + } else { + *pixbuf = NULL; + } + } - if (!*pixbuf_open) + if (!*pixbuf_open && pixbuf && *pixbuf) *pixbuf_open = get_composite_pixbuf ("qgn_list_gene_fldr_exp", FOLDER_ICON_SIZE, *pixbuf); - if (!*pixbuf_close) + if (!*pixbuf_close && pixbuf && *pixbuf) *pixbuf_close = get_composite_pixbuf ("qgn_list_gene_fldr_clp", FOLDER_ICON_SIZE, *pixbuf); @@ -1018,7 +1041,7 @@ get_folder_icons (ModestFolderView *folder_view, TnyFolderType type, GObject *in type != TNY_FOLDER_TYPE_INBOX && modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (instance))) { #ifdef MODEST_TOOLKIT_HILDON2 - return get_composite_icons (MODEST_FOLDER_ICON_ACCOUNT, + return get_composite_icons (MODEST_FOLDER_ICON_REMOTE_FOLDER, &anorm_pixbuf, &anorm_pixbuf_open, &anorm_pixbuf_close); @@ -1215,7 +1238,7 @@ add_columns (GtkWidget *treeview) priv->messages_renderer = gtk_cell_renderer_text_new (); g_object_set (priv->messages_renderer, #ifdef MODEST_TOOLKIT_HILDON2 - "yalign", 0.0, + "yalign", 0.5, "ypad", MODEST_MARGIN_DEFAULT, "xpad", MODEST_MARGIN_DOUBLE, #else @@ -1256,14 +1279,14 @@ modest_folder_view_init (ModestFolderView *obj) priv->timer_expander = 0; priv->account_store = NULL; priv->query = NULL; + priv->do_refresh = TRUE; priv->style = MODEST_FOLDER_VIEW_STYLE_SHOW_ALL; priv->cur_folder_store = NULL; priv->visible_account_id = NULL; priv->mailbox = NULL; priv->folder_to_select = NULL; - priv->outbox_deleted_handler = 0; priv->reexpand = TRUE; - priv->activity_changed_handler = 0; + priv->signal_handlers = 0; /* Initialize the local account name */ conf = modest_runtime_get_conf(); @@ -1286,29 +1309,32 @@ modest_folder_view_init (ModestFolderView *obj) setup_drag_and_drop (GTK_TREE_VIEW(obj)); /* Connect signals */ - g_signal_connect (G_OBJECT (obj), - "key-press-event", - G_CALLBACK (on_key_pressed), NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (obj), "key-press-event", + G_CALLBACK (on_key_pressed), NULL); - priv->display_name_changed_signal = - g_signal_connect (modest_runtime_get_account_mgr (), - "display_name_changed", - G_CALLBACK (on_display_name_changed), - obj); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + (GObject*) modest_runtime_get_account_mgr (), + "display_name_changed", + G_CALLBACK (on_display_name_changed), + obj); /* * Track changes in the local account name (in the device it * will be the device name) */ - priv->conf_key_signal = g_signal_connect (G_OBJECT(conf), - "key_changed", - G_CALLBACK(on_configuration_key_changed), - obj); - - update_style (obj); - g_signal_connect (G_OBJECT (obj), "notify::style", G_CALLBACK (on_notify_style), (gpointer) obj); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(conf), + "key_changed", + G_CALLBACK(on_configuration_key_changed), + obj); + gdk_color_parse ("000", &priv->active_color); + update_style (obj); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (obj), "notify::style", + G_CALLBACK (on_notify_style), (gpointer) obj); } static void @@ -1320,49 +1346,26 @@ tny_account_store_view_init (gpointer g, gpointer iface_data) } static void -modest_folder_view_finalize (GObject *obj) +modest_folder_view_dispose (GObject *obj) { + static gboolean disposed = FALSE; ModestFolderViewPrivate *priv; - GtkTreeSelection *sel; - TnyAccount *local_account; - - g_return_if_fail (obj); - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(obj); + if (disposed) + return; - if (priv->timer_expander != 0) { - g_source_remove (priv->timer_expander); - priv->timer_expander = 0; - } + priv = MODEST_FOLDER_VIEW_GET_PRIVATE (obj); - local_account = (TnyAccount *) - modest_tny_account_store_get_local_folders_account (modest_runtime_get_account_store ()); - if (local_account) { - if (g_signal_handler_is_connected (local_account, - priv->outbox_deleted_handler)) - g_signal_handler_disconnect (local_account, - priv->outbox_deleted_handler); - g_object_unref (local_account); - } +#ifdef MODEST_TOOLKIT_HILDON2 + modest_signal_mgr_disconnect_all_and_destroy (priv->signal_handlers); +#endif + /* Free external references */ if (priv->account_store) { - g_signal_handler_disconnect (G_OBJECT(priv->account_store), - priv->account_inserted_signal); - g_signal_handler_disconnect (G_OBJECT(priv->account_store), - priv->account_removed_signal); - g_signal_handler_disconnect (G_OBJECT(priv->account_store), - priv->account_changed_signal); g_object_unref (G_OBJECT(priv->account_store)); priv->account_store = NULL; } - if (g_signal_handler_is_connected (modest_runtime_get_account_mgr (), - priv->display_name_changed_signal)) { - g_signal_handler_disconnect (modest_runtime_get_account_mgr (), - priv->display_name_changed_signal); - priv->display_name_changed_signal = 0; - } - if (priv->query) { g_object_unref (G_OBJECT (priv->query)); priv->query = NULL; @@ -1373,20 +1376,6 @@ modest_folder_view_finalize (GObject *obj) priv->folder_to_select = NULL; } - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(obj)); - if (sel) - g_signal_handler_disconnect (G_OBJECT(sel), priv->changed_signal); - - g_free (priv->local_account_name); - g_free (priv->visible_account_id); - g_free (priv->mailbox); - - if (priv->conf_key_signal) { - g_signal_handler_disconnect (modest_runtime_get_conf (), - priv->conf_key_signal); - priv->conf_key_signal = 0; - } - if (priv->cur_folder_store) { g_object_unref (priv->cur_folder_store); priv->cur_folder_store = NULL; @@ -1396,10 +1385,31 @@ modest_folder_view_finalize (GObject *obj) g_object_unref (priv->list_to_move); priv->list_to_move = NULL; } +} + +static void +modest_folder_view_finalize (GObject *obj) +{ + ModestFolderViewPrivate *priv; + + g_return_if_fail (obj); + + priv = MODEST_FOLDER_VIEW_GET_PRIVATE(obj); + + if (priv->timer_expander != 0) { + g_source_remove (priv->timer_expander); + priv->timer_expander = 0; + } + + g_free (priv->local_account_name); + g_free (priv->visible_account_id); + g_free (priv->mailbox); /* Clear hidding array created by cut operation */ _clear_hidding_filter (MODEST_FOLDER_VIEW (obj)); + gdk_color_parse ("000", &priv->active_color); + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -1418,34 +1428,40 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore if (G_UNLIKELY (priv->account_store)) { - if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), - priv->account_inserted_signal)) - g_signal_handler_disconnect (G_OBJECT (priv->account_store), - priv->account_inserted_signal); - if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), - priv->account_removed_signal)) - g_signal_handler_disconnect (G_OBJECT (priv->account_store), - priv->account_removed_signal); - if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), - priv->account_changed_signal)) - g_signal_handler_disconnect (G_OBJECT (priv->account_store), - priv->account_changed_signal); + if (modest_signal_mgr_is_connected (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_inserted")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_inserted"); + if (modest_signal_mgr_is_connected (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_removed")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_removed"); + if (modest_signal_mgr_is_connected (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_changed")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + G_OBJECT (priv->account_store), + "account_changed"); g_object_unref (G_OBJECT (priv->account_store)); } priv->account_store = g_object_ref (G_OBJECT (account_store)); - priv->account_removed_signal = - g_signal_connect (G_OBJECT(account_store), "account_removed", - G_CALLBACK (on_account_removed), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(account_store), "account_removed", + G_CALLBACK (on_account_removed), self); - priv->account_inserted_signal = - g_signal_connect (G_OBJECT(account_store), "account_inserted", - G_CALLBACK (on_account_inserted), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(account_store), "account_inserted", + G_CALLBACK (on_account_inserted), self); - priv->account_changed_signal = - g_signal_connect (G_OBJECT(account_store), "account_changed", - G_CALLBACK (on_account_changed), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(account_store), "account_changed", + G_CALLBACK (on_account_changed), self); modest_folder_view_update_model (MODEST_FOLDER_VIEW (self), account_store); priv->reselect = FALSE; @@ -1516,12 +1532,10 @@ on_account_inserted (TnyAccountStore *account_store, for a merge folder */ if (TNY_IS_GTK_FOLDER_LIST_STORE (model) && MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (account)) { - - priv->outbox_deleted_handler = - g_signal_connect (account, - "outbox-deleted", - G_CALLBACK (on_outbox_deleted_cb), - user_data); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + (GObject*) account, "outbox-deleted", + G_CALLBACK (on_outbox_deleted_cb), + user_data); } /* Refilter the model */ @@ -1675,10 +1689,10 @@ on_account_removed (TnyAccountStore *account_store, /* Disconnect the signal handler */ if (TNY_IS_GTK_FOLDER_LIST_STORE (model) && MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (account)) { - if (g_signal_handler_is_connected (account, - priv->outbox_deleted_handler)) - g_signal_handler_disconnect (account, - priv->outbox_deleted_handler); + if (modest_signal_mgr_is_connected (priv->signal_handlers, (GObject*) account, "outbox-deleted")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + (GObject *) account, + "outbox-deleted"); } /* Remove the account from the model */ @@ -1763,6 +1777,12 @@ modest_folder_view_on_map (ModestFolderView *self, GtkWidget* modest_folder_view_new (TnyFolderStoreQuery *query) { + return modest_folder_view_new_full (query, TRUE); +} + +GtkWidget* +modest_folder_view_new_full (TnyFolderStoreQuery *query, gboolean do_refresh) +{ GObject *self; ModestFolderViewPrivate *priv; GtkTreeSelection *sel; @@ -1777,13 +1797,20 @@ modest_folder_view_new (TnyFolderStoreQuery *query) if (query) priv->query = g_object_ref (query); + priv->do_refresh = do_refresh; + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - priv->changed_signal = g_signal_connect (sel, "changed", - G_CALLBACK (on_selection_changed), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + (GObject*) sel, "changed", + G_CALLBACK (on_selection_changed), self); - g_signal_connect (self, "row-activated", G_CALLBACK (on_row_activated), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + self, "row-activated", + G_CALLBACK (on_row_activated), self); - g_signal_connect (self, "expose-event", G_CALLBACK (modest_folder_view_on_map), NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + self, "expose-event", + G_CALLBACK (modest_folder_view_on_map), NULL); return GTK_WIDGET(self); } @@ -2223,7 +2250,7 @@ modest_folder_view_update_model (ModestFolderView *self, { ModestFolderViewPrivate *priv; GtkTreeModel *model; - GtkTreeModel *filter_model = NULL, *sortable = NULL; + GtkTreeModel *filter_model = NULL, *sortable = NULL, *old_tny_model; g_return_val_if_fail (self && MODEST_IS_FOLDER_VIEW (self), FALSE); g_return_val_if_fail (account_store && MODEST_IS_TNY_ACCOUNT_STORE(account_store), @@ -2243,8 +2270,14 @@ modest_folder_view_update_model (ModestFolderView *self, /* FIXME: the local accounts are not shown when the query selects only the subscribed folders */ #ifdef MODEST_TOOLKIT_HILDON2 + TnyGtkFolderListStoreFlags flags; + flags = TNY_GTK_FOLDER_LIST_STORE_FLAG_SHOW_PATH; + if (priv->do_refresh) + flags |= TNY_GTK_FOLDER_LIST_STORE_FLAG_DELAYED_REFRESH; + else + flags |= TNY_GTK_FOLDER_LIST_STORE_FLAG_NO_REFRESH; model = tny_gtk_folder_list_store_new_with_flags (NULL, - TNY_GTK_FOLDER_LIST_STORE_FLAG_SHOW_PATH); + flags); tny_gtk_folder_list_store_set_path_separator (TNY_GTK_FOLDER_LIST_STORE (model), MODEST_FOLDER_PATH_SEPARATOR); #else @@ -2263,16 +2296,16 @@ modest_folder_view_update_model (ModestFolderView *self, acc_store = modest_runtime_get_account_store (); account = modest_tny_account_store_get_local_folders_account (acc_store); - if (g_signal_handler_is_connected (account, - priv->outbox_deleted_handler)) - g_signal_handler_disconnect (account, - priv->outbox_deleted_handler); + if (modest_signal_mgr_is_connected (priv->signal_handlers, (GObject *) account, + "outbox-deleted")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + (GObject *) account, + "outbox-deleted"); - priv->outbox_deleted_handler = - g_signal_connect (account, - "outbox-deleted", - G_CALLBACK (on_outbox_deleted_cb), - self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + (GObject*) account, "outbox-deleted", + G_CALLBACK (on_outbox_deleted_cb), + self); g_object_unref (account); } @@ -2296,25 +2329,28 @@ modest_folder_view_update_model (ModestFolderView *self, self, NULL); - if (priv->activity_changed_handler > 0) { - GtkTreeModel *old_tny_model; - - if (get_inner_models (self, NULL, NULL, &old_tny_model)) { - g_signal_handler_disconnect (G_OBJECT (old_tny_model), priv->activity_changed_handler); - } - priv->activity_changed_handler = 0; + if (get_inner_models (self, NULL, NULL, &old_tny_model)) { + if (modest_signal_mgr_is_connected (priv->signal_handlers, (GObject *) old_tny_model, + "activity-changed")) + priv->signal_handlers = modest_signal_mgr_disconnect (priv->signal_handlers, + G_OBJECT (old_tny_model), + "activity-changed"); } /* Set new model */ gtk_tree_view_set_model (GTK_TREE_VIEW(self), filter_model); #ifndef MODEST_TOOLKIT_HILDON2 - g_signal_connect (G_OBJECT(filter_model), "row-inserted", - (GCallback) on_row_inserted_maybe_select_folder, self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(filter_model), "row-inserted", + (GCallback) on_row_inserted_maybe_select_folder, self); #endif #ifdef MODEST_TOOLKIT_HILDON2 - priv->activity_changed_handler = - g_signal_connect (G_OBJECT (model), "activity-changed", G_CALLBACK (on_activity_changed), self); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (model), + "activity-changed", + G_CALLBACK (on_activity_changed), + self); #endif g_object_unref (model); @@ -2367,9 +2403,11 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) cause (and it actually does it) a free of the summary of the folder (because the main window will clear the headers view */ +#ifndef MODEST_TOOLKIT_HILDON2 if (TNY_IS_FOLDER(priv->cur_folder_store)) tny_folder_sync_async (TNY_FOLDER(priv->cur_folder_store), FALSE, NULL, NULL, NULL); +#endif g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, priv->cur_folder_store, FALSE); @@ -2617,6 +2655,51 @@ compare_accounts_first (TnyFolderStore *s1, TnyFolderStore *s2) return is_account2 - is_account1; } +static gint +compare_folders (const gchar *name1, const gchar *name2) +{ + const gchar *separator1, *separator2; + const gchar *next1, *next2; + gchar *top1, *top2; + gint cmp; + + if (name1 == NULL || name1[0] == '\0') + return -1; + if (name2 == NULL || name2[0] == '\0') + return 1; + + separator1 = strstr (name1, MODEST_FOLDER_PATH_SEPARATOR); + if (separator1) { + top1 = g_strndup (name1, separator1 - name1); + } else { + top1 = g_strdup (name1); + } + + separator2 = strstr (name2, MODEST_FOLDER_PATH_SEPARATOR); + if (separator2) { + top2 = g_strndup (name2, separator2 - name2); + } else { + top2 = g_strdup (name2); + } + + + cmp = modest_text_utils_utf8_strcmp (top1, top2, TRUE); + g_free (top1); + g_free (top2); + + if (cmp != 0) + return cmp; + + if (separator1 == NULL && separator2 == NULL) + return 0; + + next1 = (separator1 != NULL)?separator1 + strlen (MODEST_FOLDER_PATH_SEPARATOR):NULL; + next2 = (separator2 != NULL)?separator2 + strlen (MODEST_FOLDER_PATH_SEPARATOR):NULL; + + return compare_folders (next1, next2); +} + + /* * This function orders the mail accounts according to these rules: * 1st - remote accounts @@ -2672,7 +2755,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, } /* Pure sort by name */ - cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE); + cmp = compare_folders (name1, name2); finish: if (folder1) g_object_unref(G_OBJECT(folder1)); @@ -3321,16 +3404,19 @@ setup_drag_and_drop (GtkTreeView *self) #ifdef MODEST_TOOLKIT_HILDON2 return; #endif + ModestFolderViewPrivate *priv; + + priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_HIGHLIGHT, folder_view_drag_types, G_N_ELEMENTS (folder_view_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - g_signal_connect (G_OBJECT (self), - "drag_data_received", - G_CALLBACK (on_drag_data_received), - NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (self), "drag_data_received", + G_CALLBACK (on_drag_data_received), NULL); /* Set up the treeview as a dnd source */ @@ -3340,20 +3426,17 @@ setup_drag_and_drop (GtkTreeView *self) G_N_ELEMENTS (folder_view_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - g_signal_connect (G_OBJECT (self), - "drag_motion", - G_CALLBACK (on_drag_motion), - NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (self), "drag_motion", + G_CALLBACK (on_drag_motion), NULL); - g_signal_connect (G_OBJECT (self), - "drag_data_get", - G_CALLBACK (on_drag_data_get), - NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (self), "drag_data_get", + G_CALLBACK (on_drag_data_get), NULL); - g_signal_connect (G_OBJECT (self), - "drag_drop", - G_CALLBACK (drag_drop_cb), - NULL); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT (self), "drag_drop", + G_CALLBACK (drag_drop_cb), NULL); } /* @@ -3792,8 +3875,9 @@ modest_folder_view_copy_model (ModestFolderView *folder_view_src, /* Get src model*/ if (get_inner_models (folder_view_dst, NULL, NULL, &old_tny_model)) { - g_signal_handler_disconnect (G_OBJECT (old_tny_model), dst_priv->activity_changed_handler); - dst_priv->activity_changed_handler = 0; + modest_signal_mgr_disconnect (dst_priv->signal_handlers, + G_OBJECT (old_tny_model), + "activity-changed"); } filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view_src)); model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter_model)); @@ -3810,13 +3894,19 @@ modest_folder_view_copy_model (ModestFolderView *folder_view_src, /* Set copied model */ gtk_tree_view_set_model (GTK_TREE_VIEW (folder_view_dst), new_filter_model); #ifndef MODEST_TOOLKIT_HILDON2 - g_signal_connect (G_OBJECT(new_filter_model), "row-inserted", - (GCallback) on_row_inserted_maybe_select_folder, folder_view_dst); + priv->signal_handlers = modest_signal_mgr_connect (priv->signal_handlers, + G_OBJECT(new_filter_model), "row-inserted", + (GCallback) on_row_inserted_maybe_select_folder, + folder_view_dst); #endif #ifdef MODEST_TOOLKIT_HILDON2 - if (new_tny_model) - dst_priv->activity_changed_handler = g_signal_connect (G_OBJECT (new_tny_model), "activity-changed", - G_CALLBACK (on_activity_changed), folder_view_dst); + if (new_tny_model) { + dst_priv->signal_handlers = modest_signal_mgr_connect (dst_priv->signal_handlers, + G_OBJECT (new_tny_model), + "activity-changed", + G_CALLBACK (on_activity_changed), + folder_view_dst); + } #endif /* Free */ @@ -3948,7 +4038,7 @@ static void update_style (ModestFolderView *self) { ModestFolderViewPrivate *priv; - GdkColor style_color; + GdkColor style_color, style_active_color; PangoAttrList *attr_list; GtkStyle *style; PangoAttribute *attr; @@ -3982,6 +4072,12 @@ update_style (ModestFolderView *self) NULL); pango_attr_list_unref (attr_list); } + + if (gtk_style_lookup_color (GTK_WIDGET (self)->style, "ActiveTextColor", &style_active_color)) { + priv->active_color = style_active_color; + } else { + gdk_color_parse ("000", &(priv->active_color)); + } } static void