1 /* modest-tny-header-tree-view.c
3 * This file is part of modest.
5 * Copyright (C) 2006 Nokia Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 #include <glib/gi18n.h>
23 #include "modest-tny-header-tree-view.h"
25 /* 'private'/'protected' functions */
26 static void modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass);
27 static void modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj);
28 static void modest_tny_header_tree_view_finalize (GObject *obj);
30 static void selection_changed (GtkTreeSelection *sel, gpointer user_data);
31 static void column_clicked (GtkTreeViewColumn *treeviewcolumn, gpointer user_data);
36 MESSAGE_SELECTED_SIGNAL,
40 typedef struct _ModestTnyHeaderTreeViewPrivate ModestTnyHeaderTreeViewPrivate;
41 struct _ModestTnyHeaderTreeViewPrivate {
42 TnyMsgFolderIface *tny_msg_folder;
43 GtkTreeModel *header_tree_model;
45 #define MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
46 MODEST_TYPE_TNY_HEADER_TREE_VIEW, \
47 ModestTnyHeaderTreeViewPrivate))
49 static GObjectClass *parent_class = NULL;
51 /* uncomment the following if you have defined any signals */
52 static guint signals[LAST_SIGNAL] = {0};
55 modest_tny_header_tree_view_get_type (void)
57 static GType my_type = 0;
59 static const GTypeInfo my_info = {
60 sizeof(ModestTnyHeaderTreeViewClass),
62 NULL, /* base finalize */
63 (GClassInitFunc) modest_tny_header_tree_view_class_init,
64 NULL, /* class finalize */
65 NULL, /* class data */
66 sizeof(ModestTnyHeaderTreeView),
68 (GInstanceInitFunc) modest_tny_header_tree_view_init,
70 my_type = g_type_register_static (GTK_TYPE_TREE_VIEW,
71 "ModestTnyHeaderTreeView",
78 modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass)
80 GObjectClass *gobject_class;
81 gobject_class = (GObjectClass*) klass;
83 parent_class = g_type_class_peek_parent (klass);
84 gobject_class->finalize = modest_tny_header_tree_view_finalize;
86 g_type_class_add_private (gobject_class, sizeof(ModestTnyHeaderTreeViewPrivate));
88 signals[MESSAGE_SELECTED_SIGNAL] =
89 g_signal_new ("message_selected",
90 G_TYPE_FROM_CLASS (gobject_class),
92 G_STRUCT_OFFSET (ModestTnyHeaderTreeViewClass,message_selected),
94 g_cclosure_marshal_VOID__POINTER,
95 G_TYPE_NONE, 1, G_TYPE_POINTER);
99 map_header_icon (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
100 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
102 TnyMsgHeaderFlags flags;
103 static gchar txt[10];
105 gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1);
106 g_snprintf (txt, 10, "%d", flags);
107 g_object_set (G_OBJECT (renderer), "text", txt, NULL);
112 map_header_text (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
113 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
116 TnyMsgHeaderFlags flags;
118 gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
120 rendobj = G_OBJECT(renderer);
122 if (!(flags & TNY_MSG_HEADER_FLAG_SEEN))
123 g_object_set (rendobj, "weight", 800, NULL);
125 g_object_set (rendobj, "weight", 400, NULL); /* default, non-bold */
130 modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj)
132 GtkTreeViewColumn *column;
133 GtkCellRenderer *renderer_icon, *renderer_header;
135 ModestTnyHeaderTreeViewPrivate *priv;
137 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj);
139 renderer_icon = gtk_cell_renderer_text_new (); /* TODO */
140 renderer_header = gtk_cell_renderer_text_new ();
142 priv->tny_msg_folder = NULL;
143 priv->header_tree_model = NULL;
146 column = gtk_tree_view_column_new_with_attributes(_("F"), renderer_icon, NULL);
147 gtk_tree_view_column_set_resizable (column, TRUE);
148 gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN);
149 gtk_tree_view_column_set_sort_indicator (column, FALSE);
150 gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
151 gtk_tree_view_column_set_cell_data_func(column, renderer_icon, map_header_icon, NULL, NULL);
154 column = gtk_tree_view_column_new_with_attributes(_("Date"), renderer_header,
156 TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
158 gtk_tree_view_column_set_resizable (column, TRUE);
159 gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN);
160 gtk_tree_view_column_set_sort_indicator (column, TRUE);
161 gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
162 gtk_tree_view_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL);
163 g_signal_connect (G_OBJECT (column), "clicked", G_CALLBACK (column_clicked), obj);
167 column = gtk_tree_view_column_new_with_attributes(_("From"), renderer_header,
169 TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
171 gtk_tree_view_column_set_resizable (column, TRUE);
172 gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN);
173 gtk_tree_view_column_set_sort_indicator (column, TRUE);
174 gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
175 gtk_tree_view_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL);
176 g_signal_connect (G_OBJECT (column), "clicked", G_CALLBACK (column_clicked), obj);
180 column = gtk_tree_view_column_new_with_attributes(_("Subject"), renderer_header,
182 TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
184 gtk_tree_view_column_set_resizable (column, TRUE);
185 gtk_tree_view_column_set_sort_column_id (column, TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN);
186 gtk_tree_view_column_set_sort_indicator (column, TRUE);
187 gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
188 g_signal_connect (G_OBJECT (column), "clicked", G_CALLBACK (column_clicked), obj);
192 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(obj), TRUE);
193 gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE);
194 gtk_tree_view_column_set_cell_data_func(column, renderer_header, map_header_text, NULL, NULL);
197 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), TRUE); /* alternating row colors */
202 modest_tny_header_tree_view_finalize (GObject *obj)
204 ModestTnyHeaderTreeView *self;
205 ModestTnyHeaderTreeViewPrivate *priv;
207 self = MODEST_TNY_HEADER_TREE_VIEW(obj);
208 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
210 if (priv->header_tree_model)
211 g_object_unref (G_OBJECT(priv->header_tree_model));
213 priv->header_tree_model = NULL;
214 priv->tny_msg_folder = NULL;
218 modest_tny_header_tree_view_new (TnyMsgFolderIface *folder)
221 GtkTreeSelection *sel;
222 ModestTnyHeaderTreeView *self;
224 obj = G_OBJECT(g_object_new(MODEST_TYPE_TNY_HEADER_TREE_VIEW, NULL));
225 self = MODEST_TNY_HEADER_TREE_VIEW(obj);
227 if (!modest_tny_header_tree_view_set_folder (self, NULL)) {
228 g_warning ("could not set the folder");
229 g_object_unref (obj);
233 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
234 g_signal_connect (sel, "changed",
235 G_CALLBACK(selection_changed), self);
237 return GTK_WIDGET(self);
242 modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self,
243 TnyMsgFolderIface *folder)
245 GtkTreeModel *sortable;
246 ModestTnyHeaderTreeViewPrivate *priv;
248 g_return_val_if_fail (self, FALSE);
250 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
252 /* clean up old stuff */
253 if (priv->header_tree_model)
254 g_object_unref (G_OBJECT(priv->header_tree_model));
255 priv->header_tree_model = NULL;
257 priv->header_tree_model = GTK_TREE_MODEL (tny_msg_header_list_model_new());
259 tny_msg_header_list_model_set_folder (
260 TNY_MSG_HEADER_LIST_MODEL(priv->header_tree_model),
261 folder, TRUE); /* FIXME: refresh?*/
263 sortable = gtk_tree_model_sort_new_with_model (priv->header_tree_model);
266 static GtkTreeModel *empty_model = NULL;
268 empty_model = GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_STRING));
270 sortable = empty_model;
273 gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
276 g_object_unref (G_OBJECT(sortable));
283 selection_changed (GtkTreeSelection *sel, gpointer user_data)
286 TnyMsgHeaderIface *header;
288 ModestTnyHeaderTreeView *tree_view;
290 g_return_if_fail (sel);
291 g_return_if_fail (user_data);
293 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
294 return; /* msg was _un_selected */
296 tree_view = MODEST_TNY_HEADER_TREE_VIEW (user_data);
298 gtk_tree_model_get (model, &iter,
299 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
303 TnyMsgHeaderFlags flags;
304 const TnyMsgIface *msg;
305 const TnyMsgFolderIface *folder;
307 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
309 g_message ("cannot find folder");
311 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder),
314 g_message ("cannot find msg");
317 /* mark message as seen; _set_flags crashes, bug in tinymail? */
318 //flags = tny_msg_header_iface_get_flags (TNY_MSG_HEADER_IFACE(header));
319 //tny_msg_header_iface_set_flags (header, flags | TNY_MSG_HEADER_FLAG_SEEN);
321 g_signal_emit (G_OBJECT(tree_view), signals[MESSAGE_SELECTED_SIGNAL], 0,
327 column_clicked (GtkTreeViewColumn *col, gpointer user_data)
329 GtkTreeView *treeview;
332 treeview = GTK_TREE_VIEW (user_data);
333 id = gtk_tree_view_column_get_sort_column_id (col);
335 gtk_tree_view_set_search_column (treeview, id);