Changeset 1649

Show
Ignore:
Timestamp:
02/16/07 19:14:06
Author:
pvanhoof
Message:

observer stuff

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r1644 r1649  
    44        * TnyFolderStoreObserver notifications 
    55        * Implementation for poke() in tnycamelfolder 
     6        * Lot's of fixes to the TnyFolderStoreObserver infrastructure 
     7        * First pieces of letting TnyGtkFolderStoreTreeModel become a 
     8        self-responsible TnyFolderStoreObserver and TnyFolderObserver (letting 
     9        it act on changes) 
    610 
    7112007-02-16  Sergio Villar Senin  <svillar@igalia.com> 
  • trunk/libtinymail-camel/tny-camel-folder.c

    r1646 r1649  
    7777        TnyIterator *iter; 
    7878 
     79        if (!priv->sobservers) 
     80                return; 
     81 
    7982        iter = tny_list_create_iterator (priv->sobservers); 
    8083        while (!tny_iterator_is_done (iter)) 
     
    9396        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    9497        TnyIterator *iter; 
     98 
     99        if (!priv->observers) 
     100                return; 
    95101 
    96102        iter = tny_list_create_iterator (priv->observers); 
     
    607613_tny_camel_folder_set_all_count (TnyCamelFolder *self, guint len) 
    608614{ 
    609  
    610         TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
    611         if (len != priv->cached_length) 
    612         { 
    613                 TnyFolderChange *change = tny_folder_change_new (TNY_FOLDER (self)); 
    614                 priv->cached_length = len; 
    615                 tny_folder_change_set_new_all_count (change, priv->cached_length); 
    616                 notify_folder_observers_about (TNY_FOLDER (self), change); 
    617                 g_object_unref (change); 
    618         } 
     615        TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 
     616        priv->cached_length = len; 
    619617 
    620618        return; 
     
    19761974        } else if (priv->cached_name) 
    19771975        { 
     1976                TnyFolderChange *change; 
     1977 
     1978                change = tny_folder_change_new (self); 
     1979                tny_folder_change_set_rename (change, name); 
     1980                notify_folder_observers_about (self, change); 
     1981                g_object_unref (G_OBJECT (change)); 
     1982 
    19781983                g_free (priv->cached_name); 
    19791984                priv->cached_name = g_strdup (name); 
     
    26232628        g_assert (TNY_IS_FOLDER_OBSERVER (observer)); 
    26242629 
     2630        /* TNY TODO: locking */ 
     2631 
     2632        if (!priv->observers) 
     2633                priv->observers = tny_simple_list_new (); 
     2634 
    26252635        tny_list_prepend (priv->observers, G_OBJECT (observer)); 
    26262636 
     
    26652675 
    26662676        g_assert (TNY_IS_FOLDER_STORE_OBSERVER (observer)); 
     2677 
     2678        /* TNY TODO: locking */ 
     2679 
     2680        if (!priv->sobservers) 
     2681                priv->sobservers = tny_simple_list_new (); 
    26672682 
    26682683        tny_list_prepend (priv->sobservers, G_OBJECT (observer)); 
     
    27202735        priv->dont_fkill = FALSE; 
    27212736 
    2722         g_object_unref (G_OBJECT (priv->observers)); 
     2737        if (priv->observers) 
     2738                g_object_unref (G_OBJECT (priv->observers)); 
     2739        if (priv->sobservers) 
     2740                g_object_unref (G_OBJECT (priv->sobservers)); 
    27232741 
    27242742        if (priv->account && TNY_IS_CAMEL_STORE_ACCOUNT (priv->account)) 
     
    28862904        priv->unread_sync = 0; 
    28872905        priv->dont_fkill = FALSE; 
    2888         priv->observers = tny_simple_list_new (); 
     2906        priv->observers = NULL; 
     2907        priv->sobservers = NULL; 
    28892908        priv->iter = NULL; 
    28902909        priv->iter_parented = FALSE; 
  • trunk/libtinymail/tny-folder-change.c

    r1636 r1649  
    3434        GMutex *lock; 
    3535        TnyFolder *folder; 
     36        gchar *oldname, *newname; 
    3637        TnyFolderChangeChanged changed; 
    3738}; 
     
    278279} 
    279280 
     281/** 
     282 * tny_folder_change_get_rename: 
     283 * @self: a #TnyFolderChange instance 
     284 * @oldname: a pointer to a string 
     285 * 
     286 * Get the new name of the folder in case of a rename. This will return NULL 
     287 * of nu rename happened. You can pass a pointer if you need the old folder 
     288 * name too. 
     289 * 
     290 * You must not free the return value nor the @oldname pointer. It's handled 
     291 * internally in the TnyFolderChange type. 
     292 **/ 
     293const gchar * 
     294tny_folder_change_get_rename (TnyFolderChange *self, const gchar **oldname) 
     295{ 
     296        const gchar *retval = NULL; 
     297        TnyFolderChangePriv *priv = TNY_FOLDER_CHANGE_GET_PRIVATE (self); 
     298 
     299        g_mutex_lock (priv->lock); 
     300 
     301        if (priv->changed & TNY_FOLDER_CHANGE_CHANGED_FOLDER_RENAME) 
     302        { 
     303                retval = priv->newname; 
     304                if (oldname) 
     305                        *oldname = priv->oldname; 
     306        } 
     307 
     308        g_mutex_unlock (priv->lock); 
     309 
     310        return retval; 
     311} 
     312 
     313/** 
     314 * tny_folder_change_set_rename: 
     315 * @self: a #TnyFolderChange instance 
     316 * @newname: the new name of the folder 
     317 * 
     318 * Mark the change in such a way that the user can know that a rename has  
     319 * happened. The TnyFolderChange will copy your @newname internally, so you 
     320 * can do whatever you want with what you passed afterwards. 
     321 **/ 
     322void  
     323tny_folder_change_set_rename (TnyFolderChange *self, const gchar *newname) 
     324{ 
     325        TnyFolderChangePriv *priv = TNY_FOLDER_CHANGE_GET_PRIVATE (self); 
     326 
     327        g_mutex_lock (priv->lock); 
     328        priv->changed |= TNY_FOLDER_CHANGE_CHANGED_FOLDER_RENAME; 
     329        if (priv->newname) 
     330                g_free (priv->newname); 
     331        priv->newname = g_strdup (newname); 
     332        g_mutex_unlock (priv->lock); 
     333} 
     334 
    280335 
    281336/** 
     
    294349 
    295350        priv->folder = TNY_FOLDER (g_object_ref (G_OBJECT (folder))); 
     351        priv->oldname = g_strdup (tny_folder_get_name (folder)); 
    296352 
    297353        return self; 
     
    338394        priv->removed = NULL; 
    339395        priv->folder = NULL; 
     396        priv->oldname = NULL; 
     397        priv->newname = NULL; 
    340398 
    341399        g_mutex_unlock (priv->lock); 
     
    358416        priv->added = NULL; 
    359417        priv->removed = NULL; 
     418 
     419        if (priv->oldname) 
     420                g_free (priv->oldname); 
     421        if (priv->newname) 
     422                g_free (priv->newname); 
    360423 
    361424        if (priv->folder) 
  • trunk/libtinymail/tny-folder-change.h

    r1642 r1649  
    4646        TNY_FOLDER_CHANGE_CHANGED_UNREAD_COUNT, 
    4747        TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS, 
    48         TNY_FOLDER_CHANGE_CHANGED_REMOVED_HEADERS 
     48        TNY_FOLDER_CHANGE_CHANGED_REMOVED_HEADERS, 
     49        TNY_FOLDER_CHANGE_CHANGED_FOLDER_RENAME 
    4950}; 
    5051 
     
    6263TnyFolderChange* tny_folder_change_new (TnyFolder *folder); 
    6364 
     65const gchar *tny_folder_change_get_rename (TnyFolderChange *self, const gchar **oldname); 
     66void tny_folder_change_set_rename (TnyFolderChange *self, const gchar *newname); 
    6467void tny_folder_change_set_new_all_count (TnyFolderChange *self, guint new_all_count); 
    6568void tny_folder_change_set_new_unread_count (TnyFolderChange *self, guint new_unread_count); 
  • trunk/libtinymail/tny-folder-store-change.c

    r1636 r1649  
    2929struct _TnyFolderStoreChangePriv 
    3030{ 
    31         TnyList *created, *removed, *renamed
     31        TnyList *created, *removed
    3232        GMutex *lock; 
    3333        TnyFolderStore *folderstore; 
     
    8080 
    8181 
    82 /** 
    83  * tny_folder_store_change_add_renamed_folder: 
    84  * @self: a #TnyFolderStoreChange instance 
    85  * @folder: the folder to add to the changeset 
    86  * 
    87  * Add @folder to the changeset of renamed folders 
    88  **/ 
    89 void  
    90 tny_folder_store_change_add_renamed_folder (TnyFolderStoreChange *self, TnyFolder *folder) 
    91 
    92         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    93  
    94         g_mutex_lock (priv->lock); 
    95  
    96         if (!priv->renamed) 
    97                 priv->renamed = tny_simple_list_new (); 
    98         tny_list_prepend (priv->renamed, G_OBJECT (folder)); 
    99         priv->changed |= TNY_FOLDER_STORE_CHANGE_CHANGED_RENAMED_FOLDERS; 
    100  
    101         g_mutex_unlock (priv->lock); 
    102  
    103         return; 
    104 
    105  
    106 /** 
    107  * tny_folder_store_change_add_removed_header: 
     82 
     83/** 
     84 * tny_folder_store_change_add_removed_folder: 
    10885 * @self: a #TnyFolderStoreChange instance 
    10986 * @folder: the folder to add to the changeset 
     
    170147 
    171148 
    172 /** 
    173  * tny_folder_store_change_get_renamed_folders: 
    174  * @self: a #TnyFolderStoreChange instance 
    175  * @folders: the #TnyList where the renamed folders will be put it 
    176  * 
    177  * Get the renamed folders in this changeset 
    178  **/ 
    179 void  
    180 tny_folder_store_change_get_renamed_folders (TnyFolderStoreChange *self, TnyList *folders) 
     149 
     150/** 
     151 * tny_folder_store_change_get_removed_folders: 
     152 * @self: a #TnyFolderStoreChange instance 
     153 * @folders: the #TnyList where the removed folders will be put it 
     154 * 
     155 * Get the removed folders in this changeset 
     156 **/ 
     157void  
     158tny_folder_store_change_get_removed_folders (TnyFolderStoreChange *self, TnyList *folders) 
    181159{ 
    182160        TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
     
    187165        g_mutex_lock (priv->lock); 
    188166 
    189         if (!priv->created) 
     167        if (!priv->removed) 
    190168        { 
    191169                g_mutex_unlock (priv->lock); 
     
    193171        } 
    194172 
    195         iter = tny_list_create_iterator (priv->renamed); 
     173        iter = tny_list_create_iterator (priv->removed); 
    196174 
    197175        while (!tny_iterator_is_done (iter)) 
     
    210188} 
    211189 
    212  
    213 /** 
    214  * tny_folder_store_change_get_removed_folders: 
    215  * @self: a #TnyFolderStoreChange instance 
    216  * @folders: the #TnyList where the removed folders will be put it 
    217  * 
    218  * Get the removed folders in this changeset 
    219  **/ 
    220 void  
    221 tny_folder_store_change_get_removed_folders (TnyFolderStoreChange *self, TnyList *folders) 
    222 { 
    223         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    224         TnyIterator *iter; 
    225  
    226         g_assert (TNY_IS_LIST (folders)); 
    227  
    228         g_mutex_lock (priv->lock); 
    229  
    230         if (!priv->removed) 
    231         { 
    232                 g_mutex_unlock (priv->lock); 
    233                 return; 
    234         } 
    235  
    236         iter = tny_list_create_iterator (priv->removed); 
    237  
    238         while (!tny_iterator_is_done (iter)) 
    239         { 
    240                 GObject *folder = tny_iterator_get_current (iter); 
    241                 tny_list_prepend (folders, folder); 
    242                 g_object_unref (folder); 
    243                 tny_iterator_next (iter); 
    244         } 
    245  
    246         g_object_unref (G_OBJECT (iter)); 
    247  
    248         g_mutex_unlock (priv->lock); 
    249  
    250         return; 
    251 } 
    252  
    253190/** 
    254191 * tny_folder_store_change_reset: 
     
    265202 
    266203        priv->changed = 0; 
    267         if (priv->created) 
    268                 g_object_unref (G_OBJECT (priv->created)); 
    269         if (priv->removed) 
    270                 g_object_unref (G_OBJECT (priv->removed)); 
    271         if (priv->renamed) 
    272                 g_object_unref (G_OBJECT (priv->removed)); 
    273         priv->created = NULL; 
    274         priv->removed = NULL; 
    275         priv->renamed = NULL; 
    276  
    277         g_mutex_unlock (priv->lock); 
    278 } 
    279  
    280  
    281 /** 
    282  * tny_folder_store_change_new: 
    283  * @folderstore: a #TnyFolderStore instance 
    284  * 
    285  * Creates a changeset for @folderstore 
    286  * 
    287  * Return value: a new #TnyFolderStoreChange instance 
    288  **/ 
    289 TnyFolderStoreChange* 
    290 tny_folder_store_change_new (TnyFolderStore *folderstore) 
    291 { 
    292         TnyFolderStoreChange *self = g_object_new (TNY_TYPE_FOLDER_STORE_CHANGE, NULL); 
    293         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    294  
    295         priv->folderstore = TNY_FOLDER_STORE (g_object_ref (G_OBJECT (folderstore))); 
    296  
    297         return self; 
    298 } 
    299  
    300 /** 
    301  * tny_folder_store_change_get_folder_store: 
    302  * @self: a #TnyFolderStoreChange instance 
    303  * 
    304  * Get the folderstore of @self. The return value of this method must be unreferenced  
    305  * after use 
    306  * 
    307  * Return value: the #TnyFolderStore instance related to this changeset 
    308  **/ 
    309 TnyFolderStore*  
    310 tny_folder_store_change_get_folder_store (TnyFolderStoreChange *self) 
    311 { 
    312         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    313         TnyFolderStore *retval = NULL; 
    314  
    315         g_mutex_lock (priv->lock); 
    316         if (priv->folderstore) 
    317                 retval = TNY_FOLDER_STORE (g_object_ref (G_OBJECT (priv->folderstore))); 
    318         g_mutex_unlock (priv->lock); 
    319  
    320         return retval; 
    321 } 
    322  
    323  
    324 static void 
    325 tny_folder_store_change_instance_init (GTypeInstance *instance, gpointer g_class) 
    326 { 
    327         TnyFolderStoreChange *self = (TnyFolderStoreChange *)instance; 
    328         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    329  
    330         priv->lock = g_mutex_new (); 
    331  
    332         g_mutex_lock (priv->lock); 
    333  
    334         priv->changed = 0; 
    335         priv->created = NULL; 
    336         priv->removed = NULL; 
    337         priv->renamed = NULL; 
    338         priv->folderstore = NULL; 
    339  
    340         g_mutex_unlock (priv->lock); 
    341  
    342         return; 
    343 } 
    344  
    345 static void 
    346 tny_folder_store_change_finalize (GObject *object) 
    347 { 
    348         TnyFolderStoreChange *self = (TnyFolderStoreChange *)object;     
    349         TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
    350  
    351         g_mutex_lock (priv->lock); 
    352  
    353         if (priv->renamed) 
    354                 g_object_unref (G_OBJECT (priv->renamed)); 
    355204        if (priv->created) 
    356205                g_object_unref (G_OBJECT (priv->created)); 
     
    359208        priv->created = NULL; 
    360209        priv->removed = NULL; 
    361         priv->renamed = NULL; 
     210 
     211        g_mutex_unlock (priv->lock); 
     212
     213 
     214 
     215/** 
     216 * tny_folder_store_change_new: 
     217 * @folderstore: a #TnyFolderStore instance 
     218 * 
     219 * Creates a changeset for @folderstore 
     220 * 
     221 * Return value: a new #TnyFolderStoreChange instance 
     222 **/ 
     223TnyFolderStoreChange* 
     224tny_folder_store_change_new (TnyFolderStore *folderstore) 
     225
     226        TnyFolderStoreChange *self = g_object_new (TNY_TYPE_FOLDER_STORE_CHANGE, NULL); 
     227        TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
     228 
     229        priv->folderstore = TNY_FOLDER_STORE (g_object_ref (G_OBJECT (folderstore))); 
     230 
     231        return self; 
     232
     233 
     234/** 
     235 * tny_folder_store_change_get_folder_store: 
     236 * @self: a #TnyFolderStoreChange instance 
     237 * 
     238 * Get the folderstore of @self. The return value of this method must be unreferenced  
     239 * after use 
     240 * 
     241 * Return value: the #TnyFolderStore instance related to this changeset 
     242 **/ 
     243TnyFolderStore*  
     244tny_folder_store_change_get_folder_store (TnyFolderStoreChange *self) 
     245
     246        TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
     247        TnyFolderStore *retval = NULL; 
     248 
     249        g_mutex_lock (priv->lock); 
     250        if (priv->folderstore) 
     251                retval = TNY_FOLDER_STORE (g_object_ref (G_OBJECT (priv->folderstore))); 
     252        g_mutex_unlock (priv->lock); 
     253 
     254        return retval; 
     255
     256 
     257 
     258static void 
     259tny_folder_store_change_instance_init (GTypeInstance *instance, gpointer g_class) 
     260
     261        TnyFolderStoreChange *self = (TnyFolderStoreChange *)instance; 
     262        TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
     263 
     264        priv->lock = g_mutex_new (); 
     265 
     266        g_mutex_lock (priv->lock); 
     267 
     268        priv->changed = 0; 
     269        priv->created = NULL; 
     270        priv->removed = NULL; 
     271        priv->folderstore = NULL; 
     272 
     273        g_mutex_unlock (priv->lock); 
     274 
     275        return; 
     276
     277 
     278static void 
     279tny_folder_store_change_finalize (GObject *object) 
     280
     281        TnyFolderStoreChange *self = (TnyFolderStoreChange *)object;     
     282        TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); 
     283 
     284        g_mutex_lock (priv->lock); 
     285 
     286        if (priv->created) 
     287                g_object_unref (G_OBJECT (priv->created)); 
     288        if (priv->removed) 
     289                g_object_unref (G_OBJECT (priv->removed)); 
     290        priv->created = NULL; 
     291        priv->removed = NULL; 
    362292 
    363293        if (priv->folderstore) 
  • trunk/libtinymail/tny-folder-store-change.h

    r1636 r1649  
    4444{ 
    4545        TNY_FOLDER_STORE_CHANGE_CHANGED_CREATED_FOLDERS, 
    46         TNY_FOLDER_STORE_CHANGE_CHANGED_REMOVED_FOLDERS, 
    47         TNY_FOLDER_STORE_CHANGE_CHANGED_RENAMED_FOLDERS 
     46        TNY_FOLDER_STORE_CHANGE_CHANGED_REMOVED_FOLDERS 
    4847}; 
    4948 
     
    6261 
    6362void tny_folder_store_change_add_created_folder (TnyFolderStoreChange *self, TnyFolder *folder); 
    64 void tny_folder_store_change_add_renamed_folder (TnyFolderStoreChange *self, TnyFolder *folder); 
    6563void tny_folder_store_change_add_removed_folder (TnyFolderStoreChange *self, TnyFolder *folder); 
    6664 
    6765void tny_folder_store_change_get_created_folders (TnyFolderStoreChange *self, TnyList *folders); 
    68 void tny_folder_store_change_get_renamed_folders (TnyFolderStoreChange *self, TnyList *folders); 
    6966void tny_folder_store_change_get_removed_folders (TnyFolderStoreChange *self, TnyList *folders); 
    7067 
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c

    r1418 r1649  
    3030#include <tny-simple-list.h> 
    3131 
     32#include <tny-folder-store-change.h> 
     33#include <tny-folder-store-observer.h> 
     34#include <tny-folder-change.h> 
     35#include <tny-folder-observer.h> 
     36 
    3237#include <tny-gtk-folder-store-tree-model.h> 
    3338 
     
    5055        AsyncHelpr *hlrp = user_data; 
    5156        TnyIterator *iter = tny_list_create_iterator (folders); 
     57        TnyGtkFolderStoreTreeModel *me = (TnyGtkFolderStoreTreeModel*) self; 
    5258 
    5359        while (!tny_iterator_is_done (iter)) 
     
    5662                TnyFolderStore *folder = (TnyFolderStore*) tny_iterator_get_current (iter); 
    5763                GtkTreeIter *tree_iter = gtk_tree_iter_copy (hlrp->parent_tree_iter); 
     64 
     65                tny_folder_add_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (self)); 
     66                tny_folder_store_add_observer (TNY_FOLDER_STORE (folder), TNY_FOLDER_STORE_OBSERVER (self)); 
     67                me->folder_observables = g_list_prepend (me->folder_observables, folder); 
     68                me->store_observables = g_list_prepend (me->store_observables, folder); 
    5869 
    5970                gtk_tree_store_append (model, tree_iter, hlrp->parent_tree_iter); 
     
    102113        TnyIterator *iter; 
    103114        TnyList *folders = tny_simple_list_new (); 
     115        TnyGtkFolderStoreTreeModel *me = (TnyGtkFolderStoreTreeModel*) self; 
    104116 
    105117        /* TODO add error checking and reporting here */ 
     
    115127                gtk_tree_store_append (model, &tree_iter, parent_tree_iter); 
    116128 
    117                 gtk_tree_store_set (model, &tree_iter, 
     129                tny_folder_add_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (self)); 
     130                tny_folder_store_add_observer (TNY_FOLDER_STORE (folder), TNY_FOLDER_STORE_OBSERVER (self)); 
     131                me->folder_observables = g_list_prepend (me->folder_observables, folder); 
     132                me->store_observables = g_list_prepend (me->store_observables, folder); 
     133 
     134                gtk_tree_store_set (model, &tree_iter, 
    118135                        TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,  
    119136                        tny_folder_get_name (TNY_FOLDER (folder)), 
     
    129146                g_object_unref (G_OBJECT (folder)); 
    130147 
    131                 tny_iterator_next (iter);           
     148                tny_iterator_next (iter); 
    132149        } 
    133150 
     
    225242} 
    226243 
     244static void  
     245unregister_folder_observerable (gpointer item, gpointer user_data) 
     246{ 
     247        TnyFolder *f = (TnyFolder *) item; 
     248        tny_folder_remove_observer (f, TNY_FOLDER_OBSERVER (user_data)); 
     249} 
     250 
     251static void  
     252unregister_store_observerable (gpointer item, gpointer user_data) 
     253{ 
     254        TnyFolderStore *fstore = (TnyFolderStore *) item; 
     255        tny_folder_store_remove_observer (fstore, TNY_FOLDER_STORE_OBSERVER (user_data)); 
     256} 
     257 
    227258static void 
    228259tny_gtk_folder_store_tree_model_finalize (GObject *object) 
     
    237268        } 
    238269        g_mutex_unlock (me->iterator_lock); 
     270 
     271        if (me->folder_observables) 
     272        { 
     273                g_list_foreach (me->folder_observables, unregister_folder_observerable, me); 
     274                g_list_free (me->store_observables); 
     275        } 
     276 
     277        if (me->store_observables) 
     278        { 
     279                g_list_foreach (me->store_observables, unregister_store_observerable, me); 
     280                g_list_free (me->store_observables); 
     281        } 
    239282 
    240283        g_mutex_free (me->iterator_lock); 
     
    268311 
    269312        me->iterator_lock = g_mutex_new (); 
     313        me->folder_observables = NULL; 
     314        me->store_observables = NULL; 
    270315 
    271316        gtk_tree_store_set_column_types (store,  
     
    479524} 
    480525 
     526static void 
     527tny_gtk_folder_store_tree_model_store_obsr_update (TnyFolderStoreObserver *self, TnyFolderStoreChange *change) 
     528{ 
     529        TnyFolderStoreChangeChanged changed = tny_folder_store_change_get_changed (change); 
     530 
     531        if (changed & TNY_FOLDER_STORE_CHANGE_CHANGED_CREATED_FOLDERS) 
     532        { 
     533        } 
     534 
     535        if (changed & TNY_FOLDER_STORE_CHANGE_CHANGED_REMOVED_FOLDERS) 
     536        { 
     537        } 
     538} 
     539 
     540 
     541static void 
     542tny_gtk_folder_store_tree_model_folder_obsr_update (TnyFolderObserver *self, TnyFolderChange *change) 
     543{ 
     544        TnyFolderChangeChanged changed = tny_folder_change_get_changed (change); 
     545 
     546        if (changed & TNY_FOLDER_CHANGE_CHANGED_FOLDER_RENAME) 
     547        { 
     548                const gchar *oldname, *newname; 
     549 
     550                newname = tny_folder_change_get_rename (change, &oldname); 
     551 
     552                printf ("Renamed %s to %s\n", oldname, newname); 
     553        } 
     554 
     555} 
     556 
     557static void 
     558tny_folder_store_observer_init (TnyFolderStoreObserverIface *klass) 
     559{ 
     560        klass->update_func = tny_gtk_folder_store_tree_model_store_obsr_update; 
     561} 
     562 
     563static void 
     564tny_folder_observer_init (TnyFolderObserverIface *klass) 
     565{ 
     566        klass->update_func = tny_gtk_folder_store_tree_model_folder_obsr_update; 
     567} 
    481568 
    482569static void 
     
    523610                }; 
    524611 
     612                static const GInterfaceInfo tny_folder_store_observer_info = { 
     613                        (GInterfaceInitFunc) tny_folder_store_observer_init, 
     614                        NULL, 
     615                        NULL 
     616                }; 
     617 
     618                static const GInterfaceInfo tny_folder_observer_info = { 
     619                        (GInterfaceInitFunc) tny_folder_observer_init, 
     620                        NULL, 
     621                        NULL 
     622                }; 
     623 
    525624                g_type_add_interface_static (type, TNY_TYPE_LIST, 
    526625                                             &tny_list_info); 
     626                g_type_add_interface_static (type, TNY_TYPE_FOLDER_STORE_OBSERVER, 
     627                                             &tny_folder_store_observer_info); 
     628                g_type_add_interface_static (type, TNY_TYPE_FOLDER_OBSERVER, 
     629                                             &tny_folder_observer_info); 
     630 
    527631        } 
    528632 
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h

    r1283 r1649  
    6161        gboolean is_async; 
    6262        TnyFolderStoreQuery *query; 
     63        GList *store_observables, *folder_observables; 
    6364}; 
    6465 
  • trunk/tests/c-demo/tny-demoui-summary-view.c

    r1627 r1649  
    507507        GtkTreeModel *model; 
    508508 
    509         if (G_LIKELY (gtk_tree_selection_get_selected (selection, &model, &iter))) 
     509        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
    510510        { 
    511511                TnyFolder *folder; 
     
    648648                } 
    649649        } 
     650} 
     651 
     652 
     653static void  
     654on_rename_folder_activate (GtkMenuItem *mitem, gpointer user_data) 
     655{ 
     656        TnyDemouiSummaryView *self = user_data; 
     657        TnyDemouiSummaryViewPriv *priv = TNY_DEMOUI_SUMMARY_VIEW_GET_PRIVATE (self); 
     658        GtkTreeIter iter; 
     659        GtkTreeModel *model; 
     660 
     661        if (gtk_tree_selection_get_selected (priv->mailbox_select, &model, &iter)) 
     662        { 
     663                gint type; 
     664 
     665                gtk_tree_model_get (model, &iter,  
     666                        TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN,  
     667                        &type, -1); 
     668 
     669                if (type != TNY_FOLDER_TYPE_ROOT)  
     670                {  
     671                        TnyFolder *folder; 
     672                        GtkWidget *dialog, *entry; 
     673                        gint result; 
     674 
     675                        gtk_tree_model_get (model, &iter,  
     676                                TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,  
     677                                &folder, -1); 
     678 
     679                        dialog = gtk_dialog_new_with_buttons (_("Rename a folder"), 
     680                                                                                                  GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (self))), 
     681                                                                                                  GTK_DIALOG_MODAL, 
     682                                                                                                  GTK_STOCK_OK, 
     683                                                                                                  GTK_RESPONSE_ACCEPT, 
     684                                                                                                  GTK_STOCK_CANCEL, 
     685                                                                                                  GTK_RESPONSE_REJECT, 
     686                                                                                                  NULL); 
     687 
     688                        entry = gtk_entry_new (); 
     689                        gtk_entry_set_text (GTK_ENTRY (entry), tny_folder_get_name (folder)); 
     690                        gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), entry); 
     691                        gtk_widget_show (entry); 
     692 
     693                        result = gtk_dialog_run (GTK_DIALOG (dialog)); 
     694 
     695                        switch (result) 
     696                        { 
     697                                case GTK_RESPONSE_ACCEPT:  
     698                                { 
     699                                        GError *err = NULL; 
     700                                        const gchar *newname = gtk_entry_get_text (GTK_ENTRY (entry)); 
     701                                        tny_folder_set_name (folder, newname, &err); 
     702 
     703                                        if (err != NULL) 
     704                                        { 
     705                                                GtkWidget *edialog = gtk_message_dialog_new ( 
     706                                                                                  GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (self))), 
     707                                                                                  GTK_DIALOG_DESTROY_WITH_PARENT, 
     708                                                                                  GTK_MESSAGE_ERROR, 
     709                                                                                  GTK_BUTTONS_CLOSE, 
     710                                                                                  err->message); 
     711                                                gtk_widget_show_all (edialog); 
     712                                                g_error_free (err); 
     713                                        } 
     714                                } 
     715                                break; 
     716 
     717                                default: 
     718                                break; 
     719                        } 
     720                        gtk_widget_destroy (dialog); 
     721                        g_object_unref (G_OBJECT (folder)); 
     722                } 
     723 
     724        } 
     725 
     726} 
     727 
     728static void  
     729on_delete_folder_activate (GtkMenuItem *mitem, gpointer user_data) 
     730{ 
     731 
     732} 
     733 
     734static void  
     735on_create_folder_activate (GtkMenuItem *mitem, gpointer user_data) 
     736{ 
     737 
     738} 
     739 
     740static void 
     741header_view_do_popup_menu (GtkWidget *my_widget, GdkEventButton *event, gpointer user_data) 
     742{ 
     743        GtkWidget *menu; 
     744        int button, event_time; 
     745 
     746        menu = gtk_menu_new (); 
     747        g_signal_connect (menu, "deactivate", G_CALLBACK (gtk_widget_destroy), NULL); 
     748 
     749        /* ... add menu items ... */ 
     750 
     751        if (event) 
     752        { 
     753                button = event->button; 
     754                event_time = event->time; 
     755        } 
     756        else 
     757        { 
     758                button = 0; 
     759                event_time = gtk_get_current_event_time (); 
     760        } 
     761 
     762        gtk_menu_attach_to_widget (GTK_MENU (menu), my_widget, NULL); 
     763        gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,  
     764                                        button, event_time); 
     765} 
     766 
     767static gboolean  
     768on_header_view_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) 
     769{ 
     770        if (event->button == 3 && event->type == GDK_BUTTON_PRESS) 
     771        { 
     772                header_view_do_popup_menu (widget, event, user_data); 
     773                return TRUE; 
     774        } 
     775 
     776        return FALSE; 
     777} 
     778 
     779static gboolean 
     780header_view_popup_menu_event (GtkWidget *widget, gpointer user_data) 
     781{ 
     782        header_view_do_popup_menu (widget, NULL, user_data); 
     783        return TRUE; 
     784} 
     785 
     786 
     787 
     788static void 
     789mailbox_view_do_popup_menu (GtkWidget *my_widget, GdkEventButton *event, gpointer user_data) 
     790{ 
     791        GtkWidget *menu; 
     792        GtkWidget *mrename, *mdelete, *mcreate; 
     793        int button, event_time; 
     794 
     795        menu = gtk_menu_new (); 
     796        //g_signal_connect (menu, "deactivate", G_CALLBACK (gtk_widget_destroy), NULL); 
     797 
     798        mrename = gtk_menu_item_new_with_label (_("Rename folder")); 
     799        mcreate = gtk_menu_item_new_with_label (_("Create folder")); 
     800        mdelete = gtk_menu_item_new_with_label (_("Delete folder")); 
     801 
     802        g_signal_connect (G_OBJECT (mrename), "activate", 
     803                G_CALLBACK (on_rename_folder_activate), user_data); 
     804        g_signal_connect (G_OBJECT (mcreate), "activate", 
     805                G_CALLBACK (on_rename_folder_activate), user_data); 
     806        g_signal_connect (G_OBJECT (mdelete), "activate", 
     807                G_CALLBACK (on_delete_folder_activate), user_data); 
     808 
     809        gtk_menu_prepend (menu, mrename); 
     810        gtk_menu_prepend (menu, mcreate); 
     811        gtk_menu_prepend (menu, mdelete); 
     812 
     813        gtk_widget_show (mrename); 
     814        gtk_widget_show (mcreate); 
     815        gtk_widget_show (mdelete); 
     816 
     817 
     818        if (event) 
     819        { 
     820                button = event->button; 
     821                event_time = event->time; 
     822        } 
     823        else 
     824        { 
     825                button = 0; 
     826                event_time = gtk_get_current_event_time (); 
     827        } 
     828 
     829        gtk_menu_attach_to_widget (GTK_MENU (menu), my_widget, NULL); 
     830        gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,  
     831                                        button, event_time); 
     832} 
     833 
     834static gboolean  
     835on_mailbox_view_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) 
     836{ 
     837        if (event->button == 3 && event->type == GDK_BUTTON_PRESS) 
     838        { 
     839                mailbox_view_do_popup_menu (widget, event, user_data); 
     840                return TRUE; 
     841        } 
     842 
     843        return FALSE; 
     844} 
     845 
     846static gboolean 
     847mailbox_view_popup_menu_event (GtkWidget *widget, gpointer user_data) 
     848{ 
     849        mailbox_view_do_popup_menu (widget, NULL, user_data); 
     850        return FALSE; 
    650851} 
    651852 
     
    732933        priv->msg_view = tny_platform_factory_new_msg_view (platfact); 
    733934 
    734         gtk_widget_show (GTK_WIDGET (priv->msg_view));  
     935        gtk_widget_show (GTK_WIDGET (priv->msg_view)); 
    735936 
    736937        widget = gtk_scrolled_window_new (NULL, NULL); 
     
    8171018        column = gtk_tree_view_column_new_with_attributes (_("From"), renderer, 
    8181019                "text", TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, NULL); 
    819         gtk_tree_view_column_set_sort_column_id (column, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN);                          
     1020        gtk_tree_view_column_set_sort_column_id (column, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN); 
    8201021        gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 
    8211022        gtk_tree_view_column_set_fixed_width (column, 100); 
     
    8271028                column = gtk_tree_view_column_new_with_attributes (_("To"), renderer, 
    8281029                        "text", TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, NULL); 
    829                 gtk_tree_view_column_set_sort_column_id (column, TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN);                    
     1030                gtk_tree_view_column_set_sort_column_id (column, TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN); 
    8301031                gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);