1 /* modest-tny-header-tree-view.c */
3 /* insert (c)/licensing information) */
5 #include "modest-tny-header-tree-view.h"
7 /* 'private'/'protected' functions */
8 static void modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass);
9 static void modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj);
10 static void modest_tny_header_tree_view_finalize (GObject *obj);
12 static void selection_changed (GtkTreeSelection *sel, gpointer user_data);
17 MESSAGE_SELECTED_SIGNAL,
21 typedef struct _ModestTnyHeaderTreeViewPrivate ModestTnyHeaderTreeViewPrivate;
22 struct _ModestTnyHeaderTreeViewPrivate {
23 TnyMsgFolderIface *tny_msg_folder;
24 GtkTreeModel *header_tree_model;
26 #define MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
27 MODEST_TYPE_TNY_HEADER_TREE_VIEW, \
28 ModestTnyHeaderTreeViewPrivate))
30 static GObjectClass *parent_class = NULL;
32 /* uncomment the following if you have defined any signals */
33 static guint signals[LAST_SIGNAL] = {0};
36 modest_tny_header_tree_view_get_type (void)
38 static GType my_type = 0;
40 static const GTypeInfo my_info = {
41 sizeof(ModestTnyHeaderTreeViewClass),
43 NULL, /* base finalize */
44 (GClassInitFunc) modest_tny_header_tree_view_class_init,
45 NULL, /* class finalize */
46 NULL, /* class data */
47 sizeof(ModestTnyHeaderTreeView),
49 (GInstanceInitFunc) modest_tny_header_tree_view_init,
51 my_type = g_type_register_static (GTK_TYPE_TREE_VIEW,
52 "ModestTnyHeaderTreeView",
59 modest_tny_header_tree_view_class_init (ModestTnyHeaderTreeViewClass *klass)
61 GObjectClass *gobject_class;
62 gobject_class = (GObjectClass*) klass;
64 parent_class = g_type_class_peek_parent (klass);
65 gobject_class->finalize = modest_tny_header_tree_view_finalize;
67 g_type_class_add_private (gobject_class, sizeof(ModestTnyHeaderTreeViewPrivate));
69 signals[MESSAGE_SELECTED_SIGNAL] =
70 g_signal_new ("message_selected",
71 G_TYPE_FROM_CLASS (gobject_class),
73 G_STRUCT_OFFSET (ModestTnyHeaderTreeViewClass,message_selected),
75 g_cclosure_marshal_VOID__POINTER,
76 G_TYPE_NONE, 1, G_TYPE_POINTER);
80 modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj)
82 ModestTnyHeaderTreeViewPrivate *priv;
83 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj);
85 priv->tny_msg_folder = NULL;
86 priv->header_tree_model = NULL;
90 modest_tny_header_tree_view_finalize (GObject *obj)
92 ModestTnyHeaderTreeView *self;
93 ModestTnyHeaderTreeViewPrivate *priv;
95 self = MODEST_TNY_HEADER_TREE_VIEW(obj);
96 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
98 if (priv->header_tree_model)
99 g_object_unref (G_OBJECT(priv->header_tree_model));
101 priv->header_tree_model = NULL;
102 priv->tny_msg_folder = NULL;
106 modest_tny_header_tree_view_new (TnyMsgFolderIface *folder)
109 GtkTreeSelection *sel;
110 ModestTnyHeaderTreeView *self;
112 obj = G_OBJECT(g_object_new(MODEST_TYPE_TNY_HEADER_TREE_VIEW, NULL));
113 self = MODEST_TNY_HEADER_TREE_VIEW(obj);
115 if (!modest_tny_header_tree_view_set_folder (self, NULL)) {
116 g_warning ("could not set the folder");
117 g_object_unref (obj);
121 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
122 g_signal_connect (sel, "changed",
123 G_CALLBACK(selection_changed), self);
125 return GTK_WIDGET(self);
130 modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self,
131 TnyMsgFolderIface *folder)
133 GtkTreeModel *sortable;
134 ModestTnyHeaderTreeViewPrivate *priv;
136 g_return_val_if_fail (self, FALSE);
138 priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
140 /* clean up old stuff */
141 if (priv->header_tree_model)
142 g_object_unref (G_OBJECT(priv->header_tree_model));
143 priv->header_tree_model = NULL;
145 priv->header_tree_model = GTK_TREE_MODEL (tny_msg_header_list_model_new());
147 tny_msg_header_list_model_set_folder (
148 TNY_MSG_HEADER_LIST_MODEL(priv->header_tree_model),
149 folder, TRUE); /* FIXME: refresh?*/
151 sortable = gtk_tree_model_sort_new_with_model (priv->header_tree_model);
154 static GtkTreeModel *empty_model = NULL;
156 empty_model = GTK_TREE_MODEL(gtk_list_store_new(1,G_TYPE_STRING));
158 sortable = empty_model;
161 gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
164 g_object_unref (G_OBJECT(sortable));
171 selection_changed (GtkTreeSelection *sel, gpointer user_data)
174 TnyMsgHeaderIface *header;
176 ModestTnyHeaderTreeView *tree_view;
178 g_return_if_fail (sel);
179 g_return_if_fail (user_data);
181 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
182 return; /* msg was _un_selected */
184 tree_view = MODEST_TNY_HEADER_TREE_VIEW (user_data);
186 gtk_tree_model_get (model, &iter,
187 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
191 const TnyMsgIface *msg;
192 const TnyMsgFolderIface *folder;
194 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
196 g_warning ("cannot find folder");
200 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
202 g_warning ("cannot find msg");
206 g_signal_emit (G_OBJECT(tree_view), signals[MESSAGE_SELECTED_SIGNAL], 0,