diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2003-11-15 01:29:06 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2003-11-15 01:29:06 +0800 |
commit | d9a3bd550f45df85d896a695596e57bb57b1177d (patch) | |
tree | 74f20936011a030a5386738f070c0186ddaa2196 | |
parent | 02031fc95a8670ccda4e51ef003473d494e15d05 (diff) | |
download | gsoc2013-evolution-d9a3bd550f45df85d896a695596e57bb57b1177d.tar.gz gsoc2013-evolution-d9a3bd550f45df85d896a695596e57bb57b1177d.tar.zst gsoc2013-evolution-d9a3bd550f45df85d896a695596e57bb57b1177d.zip |
Only set OK to sensitive if the selected node is not a store node.
2003-11-14 Jeffrey Stedfast <fejj@ximian.com>
* em-folder-selection.c (folder_selected_cb): Only set OK to
sensitive if the selected node is not a store node.
* em-folder-tree-model.c: Moved the store_hash and uri_hash from
EMFolderTreePrivate into here instead.
* em-folder-tree.c: Updated for above changes.
svn path=/trunk/; revision=23355
-rw-r--r-- | mail/ChangeLog | 10 | ||||
-rw-r--r-- | mail/em-folder-selection.c | 5 | ||||
-rw-r--r-- | mail/em-folder-tree-model.c | 81 | ||||
-rw-r--r-- | mail/em-folder-tree-model.h | 22 | ||||
-rw-r--r-- | mail/em-folder-tree.c | 132 |
5 files changed, 146 insertions, 104 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index bff558acd8..d69009a108 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,5 +1,15 @@ 2003-11-14 Jeffrey Stedfast <fejj@ximian.com> + * em-folder-selection.c (folder_selected_cb): Only set OK to + sensitive if the selected node is not a store node. + + * em-folder-tree-model.c: Moved the store_hash and uri_hash from + EMFolderTreePrivate into here instead. + + * em-folder-tree.c: Updated for above changes. + +2003-11-14 Jeffrey Stedfast <fejj@ximian.com> + * em-folder-view.c (emfv_popup_move): Updated. (emfv_popup_copy): Updated. diff --git a/mail/em-folder-selection.c b/mail/em-folder-selection.c index 3be462c88a..fcb1054a5a 100644 --- a/mail/em-folder-selection.c +++ b/mail/em-folder-selection.c @@ -38,7 +38,10 @@ static void folder_selected_cb (EMFolderTree *emft, const char *path, const char *uri, GtkDialog *dialog) { - gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, TRUE); + if (!path || !strcmp (path, "/")) + gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, FALSE); + else + gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, TRUE); } static GtkWidget * diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 786ac94d68..1ef56ae395 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -184,12 +184,60 @@ em_folder_tree_model_class_init (EMFolderTreeModelClass *klass) static void em_folder_tree_model_init (EMFolderTreeModel *model) { - ; + model->store_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + model->uri_hash = g_hash_table_new (g_str_hash, g_str_equal); +} + +static void +path_hash_free (gpointer key, gpointer value, gpointer user_data) +{ + g_free (key); + gtk_tree_row_reference_free (value); +} + +static void +store_info_free (struct _EMFolderTreeModelStoreInfo *si) +{ + camel_object_remove_event (si->store, si->created_id); + camel_object_remove_event (si->store, si->deleted_id); + camel_object_remove_event (si->store, si->renamed_id); + camel_object_remove_event (si->store, si->subscribed_id); + camel_object_remove_event (si->store, si->unsubscribed_id); + + g_free (si->display_name); + camel_object_unref (si->store); + gtk_tree_row_reference_free (si->row); + g_hash_table_foreach (si->path_hash, path_hash_free, NULL); + g_free (si); } static void +store_hash_free (gpointer key, gpointer value, gpointer user_data) +{ + struct _EMFolderTreeModelStoreInfo *si = value; + + store_info_free (si); +} + +static void +uri_hash_free (gpointer key, gpointer value, gpointer user_data) +{ + g_free (key); + gtk_tree_row_reference_free (value); +} + + +static void em_folder_tree_model_finalize (GObject *obj) { + EMFolderTreeModel *model = (EMFolderTreeModel *) obj; + + g_hash_table_foreach (model->store_hash, store_hash_free, NULL); + g_hash_table_destroy (model->store_hash); + + g_hash_table_foreach (model->uri_hash, uri_hash_free, NULL); + g_hash_table_destroy (model->uri_hash); + G_OBJECT_CLASS (parent_class)->finalize (obj); } @@ -282,3 +330,34 @@ em_folder_tree_model_new (int n_columns, GType *types) return model; } + + +void +em_folder_tree_model_remove_uri (EMFolderTreeModel *model, const char *uri) +{ + GtkTreeRowReference *row; + + g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model)); + g_return_if_fail (uri != NULL); + + if ((row = g_hash_table_lookup (model->uri_hash, uri))) { + g_hash_table_remove (model->uri_hash, uri); + gtk_tree_row_reference_free (row); + } +} + + +void +em_folder_tree_model_remove_store_info (EMFolderTreeModel *model, CamelStore *store) +{ + struct _EMFolderTreeModelStoreInfo *si; + + g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model)); + g_return_if_fail (CAMEL_IS_STORE (store)); + + if (!(si = g_hash_table_lookup (model->store_hash, store))) + return; + + g_hash_table_remove (model->store_hash, si->store); + store_info_free (si); +} diff --git a/mail/em-folder-tree-model.h b/mail/em-folder-tree-model.h index c52509ad63..3d928a2ef5 100644 --- a/mail/em-folder-tree-model.h +++ b/mail/em-folder-tree-model.h @@ -27,6 +27,8 @@ #include <gtk/gtktreednd.h> #include <gtk/gtktreestore.h> +#include <camel/camel-store.h> + #ifdef __cplusplus extern "C" { #pragma } @@ -41,10 +43,27 @@ extern "C" { typedef struct _EMFolderTreeModel EMFolderTreeModel; typedef struct _EMFolderTreeModelClass EMFolderTreeModelClass; +typedef struct _EMFolderTreeModelStoreInfo EMFolderTreeModelStoreInfo; + +struct _EMFolderTreeModelStoreInfo { + CamelStore *store; + GtkTreeRowReference *row; + GHashTable *path_hash; /* maps CamelFolderInfo::path's to GtkTreeRowReferences */ + + char *display_name; + + unsigned int created_id; + unsigned int deleted_id; + unsigned int renamed_id; + unsigned int subscribed_id; + unsigned int unsubscribed_id; +}; struct _EMFolderTreeModel { GtkTreeStore parent_object; + GHashTable *store_hash; /* maps CamelStore's to store-info's */ + GHashTable *uri_hash; /* maps URI's to GtkTreeRowReferences */ }; struct _EMFolderTreeModelClass { @@ -74,6 +93,9 @@ GType em_folder_tree_model_get_type (void); EMFolderTreeModel *em_folder_tree_model_new (int n_columns, GType *types); +void em_folder_tree_model_remove_uri (EMFolderTreeModel *model, const char *uri); +void em_folder_tree_model_remove_store_info (EMFolderTreeModel *model, CamelStore *store); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index 8566cbf451..2b6cde1db4 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -85,25 +85,9 @@ static GType col_types[] = { G_TYPE_BOOLEAN, /* has not-yet-loaded subfolders */ }; -struct _emft_store_info { - CamelStore *store; - GtkTreeRowReference *row; - GHashTable *path_hash; /* maps CamelFolderInfo::path's to GtkTreeRowReferences */ - - char *display_name; - - unsigned int created_id; - unsigned int deleted_id; - unsigned int renamed_id; - unsigned int subscribed_id; - unsigned int unsubscribed_id; -}; - struct _EMFolderTreePrivate { GtkTreeView *treeview; - - GHashTable *store_hash; /* maps CamelStore's to store-info's */ - GHashTable *uri_hash; /* maps URI's to GtkTreeRowReferences */ + EMFolderTreeModel *model; char *selected_uri; char *selected_path; @@ -322,63 +306,18 @@ em_folder_tree_init (EMFolderTree *emft) struct _EMFolderTreePrivate *priv; priv = g_new0 (struct _EMFolderTreePrivate, 1); - priv->store_hash = g_hash_table_new (g_direct_hash, g_direct_equal); - priv->uri_hash = g_hash_table_new (g_str_hash, g_str_equal); priv->selected_uri = NULL; priv->selected_path = NULL; priv->treeview = NULL; + priv->model = NULL; emft->priv = priv; } static void -path_hash_free (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - gtk_tree_row_reference_free (value); -} - -static void -store_info_free (struct _emft_store_info *si) -{ - camel_object_remove_event (si->store, si->created_id); - camel_object_remove_event (si->store, si->deleted_id); - camel_object_remove_event (si->store, si->renamed_id); - camel_object_remove_event (si->store, si->subscribed_id); - camel_object_remove_event (si->store, si->unsubscribed_id); - - g_free (si->display_name); - camel_object_unref (si->store); - gtk_tree_row_reference_free (si->row); - g_hash_table_foreach (si->path_hash, path_hash_free, NULL); - g_free (si); -} - -static void -store_hash_free (gpointer key, gpointer value, gpointer user_data) -{ - struct _emft_store_info *si = value; - - store_info_free (si); -} - -static void -uri_hash_free (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - gtk_tree_row_reference_free (value); -} - -static void em_folder_tree_finalize (GObject *obj) { EMFolderTree *emft = (EMFolderTree *) obj; - g_hash_table_foreach (emft->priv->store_hash, store_hash_free, NULL); - g_hash_table_destroy (emft->priv->store_hash); - - g_hash_table_foreach (emft->priv->uri_hash, uri_hash_free, NULL); - g_hash_table_destroy (emft->priv->uri_hash); - g_free (emft->priv->selected_uri); g_free (emft->priv->selected_path); g_free (emft->priv); @@ -463,6 +402,7 @@ em_folder_tree_construct (EMFolderTree *emft, EMFolderTreeModel *model) GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); + priv->model = model; priv->treeview = folder_tree_new (model); gtk_widget_show ((GtkWidget *) priv->treeview); @@ -899,6 +839,7 @@ em_folder_tree_new_with_model (EMFolderTreeModel *model) emft = g_object_new (EM_TYPE_FOLDER_TREE, NULL); em_folder_tree_construct (emft, model); + g_object_ref (model); return (GtkWidget *) emft; } @@ -907,7 +848,7 @@ em_folder_tree_new_with_model (EMFolderTreeModel *model) static void tree_store_set_folder_info (GtkTreeStore *model, GtkTreeIter *iter, struct _EMFolderTreePrivate *priv, - struct _emft_store_info *si, + struct _EMFolderTreeModelStoreInfo *si, CamelFolderInfo *fi) { GtkTreeRowReference *uri_row, *path_row; @@ -923,7 +864,7 @@ tree_store_set_folder_info (GtkTreeStore *model, GtkTreeIter *iter, path_row = gtk_tree_row_reference_copy (uri_row); gtk_tree_path_free (path); - g_hash_table_insert (priv->uri_hash, g_strdup (fi->url), uri_row); + g_hash_table_insert (priv->model->uri_hash, g_strdup (fi->url), uri_row); g_hash_table_insert (si->path_hash, g_strdup (fi->path), path_row); unread = fi->unread_message_count == -1 ? 0 : fi->unread_message_count; @@ -958,7 +899,7 @@ tree_row_expanded (GtkTreeView *treeview, GtkTreeIter *root, GtkTreePath *tree_p { /* FIXME: might be best to call get_folder_info in another thread and add the nodes to the treeview in the callback? */ struct _EMFolderTreePrivate *priv = emft->priv; - struct _emft_store_info *si; + struct _EMFolderTreeModelStoreInfo *si; CamelFolderInfo *fi, *child; CamelStore *store; CamelException ex; @@ -978,7 +919,7 @@ tree_row_expanded (GtkTreeView *treeview, GtkTreeIter *root, GtkTreePath *tree_p if (!load) return; - if (!(si = g_hash_table_lookup (emft->priv->store_hash, store))) { + if (!(si = g_hash_table_lookup (priv->model->store_hash, store))) { g_assert_not_reached (); return; } @@ -1241,7 +1182,7 @@ emft_popup_new_folder_response (EMFolderSelector *emfs, int response, EMFolderTr { /* FIXME: ugh, kludge-a-licious: EMFolderSelector uses EMFolderTree so we can poke emfs->emft internals */ struct _EMFolderTreePrivate *priv = emfs->emft->priv; - struct _emft_store_info *si; + struct _EMFolderTreeModelStoreInfo *si; const char *uri, *parent; CamelException ex; char *path, *name; @@ -1255,7 +1196,7 @@ emft_popup_new_folder_response (EMFolderSelector *emfs, int response, EMFolderTr path = (char *) em_folder_selector_get_selected_path (emfs); d(printf ("Creating folder: %s (%s)\n", path, uri)); - if (!(si = g_hash_table_lookup (priv->store_hash, uri))) + if (!(si = g_hash_table_lookup (priv->model->store_hash, uri))) goto done; /* FIXME: camel_store_create_folder should just take full path names */ @@ -1293,22 +1234,12 @@ emft_popup_new_folder_response (EMFolderSelector *emfs, int response, EMFolderTr } static void -store_hash_add_store (gpointer key, gpointer value, gpointer user_data) -{ - struct _emft_store_info *si = value; - EMFolderTree *emft = user_data; - - em_folder_tree_add_store (emft, si->store, si->display_name); -} - -static void emft_popup_new_folder (GtkWidget *item, EMFolderTree *emft) { EMFolderTree *folder_tree; GtkWidget *dialog; - folder_tree = (EMFolderTree *) em_folder_tree_new (); - g_hash_table_foreach (emft->priv->store_hash, store_hash_add_store, folder_tree); + folder_tree = (EMFolderTree *) em_folder_tree_new_with_model (emft->priv->model); dialog = em_folder_selector_create_new (folder_tree, 0, _("Create folder"), _("Specify where to create the folder:")); em_folder_selector_set_selected ((EMFolderSelector *) dialog, emft->priv->selected_uri); @@ -1775,8 +1706,9 @@ tree_selection_changed (GtkTreeSelection *selection, EMFolderTree *emft) static void folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) { + struct _EMFolderTreePrivate *priv = emft->priv; + struct _EMFolderTreeModelStoreInfo *si; CamelFolderInfo *fi = event_data; - struct _emft_store_info *si; GtkTreeRowReference *row; GtkTreeIter parent, iter; GtkTreeModel *model; @@ -1784,7 +1716,7 @@ folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) gboolean load; char *dirname; - if (!(si = g_hash_table_lookup (emft->priv->store_hash, store))) + if (!(si = g_hash_table_lookup (priv->model->store_hash, store))) return; /* make sure we don't already know about it? */ @@ -1811,7 +1743,7 @@ folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) } path = gtk_tree_row_reference_get_path (row); - model = gtk_tree_view_get_model (emft->priv->treeview); + model = gtk_tree_view_get_model (priv->treeview); if (!(gtk_tree_model_get_iter (model, &parent, path))) { gtk_tree_path_free (path); return; @@ -1827,11 +1759,11 @@ folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) /* append a new node */ gtk_tree_store_append ((GtkTreeStore *) model, &iter, &parent); - tree_store_set_folder_info ((GtkTreeStore *) model, &iter, emft->priv, si, fi); + tree_store_set_folder_info ((GtkTreeStore *) model, &iter, priv, si, fi); } static void -remove_folders (EMFolderTree *emft, GtkTreeModel *model, struct _emft_store_info *si, GtkTreeIter *toplevel) +remove_folders (EMFolderTree *emft, GtkTreeModel *model, struct _EMFolderTreeModelStoreInfo *si, GtkTreeIter *toplevel) { struct _EMFolderTreePrivate *priv = emft->priv; GtkTreeRowReference *row; @@ -1858,30 +1790,26 @@ remove_folders (EMFolderTree *emft, GtkTreeModel *model, struct _emft_store_info gtk_tree_row_reference_free (row); } - if ((row = g_hash_table_lookup (priv->uri_hash, uri))) { - g_hash_table_remove (priv->uri_hash, uri); - gtk_tree_row_reference_free (row); - } + em_folder_tree_model_remove_uri (priv->model, uri); gtk_tree_store_remove ((GtkTreeStore *) model, toplevel); - if (is_store) { - g_hash_table_remove (priv->store_hash, si->store); - store_info_free (si); - } + if (is_store) + em_folder_tree_model_remove_store_info (priv->model, si->store); } static void folder_unsubscribed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) { + struct _EMFolderTreePrivate *priv = emft->priv; + struct _EMFolderTreeModelStoreInfo *si; CamelFolderInfo *fi = event_data; - struct _emft_store_info *si; GtkTreeRowReference *row; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; - if (!(si = g_hash_table_lookup (emft->priv->store_hash, store))) + if (!(si = g_hash_table_lookup (priv->model->store_hash, store))) return; if (!(row = g_hash_table_lookup (si->path_hash, fi->path))) @@ -1923,8 +1851,8 @@ folder_renamed_cb (CamelStore *store, void *event_data, EMFolderTree *emft) void em_folder_tree_add_store (EMFolderTree *emft, CamelStore *store, const char *display_name) { + struct _EMFolderTreeModelStoreInfo *si; struct _EMFolderTreePrivate *priv; - struct _emft_store_info *si; GtkTreeRowReference *row; GtkTreeIter root, iter; GtkTreeStore *model; @@ -1938,7 +1866,7 @@ em_folder_tree_add_store (EMFolderTree *emft, CamelStore *store, const char *dis priv = emft->priv; model = (GtkTreeStore *) gtk_tree_view_get_model (priv->treeview); - if ((si = g_hash_table_lookup (priv->store_hash, store))) { + if ((si = g_hash_table_lookup (priv->model->store_hash, store))) { const char *name; path = gtk_tree_row_reference_get_path (si->row); @@ -1969,13 +1897,13 @@ em_folder_tree_add_store (EMFolderTree *emft, CamelStore *store, const char *dis row = gtk_tree_row_reference_new ((GtkTreeModel *) model, path); gtk_tree_path_free (path); - si = g_new (struct _emft_store_info, 1); + si = g_new (struct _EMFolderTreeModelStoreInfo, 1); si->display_name = g_strdup (display_name); camel_object_ref (store); si->store = store; si->row = row; si->path_hash = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (priv->store_hash, store, si); + g_hash_table_insert (priv->model->store_hash, store, si); /* each store has folders... but we don't load them until the user demands them */ root = iter; @@ -2005,8 +1933,8 @@ em_folder_tree_add_store (EMFolderTree *emft, CamelStore *store, const char *dis void em_folder_tree_remove_store (EMFolderTree *emft, CamelStore *store) { + struct _EMFolderTreeModelStoreInfo *si; struct _EMFolderTreePrivate *priv; - struct _emft_store_info *si; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; @@ -2017,7 +1945,7 @@ em_folder_tree_remove_store (EMFolderTree *emft, CamelStore *store) priv = emft->priv; model = gtk_tree_view_get_model (priv->treeview); - if (!(si = g_hash_table_lookup (priv->store_hash, store))) { + if (!(si = g_hash_table_lookup (priv->model->store_hash, store))) { g_warning ("the store `%s' is not in the folder tree", si->display_name); return; @@ -2064,5 +1992,5 @@ em_folder_tree_get_model (EMFolderTree *emft) { g_return_val_if_fail (EM_IS_FOLDER_TREE (emft), NULL); - return (EMFolderTreeModel *) gtk_tree_view_get_model (emft->priv->treeview); + return emft->priv->model; } |