[evolution-kolab/ek-wip-acl] EPlugin: display alert bar if saving Kolab folder properties fails



commit e6da058438f89692ca280bf683e989728a140486
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Thu Sep 27 15:21:26 2012 +0200

    EPlugin: display alert bar if saving Kolab folder properties fails
    
    * in case of an error writing the "Kolab Folder Properties..."
      out to the Kolab server, display the resulting GError as
      an EAlert in the EAlertBar, which is part of the dialog

 src/eplugin/e-kolab-plugin-ui.c |  129 +++++++++++++++++++++++++++------------
 1 files changed, 90 insertions(+), 39 deletions(-)
---
diff --git a/src/eplugin/e-kolab-plugin-ui.c b/src/eplugin/e-kolab-plugin-ui.c
index 7e1f130..d153bdc 100644
--- a/src/eplugin/e-kolab-plugin-ui.c
+++ b/src/eplugin/e-kolab-plugin-ui.c
@@ -34,6 +34,7 @@
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-plugin-ui.h>
 
+#include <libevolution-utils/e-alert.h>
 #include <misc/e-alert-bar.h>
 
 #include <libekolab/camel-kolab-imapx-store.h>
@@ -169,6 +170,45 @@ kolab_folder_prop_ui_data_destroy (gpointer data)
 	kolab_folder_prop_ui_data_free ((KolabFolderPropUIData *)data);
 }
 
+/*----------------------------------------------------------------------------*/
+/* internal statics (non-UI) */
+
+
+/*----------------------------------------------------------------------------*/
+/* internal statics (UI) */
+
+static void
+kolab_folder_prop_ui_alertbar_visible (KolabFolderPropUIData *uidata,
+                                       gboolean visible)
+{
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (E_IS_ALERT_BAR (uidata->widgets->alert_bar));
+
+	if (visible)
+		gtk_widget_show (uidata->widgets->alert_bar);
+	else
+		gtk_widget_hide (uidata->widgets->alert_bar);
+}
+
+static void
+kolab_folder_prop_ui_alertbar_add_error (KolabFolderPropUIData *uidata,
+                                         GError *err)
+{
+	EAlert *alert = NULL;
+
+	g_return_if_fail (uidata != NULL);
+	g_return_if_fail (uidata->widgets != NULL);
+	g_return_if_fail (E_IS_ALERT_BAR (uidata->widgets->alert_bar));
+
+	if (err == NULL)
+		return;
+
+	alert = e_kolab_plugin_util_ui_alert_new_from_gerror (err);
+	e_alert_bar_add_alert (E_ALERT_BAR (uidata->widgets->alert_bar),
+	                       alert);
+}
+
 static void
 kolab_folder_prop_ui_clear_all_entries (GObject *dialog)
 {
@@ -192,9 +232,16 @@ kolab_folder_prop_ui_notebook_enable (KolabFolderPropUIData *uidata,
 
 static void
 kolab_folder_prop_ui_response_cb (GObject *dialog,
-                                  gint response_id)
+                                  gint response_id,
+                                  gpointer userdata)
 {
+	KolabFolderPropUIData *uidata = NULL;
+	GtkWidget *ok_btn = NULL;
+	GError *tmp_err = NULL;
+	gboolean ok = FALSE;
+	
 	g_return_if_fail (dialog != NULL);
+	g_return_if_fail (userdata != NULL);
 
 	if (response_id != GTK_RESPONSE_OK) {
 		kolab_folder_prop_ui_clear_all_entries (dialog);
@@ -202,16 +249,49 @@ kolab_folder_prop_ui_response_cb (GObject *dialog,
 		return;
 	}
 
-	/* FIXME implement me */
-	g_warning ("%s: FIXME implement me", __func__);
-}
+	uidata = (KolabFolderPropUIData *) userdata;
 
-/*----------------------------------------------------------------------------*/
-/* internal statics (non-UI) */
+	/* we try with folder permissions first, since if it will
+	 * succeed, the following actions may be affected by the
+	 * newly set permissions
+	 */
+	
+	ok = e_kolab_folder_permissions_ui_write_store (uidata->perm_ui_data,
+	                                                NULL, /* FIXME add cancellation stack */
+	                                                &tmp_err);
+	if (! ok)
+		goto exit;
 
+	/* Instead of aborting after unsuccessful permission setting,
+	 * should we just dump the error into the EAlertBar and move
+	 * on? Alerts can be stacked in the EAlertBar, so we could
+	 * try whether either operation succeeds, and in the event of
+	 * a double failure just accumulate two errors in the EAlertBar.
+	 * Downside: If there are two errors, the earlier one may not
+	 * be visible unless the latter is closed.
+	 */
 
-/*----------------------------------------------------------------------------*/
-/* internal statics (UI) */
+	ok = e_kolab_folder_metadata_ui_write_store (uidata->meta_ui_data,
+	                                             NULL, /* FIXME add cancellation stack */
+	                                             &tmp_err);
+ exit:
+	if (tmp_err != NULL) {
+		/* dump GError into EAlertBar */
+		kolab_folder_prop_ui_alertbar_add_error (uidata, tmp_err);
+		g_error_free (tmp_err);
+		/* deactivate OK button (need to cancel or try again) */
+		ok_btn = e_kolab_plugin_util_ui_dialog_ref_button (GTK_DIALOG (uidata->widgets->dialog),
+		                                                   GTK_STOCK_OK,
+		                                                   TRUE);
+		g_return_if_fail (GTK_IS_BUTTON (ok_btn));
+		gtk_widget_set_sensitive (ok_btn, FALSE);
+		g_object_unref (ok_btn);
+		return;
+	}
+
+	kolab_folder_prop_ui_clear_all_entries (dialog);
+	gtk_widget_destroy (GTK_WIDGET (dialog));	
+}
 
 static KolabFolderPropUIData*
 kolab_folder_prop_ui_dialog_data_new (EShellView *shell_view)
@@ -346,34 +426,6 @@ kolab_folder_prop_ui_dialog_update_from_uidata (KolabFolderPropUIData *uidata)
 	e_kolab_folder_permissions_ui_update_from_uidata (uidata->perm_ui_data);
 }
 
