[evolution-kolab: 9/9] EPlugin: update ACL tab after add/edit



commit a992e133895af04f1c7f0e70dff77f0a51ad6156
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Fri Oct 12 19:22:25 2012 +0200

    EPlugin: update ACL tab after add/edit
    
    * update the ACL treeview from the changes
      made in the add/edit sub-dialog

 src/eplugin/e-kolab-folder-permissions.c |  136 +++++++++++++++++++++---------
 1 files changed, 97 insertions(+), 39 deletions(-)
---
diff --git a/src/eplugin/e-kolab-folder-permissions.c b/src/eplugin/e-kolab-folder-permissions.c
index 1109c2f..b61b9c5 100644
--- a/src/eplugin/e-kolab-folder-permissions.c
+++ b/src/eplugin/e-kolab-folder-permissions.c
@@ -378,6 +378,71 @@ kolab_folder_permissions_ui_update_add_edit_dialog (KolabFolderPermUIData *uidat
 }
 
 static void
+kolab_folder_permissions_ui_update_treeview (KolabFolderPermUIData *uidata)
+{
+	GtkTreeView *treeview = NULL;
+	GtkListStore *liststore = NULL;
+	GList *acl_ptr = NULL;
+
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->permissions != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (GTK_IS_TREE_VIEW (uidata->widgets->treeview));
+
+	treeview = GTK_TREE_VIEW (uidata->widgets->treeview);
+	liststore = GTK_LIST_STORE (gtk_tree_view_get_model (treeview));
+
+	gtk_list_store_clear (liststore);
+
+	acl_ptr = uidata->permissions->acl;
+	while (acl_ptr != NULL) {
+		CamelImapxAclEntry *entry = NULL;
+		gchar *access_id = NULL;
+		gchar *rights = NULL;
+
+		entry = (CamelImapxAclEntry *) acl_ptr->data;
+		if (entry == NULL)
+			goto skip;
+
+		access_id = entry->access_id;
+		rights = entry->rights;
+
+		gtk_list_store_insert_with_values (liststore,
+		                                   NULL, /* GtkTreeIter not needed */
+		                                   -1,   /* append to liststore    */
+		                                   0, g_strdup (access_id),
+		                                   1, g_strdup (rights),
+		                                   -1);
+	skip:
+		acl_ptr = g_list_next (acl_ptr);
+	}
+}
+
+static void
+kolab_folder_permissions_ui_update_from_dialog (KolabFolderPermUIData *uidata,
+                                                const gchar *access_id,
+                                                const gchar *rights)
+{
+	CamelImapxAclEntry *entry = NULL;
+
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (access_id != NULL);
+	/* rights may be NULL */
+
+	/* update payload data */
+	entry = camel_imapx_acl_entry_new (access_id,
+	                                   rights,
+	                                   NULL);
+	(void) camel_imapx_acl_list_update_from_entry (&(uidata->permissions->acl),
+	                                               entry,
+	                                               NULL);
+	camel_imapx_acl_entry_free (entry);
+
+	/* update treeview */
+	kolab_folder_permissions_ui_update_treeview (uidata);
+}
+
+static void
 kolab_folder_permissions_ui_add_edit_dialog_response_cb (GObject *dialog,
                                                          gint response_id,
                                                          gpointer *userdata)
