root/trunk/src/tmut-folder-view.c

Revision 92 (checked in by pvanhoof, 2 weeks ago)

2008-08-25 Guido Günther <agx@sigxcpu.org>

Renames the recipient in the folver overview to address. Aim is

to be able to display either sender or recipient there without
having confusing variable names.

Displays the sender instead of the recipient in tmut's folder

overview. This would ideally be contrallable by a config knob at
a later point.

Review and committed by Philip Van Hoof

Line 
1 /* TMut
2  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with self library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #if HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include <glib/gi18n-lib.h>
25
26 #include "tmut-folder-view.h"
27 #include "tmut-folder-selector.h"
28 #include "tmut-msg-view.h"
29 #include "tmut-ringtone-player.h"
30 #include "tmut-shell-window.h"
31 #include "tmut-shell-child.h"
32
33 #include <tny-folder-monitor.h>
34 #include <tny-gtk-header-list-model.h>
35 #include <tny-simple-list.h>
36 #include <tny-camel-account.h>
37
38 #include <modest-vbox-cell-renderer.h>
39 #include <modest-hbox-cell-renderer.h>
40
41 #include <string.h>
42
43 static GObjectClass *parent_class = NULL;
44
45 typedef struct _TMutFolderViewPriv TMutFolderViewPriv;
46
47 struct _TMutFolderViewPriv
48 {
49         GtkTreeView *headers_treeview;
50         TnyFolderMonitor *monitor;
51         TnyFolder *folder;
52         TnyFolderObserver *ringtone_player;
53         TMutShellWindow *shell;
54         TnyAccountStore *account_store;
55 };
56
57 #define TMUT_FOLDER_VIEW_GET_PRIVATE(o) \
58         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TMUT_TYPE_FOLDER_VIEW, TMutFolderViewPriv))
59
60
61
62 static void
63 status_update (GObject *sender, TnyStatus *status, gpointer user_data)
64 {
65         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (user_data);
66
67         if (priv->shell)
68                 gtk_progress_set_percentage (tmut_shell_window_get_progress (priv->shell),
69                                 tny_status_get_fraction (status));
70
71         return;
72 }
73
74
75
76 static void
77 on_move_done (TnyFolder *folder, gboolean canceled, GError *err, gpointer user_data)
78 {
79         TMutFolderView *self = TMUT_FOLDER_VIEW (user_data);
80         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
81         gchar *msg = "";
82
83         if (canceled)
84                 msg = _("User canceled the operation");
85         else if (err)
86                 msg = err->message;
87
88         if (err || canceled)
89         {
90                 GtkWidget *dialog = gtk_message_dialog_new (
91                                 GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (priv->shell))),
92                                 GTK_DIALOG_DESTROY_WITH_PARENT,
93                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, msg);
94                 g_signal_connect_swapped (dialog, "response",
95                         G_CALLBACK (gtk_widget_destroy), dialog);
96                 gtk_widget_show_all (dialog);
97         }
98
99         g_object_unref (user_data);
100
101         return;
102 }
103
104 typedef struct {
105         TMutFolderView *self;
106         gboolean delete_originals;
107         TnyList *items;
108 } OnMoveSelectedInfo;
109
110 static void
111 on_folder_selected_for_move (GtkWidget *widget, gpointer user_data)
112 {
113         OnMoveSelectedInfo *info = (OnMoveSelectedInfo *) user_data;
114         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (info->self);
115         TnyFolderStore *into = tmut_folder_selector_get_current (TMUT_FOLDER_SELECTOR (widget));
116
117         if (into)
118         {
119                 if (into != (TnyFolderStore *) priv->folder && TNY_IS_FOLDER (into))
120                         tny_folder_transfer_msgs_async (priv->folder,
121                                 info->items, TNY_FOLDER (into), info->delete_originals,
122                                 on_move_done, status_update,
123                                 g_object_ref (info->self));
124
125                 g_object_unref (into);
126         }
127
128         tmut_shell_window_back (priv->shell);
129
130         return;
131 }
132
133 static void
134 on_folder_selected_for_move_destroy (GtkWidget *widget, gpointer user_data)
135 {
136         OnMoveSelectedInfo *info = (OnMoveSelectedInfo *) user_data;
137
138         g_object_unref (info->self);
139         g_object_unref (info->items);
140
141         g_slice_free (OnMoveSelectedInfo, info);
142
143         return;
144 }
145
146
147 static void
148 message_movecopy_helper (TMutFolderView *self, gboolean move)
149 {
150         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
151         GtkTreeSelection *selection = gtk_tree_view_get_selection (priv->headers_treeview);
152         GtkTreeModel *model;
153         GtkTreeIter iter;
154
155         if (gtk_tree_selection_get_selected (selection, &model, &iter))
156         {
157                 TnyHeader *header = NULL;
158
159                 gtk_tree_model_get (model, &iter,
160                         TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
161                         &header, -1);
162
163                 if (header)
164                 {
165                         TnyFolder *folder;
166                         TMutFolderSelector *view;
167                         OnMoveSelectedInfo *info;
168                         gboolean del_originals = TRUE;
169
170                         info = g_slice_new0 (OnMoveSelectedInfo);
171                         info->self = TMUT_FOLDER_VIEW (g_object_ref (self));
172                         info->items = tny_simple_list_new ();
173
174                         tny_list_prepend (info->items, G_OBJECT (header));
175
176                         info->delete_originals = move;
177
178                         view = tmut_folder_selector_new ();
179
180                         tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (view),
181                                 priv->account_store);
182
183                         g_signal_connect (G_OBJECT (view), "folder-selected",
184                                 G_CALLBACK (on_folder_selected_for_move), info);
185                         g_signal_connect (G_OBJECT (view), "destroy",
186                                 G_CALLBACK (on_folder_selected_for_move_destroy), info);
187                         gtk_widget_show (GTK_WIDGET (view));
188
189                         tmut_shell_window_set_child (
190                                 tmut_shell_child_get_window (TMUT_SHELL_CHILD (self)),
191                                 TMUT_SHELL_CHILD (view), _("Select destination"));
192
193                         g_object_unref (header);
194                 }
195         }
196
197         return;
198 }
199
200 void
201 tmut_folder_view_on_message_move_activated (GObject *sender, TMutFolderView *self)
202 {
203         message_movecopy_helper (self, TRUE);
204         return;
205 }
206
207
208
209 void
210 tmut_folder_view_on_message_copy_activated (GObject *sender, TMutFolderView *self)
211 {
212         message_movecopy_helper (self, FALSE);
213         return;
214 }
215
216
217 void
218 tmut_folder_view_on_message_delete_activated (GObject *sender, TMutFolderView *self)
219 {
220         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
221         GtkTreeSelection *selection = gtk_tree_view_get_selection (priv->headers_treeview);
222         GtkTreeModel *model;
223         GtkTreeIter iter;
224
225         if (gtk_tree_selection_get_selected (selection, &model, &iter))
226         {
227                 TnyHeader *header = NULL;
228
229                 gtk_tree_model_get (model, &iter,
230                         TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
231                         &header, -1);
232
233                 if (header)
234                 {
235                         gchar *hstr = tny_header_dup_subject (header);
236                         GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (priv->shell),
237                                 GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO,
238                                 _("This will remove the message with subject \"%s\""),
239                                 hstr);
240                         g_free (hstr);
241                         if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES) {
242                                 TnyFolder *folder = tny_header_get_folder (header);
243                                 tny_folder_remove_msg (folder, header, NULL);
244                                 tny_folder_sync (folder, TRUE, NULL);
245                                 g_object_unref (folder);
246                         }
247                         gtk_widget_destroy (dialog);
248
249                         g_object_unref (header);
250                 }
251         }
252
253
254         return;
255 }
256
257
258 static void
259 popup_the_actions_menu (GtkButton *button, gpointer user_data)
260 {
261         GtkMenu *menu = (GtkMenu *) user_data;
262
263         gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
264                         0, gtk_get_current_event_time ());
265
266         return;
267 }
268
269 static void
270 tmut_folder_view_create_menu_default (TMutFolderView *self)
271 {
272         GtkMenu *menu;
273         GtkWidget *mdel_menuitem, *mmove_menuitem, *mcopy_menuitem;
274         GtkButton *menu_button;
275
276         menu_button = GTK_BUTTON (gtk_button_new_with_label (_("Actions")));
277
278         menu = GTK_MENU (gtk_menu_new ());
279
280         mdel_menuitem = gtk_menu_item_new_with_label (_("Delete a message"));
281         mmove_menuitem = gtk_menu_item_new_with_label (_("Move a message"));
282         mcopy_menuitem = gtk_menu_item_new_with_label (_("Copy a message"));
283
284         gtk_widget_show (mdel_menuitem);
285         gtk_widget_show (mmove_menuitem);
286         gtk_widget_show (mcopy_menuitem);
287         gtk_widget_show (GTK_WIDGET (menu));
288
289         gtk_widget_show (GTK_WIDGET (menu_button));
290
291         gtk_menu_prepend (menu, mdel_menuitem);
292         gtk_menu_prepend (menu, mmove_menuitem);
293         gtk_menu_prepend (menu, mcopy_menuitem);
294
295         gtk_menu_attach_to_widget (menu, GTK_WIDGET (menu_button), NULL);
296
297         g_signal_connect (G_OBJECT (menu_button), "clicked",
298                 G_CALLBACK (popup_the_actions_menu), menu);
299
300         g_signal_connect (G_OBJECT (mdel_menuitem), "activate",
301                 G_CALLBACK (tmut_folder_view_on_message_delete_activated), self);
302         g_signal_connect (G_OBJECT (mmove_menuitem), "activate",
303                 G_CALLBACK (tmut_folder_view_on_message_move_activated), self);
304         g_signal_connect (G_OBJECT (mcopy_menuitem), "activate",
305                 G_CALLBACK (tmut_folder_view_on_message_copy_activated), self);
306
307         gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (menu_button), FALSE, TRUE, 0);
308
309         return;
310 }
311
312
313 static void
314 tmut_folder_view_deactivate_folder (TMutFolderViewPriv *priv)
315 {
316         if (priv->folder) {
317                 if (priv->ringtone_player)
318                         tny_folder_remove_observer (priv->folder, priv->ringtone_player);
319                 g_object_unref (priv->folder);
320         }
321         if (priv->monitor) {
322                 tny_folder_monitor_stop (priv->monitor);
323                 g_object_unref (priv->monitor);
324         }
325 }
326
327 static void
328 on_active_folder_got_set (TnyFolder *folder, gboolean cancelled, GError *err, gpointer user_data)
329 {
330         g_object_unref (user_data);
331
332         return;
333 }
334
335 void 
336 tmut_folder_view_set_active_folder (TMutFolderView *self, TnyFolder *folder)
337 {
338         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
339         GtkTreeModel *model = NULL;
340
341         tmut_folder_view_deactivate_folder (priv);
342
343         priv->folder = TNY_FOLDER (g_object_ref (folder));
344
345         if (!priv->ringtone_player)
346                 priv->ringtone_player = tmut_ringtone_player_new ();
347         tny_folder_add_observer (priv->folder, priv->ringtone_player);
348
349         model = tny_gtk_header_list_model_new ();
350
351         tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL (model),
352                 folder, FALSE, NULL, status_update, self);
353
354         /* The folder monitor makes Push E-mail work */
355         priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder));
356         tny_folder_monitor_add_list (priv->monitor, TNY_LIST (model));
357         tny_folder_monitor_start (priv->monitor);
358
359         tny_folder_refresh_async (folder, on_active_folder_got_set,
360                         status_update, g_object_ref (self));
361
362         gtk_tree_view_set_model (priv->headers_treeview, model);
363
364         g_object_unref (model);
365
366         return;
367 }
368
369 static void
370 tmut_folder_view_on_got_msg (TnyFolder *folder, gboolean canceled, TnyMsg *msg, GError *err, gpointer user_data)
371 {
372         TMutFolderView *self = TMUT_FOLDER_VIEW (user_data);
373         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
374
375         if (!canceled && !err) {
376                 TnyHeader *header;
377                 TnyMsgView *view = tmut_msg_view_new (priv->account_store);
378                 tny_msg_view_set_msg (view, msg);
379                 header = tny_msg_get_header (msg);
380                 tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
381                 g_object_unref (header);
382                 gtk_widget_show (GTK_WIDGET (view));
383
384                 tmut_shell_window_set_child (
385                         tmut_shell_child_get_window (TMUT_SHELL_CHILD (self)),
386                         TMUT_SHELL_CHILD (view), NULL);
387
388         } else {
389                 gchar *msg = err?err->message:"User canceled the operation";
390                 GtkWidget *dialog = gtk_message_dialog_new (
391                                 GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (priv->shell))),
392                                 GTK_DIALOG_DESTROY_WITH_PARENT,
393                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, msg);
394                 g_signal_connect_swapped (dialog, "response",
395                         G_CALLBACK (gtk_widget_destroy), dialog);
396                 gtk_widget_show_all (dialog);
397         }
398
399         g_object_unref (user_data);
400
401         return;
402 }
403
404 typedef struct {
405         TMutFolderView *self;
406         TnyFolder *folder;
407         TnyHeader *header;
408 } OnWentOnlineInfo;
409
410 static void
411 on_went_online (TnyCamelAccount *account, gboolean canceled, GError *err, gpointer user_data)
412 {
413         OnWentOnlineInfo *info = (OnWentOnlineInfo *) user_data;
414         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (info->self);
415
416         if (!canceled && !err && (tny_account_get_connection_status (TNY_ACCOUNT (account)) == TNY_CONNECTION_STATUS_CONNECTED)) {
417                 tny_folder_get_msg_async (info->folder, info->header,
418                         tmut_folder_view_on_got_msg, status_update,
419                         g_object_ref (info->self));
420         } else {
421                 gchar *msg;
422                 GtkWidget *dialog;
423
424                 if (err)
425                         msg = g_strdup_printf ("Can't get message: %s",
426                                 err->message);
427                 else {
428                         if (tny_account_get_connection_status (TNY_ACCOUNT (account)) != TNY_CONNECTION_STATUS_CONNECTED)
429                                 msg = g_strdup ("Can't get message: account not online");
430                         else
431                                 msg = g_strdup ("Can't get message: User canceled the operation");
432                 }
433
434                 dialog = gtk_message_dialog_new (
435                                 GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (priv->shell))),
436                                 GTK_DIALOG_DESTROY_WITH_PARENT,
437                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, msg);
438                 g_signal_connect_swapped (dialog, "response",
439                         G_CALLBACK (gtk_widget_destroy), dialog);
440                 gtk_widget_show_all (dialog);
441         }
442
443         g_object_unref (info->self);
444         g_object_unref (info->header);
445         g_object_unref (info->folder);
446         g_slice_free (OnWentOnlineInfo, info);
447 }
448
449 static void
450 on_msg_selected (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
451 {
452         TMutFolderView *self = TMUT_FOLDER_VIEW (user_data);
453         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
454         GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
455         GtkTreeModel *model;
456         GtkTreeIter iter;
457
458         if (gtk_tree_selection_get_selected (selection, &model, &iter))
459         {
460                 TnyHeader *header;
461                 TnyMsgView *view;
462
463                 gtk_tree_model_get (model, &iter,
464                         TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
465                         &header, -1);
466
467                 if (header) {
468                         TnyFolder *folder = tny_header_get_folder (header);
469                         if (folder) {
470                                 TnyDevice *device = tny_account_store_get_device (priv->account_store);
471                                 if (!tny_device_is_online (device)) {
472                                         OnWentOnlineInfo *info = g_slice_new0 (OnWentOnlineInfo);
473                                         TnyAccount *account = tny_folder_get_account (folder);
474
475                                         /* If we do this, sometimes the callback tells us the
476                                          * connecting got canceled. It makes sense why (for me,
477                                          * Tinymail's developer), perhaps I need to fix this
478                                          * in Tinymail. For now .. we just don't do it because
479                                          * it ain't really necessary (the account goes into
480                                          * online, no matter what state the device is is, when
481                                          * using tny_camel_account_set_online).
482                                          *
483                                          * tny_device_force_online (device);
484                                          **/
485                                         info->folder = g_object_ref (folder);
486                                         info->header = g_object_ref (header);
487                                         info->self = g_object_ref (self);
488                                         tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (account),
489                                                 TRUE, on_went_online, info);
490                                         g_object_unref (account);
491                                 } else {
492                                         tny_folder_get_msg_async (folder, header,
493                                                 tmut_folder_view_on_got_msg, status_update,
494                                                 g_object_ref (self));
495                                 }
496                                 g_object_unref (device);
497                                 g_object_unref (folder);
498                         }
499                         g_object_unref (header);
500                 }
501         }
502
503         return;
504 }
505
506 static void
507 set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags)
508 {
509         g_object_set (G_OBJECT(renderer),
510                 "weight", (flags & TNY_HEADER_FLAG_SEEN) ? PANGO_WEIGHT_NORMAL: PANGO_WEIGHT_ULTRABOLD,
511                 "strikethrough",  (flags & TNY_HEADER_FLAG_DELETED) ?  TRUE:FALSE,
512                 NULL);
513 }
514
515
516 static void
517 header_view_compact_header_cell_data (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
518                         GtkTreeModel *tree_model,  GtkTreeIter *iter,  gpointer user_data)
519 {
520         TnyHeaderFlags flags = 0;
521         gchar *address = NULL;
522         gchar *subject = NULL;
523         gchar *header = NULL;
524         time_t date;
525         GtkCellRenderer *address_cell, *date_or_status_cell, *subject_cell,
526                 *address_box, *subject_box = NULL;
527         TnyHeader *msg_header = NULL;
528         gchar *display_date = NULL, *tmp_date = NULL;
529         TnyHeaderFlags prio = 0;
530
531         address_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "address-box-renderer"));
532         subject_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "subject-box-renderer"));
533         subject_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "subject-renderer"));
534         address_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (address_box), "address-renderer"));
535         date_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (address_box), "date-renderer"));
536
537         gtk_tree_model_get (tree_model, iter,
538                         TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
539                         TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN,  &address,
540                         TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
541                         TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date,
542                         TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header,
543                         -1);
544
545         if (subject && strlen (subject)) {
546                 gchar* escaped_subject = g_markup_escape_text (subject, -1);
547                 g_object_set (G_OBJECT (subject_cell), "markup",
548                         escaped_subject, NULL);
549                 g_free (escaped_subject);
550         } else
551                 g_object_set (G_OBJECT (subject_cell), "markup",
552                         _("No subject"), NULL);
553
554         g_free (subject);
555         set_common_flags (subject_cell, flags);
556
557         header = g_markup_printf_escaped ("<span size='small' foreground='#666666'>%s</span>",
558                         address);
559         g_free (address);
560
561         g_object_set (G_OBJECT (address_cell),
562                         "markup", header, NULL);
563         g_free (header);
564
565         header = NULL;
566         display_date = g_strdup_printf ("<span size='small' foreground='#666666'>%s</span>",
567                                         date ? _get_readable_date (date) : "");
568         g_object_set (G_OBJECT (date_or_status_cell),
569                       "markup", display_date,
570                       NULL);
571         g_free (tmp_date);
572         tmp_date = NULL;
573         g_free (display_date);
574         display_date = NULL;
575
576         if (msg_header != NULL)
577                 g_object_unref (msg_header);
578 }
579
580 static void
581 tmut_folder_view_instance_init (GTypeInstance *instance, gpointer g_class)
582 {
583         TMutFolderView *self = (TMutFolderView *) instance;
584         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
585         GtkCellRenderer *renderer;
586         GtkTreeViewColumn *column;
587         GtkTreeSelection *select;
588         GtkWidget *widget, *sw;
589
590         GtkCellRenderer *renderer_compact_header, *renderer_addr_box,
591                 *renderer_subject, *renderer_subject_box, *renderer_addr,
592                 *renderer_compact_date_or_status;
593
594         priv->account_store = NULL;
595         priv->monitor = NULL;
596         priv->ringtone_player = NULL;
597
598         sw = gtk_scrolled_window_new (NULL, NULL);
599         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
600                 GTK_SHADOW_NONE);
601         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
602                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
603
604         gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (sw),
605                 TRUE, TRUE, 0);
606
607         gtk_widget_show (sw);
608
609         priv->headers_treeview = GTK_TREE_VIEW (gtk_tree_view_new ());
610
611         gtk_tree_view_set_headers_visible (priv->headers_treeview, FALSE);
612 #if GTK_CHECK_VERSION (2,12,0)
613         gtk_tree_view_set_show_expanders (priv->headers_treeview, FALSE);
614 #endif
615
616         gtk_tree_view_set_rules_hint (priv->headers_treeview, TRUE);
617         gtk_tree_view_set_fixed_height_mode (priv->headers_treeview, TRUE);
618         gtk_widget_show (GTK_WIDGET (priv->headers_treeview));
619         gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->headers_treeview));
620
621
622         renderer_compact_header = modest_vbox_cell_renderer_new ();
623         renderer_subject_box = modest_hbox_cell_renderer_new ();
624         renderer_addr_box = modest_hbox_cell_renderer_new ();
625         renderer_addr = gtk_cell_renderer_text_new ();
626         renderer_subject = gtk_cell_renderer_text_new ();
627         renderer_compact_date_or_status  = gtk_cell_renderer_text_new ();
628
629         modest_vbox_cell_renderer_append (MODEST_VBOX_CELL_RENDERER (renderer_compact_header), renderer_subject_box, FALSE);
630         modest_vbox_cell_renderer_append (MODEST_VBOX_CELL_RENDERER (renderer_compact_header), renderer_addr_box, FALSE);
631         modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_subject_box), renderer_subject, TRUE);
632         modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_addr_box), renderer_addr, TRUE);
633         modest_hbox_cell_renderer_append (MODEST_HBOX_CELL_RENDERER (renderer_addr_box), renderer_compact_date_or_status, FALSE);
634
635         g_object_set_data (G_OBJECT (renderer_compact_header), "subject-box-renderer", renderer_subject_box);
636         g_object_set_data (G_OBJECT (renderer_compact_header), "address-box-renderer", renderer_addr_box);
637         g_object_set_data (G_OBJECT (renderer_subject_box), "subject-renderer", renderer_subject);
638         g_object_set_data (G_OBJECT (renderer_addr_box), "address-renderer", renderer_addr);
639         g_object_set_data (G_OBJECT (renderer_addr_box), "date-renderer", renderer_compact_date_or_status);
640
641         g_object_set (G_OBJECT (renderer_subject_box), "yalign", 0.0, NULL);
642         gtk_cell_renderer_set_fixed_size (renderer_subject_box, -1, 15);
643         gtk_cell_renderer_set_fixed_size (renderer_addr_box, -1, 15);
644         g_object_set (G_OBJECT (renderer_addr_box), "yalign", 0.0, NULL);
645
646         g_object_set (G_OBJECT (renderer_subject),
647                 "ellipsize", PANGO_ELLIPSIZE_END, "yalign", 0.0, NULL);
648         g_object_set (G_OBJECT (renderer_addr),
649                 "ellipsize", PANGO_ELLIPSIZE_END, "yalign", 0.0, NULL);
650         g_object_set(G_OBJECT(renderer_compact_date_or_status),
651                 "xalign", 0.0, "yalign", 0.0, NULL);
652
653         renderer = renderer_compact_header;
654
655         column = gtk_tree_view_column_new_with_attributes (_("Subject"), renderer, NULL);
656
657         gtk_tree_view_column_set_cell_data_func(column, renderer, header_view_compact_header_cell_data,
658                                 NULL, NULL);
659
660         gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
661         gtk_tree_view_column_set_resizable (column, FALSE);
662
663         gtk_tree_view_append_column (GTK_TREE_VIEW(priv->headers_treeview), column);
664
665         select = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->headers_treeview));
666         gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
667
668         g_signal_connect (G_OBJECT (priv->headers_treeview), "row-activated",
669                 G_CALLBACK (on_msg_selected), self);
670
671         TMUT_FOLDER_VIEW_GET_CLASS (self)->create_menu (self);
672
673         return;
674 }
675
676 static void
677 tmut_folder_view_finalize (GObject *object)
678 {
679         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (object);
680
681         tmut_folder_view_deactivate_folder (priv);
682
683         if (priv->account_store)
684                 g_object_unref (priv->account_store);
685
686         if (priv->ringtone_player)
687                 g_object_unref (priv->ringtone_player);
688
689         (*parent_class->finalize) (object);
690
691         return;
692 }
693
694
695 static void
696 tmut_folder_view_class_init (TMutFolderViewClass *class)
697 {
698         GObjectClass *object_class;
699
700         parent_class = g_type_class_peek_parent (class);
701         object_class = (GObjectClass*) class;
702
703         object_class->finalize = tmut_folder_view_finalize;
704
705         class->create_menu= tmut_folder_view_create_menu_default;
706
707         g_type_class_add_private (object_class, sizeof (TMutFolderViewPriv));
708
709         return;
710 }
711
712 /**
713  * tmut_folder_view_new:
714  *
715  *
716  * Return value: A new #TnySummaryView instance implemented for TMUT
717  **/
718 TMutFolderView*
719 tmut_folder_view_new (TnyAccountStore *account_store)
720 {
721         TMutFolderView *self = g_object_new (TMUT_TYPE_FOLDER_VIEW, NULL);
722         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
723
724         priv->account_store = TNY_ACCOUNT_STORE (g_object_ref (account_store));
725
726         return TMUT_FOLDER_VIEW (self);
727 }
728
729
730 TMutShellWindow*
731 tmut_folder_view_get_window (TMutShellChild *self)
732 {
733         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
734         return priv->shell;
735 }
736
737 void 
738 tmut_folder_view_set_window (TMutShellChild *self, TMutShellWindow *window)
739 {
740         TMutFolderViewPriv *priv = TMUT_FOLDER_VIEW_GET_PRIVATE (self);
741         priv->shell = window;
742 }
743
744 static void
745 tmut_shell_child_init (gpointer g, gpointer iface_data)
746 {
747         TMutShellChildIface *klass = (TMutShellChildIface *)g;
748
749         klass->get_window= tmut_folder_view_get_window;
750         klass->set_window= tmut_folder_view_set_window;
751
752         return;
753 }
754
755
756 GType
757 tmut_folder_view_get_type (void)
758 {
759         static GType type = 0;
760
761         if (G_UNLIKELY(type == 0))
762         {
763                 static const GTypeInfo info =
764                 {
765                   sizeof (TMutFolderViewClass),
766                   NULL,   /* base_init */
767                   NULL,   /* base_finalize */
768                   (GClassInitFunc) tmut_folder_view_class_init,   /* class_init */
769                   NULL,   /* class_finalize */
770                   NULL,   /* class_data */
771                   sizeof (TMutFolderView),
772                   0,      /* n_preallocs */
773                   tmut_folder_view_instance_init    /* instance_init */
774                 };
775
776                 static const GInterfaceInfo tmut_shell_child_info =
777                 {
778                   (GInterfaceInitFunc) tmut_shell_child_init, /* interface_init */
779                   NULL,         /* interface_finalize */
780                   NULL          /* interface_data */
781                 };
782
783                 type = g_type_register_static (GTK_TYPE_VBOX,
784                         "TMutFolderView",
785                         &info, 0);
786
787                 g_type_add_interface_static (type, TMUT_TYPE_SHELL_CHILD,
788                         &tmut_shell_child_info);
789
790         }
791
792         return type;
793 }
794
Note: See TracBrowser for help on using the browser.