-static void
-kolab_folder_prop_ui_alertbar_visible (KolabFolderPropUIData *uidata,
-                                       gboolean visible)
-{
-	g_return_if_fail (uidata != NULL);
-	g_return_if_fail (uidata->widgets != NULL);
-	g_return_if_fail (E_IS_ALERT_BAR (uidata->widgets->alert_bar));
-
-	if (visible)
-		gtk_widget_show (uidata->widgets->alert_bar);
-	else
-		gtk_widget_hide (uidata->widgets->alert_bar);
-}
-
-static void
-kolab_folder_prop_ui_alertbar_show_error (KolabFolderPropUIData *uidata,
-                                          GError *err)
-{
-	g_return_if_fail (uidata != NULL);
-	g_return_if_fail (uidata->widgets != NULL);
-	g_return_if_fail (E_IS_ALERT_BAR (uidata->widgets->alert_bar));
-
-	if (err == NULL)
-		return;
-
-	g_warning ("%s: FIXME implement me", __func__);
-}
-
 static gboolean
 kolab_folder_prop_ui_query_metadata (KolabFolderPropUIData *uidata,
                                      GCancellable *cancellable,
@@ -437,7 +489,7 @@ kolab_plugin_ui_action_kolab_properties_cb (GtkAction *action,
 
 	/* connect response callback */
 	dialog = G_OBJECT (uidata->widgets->dialog);
-	g_signal_connect (dialog, "response", G_CALLBACK (kolab_folder_prop_ui_response_cb), NULL);
+	g_signal_connect (dialog, "response", G_CALLBACK (kolab_folder_prop_ui_response_cb), uidata);
 	g_object_set_data_full (dialog, E_KOLAB_PROP_DLG_UIDATA, uidata, kolab_folder_prop_ui_data_destroy);
 
 	kolab_folder_prop_ui_notebook_enable (uidata, FALSE);
@@ -475,8 +527,7 @@ kolab_plugin_ui_action_kolab_properties_cb (GtkAction *action,
 
  exit:
 	if (tmp_err != NULL) {
-		kolab_folder_prop_ui_alertbar_show_error (uidata,
-		                                          tmp_err);
+		kolab_folder_prop_ui_alertbar_add_error (uidata, tmp_err);
 		g_error_free (tmp_err);
 	}
 }



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