@@ -387,6 +452,8 @@ kolab_folder_permissions_ui_add_edit_dialog_response_cb (GObject *dialog,
 	GtkComboBoxText *entry = NULL;
 	gchar *access_id = NULL;
 	const gchar *rights = NULL;
+	const gchar *prev_rights = NULL;
+	gchar *new_rights = NULL;
 	GError *tmp_err = NULL;
 
 	g_return_if_fail (dialog != NULL);
@@ -413,16 +480,28 @@ kolab_folder_permissions_ui_add_edit_dialog_response_cb (GObject *dialog,
 	g_return_if_fail (rights != NULL);
 
 	/* previously set rights */
+	prev_rights = camel_imapx_acl_list_get_rights (uidata->permissions->acl,
+	                                               access_id,
+	                                               &tmp_err);
+	if (tmp_err != NULL)
+		goto exit;
 
-	/* FIXME implement me */
-	g_warning ("%s()[%u] FIXME implement me", __func__, __LINE__);
-
-
-	/* merge rights */
-
+	/* merge current and previous rights */
+	new_rights = camel_imapx_acl_rights_merge (prev_rights,
+	                                           rights,
+	                                           &tmp_err);
+	if (tmp_err != NULL)
+		goto exit;
 
 	/* set new access_id,rights */
+	kolab_folder_permissions_ui_update_from_dialog (uidata,
+	                                                access_id,
+	                                                new_rights);
+
+	if (new_rights != NULL)
+		g_free (new_rights);
 
+ exit:
 
 	if (tmp_err != NULL) {
 		e_kolab_plugin_util_ui_alert_bar_add_error (uidata->alert_bar,
@@ -782,6 +861,10 @@ e_kolab_folder_permissions_ui_free (KolabFolderPermUIData *uidata)
 	if (uidata == NULL)
 		return;
 
+	/* the actual widgets will have been deleted already,
+	 * so just deleting the struct shell and supplemental
+	 * data structures for the widgets here
+	 */
 	if (uidata->widgets != NULL) {
 		if (uidata->widgets->folder_perm_map != NULL)
 			g_hash_table_destroy (uidata->widgets->folder_perm_map);
@@ -805,46 +888,21 @@ e_kolab_folder_permissions_ui_free (KolabFolderPermUIData *uidata)
 void
 e_kolab_folder_permissions_ui_update_from_uidata (KolabFolderPermUIData *uidata)
 {
-	GtkTreeView *treeview = NULL;
-	GtkListStore *liststore = NULL;
-	GList *acl_ptr = NULL;
+	GtkWidget *label = NULL;
+	gpointer data = NULL;
+	gchar *rights = NULL;
 
 	g_return_if_fail (uidata != NULL);
 	g_return_if_fail (uidata->permissions != NULL);
 	g_return_if_fail (uidata->widgets != NULL);
-	g_return_if_fail (GTK_IS_TREE_VIEW (uidata->widgets->treeview));
 	g_return_if_fail (GTK_IS_LABEL (uidata->widgets->myrights_lbl));
 
-	treeview = GTK_TREE_VIEW (uidata->widgets->treeview);
-	liststore = GTK_LIST_STORE (gtk_tree_view_get_model (treeview));
-
-	acl_ptr = uidata->permissions->acl;
-	while (acl_ptr != NULL) {
-		CamelImapxAclEntry *entry = NULL;
-		gchar *access_id = NULL;
-		gchar *rights = NULL;
-
-		entry = (CamelImapxAclEntry *) acl_ptr->data;
-		if (entry == NULL)
-			goto skip;
-
-		access_id = entry->access_id;
-		rights = entry->rights;
-
-		gtk_list_store_insert_with_values (liststore,
-		                                   NULL, /* GtkTreeIter not needed */
-		                                   -1,   /* append to liststore    */
-		                                   0, g_strdup (access_id),
-		                                   1, g_strdup (rights),
-		                                   -1);
-	skip:
-		acl_ptr = g_list_next (acl_ptr);
-	}
+	kolab_folder_permissions_ui_update_treeview (uidata);
 
 	if (uidata->permissions->myrights != NULL) {
-		GtkWidget *label = uidata->widgets->myrights_lbl;
-		gpointer data = uidata->permissions->myrights->data;
-		gchar *rights = NULL;
+		label = uidata->widgets->myrights_lbl;
+		data = uidata->permissions->myrights->data;
+		rights = NULL;
 
 		if (data != NULL)
 			rights = ((CamelImapxAclEntry *) data)->rights;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]