#include <tny-account-store.h>
#include <tny-account.h>
#include <tny-folder.h>
+#include <modest-marshal.h>
#include <modest-icon-names.h>
#include <modest-icon-factory.h>
#include <modest-tny-account-store.h>
static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self);
enum {
- FOLDER_SELECTED_SIGNAL,
+ FOLDER_SELECTION_CHANGED_SIGNAL,
LAST_SIGNAL
};
g_type_class_add_private (gobject_class,
sizeof(ModestFolderViewPrivate));
- signals[FOLDER_SELECTED_SIGNAL] =
- g_signal_new ("folder_selected",
+ signals[FOLDER_SELECTION_CHANGED_SIGNAL] =
+ g_signal_new ("folder_selection_changed",
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ModestFolderViewClass,
- folder_selected),
+ folder_selection_changed),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
+ modest_marshal_VOID__POINTER_BOOLEAN,
+ G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_BOOLEAN);
}
g_free (fname);
}
-/* FIXME: move these to TnyMail */
-enum {
- TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_ROOT + 1, /* urgh */
- TNY_FOLDER_TYPE_DRAFTS,
- TNY_FOLDER_TYPE_CONTACTS,
- TNY_FOLDER_TYPE_CALENDAR
-};
-
+/* guess the folder type based on the name, or -1 in case of error */
static TnyFolderType
-guess_folder_type (const gchar* name)
+guess_type_from_name (const gchar* name)
{
- TnyFolderType type;
+ gint type;
gchar *folder;
-
- g_return_val_if_fail (name, TNY_FOLDER_TYPE_NORMAL);
+
+ if (!name)
+ return -1;
type = TNY_FOLDER_TYPE_NORMAL;
folder = g_utf8_strdown (name, strlen(name));
}
+
+TnyFolderType
+modest_folder_view_guess_folder_type (TnyFolder *folder)
+{
+ TnyFolderType type;
+
+ g_return_val_if_fail (folder, -1);
+
+ type = tny_folder_get_folder_type (folder);
+ if (type == TNY_FOLDER_TYPE_NORMAL)
+ type = guess_type_from_name (tny_folder_get_name (folder));
+
+ return type;
+}
+
+
static void
icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
rendobj = G_OBJECT(renderer);
if (type == TNY_FOLDER_TYPE_NORMAL)
- type = guess_folder_type (fname);
+ type = guess_type_from_name (fname);
if (fname)
g_free (fname);
priv->view_is_empty = TRUE;
- g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL], 0,
- NULL);
+ g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
+ NULL, TRUE);
return TRUE;
}
GtkTreeIter iter;
ModestFolderView *tree_view;
ModestFolderViewPrivate *priv;
- gint type;
- const gchar *account_name;
+ gint type;
g_return_if_fail (sel);
g_return_if_fail (user_data);
priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data);
priv->cur_selection = sel;
-
/* is_empty means that there is only the 'empty' item */
if (priv->view_is_empty)
return;
-
+
/* folder was _un_selected if true */
if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
- priv->cur_folder = NULL; /* FIXME: need this? */
- return;
- }
-
+ priv->cur_folder = NULL; /* FIXME: need this? */
+ return;
+ }
+
tree_view = MODEST_FOLDER_VIEW (user_data);
-
gtk_tree_model_get (model, &iter,
TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
-1);
-
- if (type == TNY_FOLDER_TYPE_ROOT) {
- account_name = tny_account_get_name (TNY_ACCOUNT (folder));
- } else {
- if (priv->cur_folder)
- tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */
- priv->cur_folder = folder;
-
- /* FIXME: this is ugly */
- account_name = get_account_name_from_folder (model, iter);
-
- g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTED_SIGNAL], 0,
- folder);
- }
-
+
+ if (type == TNY_FOLDER_TYPE_ROOT)
+ return;
+
+ /* emit 2 signals: one for the unselection of the old one,
+ * and one for the selection of the new on */
+ g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
+ priv->cur_folder, FALSE);
+ g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
+ folder, TRUE);
+
+ if (priv->cur_folder)
+ tny_folder_expunge (priv->cur_folder, NULL); /* FIXME */
+ priv->cur_folder = folder;
}
static void
g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
retval = update_model (self, MODEST_TNY_ACCOUNT_STORE(account_store)); /* ugly */
- g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTED_SIGNAL],
- 0, NULL);
+ g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL],
+ 0, NULL, TRUE);
return retval;
}
+
+/* ugly */
static const gchar *
get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter)
{
#ifndef __MODEST_FOLDER_VIEW_H__
#define __MODEST_FOLDER_VIEW_H__
+#include <glib-object.h>
#include <tny-gtk-account-list-model.h>
#include <tny-account-store.h>
-#include <glib-object.h>
+#include <modest-tny-account-store.h>
G_BEGIN_DECLS
struct _ModestFolderViewClass {
GtkTreeViewClass parent_class;
- /* emitted when a folder is clicked */
- void (*folder_selected) (ModestFolderView* self,
- TnyFolder *folder,
- gpointer user_data);
-
+ /* emitted when a folder is selected or unselected */
+ void (*folder_selection_changed) (ModestFolderView* self,
+ TnyFolder *folder,
+ gboolean selected,
+ gpointer user_data);
+
gboolean (*update_model) (ModestFolderView *self,
TnyAccountStore *account_store);
};
+
+/* FIXME: move these to TnyMail */
+enum {
+
+ TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_ROOT + 1, /* urgh */
+ TNY_FOLDER_TYPE_DRAFTS,
+ TNY_FOLDER_TYPE_CONTACTS,
+ TNY_FOLDER_TYPE_CALENDAR
+};
+
+
/**
* modest_folder_view_get_type:
*
gboolean modest_folder_view_is_empty (ModestFolderView *self);
+/**
+ * modest_folder_view_guess_folder_type:
+ * @folder: a tnymail folder
+ *
+ * guess the type of the folder, this is a class method so it does not need
+ * an ModestFolderView instance
+ *
+ * Returns: the folder type, or -1 in case of error
+ */
+TnyFolderType modest_folder_view_guess_folder_type (TnyFolder *folder);
+
+
+/* FIXME: this is ugly */
const gchar* modest_folder_view_get_selected_account (ModestFolderView *self);
G_END_DECLS
typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
struct _ModestHeaderViewPrivate {
- TnyFolder *tny_folder;
+ TnyFolder *folder;
TnyList *headers;
GMutex *lock;
ModestHeaderViewStyle style;
-
- gulong sig1;
+ gulong sig1;
};
#define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
}
-
-/* try to make a shorter display address; changes its argument in-place */
-static gchar*
-display_address (gchar *address)
-{
- gchar *cursor;
-
- if (!address)
- return NULL;
-
- /* simplistic --> remove <email@address> from display name */
- cursor = g_strstr_len (address, strlen(address), "<");
- if (cursor)
- cursor[0]='\0';
-
- /* simplistic --> remove (bla bla) from display name */
- cursor = g_strstr_len (address, strlen(address), "(");
- if (cursor)
- cursor[0]='\0';
-
- /* FIXME */
- if (!g_utf8_validate (address, -1, NULL))
- g_printerr ("modest: invalid: '%s'", address);
-
- return address;
-}
-
-
-
static void
sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender)
g_object_set (G_OBJECT(renderer),
"text",
- display_address (address),
+ modest_text_utils_display_address (address),
"weight",
(flags & TNY_HEADER_FLAG_SEEN) ? 400 : 800,
"style",
rendobj = G_OBJECT(renderer);
header = g_strdup_printf ("%s %s\n%s",
- display_address (from),
+ modest_text_utils_display_address (from),
display_date(date),
subject);
priv->lock = NULL;
}
- priv->headers = NULL;
- priv->tny_folder = NULL;
+ priv->headers = NULL;
+ priv->folder = NULL;
- //G_OBJECT_CLASS(parent_class)->finalize (obj);
+ G_OBJECT_CLASS(parent_class)->finalize (obj);
}
GtkWidget*
self = MODEST_HEADER_VIEW(user_data);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ g_assert (folder == priv->folder);
+
if (!folder) /* when there is no folder */
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE);
else { /* it's a new one or a refresh */
}
+TnyFolder*
+modest_header_view_get_folder (ModestHeaderView *self)
+{
+ ModestHeaderViewPrivate *priv;
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ return priv->folder;
+}
+
gboolean
modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
ModestHeaderViewPrivate *priv;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ priv->folder = folder;
+
if (!folder) {/* when there is no folder */
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE);
gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL);
on_refresh_folder_status_update,
self);
}
-
+
/* no message selected */
g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0,
NULL);
-
- //g_mutex_unlock (priv->lock);
-
return TRUE;
}
+
static void
on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
{
/* Free */
/* g_free (folder); */
}
-
MODEST_HEADER_VIEW_COLUMN_MSGTYPE,
MODEST_HEADER_VIEW_COLUMN_ATTACH,
MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER,
-
MODEST_HEADER_VIEW_COLUMN_NUM
} ModestHeaderViewColumn;
-/* typedef enum _ModestHeaderViewColumn ModestHeaderViewColumn; */
typedef enum _ModestHeaderViewStyle {
MODEST_HEADER_VIEW_STYLE_NORMAL,
MODEST_HEADER_VIEW_STYLE_COMPACT,
MODEST_HEADER_VIEW_STYLE_NUM
} ModestHeaderViewStyle;
-/* typedef enum _ModestHeaderViewStyle ModestHeaderViewStyle; */
typedef enum _ModestItemType {
MODEST_ITEM_TYPE_MESSAGE,
TnyFolder *folder);
+
+
+/**
+ * modest_header_view_get_folder:
+ * @self: a ModestHeaderView instance
+ *
+ * get the folder in this ModestHeaderView
+ *
+ * Returns: the tny folder instance or NULL if there is none
+ */
+TnyFolder *modest_header_view_get_folder (ModestHeaderView *self);
+
+
/**
* modest_header_view_set_columns:
* @self: a ModestHeaderView instance
static void
modest_toolbar_init (ModestToolbar *obj)
{
+ ModestToolbarPrivate *priv;
+ priv = MODEST_TOOLBAR_GET_PRIVATE(obj);
+
+ priv->tooltips = NULL;
}
static void
modest_toolbar_finalize (GObject *obj)
{
+ ModestToolbarPrivate *priv;
+ priv = MODEST_TOOLBAR_GET_PRIVATE(obj);
+
+ if (priv->tooltips) {
+ g_object_ref_sink (G_OBJECT(priv->tooltips));
+ priv->tooltips = NULL;
+ }
+
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
modest_toolbar_set_buttons (ModestToolbar *self, const GSList *buttons)
{
const GSList *cursor;
- GtkTooltips *tooltips;
-
- g_return_val_if_fail (self, FALSE);
+ ModestToolbarPrivate *priv;
+
+ priv = MODEST_TOOLBAR_GET_PRIVATE(self);
- tooltips = gtk_tooltips_new ();
- gtk_tooltips_enable (tooltips);
+ priv->tooltips = gtk_tooltips_new ();
+ gtk_tooltips_enable (priv->tooltips);
gtk_toolbar_set_tooltips (GTK_TOOLBAR(self), TRUE);
cursor = buttons;
g_signal_connect (G_OBJECT(button), "clicked",
G_CALLBACK(on_toolbutton_clicked), self);
- gtk_tooltips_set_tip (tooltips, GTK_WIDGET(button),tooltip, NULL);
+ gtk_tooltips_set_tip (priv->tooltips, GTK_WIDGET(button),
+ tooltip, NULL);
gtk_widget_show_all (GTK_WIDGET(button));
gtk_toolbar_insert (GTK_TOOLBAR(self), button, -1);
}