[evolution-kolab] EPlugin: rework of ACL add/edit sub-dialog internals



commit 2899440e810825225e4ede307611e36b147e5dba
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Wed Oct 10 18:53:07 2012 +0200

    EPlugin: rework of ACL add/edit sub-dialog internals
    
    * create permission type radiobutton list
      with a loop when creating the dialog
    * differentiate adding to and editing of
      ACL in the the dialog title
    * avoid mem leaks when free()ing the
      KolabFolderPermUIData instances

 src/eplugin/e-kolab-folder-permissions.c |  248 +++++++++++++++++++++---------
 src/eplugin/e-kolab-folder-permissions.h |    1 +
 2 files changed, 176 insertions(+), 73 deletions(-)
---
diff --git a/src/eplugin/e-kolab-folder-permissions.c b/src/eplugin/e-kolab-folder-permissions.c
index 84ca0bd..1109c2f 100644
--- a/src/eplugin/e-kolab-folder-permissions.c
+++ b/src/eplugin/e-kolab-folder-permissions.c
@@ -60,8 +60,8 @@ kolab_folder_permissions_ui_create_folder_perms_map (KolabFolderPermUIData *uida
 {
 	GHashTable *map = NULL;
 
-	g_assert (uidata != NULL);
-	g_assert (uidata->widgets != NULL);
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
 
 	map = g_hash_table_new_full (g_direct_hash,
 	                             g_direct_equal,
@@ -89,6 +89,57 @@ kolab_folder_permissions_ui_create_folder_perms_map (KolabFolderPermUIData *uida
 	uidata->widgets->folder_perm_map = map;
 }
 
+static void
+kolab_folder_permissions_ui_create_perms_btn_lbl_array (KolabFolderPermUIData *uidata)
+{
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (uidata->widgets->radio_btn_perm_lbl != NULL);
+
+	uidata->widgets->radio_btn_perm_lbl[KOLAB_FOLDER_PERM_NOCHANGE] =
+		g_strdup (C_("Kolab Folder Permissions",
+		             "Keep the current permission settings"));
+	uidata->widgets->radio_btn_perm_lbl[KOLAB_FOLDER_PERM_READ] =
+		g_strdup (C_("Kolab Folder Permissions",
+		             "Read"));
+	uidata->widgets->radio_btn_perm_lbl[KOLAB_FOLDER_PERM_APPEND] =
+		g_strdup (C_("Kolab Folder Permissions",
+		             "Append"));
+	uidata->widgets->radio_btn_perm_lbl[KOLAB_FOLDER_PERM_WRITE] =
+		g_strdup (C_("Kolab Folder Permissions",
+		             "Write"));
+	uidata->widgets->radio_btn_perm_lbl[KOLAB_FOLDER_PERM_ALL] =
+		g_strdup (C_("Kolab Folder Permissions",
+		             "All"));
+}
+
+static void
+kolab_folder_permissions_ui_get_active_perm (KolabFolderPermUIData *uidata,
+                                             KolabFolderPermID *perm_id,
+                                             GtkRadioButton **active_btn)
+{
+	GtkToggleButton *cur_btn = NULL;
+	KolabFolderPermID ii = 0;
+
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (uidata->widgets->radio_btn_perm != NULL);
+	/* perm_id may be NULL */
+	if (active_btn != NULL)
+		g_return_if_fail (*active_btn == NULL);
+
+	for (ii = 0; ii < KOLAB_FOLDER_LAST_PERM; ii++) {
+		cur_btn = GTK_TOGGLE_BUTTON (uidata->widgets->radio_btn_perm[ii]);
+		if (gtk_toggle_button_get_active (cur_btn)) {
+			if (active_btn != NULL)
+				*active_btn = GTK_RADIO_BUTTON (cur_btn);
+			if (perm_id != NULL)
+				*perm_id = ii;
+			break;
+		}
+	}
+}
+
 static gboolean
 kolab_folder_permissions_ui_add_edit_have_changes (KolabFolderPermUIData *uidata,
                                                    KolabFolderPermID perm_id)
@@ -189,23 +240,15 @@ kolab_folder_permissions_ui_edit_entry_box_cb (GtkComboBoxText *box,
 {
 	KolabFolderPermUIData *uidata = NULL;
 	GtkRadioButton *btn = NULL;
-	GtkToggleButton *cur_btn = NULL;
-	gint ii = 0;
 
 	g_return_if_fail (GTK_IS_COMBO_BOX_TEXT (box));
 	g_return_if_fail (userdata != NULL);
 
 	uidata = (KolabFolderPermUIData *) userdata;
-	g_return_if_fail (uidata->widgets != NULL);
-
-	for (ii = 0; ii < KOLAB_FOLDER_LAST_PERM; ii++) {
-		cur_btn = GTK_TOGGLE_BUTTON (uidata->widgets->radio_btn_perm[ii]);
-		if (gtk_toggle_button_get_active (cur_btn)) {
-			btn = GTK_RADIO_BUTTON (cur_btn);
-			break;
-		}
-	}
 
+	kolab_folder_permissions_ui_get_active_perm (uidata,
+	                                             NULL,
+	                                             &btn);
 	kolab_folder_permissions_ui_folderperm_cb (btn,
 	                                           userdata);
 }
@@ -336,17 +379,86 @@ kolab_folder_permissions_ui_update_add_edit_dialog (KolabFolderPermUIData *uidat
 
 static void
 kolab_folder_permissions_ui_add_edit_dialog_response_cb (GObject *dialog,
-                                                         gint response_id)
+                                                         gint response_id,
+                                                         gpointer *userdata)
 {
+	KolabFolderPermUIData *uidata = NULL;
+	KolabFolderPermID perm_id = KOLAB_FOLDER_PERM_NOCHANGE;
+	GtkComboBoxText *entry = NULL;
+	gchar *access_id = NULL;
+	const gchar *rights = NULL;
+	GError *tmp_err = NULL;
+
 	g_return_if_fail (dialog != NULL);
+	g_return_if_fail (userdata != NULL);
 
 	if (response_id != GTK_RESPONSE_OK) {
 		gtk_widget_destroy (GTK_WIDGET (dialog));
 		return;
 	}
 
+	uidata = (KolabFolderPermUIData *) userdata;
+
+	/* ACL access_id */
+	entry = GTK_COMBO_BOX_TEXT (uidata->widgets->edit_entry_box);
+	access_id = gtk_combo_box_text_get_active_text (entry);
+
+	/* currently active permission id */
+	kolab_folder_permissions_ui_get_active_perm (uidata,
+	                                             &perm_id,
+	                                             NULL);
+
+	/* corresponding rights string */
+	rights = kolab_util_folder_perm_get_string (perm_id);
+	g_return_if_fail (rights != NULL);
+
+	/* previously set rights */
+
 	/* FIXME implement me */
-	g_warning ("%s: FIXME implement me", __func__);
+	g_warning ("%s()[%u] FIXME implement me", __func__, __LINE__);
+
+
+	/* merge rights */
+
+
+	/* set new access_id,rights */
+
+
+	if (tmp_err != NULL) {
+		e_kolab_plugin_util_ui_alert_bar_add_error (uidata->alert_bar,
+		                                            tmp_err);
+		g_error_free (tmp_err);
+
+	}
+	if (access_id != NULL)
+		g_free (access_id);
+
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+kolab_folder_permissions_ui_add_edit_dialog_perm_button_add_to_grid (KolabFolderPermUIData *uidata,
+                                                                     GtkGrid *grid,
+                                                                     GtkWidget *btn,
+                                                                     gint row)
+{
+	GtkWidget *widget = NULL;
+	gchar *tmp = NULL;
+
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (uidata->widgets->radio_btn_perm != NULL);
+	g_return_if_fail (GTK_IS_GRID (grid));
+	g_return_if_fail (GTK_IS_RADIO_BUTTON (btn));
+
+	uidata->widgets->radio_btn_perm[row] = btn;
+	gtk_grid_attach (grid, btn, 0, row, 1, 1);
+	tmp = g_strdup_printf ("(%s)",
+	                       kolab_util_folder_perm_get_string (row));
+	widget = gtk_label_new (tmp);
+	g_free (tmp);
+	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+	gtk_grid_attach (grid, widget, 1, row, 1, 1);
 }
 
 static void
@@ -362,14 +474,24 @@ kolab_folder_permissions_ui_add_edit_dialog (KolabFolderPermUIData *uidata)
 	GtkWidget *btn = NULL;
 	GtkWidget *grid = NULL;
 	GtkWidget *widget = NULL;
+	GtkGrid *ggrid = NULL;
+	const gchar *title = NULL;
+	gchar *tmp = NULL;
 	gint row = 0;
 	gint ii = 0;
 
 	g_assert (uidata != NULL);
 	g_assert (uidata->widgets != NULL);
 
-	dialog = gtk_dialog_new_with_buttons (C_("Kolab Folder Permissions",
-	                                         "Edit Kolab Folder Permissions..."),
+	if (uidata->editing) {
+		title = C_("Kolab Folder Permissions",
+		           "Edit Kolab Folder Permissions...");
+	} else {
+		title = C_("Kolab Folder Permissions",
+		           "Add Kolab Folder Permissions...");
+	}
+
+	dialog = gtk_dialog_new_with_buttons (title,
 	                                      NULL, /* parent */
 	                                      GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_MODAL,
 	                                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
@@ -420,67 +542,38 @@ kolab_folder_permissions_ui_add_edit_dialog (KolabFolderPermUIData *uidata)
 	gtk_container_add (GTK_CONTAINER (content), frame);
 
 	grid = gtk_grid_new ();
+	ggrid = GTK_GRID (grid);
 	gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
-	gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
-	gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
-	gtk_grid_set_column_homogeneous (GTK_GRID (grid), FALSE);
+	gtk_grid_set_column_spacing (ggrid, 5);
+	gtk_grid_set_row_homogeneous (ggrid, TRUE);
+	gtk_grid_set_column_homogeneous (ggrid, FALSE);
 	gtk_container_set_border_width (GTK_CONTAINER (grid), 16);
 	gtk_container_add (GTK_CONTAINER (frame), grid);
 
+	/* permission types radio button list */
+
+	kolab_folder_permissions_ui_create_perms_btn_lbl_array (uidata);
 	row = 0;
 
+	tmp = uidata->widgets->radio_btn_perm_lbl[row]; /* do not free() */
 	btn_loco = gtk_radio_button_new_with_label (uidata->widgets->radio_group,
-	                                            C_("Kolab Folder Permissions",
-	                                               "Keep the current permission settings"));
-	uidata->widgets->radio_btn_perm[KOLAB_FOLDER_PERM_NOCHANGE] = btn_loco;
-	gtk_grid_attach (GTK_GRID (grid), btn_loco, 0, row, 2, 1);
-
-	row++;
-
-	btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (btn_loco),
-	                                                   C_("Kolab Folder Permissions",
-	                                                      "Read"));
-	uidata->widgets->radio_btn_perm[KOLAB_FOLDER_PERM_READ] = btn;
-	gtk_grid_attach (GTK_GRID (grid), btn, 0, row, 1, 1);
-	widget = gtk_label_new ("(lrsip)");
-	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
-	gtk_grid_attach (GTK_GRID (grid), widget, 1, row, 1, 1);
-
-	row++;
-
-	btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (btn_loco),
-	                                                   C_("Kolab Folder Permissions",
-	                                                      "Append"));
-	uidata->widgets->radio_btn_perm[KOLAB_FOLDER_PERM_APPEND] = btn;
-	gtk_grid_attach (GTK_GRID (grid), btn, 0, row, 1, 1);
-	widget = gtk_label_new ("(lrsip)");
-	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
-	gtk_grid_attach (GTK_GRID (grid), widget, 1, row, 1, 1);
-
-	row++;
-
-	btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (btn_loco),
-	                                                   C_("Kolab Folder Permissions",
-	                                                      "Write"));
-	uidata->widgets->radio_btn_perm[KOLAB_FOLDER_PERM_WRITE] = btn;
-	gtk_grid_attach (GTK_GRID (grid), btn, 0, row, 1, 1);
-	widget = gtk_label_new ("(lrswipte)");
-	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
-	gtk_grid_attach (GTK_GRID (grid), widget, 1, row, 1, 1);
-
-	row++;
-
-	btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (btn_loco),
-	                                                   C_("Kolab Folder Permissions",
-	                                                      "All"));
-	uidata->widgets->radio_btn_perm[KOLAB_FOLDER_PERM_ALL] = btn;
-	gtk_grid_attach (GTK_GRID (grid), btn, 0, row, 1, 1);
-	widget = gtk_label_new ("(lrswipakxte)");
-	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
-	gtk_grid_attach (GTK_GRID (grid), widget, 1, row, 1, 1);
+	                                            tmp);
+	uidata->widgets->radio_btn_perm[row] = btn_loco;
+	gtk_grid_attach (ggrid, btn_loco, 0, row, 2, 1);
+
+	for (row = 1; row < KOLAB_FOLDER_PERM_UI_NUM_PERMS; row++) {
+		tmp = uidata->widgets->radio_btn_perm_lbl[row]; /* do not free() */
+		btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (btn_loco),
+		                                                   tmp);
+		kolab_folder_permissions_ui_add_edit_dialog_perm_button_add_to_grid (uidata,
+		                                                                     ggrid,
+		                                                                     btn,
+		                                                                     row);
+	}
 
 	kolab_folder_permissions_ui_create_folder_perms_map (uidata);
 
+	/* signals */
 
 	/* folder perms radio buttons */
 	for (ii = 0; ii < KOLAB_FOLDER_PERM_UI_NUM_PERMS; ii++) {
@@ -497,10 +590,11 @@ kolab_folder_permissions_ui_add_edit_dialog (KolabFolderPermUIData *uidata)
 	                  G_CALLBACK (kolab_folder_permissions_ui_edit_entry_box_cb),
 	                  uidata);
 
+	/* dialog */
 	g_signal_connect (dialog,
 	                  "response",
 	                  G_CALLBACK (kolab_folder_permissions_ui_add_edit_dialog_response_cb),
-	                  NULL);
+	                  uidata);
 	gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
 	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
 	                                   GTK_RESPONSE_OK,
