Changeset 566

Show
Ignore:
Timestamp:
07/10/06 10:40:26
Author:
pvanhoof
Message:

09-10-2006 Chris Lord <chris@openedhand.com>

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/AUTHORS

    r563 r566  
    33        * Maintainer, designer, developer, tester 
    44 
    5 Raphael Slinckx <raphael@slinckx.net> 
     5Raphael Slinckx <raphael@slinckx.net> 
    66 
    77        * Author of the Python bindings 
    88 
    9 Florian Boor <florian.boor@kernelconcepts.de> 
     9Florian Boor <florian.boor@kernelconcepts.de> 
    1010 
    1111        * Initial support for status flags 
     
    1414 
    1515        * Contributions to the TnyIteratorIface type 
     16 
     17Chris Lord <chris@openedhand.com> 
     18 
     19        * Contributions to the TnySummaryViewIface type 
  • trunk/ChangeLog

    r563 r566  
    1 06-09-2006  Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com> 
     109-10-2006  Chris Lord <chris@openedhand.com> 
     2 
     3        * Refactored TnySummaryWindowIface to TnySummaryViewIface 
     4        * Added support for XEmbed in the demo-ui 
     5 
     609-06-2006  Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com> 
    27 
    38        * tny_iterator_iface_is_end method 
    49 
    5 06-07-2006  Philip Van Hoof  <pvanhoof@gnome.org> 
     1007-06-2006  Philip Van Hoof  <pvanhoof@gnome.org> 
    611 
    712        * Major API changes in TnyAccountStore 
     
    1116        * Make GPE TnyDevice default to be online for now. 
    1217 
    13 06-01-2006  Philip Van Hoof  <pvanhoof@gnome.org> 
     1801-06-2006  Philip Van Hoof  <pvanhoof@gnome.org> 
    1419 
    1520        * Implementation and implementing 
  • trunk/libtinymailui/Makefile.am

    r387 r566  
    66 
    77libtinymailui_1_0_headers =             \ 
    8         tny-summary-window-iface.h    \ 
     8        tny-summary-view-iface.h      \ 
    99        tny-msg-view-iface.h            \ 
    1010        tny-save-strategy-iface.h       \ 
     
    1616libtinymailui_1_0_la_SOURCES =          \ 
    1717        $(libtinymailui_1_0_headers)    \ 
    18         tny-summary-window-iface.c    \ 
     18        tny-summary-view-iface.c      \ 
    1919        tny-save-strategy-iface.c       \ 
    2020        tny-msg-view-iface.c            \ 
  • trunk/libtinymailui/tny-summary-window-iface.c

    r387 r566  
    1 /* libtinymailui - The Tiny Mail UI library 
    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., 59 Temple Place - Suite 330, 
    17  * Boston, MA 02111-1307, USA. 
    18  */ 
    19  
    20 #include <config.h> 
    21  
    22 #include <tny-summary-window-iface.h> 
    23  
    24  
    25 static void 
    26 tny_summary_window_iface_base_init (gpointer g_class) 
    27 { 
    28         static gboolean initialized = FALSE; 
    29  
    30         if (!initialized) { 
    31                 /* create interface signals here. */ 
    32                 initialized = TRUE; 
    33         } 
    34 } 
    35  
    36 GType 
    37 tny_summary_window_iface_get_type (void) 
    38 { 
    39         static GType type = 0; 
    40  
    41         if (G_UNLIKELY(type == 0)) 
    42         { 
    43                 static const GTypeInfo info =  
    44                 { 
    45                   sizeof (TnySummaryWindowIfaceClass), 
    46                   tny_summary_window_iface_base_init,   /* base_init */ 
    47                   NULL,   /* base_finalize */ 
    48                   NULL,   /* class_init */ 
    49                   NULL,   /* class_finalize */ 
    50                   NULL,   /* class_data */ 
    51                   0, 
    52                   0,      /* n_preallocs */ 
    53                   NULL    /* instance_init */ 
    54                 }; 
    55                 type = g_type_register_static (G_TYPE_INTERFACE,  
    56                         "TnySummaryWindowIface", &info, 0); 
    57  
    58                 g_type_interface_add_prerequisite (type, G_TYPE_OBJECT); 
    59         } 
    60  
    61         return type; 
    62 } 
    63  
    64  
  • trunk/libtinymailui/tny-summary-window-iface.h

    r387 r566  
    1 #ifndef TNY_SUMMARY_WINDOW_IFACE_H 
    2 #define TNY_SUMMARY_WINDOW_IFACE_H 
    3  
    4 /* libtinymailui - The Tiny Mail UI library 
    5  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org> 
    6  * 
    7  * This library is free software; you can redistribute it and/or 
    8  * modify it under the terms of the GNU Lesser General Public 
    9  * License as published by the Free Software Foundation; either 
    10  * version 2 of the License, or (at your option) any later version. 
    11  * 
    12  * This library 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 GNU 
    15  * Lesser General Public License for more details. 
    16  * 
    17  * You should have received a copy of the GNU Lesser General Public 
    18  * License along with self library; if not, write to the 
    19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
    20  * Boston, MA 02111-1307, USA. 
    21  */ 
    22  
    23 #include <glib.h> 
    24 #include <glib-object.h> 
    25 #include <tny-shared.h> 
    26  
    27 G_BEGIN_DECLS 
    28  
    29 #define TNY_TYPE_SUMMARY_WINDOW_IFACE             (tny_summary_window_iface_get_type ()) 
    30 #define TNY_SUMMARY_WINDOW_IFACE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), TNY_TYPE_SUMMARY_WINDOW_IFACE, TnySummaryWindowIface)) 
    31 #define TNY_SUMMARY_WINDOW_IFACE_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), TNY_TYPE_SUMMARY_WINDOW_IFACE, TnySummaryWindowIfaceClass)) 
    32 #define TNY_IS_SUMMARY_WINDOW_IFACE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TNY_TYPE_SUMMARY_WINDOW_IFACE)) 
    33 #define TNY_IS_SUMMARY_WINDOW_IFACE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), TNY_TYPE_SUMMARY_WINDOW_IFACE)) 
    34 #define TNY_SUMMARY_WINDOW_IFACE_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), TNY_TYPE_SUMMARY_WINDOW_IFACE, TnySummaryWindowIfaceClass)) 
    35  
    36 typedef struct _TnySummaryWindowIface TnySummaryWindowIface; 
    37 typedef struct _TnySummaryWindowIfaceClass TnySummaryWindowIfaceClass; 
    38  
    39  
    40 struct _TnySummaryWindowIfaceClass 
    41 { 
    42         GTypeInterface parent; 
    43 }; 
    44  
    45 GType tny_summary_window_iface_get_type (void); 
    46  
    47  
    48 G_END_DECLS 
    49  
    50 #endif 
  • trunk/tinymail/Makefile.am

    r554 r566  
    2020tinymail_SOURCES =                                                      \ 
    2121        tny-main.c                                                      \ 
    22         tny-summary-window.c                                          \ 
    23         tny-summary-window.h 
     22        tny-summary-view.c                                            \ 
     23        tny-summary-view.h 
    2424 
    2525tinymail_LDADD =                                                                \ 
  • trunk/tinymail/tny-main.c

    r558 r566  
    4040        /* This solves a firefox vs. Camel bug. */ 
    4141 
    42         PR_ProcessExit ((int)data); 
    43         gtk_exit ((gint)data); 
     42        PR_ProcessExit ((PRIntn)data); 
     43        exit ((int)data); 
    4444 
    4545        return; 
     
    5959main (int argc, char **argv) 
    6060{ 
    61         GtkWindow *window = NULL; 
     61        GtkWidget *view = NULL, *window = NULL; 
    6262        TnyPlatformFactoryIface *platfact; 
     63        GOptionContext *context; 
     64        static gint plug = 0; 
     65         
     66        static GOptionEntry entries[] = { 
     67                { "plug", 'p', 0, G_OPTION_ARG_INT, &plug, 
     68                        "Socket ID of an XEmbed socket to plug into", NULL }, 
     69                { NULL } 
     70        }; 
     71 
     72        context = g_option_context_new (" - libtinymail demo application"); 
     73        g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); 
     74        g_option_context_add_group (context, gtk_get_option_group (TRUE)); 
     75        g_option_context_parse (context, &argc, &argv, NULL); 
    6376 
    6477        g_thread_init (NULL); 
    65         gtk_init (&argc, &argv); 
    6678        gdk_threads_init (); 
    6779 
     
    7587                        (tny_platform_factory_get_instance ()); 
    7688 
    77         window = GTK_WINDOW (tny_summary_window_new ()); 
     89        view = GTK_WIDGET (tny_summary_view_new ()); 
    7890 
    79         gtk_widget_show (GTK_WIDGET (window)); 
     91        if (plug > 0) { 
     92                g_message ("Plugging into socket %d", plug); 
     93                window = gtk_plug_new (plug); 
     94        } else { 
     95                window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
     96        } 
    8097 
     98        gtk_container_add (GTK_CONTAINER (window), view); 
     99         
    81100        tny_account_store_view_iface_set_account_store ( 
    82                 TNY_ACCOUNT_STORE_VIEW_IFACE (window), 
     101                TNY_ACCOUNT_STORE_VIEW_IFACE (view), 
    83102                tny_platform_factory_iface_new_account_store (platfact)); 
    84103         
     
    90109#endif 
    91110 
     111        gtk_widget_show (view); 
     112        gtk_widget_show (window); 
    92113        gtk_main(); 
    93114 
  • trunk/tinymail/tny-summary-window.c

    r560 r566  
    1 /* tinymail - Tiny Mail 
    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., 59 Temple Place - Suite 330, 
    17  * Boston, MA 02111-1307, USA. 
    18  */ 
    19  
    20 #include <config.h> 
    21  
    22 #include <glib/gi18n-lib.h> 
    23  
    24 #include <string.h> 
    25 #include <gtk/gtk.h> 
    26 #include <gdk/gdkkeysyms.h> 
    27  
    28 #include <tny-platform-factory-iface.h> 
    29 #include <tny-platform-factory.h> 
    30  
    31 #include <tny-password-dialog.h> 
    32 #include <tny-account-store-iface.h> 
    33 #include <tny-account-store.h> 
    34 #include <tny-account-iface.h> 
    35 #include <tny-store-account-iface.h> 
    36 #include <tny-transport-account-iface.h> 
    37 #include <tny-store-account.h> 
    38 #include <tny-transport-account.h> 
    39 #include <tny-msg-view-iface.h> 
    40 #include <tny-msg-window-iface.h> 
    41 #include <tny-msg-window.h> 
    42 #include <tny-msg-folder-iface.h> 
    43 #include <tny-account-tree-model.h> 
    44 #include <tny-msg-header-iface.h> 
    45 #include <tny-msg-header-list-model.h> 
    46 #include <tny-summary-window.h> 
    47 #include <tny-summary-window-iface.h> 
    48 #include <tny-account-store-view-iface.h> 
    49 #include <tny-list.h> 
    50  
    51 #define GO_ONLINE_TXT _("Go online") 
    52 #define GO_OFFLINE_TXT _("Go offline") 
    53  
    54 static GObjectClass *parent_class = NULL; 
    55  
    56  
    57 typedef struct _TnySummaryWindowPriv TnySummaryWindowPriv; 
    58  
    59 struct _TnySummaryWindowPriv 
    60 { 
    61         TnyAccountStoreIface *account_store; 
    62         GtkTreeView *mailbox_view, *header_view; 
    63         TnyMsgViewIface *msg_view; 
    64         guint accounts_reloaded_signal; 
    65         GtkWidget *status, *progress, *online_button; 
    66         guint status_id; 
    67         gulong mailbox_select_sid; 
    68         GtkTreeSelection *mailbox_select; 
    69         GtkTreeIter last_mailbox_correct_select; 
    70         guint connchanged_signal, online_button_signal; 
    71         TnyListIface *current_accounts; 
    72 }; 
    73  
    74 #define TNY_SUMMARY_WINDOW_GET_PRIVATE(o)       \ 
    75         (G_TYPE_INSTANCE_GET_PRIVATE ((o), TNY_TYPE_SUMMARY_WINDOW, TnySummaryWindowPriv)) 
    76  
    77  
    78  
    79 static void 
    80 set_header_view_model (GtkTreeView *header_view, GtkTreeModel *model) 
    81 { 
    82         GtkTreeModel *oldsortable = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); 
    83         if (oldsortable && GTK_IS_TREE_MODEL_SORT (oldsortable)) 
    84         {  
    85                 GtkTreeModel *oldmodel = gtk_tree_model_sort_get_model  
    86                         (GTK_TREE_MODEL_SORT (oldsortable)); 
    87                 if (oldmodel) 
    88                         g_object_unref (G_OBJECT (oldmodel)); 
    89                 g_object_unref (G_OBJECT (oldsortable)); 
    90         }  
    91  
    92         gtk_tree_view_set_model (header_view, model); 
    93  
    94         return; 
    95 } 
    96  
    97 static GtkTreeModel *empty_model; 
    98  
    99 static void  
    100 reload_accounts (TnySummaryWindowPriv *priv) 
    101 { 
    102         TnyAccountStoreIface *account_store = priv->account_store; 
    103         GtkTreeModel *sortable; 
    104  
    105         /* TnyAccountTreeModel is also a TnyListIface (it simply both the 
    106            TnyListIface and the GtkTreeModelIface interfaces interfaces) */ 
    107  
    108         GtkTreeModel *mailbox_model = GTK_TREE_MODEL (tny_account_tree_model_new ()); 
    109         TnyListIface *accounts = TNY_LIST_IFACE (mailbox_model); 
    110  
    111         /* Clear the header_view by giving it an empty model */ 
    112         if (G_UNLIKELY (!empty_model)) 
    113                 empty_model = GTK_TREE_MODEL (gtk_list_store_new (1, G_TYPE_STRING)); 
    114         set_header_view_model (GTK_TREE_VIEW (priv->header_view), empty_model); 
    115  
    116         if (priv->current_accounts) 
    117         { 
    118                 g_object_unref (G_OBJECT (priv->current_accounts)); 
    119                 priv->current_accounts = NULL; 
    120         } 
    121  
    122         /* This method uses the TnyAccountTreeModel as a TnyListIface */ 
    123         tny_account_store_iface_get_accounts (account_store, accounts, 
    124                 TNY_ACCOUNT_STORE_IFACE_STORE_ACCOUNTS); 
    125  
    126  
    127         /* Here we use the TnyAccountTreeModel as a GtkTreeModelIface */ 
    128         sortable = gtk_tree_model_sort_new_with_model (mailbox_model); 
    129         gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sortable), 
    130                                 TNY_ACCOUNT_TREE_MODEL_NAME_COLUMN,  
    131                                 GTK_SORT_ASCENDING); 
    132  
    133          
    134         /* Set the model of the mailbox_view */ 
    135         gtk_tree_view_set_model (GTK_TREE_VIEW (priv->mailbox_view),  
    136                 sortable); 
    137  
    138         return; 
    139 } 
    140  
    141 static void 
    142 accounts_reloaded (TnyAccountStoreIface *store, gpointer user_data) 
    143 { 
    144         TnySummaryWindowPriv *priv = user_data; 
    145          
    146         reload_accounts (priv); 
    147          
    148         return; 
    149 } 
    150  
    151 static void  
    152 online_button_toggled (GtkToggleButton *togglebutton, gpointer user_data) 
    153 { 
    154         TnySummaryWindowIface *self = user_data; 
    155         TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    156  
    157         if (priv->account_store) 
    158         { 
    159                 const TnyDeviceIface *device = tny_account_store_iface_get_device (priv->account_store); 
    160  
    161                 if (gtk_toggle_button_get_active (togglebutton)) 
    162                         tny_device_iface_force_online (device); 
    163                 else 
    164                         tny_device_iface_force_offline (device); 
    165         } 
    166 } 
    167  
    168 static void 
    169 connection_changed (TnyDeviceIface *device, gboolean online, gpointer user_data) 
    170 { 
    171         TnySummaryWindowIface *self = user_data; 
    172         TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    173  
    174         if (online) 
    175         { 
    176                 gtk_button_set_label  (GTK_BUTTON (priv->online_button), GO_OFFLINE_TXT); 
    177                 g_signal_handler_block (G_OBJECT (priv->online_button), priv->online_button_signal); 
    178                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->online_button), TRUE); 
    179                 g_signal_handler_unblock (G_OBJECT (priv->online_button), priv->online_button_signal); 
    180  
    181                 gtk_window_set_title (GTK_WINDOW (self), _("Tinymail - online")); 
    182         } else { 
    183  
    184                 gtk_button_set_label  (GTK_BUTTON (priv->online_button), GO_ONLINE_TXT); 
    185                 g_signal_handler_block (G_OBJECT (priv->online_button), priv->online_button_signal); 
    186                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->online_button), FALSE); 
    187                 g_signal_handler_unblock (G_OBJECT (priv->online_button), priv->online_button_signal); 
    188  
    189                 gtk_window_set_title (GTK_WINDOW (self), _("Tinymail - offline")); 
    190         } 
    191  
    192         return; 
    193 } 
    194  
    195 static void 
    196 tny_summary_window_set_account_store (TnyAccountStoreViewIface *self, TnyAccountStoreIface *account_store) 
    197 { 
    198         TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    199         const TnyDeviceIface *device = tny_account_store_iface_get_device (account_store); 
    200  
    201         if (G_UNLIKELY (priv->account_store)) 
    202         { /* You typically set it once, so unlikely */ 
    203  
    204                 const TnyDeviceIface *odevice = tny_account_store_iface_get_device (priv->account_store); 
    205  
    206                 if (g_signal_handler_is_connected (G_OBJECT (odevice), priv->connchanged_signal)) 
    207                 { 
    208                         g_signal_handler_disconnect (G_OBJECT (odevice),  
    209                                 priv->connchanged_signal); 
    210                 } 
    211  
    212                 g_signal_handler_disconnect (G_OBJECT (priv->account_store), 
    213                         priv->accounts_reloaded_signal); 
    214  
    215                 g_object_unref (G_OBJECT (priv->account_store)); 
    216         } 
    217  
    218  
    219         if (G_LIKELY (device)) 
    220         { 
    221                 priv->connchanged_signal =  g_signal_connect ( 
    222                                 G_OBJECT (device), "connection_changed", 
    223                                 G_CALLBACK (connection_changed), self);  
    224         } 
    225  
    226         priv->account_store = account_store; 
    227  
    228         priv->accounts_reloaded_signal = g_signal_connect ( 
    229                 G_OBJECT (account_store), "accounts_reloaded", 
    230                 G_CALLBACK (accounts_reloaded), priv); 
    231  
    232         reload_accounts (priv); 
    233  
    234         return; 
    235 } 
    236  
    237 static void 
    238 on_header_view_key_press_event (GtkTreeView *header_view, GdkEventKey *event, gpointer user_data) 
    239 { 
    240         /* If the user presses the [Del] button on his keyboard */ 
    241  
    242         if (event->keyval == GDK_Delete) 
    243         { 
    244                 TnySummaryWindow *self  = user_data; 
    245                 TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    246                 GtkTreeSelection *selection = gtk_tree_view_get_selection (header_view); 
    247                 GtkTreeModel *model, *mymodel, *sortable; 
    248                 GtkTreeIter iter; 
    249  
    250                 if (G_LIKELY (gtk_tree_selection_get_selected (selection, &model, &iter))) 
    251                 { 
    252                         TnyMsgHeaderIface *header; 
    253  
    254                         gtk_tree_model_get (model, &iter,  
    255                                 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,  
    256                                 &header, -1); 
    257  
    258                         if (G_LIKELY (header)) 
    259                         { 
    260                                 GtkWidget *dialog = gtk_message_dialog_new (NULL,  
    261                                         GTK_DIALOG_MODAL, 
    262                                         GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO,  
    263                                         _("This will remove the message with subject \"%s\""), 
    264                                         tny_msg_header_iface_get_subject (header)); 
    265  
    266                                 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES) 
    267                                 { 
    268                                         TnyMsgFolderIface *folder; 
    269                                         const TnyMsgIface *msg; 
    270  
    271                                         if (GTK_IS_TREE_MODEL_SORT (model)) 
    272                                         { 
    273                                                 mymodel = gtk_tree_model_sort_get_model  
    274                                                         (GTK_TREE_MODEL_SORT (model)); 
    275                                         } else mymodel = model; 
    276  
    277                                         folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header); 
    278                                         tny_msg_folder_iface_remove_message (folder, header); 
    279  
    280                                         tny_list_iface_remove (TNY_LIST_IFACE (mymodel), header); 
    281  
    282                                         /* This demo-ui does not support hiding marked-as-deleted  
    283                                            messages. A normal deletion will only *mark* a message 
    284                                            as deleted. That way undeletion is still possible. 
    285  
    286                                            You shouldn't *use* this demo-ui, so I'm doing destructive 
    287                                            irreversible deletes: I immediately expunge the folder! */ 
    288  
    289                                         tny_msg_folder_iface_expunge (folder); 
    290                                 } 
    291  
    292                                 gtk_widget_destroy (dialog); 
    293                         } 
    294                 } 
    295                  
    296         } 
    297  
    298         return; 
    299 } 
    300  
    301 static void 
    302 on_header_view_tree_selection_changed (GtkTreeSelection *selection,  
    303                 gpointer user_data) 
    304 { 
    305         TnySummaryWindow *self  = user_data; 
    306         TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    307         GtkTreeIter iter; 
    308         GtkTreeModel *model; 
    309  
    310         if (G_LIKELY (gtk_tree_selection_get_selected (selection, &model, &iter))) 
    311         { 
    312                 TnyMsgHeaderIface *header; 
    313  
    314                 gtk_tree_model_get (model, &iter,  
    315                         TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,  
    316                         &header, -1); 
    317  
    318                 if (G_LIKELY (header)) 
    319                 { 
    320  
    321                         const TnyMsgFolderIface *folder; 
    322                         const TnyMsgIface *msg; 
    323  
    324                         folder = tny_msg_header_iface_get_folder (header); 
    325                         if (G_LIKELY (folder)) 
    326                         { 
    327                                 msg = tny_msg_folder_iface_get_message ((TnyMsgFolderIface*)folder, header); 
    328                                 if (G_LIKELY (msg)) 
    329                                         tny_msg_view_iface_set_msg (priv->msg_view, TNY_MSG_IFACE (msg)); 
    330                                 else  
    331                                         tny_msg_view_iface_set_unavailable (priv->msg_view, header); 
    332  
    333                         } 
    334                 } else { 
    335                         tny_msg_view_iface_set_unavailable (priv->msg_view, NULL); 
    336                 } 
    337         } 
    338  
    339         return; 
    340 } 
    341  
    342 static gboolean 
    343 cleanup_statusbar (gpointer data) 
    344 { 
    345         TnySummaryWindowPriv *priv = data; 
    346  
    347         gtk_widget_hide (GTK_WIDGET (priv->progress)); 
    348         gtk_statusbar_pop (GTK_STATUSBAR (priv->status), priv->status_id); 
    349  
    350         return FALSE; 
    351 } 
    352  
    353 static void 
    354 refresh_current_folder (TnyMsgFolderIface *folder, gboolean cancelled, gpointer user_data) 
    355 { 
    356         TnySummaryWindowPriv *priv = user_data; 
    357  
    358         if (!cancelled) 
    359         { 
    360                 GtkTreeView *header_view = GTK_TREE_VIEW (priv->header_view); 
    361                 GtkTreeModel *sortable, *oldsortable; 
    362                 GtkTreeModel *select_model; 
    363                 TnyMsgHeaderListModel *model = tny_msg_header_list_model_new (); 
    364                 gboolean refresh = FALSE; 
    365  
    366 #ifndef ASYNC_HEADERS 
    367                 refresh = TRUE; 
    368 #endif 
    369  
    370                 tny_msg_header_list_model_set_folder (model, folder, refresh); 
    371                 sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model)); 
    372  
    373                 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sortable), 
    374                         TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN, 
    375                         tny_msg_header_list_model_received_date_sort_func,  
    376                         NULL, NULL); 
    377  
    378                 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sortable), 
    379                         TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_COLUMN, 
    380                         tny_msg_header_list_model_sent_date_sort_func,  
    381                         NULL, NULL); 
    382  
    383                 set_header_view_model (header_view, sortable);           
    384  
    385                 g_idle_add (cleanup_statusbar, priv); 
    386  
    387                 gtk_tree_selection_get_selected (priv->mailbox_select, &select_model,  
    388                         &priv->last_mailbox_correct_select); 
    389  
    390                 gtk_widget_set_sensitive (GTK_WIDGET (priv->header_view), TRUE); 
    391  
    392         } else { 
    393                 /* Restore selection */ 
    394  
    395                 g_signal_handler_block (G_OBJECT (priv->mailbox_select),  
    396                         priv->mailbox_select_sid); 
    397                 gtk_tree_selection_select_iter (priv->mailbox_select,  
    398                         &priv->last_mailbox_correct_select); 
    399                 g_signal_handler_unblock (G_OBJECT (priv->mailbox_select),  
    400                         priv->mailbox_select_sid); 
    401         } 
    402  
    403         return; 
    404 } 
    405  
    406  
    407 static void 
    408 refresh_current_folder_status_update (TnyMsgFolderIface *folder, const gchar *what, gint status, gpointer user_data) 
    409 { 
    410         TnySummaryWindowPriv *priv = user_data; 
    411  
    412         gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->progress)); 
    413         gtk_statusbar_pop (GTK_STATUSBAR (priv->status), priv->status_id); 
    414         gtk_statusbar_push (GTK_STATUSBAR (priv->status), priv->status_id, what); 
    415  
    416         return; 
    417 } 
    418  
    419 static void 
    420 on_mailbox_view_tree_selection_changed (GtkTreeSelection *selection,  
    421                 gpointer user_data) 
    422 { 
    423         TnySummaryWindowPriv *priv = user_data; 
    424         GtkTreeView *header_view = priv->header_view; 
    425         GtkTreeIter iter; 
    426         GtkTreeModel *model; 
    427  
    428         if (G_LIKELY (gtk_tree_selection_get_selected (selection, &model, &iter))) 
    429         { 
    430                 TnyMsgFolderIface *folder; 
    431                 gint type; 
    432  
    433                 gtk_tree_model_get (model, &iter,  
    434                         TNY_ACCOUNT_TREE_MODEL_TYPE_COLUMN,  
    435                         &type, -1); 
    436  
    437                 if (type == -1)  
    438                 {  
    439                         /* If an "account name"-row was clicked */ 
    440                         g_signal_handler_block (G_OBJECT (priv->mailbox_select), priv->mailbox_select_sid); 
    441                         gtk_tree_selection_select_iter (priv->mailbox_select, &priv->last_mailbox_correct_select); 
    442                         g_signal_handler_unblock (G_OBJECT (priv->mailbox_select), priv->mailbox_select_sid); 
    443                         return;  
    444                 } 
    445  
    446                 gtk_tree_model_get (model, &iter,  
    447                         TNY_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN,  
    448                         &folder, -1); 
    449  
    450                 gtk_widget_show (GTK_WIDGET (priv->progress)); 
    451                 gtk_widget_set_sensitive (GTK_WIDGET (priv->header_view), FALSE); 
    452                  
    453 #ifdef ASYNC_HEADERS 
    454  
    455                 tny_msg_folder_iface_refresh_async (folder,  
    456                         refresh_current_folder,  
    457                         refresh_current_folder_status_update, user_data); 
    458 #else 
    459                 refresh_current_folder (folder, FALSE, user_data); 
    460 #endif 
    461         } 
    462  
    463         return; 
    464 } 
    465  
    466  
    467 static void 
    468 on_header_view_tree_row_activated (GtkTreeView *treeview, GtkTreePath *path, 
    469                         GtkTreeViewColumn *col,  gpointer userdata) 
    470 { 
    471         GtkTreeModel *model; 
    472         GtkTreeIter iter; 
    473                  
    474         model = gtk_tree_view_get_model(treeview); 
    475          
    476         if (G_LIKELY (gtk_tree_model_get_iter(model, &iter, path))) 
    477         { 
    478                 TnyMsgHeaderIface *header; 
    479                 TnyMsgWindowIface *msgwin; 
    480  
    481                 gtk_tree_model_get (model, &iter,  
    482                         TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,  
    483                         &header, -1); 
    484                  
    485                 if (G_LIKELY (header)) 
    486                 { 
    487                         const TnyMsgFolderIface *folder; 
    488                         const TnyMsgIface *msg; 
    489                         TnyPlatformFactoryIface *platfact; 
    490  
    491                         platfact = TNY_PLATFORM_FACTORY_IFACE  
    492                                 (tny_platform_factory_get_instance ()); 
    493  
    494                         folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE (header)); 
    495  
    496                         if (G_LIKELY (folder)) 
    497                         { 
    498                                 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE (folder), header); 
    499                                 if (G_LIKELY (msg)) 
    500                                 { 
    501                                         msgwin = TNY_MSG_WINDOW_IFACE (tny_msg_window_new ( 
    502                                                 tny_platform_factory_iface_new_msg_view (platfact))); 
    503  
    504                                         tny_msg_view_iface_set_msg (TNY_MSG_VIEW_IFACE (msgwin),  
    505                                                 TNY_MSG_IFACE (msg)); 
    506                          
    507                                         gtk_widget_show (GTK_WIDGET (msgwin)); 
    508                                 } else { 
    509                                         msgwin = TNY_MSG_WINDOW_IFACE (tny_msg_window_new ( 
    510                                                 tny_platform_factory_iface_new_msg_view (platfact))); 
    511  
    512                                         tny_msg_view_iface_set_unavailable (TNY_MSG_VIEW_IFACE (msgwin), header); 
    513                          
    514                                         gtk_widget_show (GTK_WIDGET (msgwin)); 
    515                                 } 
    516                         } 
    517  
    518                 } 
    519         } 
    520 } 
    521  
    522 /** 
    523  * tny_summary_window_new: 
    524  *  
    525  * 
    526  * Return value: A new #TnySummaryWindowIface instance implemented for Gtk+ 
    527  **/ 
    528 TnySummaryWindow* 
    529 tny_summary_window_new (void) 
    530 { 
    531         TnySummaryWindow *self = g_object_new (TNY_TYPE_SUMMARY_WINDOW, NULL); 
    532  
    533         return self; 
    534 } 
    535  
    536 static void 
    537 tny_summary_window_instance_init (GTypeInstance *instance, gpointer g_class) 
    538 { 
    539         TnySummaryWindow *self = (TnySummaryWindow *)instance; 
    540         TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self); 
    541         TnyPlatformFactoryIface *platfact; 
    542  
    543         GtkWindow *window = GTK_WINDOW (self); 
    544         GtkWidget *mailbox_sw; 
    545         GtkWidget *header_sw; 
    546         GtkCellRenderer *renderer; 
    547         GtkTreeViewColumn *column; 
    548         GtkTreeModel *mailbox_model; 
    549         GtkTreeSelection *select; 
    550         gint t = 0, i = 0; 
    551         GtkWidget *hpaned1; 
    552         GtkWidget *vpaned1; 
    553         GtkWidget *vbox; 
    554          
    555         /* TODO: Persist application UI status (of the panes) */ 
    556  
    557         priv->online_button = gtk_toggle_button_new (); 
    558         priv->current_accounts = NULL; 
    559  
    560         priv->online_button_signal = g_signal_connect (G_OBJECT (priv->online_button), "toggled",  
    561                 G_CALLBACK (online_button_toggled), self); 
    562  
    563         platfact = TNY_PLATFORM_FACTORY_IFACE  
    564                         (tny_platform_factory_get_instance ()); 
    565  
    566         hpaned1 = gtk_hpaned_new (); 
    567         gtk_widget_show (hpaned1); 
    568         vbox = gtk_vbox_new (FALSE, 2); 
    569         priv->status = GTK_WIDGET (gtk_statusbar_new ()); 
    570         priv->progress = gtk_progress_bar_new (); 
    571         priv->status_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (priv->status), "default"); 
    572  
    573         gtk_box_pack_start (GTK_BOX (priv->status), priv->progress, FALSE, FALSE, 0); 
    574         gtk_box_pack_start (GTK_BOX (priv->status), priv->online_button, FALSE, FALSE, 0); 
    575  
    576         gtk_widget_show (priv->online_button); 
    577         gtk_widget_show (priv->status); 
    578         gtk_widget_show (vbox); 
    579  
    580         gtk_container_add (GTK_CONTAINER (window), vbox); 
    581         gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (hpaned1), TRUE, TRUE, 0); 
    582         gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->status), FALSE, TRUE, 0); 
    583  
    584         vpaned1 = gtk_vpaned_new (); 
    585         gtk_widget_show (vpaned1); 
    586          
    587         priv->msg_view = tny_platform_factory_iface_new_msg_view (platfact); 
    588  
    589         gtk_widget_show (GTK_WIDGET (priv->msg_view));   
    590         gtk_paned_pack2 (GTK_PANED (vpaned1), GTK_WIDGET (priv->msg_view), TRUE, TRUE); 
    591  
    592         gtk_window_set_title (window, _("Tinymail - offline")); 
    593         gtk_container_set_border_width (GTK_CONTAINER (window), 0); 
    594  
    595         mailbox_sw = gtk_scrolled_window_new (NULL, NULL); 
    596         gtk_paned_pack1 (GTK_PANED (hpaned1), mailbox_sw, TRUE, TRUE); 
    597         gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE); 
    598         gtk_widget_show (GTK_WIDGET (mailbox_sw)); 
    599  
    600         header_sw = gtk_scrolled_window_new (NULL, NULL); 
    601         gtk_paned_pack1 (GTK_PANED (vpaned1), header_sw, TRUE, TRUE); 
    602         gtk_widget_show (GTK_WIDGET (header_sw)); 
    603  
    604         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (header_sw),  
    605                         GTK_SHADOW_ETCHED_IN); 
    606  
    607         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (header_sw), 
    608                         GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); 
    609  
    610         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (mailbox_sw), 
    611                 GTK_SHADOW_ETCHED_IN); 
    612  
    613         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mailbox_sw), 
    614                                         GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); 
    615          
    616         priv->header_view = GTK_TREE_VIEW (gtk_tree_view_new ()); 
    617         gtk_widget_show (GTK_WIDGET (priv->header_view)); 
    618  
    619         gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->header_view), TRUE); 
    620         gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW(priv->header_view), TRUE); 
    621  
    622         priv->mailbox_view = GTK_TREE_VIEW (gtk_tree_view_new ()); 
    623         gtk_widget_show (GTK_WIDGET (priv->mailbox_view)); 
    624  
    625         gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->mailbox_view), TRUE); 
    626          
    627         gtk_container_add (GTK_CONTAINER (header_sw), GTK_WIDGET (priv->header_view)); 
    628         gtk_container_add (GTK_CONTAINER (mailbox_sw), GTK_WIDGET (priv->mailbox_view)); 
    629  
    630  
    631         /* TODO: Persist application UI status */ 
    632         /* mailbox_view columns */ 
    633         renderer = gtk_cell_renderer_text_new (); 
    634         column = gtk_tree_view_column_new_with