Changeset 1649
- Timestamp:
- 02/16/07 19:14:06
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-folder.c (modified) (8 diffs)
- trunk/libtinymail/tny-folder-change.c (modified) (5 diffs)
- trunk/libtinymail/tny-folder-change.h (modified) (2 diffs)
- trunk/libtinymail/tny-folder-store-change.c (modified) (8 diffs)
- trunk/libtinymail/tny-folder-store-change.h (modified) (2 diffs)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c (modified) (11 diffs)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h (modified) (1 diff)
- trunk/tests/c-demo/tny-demoui-summary-view.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r1644 r1649 4 4 * TnyFolderStoreObserver notifications 5 5 * 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) 6 10 7 11 2007-02-16 Sergio Villar Senin <svillar@igalia.com> trunk/libtinymail-camel/tny-camel-folder.c
r1646 r1649 77 77 TnyIterator *iter; 78 78 79 if (!priv->sobservers) 80 return; 81 79 82 iter = tny_list_create_iterator (priv->sobservers); 80 83 while (!tny_iterator_is_done (iter)) … … 93 96 TnyCamelFolderPriv *priv = TNY_CAMEL_FOLDER_GET_PRIVATE (self); 94 97 TnyIterator *iter; 98 99 if (!priv->observers) 100 return; 95 101 96 102 iter = tny_list_create_iterator (priv->observers); … … 607 613 _tny_camel_folder_set_all_count (TnyCamelFolder *self, guint len) 608 614 { 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; 619 617 620 618 return; … … 1976 1974 } else if (priv->cached_name) 1977 1975 { 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 1978 1983 g_free (priv->cached_name); 1979 1984 priv->cached_name = g_strdup (name); … … 2623 2628 g_assert (TNY_IS_FOLDER_OBSERVER (observer)); 2624 2629 2630 /* TNY TODO: locking */ 2631 2632 if (!priv->observers) 2633 priv->observers = tny_simple_list_new (); 2634 2625 2635 tny_list_prepend (priv->observers, G_OBJECT (observer)); 2626 2636 … … 2665 2675 2666 2676 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 (); 2667 2682 2668 2683 tny_list_prepend (priv->sobservers, G_OBJECT (observer)); … … 2720 2735 priv->dont_fkill = FALSE; 2721 2736 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)); 2723 2741 2724 2742 if (priv->account && TNY_IS_CAMEL_STORE_ACCOUNT (priv->account)) … … 2886 2904 priv->unread_sync = 0; 2887 2905 priv->dont_fkill = FALSE; 2888 priv->observers = tny_simple_list_new (); 2906 priv->observers = NULL; 2907 priv->sobservers = NULL; 2889 2908 priv->iter = NULL; 2890 2909 priv->iter_parented = FALSE; trunk/libtinymail/tny-folder-change.c
r1636 r1649 34 34 GMutex *lock; 35 35 TnyFolder *folder; 36 gchar *oldname, *newname; 36 37 TnyFolderChangeChanged changed; 37 38 }; … … 278 279 } 279 280 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 **/ 293 const gchar * 294 tny_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 **/ 322 void 323 tny_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 280 335 281 336 /** … … 294 349 295 350 priv->folder = TNY_FOLDER (g_object_ref (G_OBJECT (folder))); 351 priv->oldname = g_strdup (tny_folder_get_name (folder)); 296 352 297 353 return self; … … 338 394 priv->removed = NULL; 339 395 priv->folder = NULL; 396 priv->oldname = NULL; 397 priv->newname = NULL; 340 398 341 399 g_mutex_unlock (priv->lock); … … 358 416 priv->added = NULL; 359 417 priv->removed = NULL; 418 419 if (priv->oldname) 420 g_free (priv->oldname); 421 if (priv->newname) 422 g_free (priv->newname); 360 423 361 424 if (priv->folder) trunk/libtinymail/tny-folder-change.h
r1642 r1649 46 46 TNY_FOLDER_CHANGE_CHANGED_UNREAD_COUNT, 47 47 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 49 50 }; 50 51 … … 62 63 TnyFolderChange* tny_folder_change_new (TnyFolder *folder); 63 64 65 const gchar *tny_folder_change_get_rename (TnyFolderChange *self, const gchar **oldname); 66 void tny_folder_change_set_rename (TnyFolderChange *self, const gchar *newname); 64 67 void tny_folder_change_set_new_all_count (TnyFolderChange *self, guint new_all_count); 65 68 void tny_folder_change_set_new_unread_count (TnyFolderChange *self, guint new_unread_count); trunk/libtinymail/tny-folder-store-change.c
r1636 r1649 29 29 struct _TnyFolderStoreChangePriv 30 30 { 31 TnyList *created, *removed , *renamed;31 TnyList *created, *removed; 32 32 GMutex *lock; 33 33 TnyFolderStore *folderstore; … … 80 80 81 81 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: 108 85 * @self: a #TnyFolderStoreChange instance 109 86 * @folder: the folder to add to the changeset … … 170 147 171 148 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 **/ 157 void 158 tny_folder_store_change_get_removed_folders (TnyFolderStoreChange *self, TnyList *folders) 181 159 { 182 160 TnyFolderStoreChangePriv *priv = TNY_FOLDER_STORE_CHANGE_GET_PRIVATE (self); … … 187 165 g_mutex_lock (priv->lock); 188 166 189 if (!priv-> created)167 if (!priv->removed) 190 168 { 191 169 g_mutex_unlock (priv->lock); … … 193 171 } 194 172 195 iter = tny_list_create_iterator (priv->re named);173 iter = tny_list_create_iterator (priv->removed); 196 174 197 175 while (!tny_iterator_is_done (iter)) … … 210 188 } 211 189 212 213 /**214 * tny_folder_store_change_get_removed_folders:215 * @self: a #TnyFolderStoreChange instance216 * @folders: the #TnyList where the removed folders will be put it217 *218 * Get the removed folders in this changeset219 **/220 void221 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 253 190 /** 254 191 * tny_folder_store_change_reset: … … 265 202 266 203 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 instance284 *285 * Creates a changeset for @folderstore286 *287 * Return value: a new #TnyFolderStoreChange instance288 **/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 instance303 *304 * Get the folderstore of @self. The return value of this method must be unreferenced305 * after use306 *307 * Return value: the #TnyFolderStore instance related to this changeset308 **/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 void325 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 void346 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));355 204 if (priv->created) 356 205 g_object_unref (G_OBJECT (priv->created)); … … 359 208 priv->created = NULL; 360 209 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 **/ 223 TnyFolderStoreChange* 224 tny_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 **/ 243 TnyFolderStore* 244 tny_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 258 static void 259 tny_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 278 static void 279 tny_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; 362 292 363 293 if (priv->folderstore) trunk/libtinymail/tny-folder-store-change.h
r1636 r1649 44 44 { 45 45 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 48 47 }; 49 48 … … 62 61 63 62 void tny_folder_store_change_add_created_folder (TnyFolderStoreChange *self, TnyFolder *folder); 64 void tny_folder_store_change_add_renamed_folder (TnyFolderStoreChange *self, TnyFolder *folder);65 63 void tny_folder_store_change_add_removed_folder (TnyFolderStoreChange *self, TnyFolder *folder); 66 64 67 65 void tny_folder_store_change_get_created_folders (TnyFolderStoreChange *self, TnyList *folders); 68 void tny_folder_store_change_get_renamed_folders (TnyFolderStoreChange *self, TnyList *folders);69 66 void tny_folder_store_change_get_removed_folders (TnyFolderStoreChange *self, TnyList *folders); 70 67 trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c
r1418 r1649 30 30 #include <tny-simple-list.h> 31 31 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 32 37 #include <tny-gtk-folder-store-tree-model.h> 33 38 … … 50 55 AsyncHelpr *hlrp = user_data; 51 56 TnyIterator *iter = tny_list_create_iterator (folders); 57 TnyGtkFolderStoreTreeModel *me = (TnyGtkFolderStoreTreeModel*) self; 52 58 53 59 while (!tny_iterator_is_done (iter)) … … 56 62 TnyFolderStore *folder = (TnyFolderStore*) tny_iterator_get_current (iter); 57 63 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); 58 69 59 70 gtk_tree_store_append (model, tree_iter, hlrp->parent_tree_iter); … … 102 113 TnyIterator *iter; 103 114 TnyList *folders = tny_simple_list_new (); 115 TnyGtkFolderStoreTreeModel *me = (TnyGtkFolderStoreTreeModel*) self; 104 116 105 117 /* TODO add error checking and reporting here */ … … 115 127 gtk_tree_store_append (model, &tree_iter, parent_tree_iter); 116 128 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, 118 135 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 119 136 tny_folder_get_name (TNY_FOLDER (folder)), … … 129 146 g_object_unref (G_OBJECT (folder)); 130 147 131 tny_iterator_next (iter); 148 tny_iterator_next (iter); 132 149 } 133 150 … … 225 242 } 226 243 244 static void 245 unregister_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 251 static void 252 unregister_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 227 258 static void 228 259 tny_gtk_folder_store_tree_model_finalize (GObject *object) … … 237 268 } 238 269 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 } 239 282 240 283 g_mutex_free (me->iterator_lock); … … 268 311 269 312 me->iterator_lock = g_mutex_new (); 313 me->folder_observables = NULL; 314 me->store_observables = NULL; 270 315 271 316 gtk_tree_store_set_column_types (store, … … 479 524 } 480 525 526 static void 527 tny_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 541 static void 542 tny_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 557 static void 558 tny_folder_store_observer_init (TnyFolderStoreObserverIface *klass) 559 { 560 klass->update_func = tny_gtk_folder_store_tree_model_store_obsr_update; 561 } 562 563 static void 564 tny_folder_observer_init (TnyFolderObserverIface *klass) 565 { 566 klass->update_func = tny_gtk_folder_store_tree_model_folder_obsr_update; 567 } 481 568 482 569 static void … … 523 610 }; 524 611 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 525 624 g_type_add_interface_static (type, TNY_TYPE_LIST, 526 625 &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 527 631 } 528 632 trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h
r1283 r1649 61 61 gboolean is_async; 62 62 TnyFolderStoreQuery *query; 63 GList *store_observables, *folder_observables; 63 64 }; 64 65 trunk/tests/c-demo/tny-demoui-summary-view.c
r1627 r1649 507 507 GtkTreeModel *model; 508 508 509 if ( G_LIKELY (gtk_tree_selection_get_selected (selection, &model, &iter)))509 if (gtk_tree_selection_get_selected (selection, &model, &iter)) 510 510 { 511 511 TnyFolder *folder; … … 648 648 } 649 649 } 650 } 651 652 653 static void 654 on_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 728 static void 729 on_delete_folder_activate (GtkMenuItem *mitem, gpointer user_data) 730 { 731 732 } 733 734 static void 735 on_create_folder_activate (GtkMenuItem *mitem, gpointer user_data) 736 { 737 738 } 739 740 static void 741 header_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 767 static gboolean 768 on_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 779 static gboolean 780 header_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 788 static void 789 mailbox_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 834 static gboolean 835 on_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 846 static gboolean 847 mailbox_view_popup_menu_event (GtkWidget *widget, gpointer user_data) 848 { 849 mailbox_view_do_popup_menu (widget, NULL, user_data); 850 return FALSE; 650 851 } 651 852 … … 732 933 priv->msg_view = tny_platform_factory_new_msg_view (platfact); 733 934 734 gtk_widget_show (GTK_WIDGET (priv->msg_view)); 935 gtk_widget_show (GTK_WIDGET (priv->msg_view)); 735 936 736 937 widget = gtk_scrolled_window_new (NULL, NULL); … … 817 1018 column = gtk_tree_view_column_new_with_attributes (_("From"), renderer, 818 1019 "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); 820 1021 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 821 1022 gtk_tree_view_column_set_fixed_width (column, 100); … … 827 1028 column = gtk_tree_view_column_new_with_attributes (_("To"), renderer, 828 1029 "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); 830 1031 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
