diff options
-rw-r--r-- | mail/ChangeLog | 30 | ||||
-rw-r--r-- | mail/subscribe-dialog.c | 175 |
2 files changed, 105 insertions, 100 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 3c26efdc5b..9773b8f793 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,30 @@ +2001-08-07 Peter Williams <peterw@ximian.com> + + * subscribe-dialog.c (folder_etree_construct): Move fe_create_root_node + farther down, so we can check for its children without problems. + (storage_tree_path): Removed, this was broken. + (subscribe_get_short_folderinfo): Use the queued thread instead of the + new thread. + (subscribe_do_subscribe_folder): Same. + (ftree_node_new_root): Don't create the path anymore; it was broken + and there's a better way to get it now. + (fe_got_children): Remove some debugging output. + (fe_check_for_children): Here too. + (fe_done_subscribing): Get the path from the URI instead of the ftree_node. + (_SubscribeDialogPrivate): Add all of our useful widgets as members. + (sc_refresh_pressed): Don't clear the search... that makes no sense now. + (sc_search_activated): Don't set the filter radio button as active now; + we use sensitivity instead. + (sc_all_toggled): Make the search entry insensitive. + (sc_filter_toggled): Make the search entry sensitive. + (kill_default_view): New function. Gets rid of the default view stuff and + makes all the widgetry sensitive. + (menu_item_selected): Check if we moved off of the default view and, if so, + call kill_default_view(). + (subscribe_dialog_construct): Initialize our new private widget members, and + by default insensitize most of the buttons because they make no sense in the + default view. + 2001-08-06 Jeffrey Stedfast <fejj@ximian.com> * mail-config.glade: Added key accelerators to a bunch of the @@ -35,9 +62,6 @@ * mail-callbacks.c (manage_subscriptions): Change to reflect API update. - * component-factory.c (mail_load_storages): Don't add the storage - if it has been disabled. - * Makefile.am (etspec_DATA): Add subscribe-dialog.etspec. (glade_DATA): And the glade file. diff --git a/mail/subscribe-dialog.c b/mail/subscribe-dialog.c index 24ef62f502..da2758298e 100644 --- a/mail/subscribe-dialog.c +++ b/mail/subscribe-dialog.c @@ -95,6 +95,7 @@ * + IMAP accounts always show INBOX * - Shell interactions * + Folders are properly created / delete from folder tree when subscribed / unsubscribed + * + Toplevel as well as subfolders * + Mail Folder Cache doesn't complain * - No ETable wackiness * + Verify columns cannot be DnD'd @@ -135,30 +136,6 @@ recursive_add_folder (EvolutionStorage *storage, const char *path, const char *n mail_folder_cache_note_name (url, name); } -static char * -storage_tree_path (CamelFolderInfo *info) -{ - int len; - CamelFolderInfo *i; - char *path, *p; - - for (len = 0, i = info; i; i = i->parent) - len += strlen (i->name) + 1; - - /* We do this backwards because that's the way the pointers point. */ - path = g_malloc (len + 1); - p = path + len; - *p = '\0'; - for (i = info; i; i = i->parent) { - len = strlen (i->name); - p -= len; - memcpy (p, i->name, len); - *--p = '/'; - } - - return path; -} - /* ** Get one level of folderinfo ****************************************** */ typedef void (*SubscribeShortFolderinfoFunc) (CamelStore *store, gchar *prefix, CamelFolderInfo *info, gpointer data); @@ -261,7 +238,7 @@ subscribe_get_short_folderinfo (CamelStore *store, m->user_data = user_data; id = m->msg.seq; - e_thread_put (mail_thread_new, (EMsg *)m); + e_thread_put (mail_thread_queued, (EMsg *)m); return id; } @@ -353,7 +330,7 @@ subscribe_do_subscribe_folder (CamelStore *store, const char *full_name, const c camel_object_ref (CAMEL_OBJECT (store)); id = m->msg.seq; - e_thread_put (mail_thread_new, (EMsg *)m); + e_thread_put (mail_thread_queued, (EMsg *)m); return id; } @@ -466,11 +443,10 @@ typedef struct _ftree_node ftree_node; struct _ftree_node { guint8 flags; - int path_offset; int uri_offset; int full_name_offset; - /* format: {name}{\0}{path}{\0}{uri}{\0}{full_name}{\0} + /* format: {name}{\0}{uri}{\0}{full_name}{\0} * (No braces). */ char data[1]; }; @@ -493,7 +469,6 @@ ftree_node_new_root (const char *prefix) node = g_malloc (size); node->flags = FTREE_NODE_ROOT; - node->path_offset = 0; node->uri_offset = 0; node->full_name_offset = 1; node->data[0] = '\0'; @@ -506,15 +481,11 @@ static ftree_node * ftree_node_new (CamelStore *store, CamelFolderInfo *fi) { ftree_node *node; - int path_offset, uri_offset, full_name_offset; + int uri_offset, full_name_offset; size_t size; - char *path; CamelURL *url; - path = storage_tree_path (fi); - - path_offset = strlen (fi->name) + 1; - uri_offset = path_offset + strlen (path) + 1; + uri_offset = strlen (fi->name) + 1; full_name_offset = uri_offset + strlen (fi->url) + 1; size = full_name_offset + strlen (fi->full_name); @@ -537,18 +508,15 @@ ftree_node_new (CamelStore *store, CamelFolderInfo *fi) /* Copy strings */ - node->path_offset = path_offset; node->uri_offset = uri_offset; node->full_name_offset = full_name_offset; strcpy (node->data, fi->name); - strcpy (node->data + path_offset, path); strcpy (node->data + uri_offset, fi->url); strcpy (node->data + full_name_offset, fi->full_name); /* Done */ - g_free (path); return node; } @@ -556,7 +524,6 @@ ftree_node_new (CamelStore *store, CamelFolderInfo *fi) #define ftree_node_subscribed(node) ( ((ftree_node *) (node))->flags & FTREE_NODE_SUBSCRIBED ) #define ftree_node_get_name(node) ( ((ftree_node *) (node))->data ) #define ftree_node_get_full_name(node) ( ((ftree_node *) (node))->data + ((ftree_node *) (node))->full_name_offset ) -#define ftree_node_get_path(node) ( ((ftree_node *) (node))->data + ((ftree_node *) (node))->path_offset ) #define ftree_node_get_uri(node) ( ((ftree_node *) (node))->data + ((ftree_node *) (node))->uri_offset ) /* ** Folder Tree Model **************************************************** */ @@ -707,7 +674,6 @@ fe_got_children (CamelStore *store, gchar *prefix, CamelFolderInfo *info, gpoint if (!prefix) prefix = ""; - printf ("CHILDREN OF \"%s\":\n", prefix); for (; info; info = info->sibling) { ETreePath child_path; @@ -721,8 +687,6 @@ fe_got_children (CamelStore *store, gchar *prefix, CamelFolderInfo *info, gpoint closure->path, 0, node); - - printf (" \"%s\"\n", info->full_name); } if (closure->data) @@ -742,21 +706,12 @@ fe_check_for_children (FolderETree *ftree, ETreePath path) node = e_tree_memory_node_get_data (E_TREE_MEMORY (ftree), path); /* have we already gotten these children? */ - if (node->flags & FTREE_NODE_GOT_CHILDREN) { - printf ("CHECK FOR CHILDREN: cancel: below %s, (got children)\n", ftree_node_get_full_name (node)); - fflush (stdout); + if (node->flags & FTREE_NODE_GOT_CHILDREN) return; - } /* or we're loading them right now? */ - if (g_hash_table_lookup (ftree->scan_ops, path)) { - printf ("CHECK FOR CHILDREN: cancel: below %s, in progress\n", ftree_node_get_full_name (node)); - fflush (stdout); + if (g_hash_table_lookup (ftree->scan_ops, path)) return; - } - - printf ("CHECK FOR CHILDREN: keepon: below %s\n", ftree_node_get_full_name (node)); - fflush (stdout); /* figure out our search prefix */ if (path == ftree->root) @@ -784,6 +739,7 @@ fe_create_root_node (FolderETree *ftree) node = ftree_node_new_root (ftree->search); ftree->root = e_tree_memory_node_insert (E_TREE_MEMORY(ftree), NULL, 0, node); + fe_check_for_children (ftree, ftree->root); } static ETreePath @@ -807,15 +763,26 @@ fe_done_subscribing (const char *full_name, const char *name, gboolean subscribe ftree_op_data *closure = (ftree_op_data *) user_data; if (success) { + gchar *path; + + /* path = the path component of our uri. + * If the URI is properly encoded there should be no problem + * with this. + */ + + path = strstr (ftree_node_get_uri (closure->data), "//") + 3; + path = strchr (path, '/'); + if (subscribe) { closure->data->flags |= FTREE_NODE_SUBSCRIBED; recursive_add_folder (closure->ftree->e_storage, - ftree_node_get_path (closure->data), - name, + path, name, ftree_node_get_uri (closure->data)); } else { closure->data->flags &= ~FTREE_NODE_SUBSCRIBED; - evolution_storage_removed_folder (closure->ftree->e_storage, ftree_node_get_path (closure->data)); + + /* FIXME: recursively remove folder as well? Possible? */ + evolution_storage_removed_folder (closure->ftree->e_storage, path); } e_tree_model_node_data_changed (E_TREE_MODEL (closure->ftree), closure->path); @@ -912,12 +879,12 @@ folder_etree_construct (FolderETree *ftree, { e_tree_memory_construct (E_TREE_MEMORY (ftree)); - fe_create_root_node (ftree); - ftree->store = store; camel_object_ref (CAMEL_OBJECT (store)); ftree->e_storage = mail_lookup_storage (store); + fe_create_root_node (ftree); + return ftree; } @@ -1066,6 +1033,7 @@ store_data_async_get_store (StoreData *sd, StoreDataStoreFunc func, gpointer use } if (sd->store) { + /* um, is this the best behavior? */ func (sd, sd->store, user_data); return; } @@ -1234,6 +1202,8 @@ struct _SubscribeDialogPrivate { GtkWidget *none_item; GtkWidget *search_entry; GtkWidget *hbox; + GtkWidget *filter_radio, *all_radio; + GtkWidget *sub_button, *unsub_button, *refresh_button; }; static GtkObjectClass *subscribe_dialog_parent_class; @@ -1243,8 +1213,6 @@ sc_refresh_pressed (GtkWidget *widget, gpointer user_data) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), ""); - if (sc->priv->current_store) folder_etree_clear_tree (sc->priv->current_store->ftree); } @@ -1255,10 +1223,6 @@ sc_search_activated (GtkWidget *widget, gpointer user_data) SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); StoreData *store = sc->priv->current_store; char *search; - GtkWidget *filter_radio; - - filter_radio = glade_xml_get_widget (sc->priv->xml, "filter_radio"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (filter_radio), TRUE); if (!store) return; @@ -1300,8 +1264,10 @@ sc_all_toggled (GtkWidget *widget, gpointer user_data) if (!store) return; - if (GTK_TOGGLE_BUTTON (widget)->active) + if (GTK_TOGGLE_BUTTON (widget)->active) { + gtk_widget_set_sensitive (sc->priv->search_entry, FALSE); folder_etree_set_search (store->ftree, ""); + } } static void @@ -1313,8 +1279,10 @@ sc_filter_toggled (GtkWidget *widget, gpointer user_data) if (!store) return; - if (GTK_TOGGLE_BUTTON (widget)->active) + if (GTK_TOGGLE_BUTTON (widget)->active) { + gtk_widget_set_sensitive (sc->priv->search_entry, TRUE); sc_search_activated (sc->priv->search_entry, sc); + } } static void @@ -1330,11 +1298,25 @@ populate_store_foreach (MailConfigService *service, SubscribeDialog *sc) } static void +kill_default_view (SubscribeDialog *sc) +{ + gtk_widget_hide (sc->priv->none_item); + + /* the entry will be set sensitive when one of the + * radio buttons is activated, if necessary. */ + + gtk_widget_set_sensitive (sc->priv->all_radio, TRUE); + gtk_widget_set_sensitive (sc->priv->filter_radio, TRUE); + gtk_widget_set_sensitive (sc->priv->sub_button, TRUE); + gtk_widget_set_sensitive (sc->priv->unsub_button, TRUE); + gtk_widget_set_sensitive (sc->priv->refresh_button, TRUE); +} + +static void menu_item_selected (GtkMenuItem *item, gpointer user_data) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); StoreData *sd = gtk_object_get_data (GTK_OBJECT (item), STORE_DATA_KEY); - GtkWidget *toggle; g_return_if_fail (sd); @@ -1345,27 +1327,27 @@ menu_item_selected (GtkMenuItem *item, gpointer user_data) gtk_box_pack_start (GTK_BOX (sc->priv->hbox), widget, TRUE, TRUE, 0); } + if (sc->priv->current_widget == sc->priv->default_widget) + kill_default_view (sc); + gtk_widget_hide (sc->priv->current_widget); - gtk_widget_hide (sc->priv->none_item); /* will happen redundantly... so what? */ gtk_widget_show (sd->widget); sc->priv->current_widget = sd->widget; sc->priv->current_store = sd; - if (sd->ftree->search) { + if (*sd->ftree->search) { e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), sd->ftree->search); - toggle = glade_xml_get_widget (sc->priv->xml, "filter_radio"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sc->priv->filter_radio), TRUE); } else { e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), ""); - toggle = glade_xml_get_widget (sc->priv->xml, "all_radio"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sc->priv->all_radio), TRUE); } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE); } static void dummy_item_selected (GtkMenuItem *item, gpointer user_data) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - GtkWidget *all_toggle; gtk_widget_hide (sc->priv->current_widget); gtk_widget_show (sc->priv->default_widget); @@ -1373,9 +1355,6 @@ dummy_item_selected (GtkMenuItem *item, gpointer user_data) sc->priv->current_store = NULL; e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), ""); - - all_toggle = glade_xml_get_widget (sc->priv->xml, "all_radio"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (all_toggle), TRUE); } /* wonderful */ @@ -1498,15 +1477,20 @@ static void subscribe_dialog_construct (GtkObject *object) { SubscribeDialog *sc = SUBSCRIBE_DIALOG (object); - GtkWidget *widget; /* Load the XML */ - sc->priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/subscribe-dialog.glade", NULL); - sc->app = glade_xml_get_widget (sc->priv->xml, "Manage Subscriptions"); - sc->priv->hbox = glade_xml_get_widget (sc->priv->xml, "tree_box"); - sc->priv->search_entry = glade_xml_get_widget (sc->priv->xml, "search_entry"); - + sc->priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/subscribe-dialog.glade", NULL); + + sc->app = glade_xml_get_widget (sc->priv->xml, "Manage Subscriptions"); + sc->priv->hbox = glade_xml_get_widget (sc->priv->xml, "tree_box"); + sc->priv->search_entry = glade_xml_get_widget (sc->priv->xml, "search_entry"); + sc->priv->filter_radio = glade_xml_get_widget (sc->priv->xml, "filter_radio"); + sc->priv->all_radio = glade_xml_get_widget (sc->priv->xml, "all_radio"); + sc->priv->sub_button = glade_xml_get_widget (sc->priv->xml, "subscribe_button"); + sc->priv->unsub_button = glade_xml_get_widget (sc->priv->xml, "unsubscribe_button"); + sc->priv->refresh_button = glade_xml_get_widget (sc->priv->xml, "refresh_button"); + /* create default view */ sc->priv->default_widget = sc_create_default_widget(); @@ -1514,24 +1498,21 @@ subscribe_dialog_construct (GtkObject *object) gtk_box_pack_start (GTK_BOX (sc->priv->hbox), sc->priv->default_widget, TRUE, TRUE, 0); gtk_widget_show (sc->priv->default_widget); + gtk_widget_set_sensitive (sc->priv->all_radio, FALSE); + gtk_widget_set_sensitive (sc->priv->filter_radio, FALSE); + gtk_widget_set_sensitive (sc->priv->search_entry, FALSE); + gtk_widget_set_sensitive (sc->priv->sub_button, FALSE); + gtk_widget_set_sensitive (sc->priv->unsub_button, FALSE); + gtk_widget_set_sensitive (sc->priv->refresh_button, FALSE); + /* hook up some signals */ gtk_signal_connect (GTK_OBJECT (sc->priv->search_entry), "activate", sc_search_activated, sc); - - widget = glade_xml_get_widget (sc->priv->xml, "subscribe_button"); - gtk_signal_connect (GTK_OBJECT (widget), "clicked", sc_subscribe_pressed, sc); - - widget = glade_xml_get_widget (sc->priv->xml, "unsubscribe_button"); - gtk_signal_connect (GTK_OBJECT (widget), "clicked", sc_unsubscribe_pressed, sc); - - widget = glade_xml_get_widget (sc->priv->xml, "refresh_button"); - gtk_signal_connect (GTK_OBJECT (widget), "clicked", sc_refresh_pressed, sc); - - widget = glade_xml_get_widget (sc->priv->xml, "all_radio"); - gtk_signal_connect (GTK_OBJECT (widget), "toggled", sc_all_toggled, sc); - - widget = glade_xml_get_widget (sc->priv->xml, "filter_radio"); - gtk_signal_connect (GTK_OBJECT (widget), "toggled", sc_filter_toggled, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->sub_button), "clicked", sc_subscribe_pressed, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->unsub_button), "clicked", sc_unsubscribe_pressed, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->refresh_button), "clicked", sc_refresh_pressed, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->all_radio), "toggled", sc_all_toggled, sc); + gtk_signal_connect (GTK_OBJECT (sc->priv->filter_radio), "toggled", sc_filter_toggled, sc); /* Get the list of stores */ |