[evolution-kolab] EPlugin: rework of ACL add/edit sub-dialog internals
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab] EPlugin: rework of ACL add/edit sub-dialog internals
- Date: Wed, 10 Oct 2012 18:39:20 +0000 (UTC)
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]