modest-header-view.c \
modest-header-view.h \
modest-msg-view.c \
- modest-msg-view.h
-
-
-
-# modest-toolbar.h
-# modest-toolbar.c
+ modest-msg-view.h \
+ modest-toolbar.h \
+ modest-toolbar.c
LDADD = \
$(MODEST_GSTUFF_LIBS) \
#include <tny-account-tree-model.h>
#include <tny-account-store-iface.h>
#include <tny-account-iface.h>
-#include <tny-msg-folder-iface.h>
-#include <tny-summary-window-iface.h>
+#include <tny-folder-iface.h>
#include <modest-icon-names.h>
#include <modest-icon-factory.h>
#include <modest-tny-account-store.h>
struct _ModestFolderViewPrivate {
TnyAccountStoreIface *account_store;
- TnyMsgFolderIface *cur_folder;
+ TnyFolderIface *cur_folder;
gboolean view_is_empty;
gulong sig1, sig2;
sizeof(ModestFolderView),
1, /* n_preallocs */
(GInstanceInitFunc) modest_folder_view_init,
+ NULL
};
my_type = g_type_register_static (GTK_TYPE_TREE_VIEW,
static void
text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
- GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
{
GObject *rendobj;
gchar *fname;
gint unread;
- TnyMsgFolderType type;
+ TnyFolderType type;
gtk_tree_model_get (tree_model, iter,
TNY_ACCOUNT_TREE_MODEL_NAME_COLUMN, &fname,
/* FIXME: move these to TnyMail */
enum {
- TNY_MSG_FOLDER_TYPE_NOTES = TNY_MSG_FOLDER_TYPE_SENT + 1, /* urgh */
- TNY_MSG_FOLDER_TYPE_DRAFTS,
- TNY_MSG_FOLDER_TYPE_CONTACTS,
- TNY_MSG_FOLDER_TYPE_CALENDAR
+ TNY_FOLDER_TYPE_NOTES = TNY_FOLDER_TYPE_SENT + 1, /* urgh */
+ TNY_FOLDER_TYPE_DRAFTS,
+ TNY_FOLDER_TYPE_CONTACTS,
+ TNY_FOLDER_TYPE_CALENDAR
};
-static TnyMsgFolderType
+static TnyFolderType
guess_folder_type (const gchar* name)
{
- TnyMsgFolderType type;
+ TnyFolderType type;
gchar *folder;
- g_return_val_if_fail (name, TNY_MSG_FOLDER_TYPE_NORMAL);
+ g_return_val_if_fail (name, TNY_FOLDER_TYPE_NORMAL);
- type = TNY_MSG_FOLDER_TYPE_NORMAL;
+ type = TNY_FOLDER_TYPE_NORMAL;
folder = g_utf8_strdown (name, strlen(name));
if (strcmp (folder, "inbox") == 0 ||
strcmp (folder, _("inbox")) == 0)
- type = TNY_MSG_FOLDER_TYPE_INBOX;
+ type = TNY_FOLDER_TYPE_INBOX;
else if (strcmp (folder, "outbox") == 0 ||
strcmp (folder, _("outbox")) == 0)
- type = TNY_MSG_FOLDER_TYPE_OUTBOX;
+ type = TNY_FOLDER_TYPE_OUTBOX;
else if (g_str_has_prefix(folder, "junk") ||
g_str_has_prefix(folder, _("junk")))
- type = TNY_MSG_FOLDER_TYPE_JUNK;
+ type = TNY_FOLDER_TYPE_JUNK;
else if (g_str_has_prefix(folder, "trash") ||
g_str_has_prefix(folder, _("trash")))
- type = TNY_MSG_FOLDER_TYPE_JUNK;
+ type = TNY_FOLDER_TYPE_JUNK;
else if (g_str_has_prefix(folder, "sent") ||
g_str_has_prefix(folder, _("sent")))
- type = TNY_MSG_FOLDER_TYPE_SENT;
+ type = TNY_FOLDER_TYPE_SENT;
/* these are not *really* TNY_ types */
else if (g_str_has_prefix(folder, "draft") ||
g_str_has_prefix(folder, _("draft")))
- type = TNY_MSG_FOLDER_TYPE_DRAFTS;
+ type = TNY_FOLDER_TYPE_DRAFTS;
else if (g_str_has_prefix(folder, "notes") ||
g_str_has_prefix(folder, _("notes")))
- type = TNY_MSG_FOLDER_TYPE_NOTES;
+ type = TNY_FOLDER_TYPE_NOTES;
else if (g_str_has_prefix(folder, "contacts") ||
g_str_has_prefix(folder, _("contacts")))
- type = TNY_MSG_FOLDER_TYPE_CONTACTS;
+ type = TNY_FOLDER_TYPE_CONTACTS;
else if (g_str_has_prefix(folder, "calendar") ||
g_str_has_prefix(folder, _("calendar")))
- type = TNY_MSG_FOLDER_TYPE_CALENDAR;
+ type = TNY_FOLDER_TYPE_CALENDAR;
g_free (folder);
return type;
{
GObject *rendobj;
GdkPixbuf *pixbuf;
- TnyMsgFolderType type;
+ TnyFolderType type;
gchar *fname = NULL;
gint unread;
TNY_ACCOUNT_TREE_MODEL_UNREAD_COLUMN, &unread, -1);
rendobj = G_OBJECT(renderer);
- if (type == TNY_MSG_FOLDER_TYPE_NORMAL)
+ if (type == TNY_FOLDER_TYPE_NORMAL)
type = guess_folder_type (fname);
- if (fname);
+ if (fname)
g_free (fname);
switch (type) {
- case TNY_MSG_FOLDER_TYPE_INBOX:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_INBOX);
+ case TNY_FOLDER_TYPE_INBOX:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_INBOX);
break;
- case TNY_MSG_FOLDER_TYPE_OUTBOX:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_OUTBOX);
+ case TNY_FOLDER_TYPE_OUTBOX:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_OUTBOX);
break;
- case TNY_MSG_FOLDER_TYPE_JUNK:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_JUNK);
+ case TNY_FOLDER_TYPE_JUNK:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_JUNK);
break;
- case TNY_MSG_FOLDER_TYPE_SENT:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_SENT);
+ case TNY_FOLDER_TYPE_SENT:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_SENT);
break;
- case TNY_MSG_FOLDER_TYPE_DRAFTS:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_DRAFTS);
+ case TNY_FOLDER_TYPE_DRAFTS:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_DRAFTS);
break;
- case TNY_MSG_FOLDER_TYPE_NOTES:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_NOTES);
+ case TNY_FOLDER_TYPE_NOTES:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_NOTES);
break;
- case TNY_MSG_FOLDER_TYPE_CALENDAR:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_CALENDAR);
+ case TNY_FOLDER_TYPE_CALENDAR:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_CALENDAR);
break;
- case TNY_MSG_FOLDER_TYPE_CONTACTS:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_CONTACTS);
+ case TNY_FOLDER_TYPE_CONTACTS:
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_CONTACTS);
break;
- case TNY_MSG_FOLDER_TYPE_NORMAL:
+ case TNY_FOLDER_TYPE_NORMAL:
default:
- pixbuf = modest_icon_factory_get_icon (MODEST_FOLDER_ICON_NORMAL);
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_FOLDER_ICON_NORMAL);
break;
}
{
update_model_empty (MODEST_FOLDER_VIEW(user_data));
- if (!update_model (MODEST_FOLDER_VIEW(user_data), account_store))
+ if (!update_model (MODEST_FOLDER_VIEW(user_data),
+ MODEST_TNY_ACCOUNT_STORE(account_store)))
g_printerr ("modest: failed to update model for changes in '%s'",
account);
}
self = G_OBJECT(g_object_new(MODEST_TYPE_FOLDER_VIEW, NULL));
priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self);
- if (!update_model (MODEST_FOLDER_VIEW(self), TNY_ACCOUNT_STORE_IFACE(account_store)))
+ if (!update_model (MODEST_FOLDER_VIEW(self),
+ MODEST_TNY_ACCOUNT_STORE(account_store)))
g_printerr ("modest: failed to update model");
priv->sig1 = g_signal_connect (G_OBJECT(account_store), "account_update",
on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
{
GtkTreeModel *model;
- TnyMsgFolderIface *folder = NULL;
+ TnyFolderIface *folder = NULL;
GtkTreeIter iter;
ModestFolderView *tree_view;
ModestFolderViewPrivate *priv;
/* folder was _un_selected if true */
if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
- priv->cur_folder = NULL;
+ priv->cur_folder = NULL; /* FIXME: need this? */
return;
}
&folder, -1);
if (priv->cur_folder)
- tny_msg_folder_iface_expunge (priv->cur_folder);
+ tny_folder_iface_expunge (priv->cur_folder);
priv->cur_folder = folder;
/* folder will not be defined if you click eg. on the root node */
/* emitted when a folder is clicked */
void (*folder_selected) (ModestFolderView* self,
- TnyMsgFolderIface *folder,
+ TnyFolderIface *folder,
gpointer user_data);
gboolean (*update_model) (ModestFolderView *self,
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
-/* modest-tny-header-tree-view.c */
-
#include <glib/gi18n.h>
#include "modest-header-view.h"
#include <tny-list-iface.h>
enum {
MESSAGE_SELECTED_SIGNAL,
+ ITEM_NOT_FOUND_SIGNAL,
STATUS_UPDATE_SIGNAL,
LAST_SIGNAL
};
typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
struct _ModestHeaderViewPrivate {
- TnyMsgFolderIface *tny_msg_folder;
+ TnyFolderIface *tny_folder;
TnyListIface *headers;
GSList *columns;
GMutex *lock;
sizeof(ModestHeaderView),
1, /* n_preallocs */
(GInstanceInitFunc) modest_header_view_init,
+ NULL
};
my_type = g_type_register_static (GTK_TYPE_TREE_VIEW,
"ModestHeaderView",
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
-
+
+ signals[ITEM_NOT_FOUND_SIGNAL] =
+ g_signal_new ("item_not_found",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ModestHeaderViewClass,message_not_found),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE, 1, G_TYPE_INT);
+
signals[STATUS_UPDATE_SIGNAL] =
g_signal_new ("status_update",
G_TYPE_FROM_CLASS (gobject_class),
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
}
-
-
-
-
static void
msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
{
- TnyMsgHeaderFlags flags;
+ TnyHeaderFlags flags;
GdkPixbuf *pixbuf = NULL;
- gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ gtk_tree_model_get (tree_model, iter, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN,
&flags, -1);
- if (flags & TNY_MSG_HEADER_FLAG_DELETED)
- pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_DELETED);
- else if (flags & TNY_MSG_HEADER_FLAG_SEEN)
- pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_READ);
+ if (flags & TNY_HEADER_FLAG_DELETED)
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_DELETED);
+ else if (flags & TNY_HEADER_FLAG_SEEN)
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_READ);
else
- pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_UNREAD);
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_UNREAD);
g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL);
}
attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
{
- TnyMsgHeaderFlags flags;
+ TnyHeaderFlags flags;
GdkPixbuf *pixbuf = NULL;
- gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ gtk_tree_model_get (tree_model, iter, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN,
&flags, -1);
- if (flags & TNY_MSG_HEADER_FLAG_ATTACHMENTS)
- pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_ATTACH);
+ if (flags & TNY_HEADER_FLAG_ATTACHMENTS)
+ pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_ATTACH);
g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL);
}
header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
{
- TnyMsgHeaderFlags flags;
+ TnyHeaderFlags flags;
- gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ gtk_tree_model_get (tree_model, iter, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN,
&flags, -1);
g_object_set (G_OBJECT(renderer),
- "weight", (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400: 800,
- "style", (flags & TNY_MSG_HEADER_FLAG_DELETED) ?
+ "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
+ "style", (flags & TNY_HEADER_FLAG_DELETED) ?
PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
NULL);
}
sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender)
{
- TnyMsgHeaderFlags flags;
+ TnyHeaderFlags flags;
gchar *address;
gint sender_receiver_col;
if (is_sender)
- sender_receiver_col = TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN;
+ sender_receiver_col = TNY_HEADER_LIST_MODEL_FROM_COLUMN;
else
- sender_receiver_col = TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN;
+ sender_receiver_col = TNY_HEADER_LIST_MODEL_TO_COLUMN;
gtk_tree_model_get (tree_model, iter,
sender_receiver_col, &address,
- TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
+ TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
-1);
g_object_set (G_OBJECT(renderer),
"text",
display_address (address),
"weight",
- (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400 : 800,
+ (flags & TNY_HEADER_FLAG_SEEN) ? 400 : 800,
"style",
- (flags & TNY_MSG_HEADER_FLAG_DELETED)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL,
+ (flags & TNY_HEADER_FLAG_DELETED)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL,
NULL);
g_free (address);
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
{
GObject *rendobj;
- TnyMsgHeaderFlags flags;
+ TnyHeaderFlags flags;
gchar *from, *subject;
gchar *header;
time_t date;
gtk_tree_model_get (tree_model, iter,
- TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
- TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, &from,
- TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
- TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date,
+ TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
+ TNY_HEADER_LIST_MODEL_FROM_COLUMN, &from,
+ TNY_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
+ TNY_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date,
-1);
rendobj = G_OBJECT(renderer);
g_object_set (G_OBJECT(renderer),
"text", header,
- "weight", (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400: 800,
- "style", (flags & TNY_MSG_HEADER_FLAG_DELETED) ?
+ "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800,
+ "style", (flags & TNY_HEADER_FLAG_DELETED) ?
PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
NULL);
g_free (header);
case MODEST_HEADER_VIEW_COLUMN_MSGTYPE:
column = get_new_column (_("M"), renderer_msgtype, FALSE,
- TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ TNY_HEADER_LIST_MODEL_FLAGS_COLUMN,
FALSE, (GtkTreeCellDataFunc)msgtype_cell_data,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_ATTACH:
column = get_new_column (_("A"), renderer_attach, FALSE,
- TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ TNY_HEADER_LIST_MODEL_FLAGS_COLUMN,
FALSE, (GtkTreeCellDataFunc)attach_cell_data,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE:
column = get_new_column (_("Received"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
TRUE, (GtkTreeCellDataFunc)header_cell_data,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_FROM:
column = get_new_column (_("From"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
+ TNY_HEADER_LIST_MODEL_FROM_COLUMN,
TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data,
GINT_TO_POINTER(TRUE));
break;
case MODEST_HEADER_VIEW_COLUMN_TO:
column = get_new_column (_("To"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN,
+ TNY_HEADER_LIST_MODEL_TO_COLUMN,
TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data,
GINT_TO_POINTER(FALSE));
break;
case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER:
column = get_new_column (_("Header"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
+ TNY_HEADER_LIST_MODEL_FROM_COLUMN,
TRUE, (GtkTreeCellDataFunc)compact_header_cell_data,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_SUBJECT:
column = get_new_column (_("Subject"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
+ TNY_HEADER_LIST_MODEL_SUBJECT_COLUMN,
TRUE, (GtkTreeCellDataFunc)header_cell_data,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
column = get_new_column (_("Sent"), renderer_header, TRUE,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_COLUMN,
TRUE, (GtkTreeCellDataFunc)header_cell_data,
NULL);
break;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj);
priv->lock = g_mutex_new ();
+ priv->sig1 = 0;
}
static void
g_object_unref (G_OBJECT(priv->headers));
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
- g_signal_handler_disconnect (G_OBJECT(sel), priv->sig1);
+ if (sel && priv->sig1 != 0) {
+ g_signal_handler_disconnect (G_OBJECT(sel), priv->sig1);
+ priv->sig1 = 0;
+ }
+
if (priv->lock) {
g_mutex_free (priv->lock);
priv->lock = NULL;
}
- priv->headers = NULL;
- priv->tny_msg_folder = NULL;
+ priv->headers = NULL;
+ priv->tny_folder = NULL;
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
GtkWidget*
-modest_header_view_new (TnyMsgFolderIface *folder,
+modest_header_view_new (TnyFolderIface *folder,
GSList *columns,
ModestHeaderViewStyle style)
{
case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER:
case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE:
gtk_tree_model_get (tree_model, iter1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
&t1,-1);
gtk_tree_model_get (tree_model, iter2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
&t2,-1);
return t1 - t2;
case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
gtk_tree_model_get (tree_model, iter1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
&t1,-1);
gtk_tree_model_get (tree_model, iter2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
&t2,-1);
return t1 - t2;
case MODEST_HEADER_VIEW_COLUMN_SUBJECT: {
gtk_tree_model_get (tree_model, iter1,
- TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ TNY_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s1,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
-1);
gtk_tree_model_get (tree_model, iter2,
- TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ TNY_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s2,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
-1);
cmp = cmp_normalized_subject(s1, s2);
case MODEST_HEADER_VIEW_COLUMN_FROM:
gtk_tree_model_get (tree_model, iter1,
- TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, &s1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ TNY_HEADER_LIST_MODEL_FROM_COLUMN, &s1,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
-1);
gtk_tree_model_get (tree_model, iter2,
- TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, &s2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ TNY_HEADER_LIST_MODEL_FROM_COLUMN, &s2,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
-1);
cmp = strcmp (s1, s2);
g_free (s1);
case MODEST_HEADER_VIEW_COLUMN_TO:
gtk_tree_model_get (tree_model, iter1,
- TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN, &s1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
+ TNY_HEADER_LIST_MODEL_TO_COLUMN, &s1,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,
-1);
gtk_tree_model_get (tree_model, iter2,
- TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN, &s2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
+ TNY_HEADER_LIST_MODEL_TO_COLUMN, &s2,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,
-1);
cmp = strcmp (s1, s2);
g_free (s1);
case MODEST_HEADER_VIEW_COLUMN_ATTACH:
- gtk_tree_model_get (tree_model, iter1, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, -1);
- gtk_tree_model_get (tree_model, iter2, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, -1);
+ gtk_tree_model_get (tree_model, iter1, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, -1);
+ gtk_tree_model_get (tree_model, iter2, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, -1);
- cmp = (val1 & TNY_MSG_HEADER_FLAG_ATTACHMENTS) -
- (val2 & TNY_MSG_HEADER_FLAG_ATTACHMENTS);
+ cmp = (val1 & TNY_HEADER_FLAG_ATTACHMENTS) -
+ (val2 & TNY_HEADER_FLAG_ATTACHMENTS);
return cmp ? cmp : t1 - t2;
case MODEST_HEADER_VIEW_COLUMN_MSGTYPE:
- gtk_tree_model_get (tree_model, iter1, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1);
- gtk_tree_model_get (tree_model, iter2, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
- TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1);
- cmp = (val1 & TNY_MSG_HEADER_FLAG_SEEN) - (val2 & TNY_MSG_HEADER_FLAG_SEEN);
+ gtk_tree_model_get (tree_model, iter1, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1);
+ gtk_tree_model_get (tree_model, iter2, TNY_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2,
+ TNY_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1);
+ cmp = (val1 & TNY_HEADER_FLAG_SEEN) - (val2 & TNY_HEADER_FLAG_SEEN);
return cmp ? cmp : t1 - t2;
static void
-on_refresh_folder (TnyMsgFolderIface *folder, gboolean cancelled, gpointer user_data)
+on_refresh_folder (TnyFolderIface *folder, gboolean cancelled, gpointer user_data)
{
GtkTreeModel *oldsortable, *sortable;
ModestHeaderView *self;
self = MODEST_HEADER_VIEW(user_data);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
-
g_mutex_lock (priv->lock);
if (!folder) /* when there is no folder */
else { /* it's a new one or a refresh */
GSList *col;
- priv->headers = TNY_LIST_IFACE(tny_msg_header_list_model_new ());
+ priv->headers = TNY_LIST_IFACE(tny_header_list_model_new ());
- tny_msg_folder_iface_get_headers (folder, priv->headers, FALSE);
- tny_msg_header_list_model_set_folder (TNY_MSG_HEADER_LIST_MODEL(priv->headers),
+ tny_folder_iface_get_headers (folder, priv->headers, FALSE);
+ tny_header_list_model_set_folder (TNY_HEADER_LIST_MODEL(priv->headers),
folder, TRUE); /* async */
oldsortable = gtk_tree_view_get_model(GTK_TREE_VIEW (self));
static void
-on_refresh_folder_status_update (TnyMsgFolderIface *folder, const gchar *msg,
+on_refresh_folder_status_update (TnyFolderIface *folder, const gchar *msg,
gint status_id, gpointer user_data)
{
ModestHeaderView *self;
gboolean
modest_header_view_set_folder (ModestHeaderView *self,
- TnyMsgFolderIface *folder)
+ TnyFolderIface *folder)
{
ModestHeaderViewPrivate *priv;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
if (model)
g_object_unref (model);
} else { /* it's a new one or a refresh */
- tny_msg_folder_iface_refresh_async (folder,
+ tny_folder_iface_refresh_async (folder,
on_refresh_folder,
on_refresh_folder_status_update,
self);
static void
on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
{
- GtkTreeModel *model;
- TnyMsgHeaderIface *header;
- GtkTreeIter iter;
+ GtkTreeModel *model;
+ TnyHeaderIface *header;
+ GtkTreeIter iter;
ModestHeaderView *self;
ModestHeaderViewPrivate *priv;
+ const TnyMsgIface *msg = NULL;
+ const TnyFolderIface *folder;
g_return_if_fail (sel);
g_return_if_fail (user_data);
self = MODEST_HEADER_VIEW (user_data);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
-
-
+
if (!gtk_tree_selection_get_selected (sel, &model, &iter))
return; /* msg was _un_selected */
gtk_tree_model_get (model, &iter,
- TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ TNY_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
- if (header) {
- const TnyMsgIface *msg = NULL;
- const TnyMsgFolderIface *folder;
-
- folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
- if (!folder)
- g_printerr ("modest: cannot find folder\n");
- else {
- msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder),
- header);
- if (!msg) {
- g_printerr ("modest: cannot find msg\n");
- gtk_tree_store_remove (GTK_TREE_STORE(model),
- &iter);
- }
- }
+ if (!header) {
+ g_printerr ("modest: cannot find header\n");
+ return;
+ }
+
+ folder = tny_header_iface_get_folder (TNY_HEADER_IFACE(header));
+ if (!folder) {
+ g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL], 0,
+ MODEST_ITEM_TYPE_FOLDER);
+ return;
+ }
+
+ msg = tny_folder_iface_get_message (TNY_FOLDER_IFACE(folder),
+ header);
+ if (!msg) {
+ g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL], 0,
+ MODEST_ITEM_TYPE_MESSAGE);
+ return;
+ }
- g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0,
- msg);
+ g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0,
+ msg);
+
+ /* mark message as seen; _set_flags crashes, bug in tinymail? */
+ //flags = tny_header_iface_get_flags (TNY_HEADER_IFACE(header));
+ //tny_header_iface_set_flags (header, TNY_HEADER_FLAG_SEEN);
+}
- /* mark message as seen; _set_flags crashes, bug in tinymail? */
- //flags = tny_msg_header_iface_get_flags (TNY_MSG_HEADER_IFACE(header));
- //tny_msg_header_iface_set_flags (header, TNY_MSG_HEADER_FLAG_SEEN);
- }
-}
#define __MODEST_HEADER_VIEW_H__
#include <gtk/gtk.h>
-#include <tny-msg-folder-iface.h>
+#include <tny-folder-iface.h>
#include <tny-account-tree-model.h>
#include <tny-msg-iface.h>
-#include <tny-msg-header-iface.h>
-#include <tny-msg-header-list-model.h>
+#include <tny-header-iface.h>
+#include <tny-header-list-model.h>
G_BEGIN_DECLS
/* insert public members, if any */
};
+typedef enum _ModestItemType ModestItemType;
+
struct _ModestHeaderViewClass {
GtkTreeViewClass parent_class;
TnyMsgIface *msg,
gpointer user_data);
+ void (*message_not_found) (ModestHeaderView* self,
+ ModestItemType type,
+ gpointer user_data);
+
/* msg == NULL implies that the operation is finished, ie.
* the progress indictation can be hidden */
void (*status_update) (ModestHeaderView* self,
};
typedef enum _ModestHeaderViewColumn ModestHeaderViewColumn;
-
enum _ModestHeaderViewStyle {
MODEST_HEADER_VIEW_STYLE_NORMAL,
MODEST_HEADER_VIEW_STYLE_COMPACT,
-
MODEST_HEADER_VIEW_STYLE_NUM
};
typedef enum _ModestHeaderViewStyle ModestHeaderViewStyle;
+enum _ModestItemType {
+ MODEST_ITEM_TYPE_MESSAGE,
+ MODEST_ITEM_TYPE_FOLDER,
+ MODEST_ITEM_TYPE_NUM
+};
+
/**
* modest_header_view_get_type:
*
* Returns: a new GtkWidget (a GtkTreeView-subclass)
*/
-GtkWidget* modest_header_view_new (TnyMsgFolderIface *folder,
- GSList *columns,
- ModestHeaderViewStyle style);
+GtkWidget* modest_header_view_new (TnyFolderIface *folder,
+ GSList *columns,
+ ModestHeaderViewStyle style);
/**
* modest_header_view_set_folder:
* @self: a ModestHeaderView instance
- * @folder: a TnyMsgFolderIface object
+ * @folder: a TnyFolderIface object
*
* set the folder for this ModestHeaderView
*
* Returns: TRUE if it succeeded, FALSE otherwise
*/
gboolean modest_header_view_set_folder (ModestHeaderView *self,
- TnyMsgFolderIface *folder);
+ TnyFolderIface *folder);
/**
* Returns: TRUE if it succeeded, FALSE otherwise
*/
gboolean modest_header_view_set_columns (ModestHeaderView *self,
- GSList *columns);
+ GSList *columns);
/**
* modest_header_view_get_columns:
* @self: a ModestHeaderView instance
- * @folder: a TnyMsgFolderIface object
+ * @folder: a TnyFolderIface object
*
* get the columns for this ModestHeaderView
*
* @self: a ModestHeaderView instance
* @style: the style for this tree view
*
- * set the folder for this ModestHeaderView
+ * set the style this ModestHeaderView
*
* Returns: TRUE if it succeeded, FALSE otherwise
*/
gboolean modest_header_view_set_style (ModestHeaderView *self,
- ModestHeaderViewStyle style);
+ ModestHeaderViewStyle style);
/**
* modest_header_view_set_folder:
* @self: a ModestHeaderView instance
- * @folder: a TnyMsgFolderIface object
*
- * set the folder for this ModestHeaderView
+ * get the style for this ModestHeaderView
*
- * Returns: TRUE if it succeeded, FALSE otherwise
+ * Returns: the current style
*/
ModestHeaderViewStyle modest_header_view_get_style (ModestHeaderView *self);
#include <gtkhtml/gtkhtml.h>
#include <gtkhtml/gtkhtml-stream.h>
#include <tny-list-iface.h>
+#include <tny-list.h>
#include <modest-tny-msg-actions.h>
#include "modest-msg-view.h"
static GSList* get_url_matches (GString *txt);
-static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri,
- ModestMsgView *msg_view);
-static gboolean on_url_requested (GtkWidget *widget, const gchar *uri,
- GtkHTMLStream *stream,
+static gboolean on_link_clicked (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view);
+static gboolean on_url_requested (GtkWidget *widget, const gchar *uri, GtkHTMLStream *stream,
ModestMsgView *msg_view);
-static gboolean on_link_hover (GtkWidget *widget, const gchar *uri,
- ModestMsgView *msg_view);
+static gboolean on_link_hover (GtkWidget *widget, const gchar *uri, ModestMsgView *msg_view);
/*
* we need these regexps to find URLs in plain text e-mails
gchar *regex;
regex_t *preg;
gchar *prefix;
-
};
#define ATT_PREFIX "att:"
typedef struct _ModestMsgViewPrivate ModestMsgViewPrivate;
struct _ModestMsgViewPrivate {
- GtkWidget *gtkhtml;
- const TnyMsgIface *msg;
+
+ GtkWidget *gtkhtml;
+ TnyMsgIface *msg;
+
+ gulong sig1, sig2, sig3;
};
#define MODEST_MSG_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MSG_VIEW, \
sizeof(ModestMsgView),
1, /* n_preallocs */
(GInstanceInitFunc) modest_msg_view_init,
+ NULL
};
my_type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW,
"ModestMsgView",
gtk_html_set_blocking (GTK_HTML(priv->gtkhtml), FALSE);
gtk_html_set_images_blocking (GTK_HTML(priv->gtkhtml), FALSE);
- g_signal_connect (G_OBJECT(priv->gtkhtml), "link_clicked",
- G_CALLBACK(on_link_clicked), obj);
-
- g_signal_connect (G_OBJECT(priv->gtkhtml), "url_requested",
- G_CALLBACK(on_url_requested), obj);
-
- g_signal_connect (G_OBJECT(priv->gtkhtml), "on_url",
- G_CALLBACK(on_link_hover), obj);
+ priv->sig1 = g_signal_connect (G_OBJECT(priv->gtkhtml), "link_clicked",
+ G_CALLBACK(on_link_clicked), obj);
+ priv->sig2 = g_signal_connect (G_OBJECT(priv->gtkhtml), "url_requested",
+ G_CALLBACK(on_url_requested), obj);
+ priv->sig3 = g_signal_connect (G_OBJECT(priv->gtkhtml), "on_url",
+ G_CALLBACK(on_link_hover), obj);
}
static void
modest_msg_view_finalize (GObject *obj)
{
+ ModestMsgViewPrivate *priv;
+ priv = MODEST_MSG_VIEW_GET_PRIVATE (obj);
+
+ if (priv->msg) {
+ g_object_unref (G_OBJECT(priv->msg));
+ priv->msg = NULL;
+ }
+
+ /* we cannot disconnect sigs, because priv->gtkhtml is
+ * already dead */
+
+ priv->gtkhtml = NULL;
+
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
GtkWidget*
-modest_msg_view_new (const TnyMsgIface *msg)
+modest_msg_view_new (TnyMsgIface *msg)
{
GObject *obj;
ModestMsgView* self;
-static TnyMsgMimePartIface *
-find_cid_image (const TnyMsgIface *msg, const gchar *cid)
+static TnyMimePartIface *
+find_cid_image (TnyMsgIface *msg, const gchar *cid)
{
- TnyMsgMimePartIface *part = NULL;
- const TnyListIface *parts;
+ TnyMimePartIface *part = NULL;
+ TnyListIface *parts;
TnyIteratorIface *iter;
g_return_val_if_fail (msg, NULL);
g_return_val_if_fail (cid, NULL);
- parts = tny_msg_iface_get_parts ((TnyMsgIface*)msg); // FIXME: tinymail
- iter = tny_list_iface_create_iterator ((TnyListIface*)parts);
+ parts = TNY_LIST_IFACE (tny_list_new());
+
+ tny_msg_iface_get_parts (msg, parts);
+ iter = tny_list_iface_create_iterator (parts);
while (!tny_iterator_iface_is_done(iter)) {
const gchar *part_cid;
- part = TNY_MSG_MIME_PART_IFACE(tny_iterator_iface_current(iter));
- part_cid = tny_msg_mime_part_iface_get_content_id (part);
+ part = TNY_MIME_PART_IFACE(tny_iterator_iface_current(iter));
+ part_cid = tny_mime_part_iface_get_content_id (part);
if (part_cid && strcmp (cid, part_cid) == 0)
break;
part = NULL;
tny_iterator_iface_next (iter);
}
+
+ if (part)
+ g_object_ref (G_OBJECT(part));
g_object_unref (G_OBJECT(iter));
+ g_object_unref (G_OBJECT(parts));
+
return part;
}
if (g_str_has_prefix (uri, "cid:")) {
/* +4 ==> skip "cid:" */
- const TnyMsgMimePartIface *part = find_cid_image (priv->msg, uri + 4);
+ TnyMimePartIface *part = find_cid_image (priv->msg, uri + 4);
if (!part) {
g_printerr ("modest: '%s' not found\n", uri + 4);
gtk_html_stream_close (stream, GTK_HTML_STREAM_ERROR);
} else {
TnyStreamIface *tny_stream =
TNY_STREAM_IFACE(modest_tny_stream_gtkhtml_new(stream));
- // FIXME: tinymail
- tny_msg_mime_part_iface_decode_to_stream ((TnyMsgMimePartIface*)part,
+ tny_mime_part_iface_decode_to_stream ((TnyMimePartIface*)part,
tny_stream);
gtk_html_stream_close (stream, GTK_HTML_STREAM_OK);
+
+ g_object_unref (G_OBJECT(tny_stream));
+ g_object_unref (G_OBJECT(part));
}
}
/* render the attachments as hyperlinks in html */
static gchar*
-attachments_as_html (ModestMsgView *self, const TnyMsgIface *msg)
+attachments_as_html (ModestMsgView *self, TnyMsgIface *msg)
{
ModestMsgViewPrivate *priv;
GString *appendix;
- const TnyListIface *parts;
+ TnyListIface *parts;
TnyIteratorIface *iter;
gchar *html;
int index = 0;
return NULL;
priv = MODEST_MSG_VIEW_GET_PRIVATE (self);
- parts = tny_msg_iface_get_parts ((TnyMsgIface*)msg);
- // FIXME: tinymail
- iter = tny_list_iface_create_iterator ((TnyListIface*)parts);
+ parts = TNY_LIST_IFACE(tny_list_new());
+ tny_msg_iface_get_parts (msg, parts);
+ iter = tny_list_iface_create_iterator (parts);
+
appendix= g_string_new ("");
while (!tny_iterator_iface_is_done(iter)) {
- TnyMsgMimePartIface *part;
+ TnyMimePartIface *part;
++index; /* attachment numbers are 1-based */
- part = TNY_MSG_MIME_PART_IFACE(tny_iterator_iface_current (iter));
+ part = TNY_MIME_PART_IFACE(tny_iterator_iface_current (iter));
- if (tny_msg_mime_part_iface_is_attachment (part)) {
+ if (tny_mime_part_iface_is_attachment (part)) {
- const gchar *filename = tny_msg_mime_part_iface_get_filename(part);
+ const gchar *filename = tny_mime_part_iface_get_filename(part);
if (!filename)
filename = _("attachment");
static gchar *
convert_to_html (const gchar *data)
{
- int i;
+ guint i;
gboolean first_space = TRUE;
GString *html;
gsize len;
/*
* check if the match is inside an existing match... */
static void
-chk_partial_match (const url_match_t *match, int* offset)
+chk_partial_match (const url_match_t *match, guint* offset)
{
if (*offset >= match->offset && *offset < match->offset + match->len)
*offset = -1;
get_url_matches (GString *txt)
{
regmatch_t rm;
- int rv, i, offset = 0;
+ guint rv, i, offset = 0;
GSList *match_list = NULL;
static UrlMatchPattern patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
static gboolean
-set_html_message (ModestMsgView *self, const TnyMsgMimePartIface *tny_body,
- const TnyMsgIface *msg)
+set_html_message (ModestMsgView *self, TnyMimePartIface *tny_body, TnyMsgIface *msg)
{
gchar *html_attachments;
TnyStreamIface *gtkhtml_stream;
}
// FIXME: tinymail
- tny_msg_mime_part_iface_decode_to_stream ((TnyMsgMimePartIface*)tny_body,
+ tny_mime_part_iface_decode_to_stream ((TnyMimePartIface*)tny_body,
gtkhtml_stream);
g_object_unref (G_OBJECT(gtkhtml_stream));
/* this is a hack --> we use the tny_text_buffer_stream to
* get the message text, then write to gtkhtml 'by hand' */
static gboolean
-set_text_message (ModestMsgView *self, const TnyMsgMimePartIface *tny_body,
- const TnyMsgIface *msg)
+set_text_message (ModestMsgView *self, TnyMimePartIface *tny_body, TnyMsgIface *msg)
{
GtkTextBuffer *buf;
GtkTextIter begin, end;
}
// FIXME: tinymail
- tny_msg_mime_part_iface_decode_to_stream ((TnyMsgMimePartIface*)tny_body,
+ tny_mime_part_iface_decode_to_stream ((TnyMimePartIface*)tny_body,
txt_stream);
tny_stream_iface_reset (txt_stream);
void
-modest_msg_view_set_message (ModestMsgView *self, const TnyMsgIface *msg)
+modest_msg_view_set_message (ModestMsgView *self, TnyMsgIface *msg)
{
- TnyMsgMimePartIface *body;
+ TnyMimePartIface *body;
ModestMsgViewPrivate *priv;
g_return_if_fail (self);
priv = MODEST_MSG_VIEW_GET_PRIVATE(self);
- priv->msg = msg;
+
+ if (msg != priv->msg) {
+ if (priv->msg)
+ g_object_unref (G_OBJECT(priv->msg));
+ if (msg)
+ g_object_ref (G_OBJECT(msg));
+ priv->msg = msg;
+ }
if (!msg) {
set_empty_message (self);
body = modest_tny_msg_actions_find_body_part (msg, TRUE);
if (body) {
- if (tny_msg_mime_part_iface_content_type_is (body, "text/html"))
+ if (tny_mime_part_iface_content_type_is (body, "text/html"))
set_html_message (self, body, msg);
else
set_text_message (self, body, msg);
#include <gtk/gtk.h>
#include <tny-stream-iface.h>
#include <tny-msg-iface.h>
-#include <tny-msg-mime-part-iface.h>
+#include <tny-mime-part-iface.h>
#include <modest-conf.h>
G_BEGIN_DECLS
*
* Returns: a new ModestMsgView widget, or NULL if there's an error
*/
-GtkWidget* modest_msg_view_new (const TnyMsgIface *tny_msg);
+GtkWidget* modest_msg_view_new (TnyMsgIface *tny_msg);
/**
* display the @tny_msg e-mail message. If @tny_msg is NULL,
* then a blank page will be displayed
* */
-void modest_msg_view_set_message (ModestMsgView *self,
- const TnyMsgIface *tny_msg);
+void modest_msg_view_set_message (ModestMsgView *self, TnyMsgIface *tny_msg);
/**
* modest_msg_view_get_selected_text:
--- /dev/null
+/* Copyright (c) 2006, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "modest-toolbar.h"
+
+/* 'private'/'protected' functions */
+static void modest_toolbar_class_init (ModestToolbarClass *klass);
+static void modest_toolbar_init (ModestToolbar *obj);
+static void modest_toolbar_finalize (GObject *obj);
+
+static void on_toolbutton_clicked (GtkToolButton *button, ModestToolbar *self);
+
+/* list my signals */
+enum {
+ BUTTON_CLICKED_SIGNAL,
+ LAST_SIGNAL
+};
+
+typedef struct _ModestToolbarPrivate ModestToolbarPrivate;
+struct _ModestToolbarPrivate {
+ GtkTooltips *tooltips;
+
+};
+#define MODEST_TOOLBAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+ MODEST_TYPE_TOOLBAR, \
+ ModestToolbarPrivate))
+/* globals */
+static GtkToolbarClass *parent_class = NULL;
+
+static guint signals[LAST_SIGNAL] = {0};
+
+GType
+modest_toolbar_get_type (void)
+{
+ static GType my_type = 0;
+ if (!my_type) {
+ static const GTypeInfo my_info = {
+ sizeof(ModestToolbarClass),
+ NULL, /* base init */
+ NULL, /* base finalize */
+ (GClassInitFunc) modest_toolbar_class_init,
+ NULL, /* class finalize */
+ NULL, /* class data */
+ sizeof(ModestToolbar),
+ 1, /* n_preallocs */
+ (GInstanceInitFunc) modest_toolbar_init,
+ NULL
+ };
+ my_type = g_type_register_static (GTK_TYPE_TOOLBAR,
+ "ModestToolbar",
+ &my_info, 0);
+ }
+ return my_type;
+}
+
+static void
+modest_toolbar_class_init (ModestToolbarClass *klass)
+{
+ GObjectClass *gobject_class;
+ gobject_class = (GObjectClass*) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+ gobject_class->finalize = modest_toolbar_finalize;
+
+ g_type_class_add_private (gobject_class, sizeof(ModestToolbarPrivate));
+
+ signals[BUTTON_CLICKED_SIGNAL] =
+ g_signal_new ("button_clicked",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ModestToolbarClass, button_clicked),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE, 1, G_TYPE_INT);
+}
+
+static void
+modest_toolbar_init (ModestToolbar *obj)
+{
+
+}
+
+static void
+modest_toolbar_finalize (GObject *obj)
+{
+ G_OBJECT_CLASS(parent_class)->finalize (obj);
+}
+
+
+/* don't free icon_name/label/tooltip, they're static */
+static gboolean
+data_for_button_id (ModestToolbarButton button_id,
+ gchar **icon_name, gchar **label, gchar **tooltip)
+{
+ switch (button_id) {
+ case MODEST_TOOLBAR_BUTTON_MAIL_SEND:
+ *label = _("Send");
+ *tooltip = _("Send the current email message");
+ *icon_name = MODEST_TOOLBAR_ICON_MAIL_SEND;
+ break;
+ case MODEST_TOOLBAR_BUTTON_NEW_MAIL:
+ *label = _("New mail");
+ *tooltip = _("Compose a new email message");
+ *icon_name = MODEST_TOOLBAR_ICON_NEW_MAIL;
+ break;
+ case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE:
+ *label = _("Send/Receive");
+ *tooltip = _("Send and receive messages");
+ *icon_name = MODEST_TOOLBAR_ICON_SEND_RECEIVE;
+ break;
+ case MODEST_TOOLBAR_BUTTON_REPLY:
+ *label = _("Reply");
+ *tooltip = _("Reply to the selected email message");
+ *icon_name = MODEST_TOOLBAR_ICON_REPLY;
+ break;
+ case MODEST_TOOLBAR_BUTTON_REPLY_ALL:
+ *label = _("Reply all");
+ *tooltip = _("Reply to all people the selected email was sent to");
+ *icon_name = MODEST_TOOLBAR_ICON_REPLY_ALL;
+ break;
+ case MODEST_TOOLBAR_BUTTON_FORWARD:
+ *label = _("Forward");
+ *tooltip = _("Forward the selected email");
+ *icon_name = MODEST_TOOLBAR_ICON_FORWARD;
+ break;
+ case MODEST_TOOLBAR_BUTTON_DELETE:
+ *label = _("Delete");
+ *tooltip = _("Delete the selected email message(s)");
+ *icon_name = MODEST_TOOLBAR_ICON_DELETE;
+ break;
+ case MODEST_TOOLBAR_BUTTON_NEXT:
+ *label = _("Next");
+ *tooltip = _("Move to the next message");
+ *icon_name = MODEST_TOOLBAR_ICON_NEXT;
+ break;
+ case MODEST_TOOLBAR_BUTTON_PREV:
+ *label = _("Previous");
+ *tooltip = _("Move to the previous message");
+ *icon_name = MODEST_TOOLBAR_ICON_PREV;
+ break;
+ case MODEST_TOOLBAR_BUTTON_STOP:
+ *label = _("Stop");
+ *tooltip = _("Stop whatever");
+ *icon_name = MODEST_TOOLBAR_ICON_STOP;
+ break;
+ default:
+ g_printerr ("modest: not a valid button id: %d\n",
+ button_id);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+static gboolean
+modest_toolbar_set_buttons (ModestToolbar *self, const GSList *buttons)
+{
+ const GSList *cursor;
+ GtkTooltips *tooltips;
+
+ g_return_val_if_fail (self, FALSE);
+
+ tooltips = gtk_tooltips_new ();
+ gtk_tooltips_enable (tooltips);
+ gtk_toolbar_set_tooltips (GTK_TOOLBAR(self), TRUE);
+
+ cursor = buttons;
+ while (cursor) {
+ ModestToolbarButton button_id =
+ (ModestToolbarButton) GPOINTER_TO_INT(cursor->data);
+
+ if (button_id == MODEST_TOOLBAR_SEPARATOR)
+ gtk_toolbar_insert (GTK_TOOLBAR(self),
+ gtk_separator_tool_item_new(), -1);
+ else {
+ gchar *icon_name, *label, *tooltip; /* don't free these */
+ if (!data_for_button_id (button_id, &icon_name, &label, &tooltip))
+ g_printerr ("modest: error getting data for toolbar button %d\n",
+ button_id);
+ else {
+ GtkWidget *icon;
+ GtkToolItem *button;
+ GdkPixbuf *pixbuf;
+
+ pixbuf = modest_icon_factory_get_icon_at_size (icon_name, 24, 24);
+ icon = gtk_image_new_from_pixbuf ((GdkPixbuf*)pixbuf);
+ button = gtk_tool_button_new (icon, label);
+ g_object_set_data (G_OBJECT(button), "button_id",
+ GINT_TO_POINTER(button_id));
+ g_signal_connect (G_OBJECT(button), "clicked",
+ G_CALLBACK(on_toolbutton_clicked), self);
+
+ gtk_tooltips_set_tip (tooltips, GTK_WIDGET(button),tooltip, NULL);
+ gtk_widget_show_all (GTK_WIDGET(button));
+ gtk_toolbar_insert (GTK_TOOLBAR(self), button, -1);
+ }
+ }
+ cursor = cursor->next;
+ }
+
+ return TRUE; /* FIXME */
+}
+
+
+ModestToolbar*
+modest_toolbar_new (const GSList *buttons)
+{
+ GObject *obj;
+
+ obj = g_object_new(MODEST_TYPE_TOOLBAR, NULL);
+ modest_toolbar_set_buttons (MODEST_TOOLBAR(obj), buttons);
+
+ return MODEST_TOOLBAR(obj);
+}
+
+static void
+on_toolbutton_clicked (GtkToolButton *button, ModestToolbar *self)
+{
+ gint button_id = GPOINTER_TO_INT(
+ g_object_get_data(G_OBJECT(button), "button_id"));
+
+ g_signal_emit (G_OBJECT(self), signals[BUTTON_CLICKED_SIGNAL],
+ 0, button_id);
+}
+
+
--- /dev/null
+/* Copyright (c) 2006, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MODEST_TOOLBAR_H__
+#define __MODEST_TOOLBAR_H__
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include <modest-icon-factory.h>
+#include <modest-icon-names.h>
+
+G_BEGIN_DECLS
+
+/* convenience macros */
+#define MODEST_TYPE_TOOLBAR (modest_toolbar_get_type())
+#define MODEST_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_TOOLBAR,ModestToolbar))
+#define MODEST_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_TOOLBAR,GtkToolbar))
+#define MODEST_IS_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_TOOLBAR))
+#define MODEST_IS_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_TOOLBAR))
+#define MODEST_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_TOOLBAR,ModestToolbarClass))
+
+typedef struct _ModestToolbar ModestToolbar;
+typedef struct _ModestToolbarClass ModestToolbarClass;
+
+typedef enum _ModestToolbarButton ModestToolbarButton;
+
+
+struct _ModestToolbar {
+ GtkToolbar parent;
+ /* insert public members, if any */
+};
+
+struct _ModestToolbarClass {
+ GtkToolbarClass parent_class;
+
+ void (* button_clicked) (ModestToolbar* obj, ModestToolbarButton button_id);
+};
+
+enum _ModestToolbarButton {
+ MODEST_TOOLBAR_BUTTON_MAIL_SEND,
+ MODEST_TOOLBAR_BUTTON_NEW_MAIL,
+ MODEST_TOOLBAR_BUTTON_REPLY,
+ MODEST_TOOLBAR_BUTTON_REPLY_ALL,
+ MODEST_TOOLBAR_BUTTON_FORWARD,
+ MODEST_TOOLBAR_BUTTON_PRINT,
+ MODEST_TOOLBAR_BUTTON_DELETE,
+ MODEST_TOOLBAR_BUTTON_NEXT,
+ MODEST_TOOLBAR_BUTTON_PREV,
+ MODEST_TOOLBAR_BUTTON_STOP,
+ MODEST_TOOLBAR_BUTTON_SEND_RECEIVE,
+
+ MODEST_TOOLBAR_SEPARATOR,
+ MODEST_TOOLBAR_BUTTON_NUM
+};
+
+
+/* member functions */
+GType modest_toolbar_get_type (void) G_GNUC_CONST;
+
+ModestToolbar* modest_toolbar_new (const GSList *buttons);
+
+G_END_DECLS
+
+#endif /* __MODEST_TOOLBAR_H__ */
+