+static void edit_post_update_cb(ItemPerson *item)
+{
+ GtkTreeSelection *sel;
+ gchar *email;
+ GList *detail_sel;
+ GList *walk;
+ GSList *detail;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ ItemPerson *person;
+
+ /* save selection for after the update */
+
+ /* email -> string of email address */
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(email_view));
+ if(gtk_tree_selection_get_selected(sel,NULL,&iter))
+ gtk_tree_model_get(GTK_TREE_MODEL(email_store), &iter, 0, &email, -1);
+ else
+ email = NULL;
+
+ /* detail -> GSList of ItemPerson UIDs */
+ detail = NULL;
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(detail_view));
+ detail_sel = gtk_tree_selection_get_selected_rows(sel, &model);
+ for(walk = detail_sel; walk; walk = walk->next) {
+ GtkTreePath *path = walk->data;
+ if(!gtk_tree_model_get_iter(model,&iter,path))
+ continue;
+ gtk_tree_model_get(model, &iter, COL_ITEM, &person,-1);
+ detail = g_slist_prepend(detail, g_strdup(ADDRITEM_ID(person)));
+ }
+ g_list_foreach(detail_sel, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(detail_sel);
+
+ /* now refresh the stores, trying to keep the selections active */
+ refresh_stores(email,detail);
+
+ /* cleanup */
+ if(email)
+ g_free(email);
+ g_slist_foreach(detail, (GFunc)g_free, NULL);
+ g_slist_free(detail);
+}
+
+static void cb_edit_btn_clicked(GtkButton *button, gpointer data)
+{
+ GtkTreeSelection *selection;
+ GList *selected;
+ GtkTreeModel *model;
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(detail_view));
+ selected = gtk_tree_selection_get_selected_rows(selection,&model);
+ g_return_if_fail(selected);
+
+ /* we are guaranteed to have exactly one row selected */
+ gtk_tree_view_row_activated(GTK_TREE_VIEW(detail_view),(GtkTreePath*)selected->data,
+ gtk_tree_view_get_column(GTK_TREE_VIEW(detail_view),0));
+
+ g_list_foreach(selected, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(selected);
+}
+
+static void cb_del_btn_clicked(GtkButton *button, gpointer data)