@@ -682,14 +776,22 @@ e_kolab_folder_permissions_ui_new (void)
 void
 e_kolab_folder_permissions_ui_free (KolabFolderPermUIData *uidata)
 {
+	gint ii = 0;
+	gchar *tmp = NULL;
+
 	if (uidata == NULL)
 		return;
 
-	/* the actual widgets will have been deleted already,
-	 * so just deleting the struct shell here
-	 */
-	if (uidata->widgets != NULL)
+	if (uidata->widgets != NULL) {
+		if (uidata->widgets->folder_perm_map != NULL)
+			g_hash_table_destroy (uidata->widgets->folder_perm_map);
+		for (ii = 0; ii < KOLAB_FOLDER_PERM_UI_NUM_PERMS; ii++) {
+			tmp = uidata->widgets->radio_btn_perm_lbl[ii];
+			if (tmp)
+				g_free (tmp);
+		}
 		g_free (uidata->widgets);
+	}
 
 	kolab_data_folder_permissions_free (uidata->permissions);
 	if (uidata->foldername != NULL)
diff --git a/src/eplugin/e-kolab-folder-permissions.h b/src/eplugin/e-kolab-folder-permissions.h
index 9ba7d40..3a47b0d 100644
--- a/src/eplugin/e-kolab-folder-permissions.h
+++ b/src/eplugin/e-kolab-folder-permissions.h
@@ -69,6 +69,7 @@ struct _KolabFolderPermUIWidgets {
 	GSList *radio_group;
 	gulong radio_btn_handler_id[KOLAB_FOLDER_PERM_UI_NUM_PERMS];
 	GtkWidget *radio_btn_perm[KOLAB_FOLDER_PERM_UI_NUM_PERMS];
+	gchar *radio_btn_perm_lbl[KOLAB_FOLDER_PERM_UI_NUM_PERMS];
 };
 
 typedef struct _KolabFolderPermUIData KolabFolderPermUIData;



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