aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/dialogs/url-editor-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/dialogs/url-editor-dialog.c')
-rw-r--r--calendar/gui/dialogs/url-editor-dialog.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/calendar/gui/dialogs/url-editor-dialog.c b/calendar/gui/dialogs/url-editor-dialog.c
new file mode 100644
index 0000000000..ec1e493402
--- /dev/null
+++ b/calendar/gui/dialogs/url-editor-dialog.c
@@ -0,0 +1,360 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * Author :
+ * Gary Ekker <gekker@novell.com>
+ *
+ * Copyright 2004 Ximian, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/*
+ * UrlEditorDialog - a GtkObject which handles a libglade-loaded dialog
+ * to edit the calendar preference settings.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "cal-prefs-dialog.h"
+#include "url-editor-dialog.h"
+
+#include <gtk/gtk.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtktogglebutton.h>
+#include <libgnomeui/gnome-color-picker.h>
+#include <glade/glade.h>
+#include <gal/util/e-util.h>
+#include <e-util/e-dialog-widgets.h>
+#include <widgets/misc/e-dateedit.h>
+#include <stdlib.h>
+#include <string.h>
+
+static gboolean get_widgets (UrlDialogData *data);
+static void init_widgets (UrlDialogData *data);
+
+static void url_editor_dialog_fb_url_changed (GtkEntry *url_entry, void *data);
+static void url_editor_dialog_fb_daily_toggled (GtkWidget *button, void *data);
+static void url_editor_dialog_fb_url_activated (GtkEntry *url_entry, void *data);
+static void url_editor_dialog_fb_ok_enable (GtkWidget *widget, void *data);
+
+/**
+ * url_editor_dialog_new:
+ *
+ * Creates a new #UrlEditorDialog.
+ *
+ * Return value: a new #UrlEditorDialog.
+ **/
+gboolean
+url_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
+{
+ int b;
+
+ UrlDialogData *url_dlg_data = g_new0 (UrlDialogData, 1);
+ url_dlg_data->xml = glade_xml_new (EVOLUTION_GLADEDIR "/url-editor-dialog.glade", NULL, NULL);
+ if (!url_dlg_data->xml) {
+ g_message ("url_editor_dialog_construct(): Could not load the Glade XML file!");
+ return FALSE;
+ }
+
+ if (!get_widgets (url_dlg_data)) {
+ g_message ("url_editor_dialog_construct(): Could not find all widgets in the XML file!");
+ return FALSE;
+ }
+
+ url_dlg_data->url_dialog = (GtkWidget *) dialog_data;
+ url_dlg_data->url_data = uri;
+
+ init_widgets (url_dlg_data);
+ if (uri->location && uri->username && uri->password) {
+ if (strlen(uri->location) != 0) {
+ gtk_entry_set_text (url_dlg_data->url_entry,
+ uri->location);
+ }
+ if (strlen(uri->username) != 0) {
+ gtk_entry_set_text (url_dlg_data->username_entry,
+ uri->username);
+ }
+ if (strlen(uri->password) != 0) {
+ gtk_entry_set_text (url_dlg_data->password_entry,
+ uri->password);
+
+ e_dialog_toggle_set (url_dlg_data->remember_pw, TRUE);
+ } else {
+ e_dialog_toggle_set (url_dlg_data->remember_pw, FALSE);
+ }
+
+ switch (uri->publish_freq) {
+ case URI_PUBLISH_DAILY:
+ e_dialog_radio_set (url_dlg_data->daily,
+ URI_PUBLISH_DAILY,
+ pub_frequency_type_map);
+ break;
+ case URI_PUBLISH_WEEKLY:
+ e_dialog_radio_set (url_dlg_data->daily,
+ URI_PUBLISH_WEEKLY,
+ pub_frequency_type_map);
+ break;
+ case URI_PUBLISH_USER:
+ default:
+ e_dialog_radio_set (url_dlg_data->daily,
+ URI_PUBLISH_USER,
+ pub_frequency_type_map);
+ }
+ }
+ dialog_data->url_editor=TRUE;
+ dialog_data->url_editor_dlg = (GtkWidget *) url_dlg_data;
+ gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
+
+ b = gtk_dialog_run ((GtkDialog *) url_dlg_data->url_editor);
+
+ if (b == GTK_RESPONSE_OK) {
+ if ((GtkEntry *) url_dlg_data->url_entry) {
+ url_editor_dialog_fb_url_activated (url_dlg_data->url_entry, url_dlg_data);
+ url_dlg_data->url_data->username = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->username_entry));
+ if (e_dialog_toggle_get (url_dlg_data->remember_pw))
+ url_dlg_data->url_data->password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
+ }
+ }
+
+ gtk_widget_destroy (url_dlg_data->url_editor);
+ g_object_unref (url_dlg_data->xml);
+ g_free (url_dlg_data);
+ url_dlg_data = NULL;
+
+ return FALSE;
+}
+
+static gboolean
+get_widgets (UrlDialogData *data)
+{
+#define GW(name) glade_xml_get_widget (data->xml, name)
+
+ data->url_editor = GW ("url_editor");
+ data->url_dialog = GW ("fb_dialog");
+ data->url_entry = GTK_ENTRY (GW ("url_entry"));
+ data->daily = GW ("daily");
+ data->weekly = GW ("weekly");
+ data->user_publish = GW ("user_publish");
+ data->scrolled_window = GW ("scrolled_window");
+ data->username_entry = GTK_ENTRY (GW ("username_entry"));
+ data->password_entry = GTK_ENTRY (GW ("password_entry"));
+ data->remember_pw = GW ("remember_pw");
+ data->cancel = GW ("cancel");
+ data->ok = GW ("ok");
+
+#undef GW
+
+ return (data ->url_editor
+ && data->url_entry
+ && data->daily
+ && data->weekly
+ && data->user_publish
+ && data->scrolled_window
+ && data->username_entry
+ && data->password_entry
+ && data->remember_pw
+ && data->cancel
+ && data->ok);
+}
+
+static void
+selection_changed_callback (ESourceSelector *selector,
+ void *data)
+{
+ UrlDialogData *url_dlg_data = (UrlDialogData *) data;
+ GSList *selection = e_source_selector_get_selection (selector);
+
+ if (selection != NULL) {
+ GSList *p, *l = NULL;
+
+ for (p = selection; p != NULL; p = p->next) {
+ ESource *source = E_SOURCE(p->data);
+ gchar* source_uid = g_strdup(e_source_peek_uid(source));
+
+ l = g_slist_append (l, source_uid);
+ }
+ url_dlg_data->url_data->calendars = l;
+ }
+
+ e_source_selector_free_selection (selection);
+ gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
+}
+
+/* Connects any necessary signal handlers. */
+static void
+init_widgets (UrlDialogData *url_dlg_data)
+{
+ GtkWidget *selector;
+ ESourceList *source_list;
+ GConfClient *gconf_client;
+ GSList *p;
+
+ g_signal_connect (url_dlg_data->url_entry, "changed",
+ G_CALLBACK (url_editor_dialog_fb_url_changed),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->username_entry, "changed",
+ G_CALLBACK (url_editor_dialog_fb_ok_enable),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->password_entry, "changed",
+ G_CALLBACK (url_editor_dialog_fb_ok_enable),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->remember_pw, "toggled",
+ G_CALLBACK (url_editor_dialog_fb_ok_enable),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->url_entry, "activate",
+ G_CALLBACK (url_editor_dialog_fb_url_activated),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->daily, "toggled",
+ G_CALLBACK (url_editor_dialog_fb_daily_toggled),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->weekly, "toggled",
+ G_CALLBACK (url_editor_dialog_fb_daily_toggled),
+ url_dlg_data);
+
+ g_signal_connect (url_dlg_data->user_publish, "toggled",
+ G_CALLBACK (url_editor_dialog_fb_daily_toggled),
+ url_dlg_data);
+
+
+ if (url_dlg_data->url_data->calendars) {
+ ESource *source;
+
+ gconf_client = gconf_client_get_default ();
+ source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
+ selector = e_source_selector_new (source_list);
+
+ p = url_dlg_data->url_data->calendars;
+ for (; p != NULL; p = p->next) {
+ gchar *source_uid;
+
+ source_uid = g_strdup (p->data);
+ source = e_source_list_peek_source_by_uid (source_list, source_uid);
+ e_source_selector_select_source ((ESourceSelector *)selector, source);
+ g_free (source_uid);
+ }
+ } else {
+ gconf_client = gconf_client_get_default ();
+ source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
+ selector = e_source_selector_new (source_list);
+ }
+ e_source_selector_show_selection ((ESourceSelector *) selector, TRUE);
+ g_signal_connect (selector, "selection_changed",
+ G_CALLBACK (selection_changed_callback),
+ url_dlg_data);
+
+ gtk_widget_show (selector);
+ gtk_container_add (GTK_CONTAINER (url_dlg_data->scrolled_window),
+ selector);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (url_dlg_data->scrolled_window),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (url_dlg_data->scrolled_window),
+ GTK_SHADOW_IN);
+
+ gtk_widget_show (url_dlg_data->scrolled_window);
+}
+
+static void
+url_editor_dialog_fb_daily_toggled (GtkWidget *button,
+ void *data)
+{
+ UrlDialogData *url_dlg_data = (UrlDialogData *) data;
+ enum publish_frequency frequency;
+
+ frequency = e_dialog_radio_get (url_dlg_data->daily,
+ pub_frequency_type_map);
+ url_dlg_data->url_data->publish_freq = frequency;
+ gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
+}
+
+static gboolean
+is_valid_url (const gchar *url)
+{
+ const gchar *p = url;
+
+ if (strlen (url) == 0) {
+ return FALSE;
+ }
+ while (*p) {
+ if ((*p == '\\') || (*p == ' ')) {
+ return FALSE;
+ }
+ p++;
+ }
+ return TRUE;
+}
+
+static void
+url_editor_dialog_fb_url_activated (GtkEntry *url_entry, void *data)
+{
+ UrlDialogData *url_dlg_data = (UrlDialogData *) data;
+
+ url_dlg_data->url_data->location = g_strdup (gtk_entry_get_text ((GtkEntry *) url_entry));
+}
+
+static void
+url_editor_dialog_fb_url_changed (GtkEntry *url_entry, void *data)
+{
+ UrlDialogData *url_dlg_data = (UrlDialogData *) data;
+ DialogData *url_dialog = (DialogData *) url_dlg_data->url_dialog;
+
+ const gchar *entry_contents;
+ GtkListStore *model;
+ GtkTreeIter iter;
+ gboolean valid;
+
+ model = (GtkListStore *) gtk_tree_view_get_model (url_dialog->url_list);
+
+ entry_contents = gtk_entry_get_text ((GtkEntry *) url_entry);
+ if (!is_valid_url (entry_contents)) {
+ gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
+ return;
+ }
+ /* duplicate check */
+ valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+ while (valid) {
+ gchar *url_name;
+ gtk_tree_model_get ((GtkTreeModel *) model, &iter,
+ URL_LIST_LOCATION_COLUMN, &url_name,
+ -1);
+
+ if (!strcasecmp (url_name, entry_contents)) {
+ gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, FALSE);
+ return;
+ }
+ valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
+ }
+ /* valid and unique */
+ gtk_widget_set_sensitive (GTK_WIDGET (url_dlg_data->ok), TRUE);
+ gtk_widget_grab_default (GTK_WIDGET (url_dlg_data->ok));
+ gtk_entry_set_activates_default ((GtkEntry*) url_dlg_data->url_entry,
+ TRUE);
+}
+
+static void url_editor_dialog_fb_ok_enable (GtkWidget *widget, void *data) {
+ UrlDialogData *url_dlg_data = (UrlDialogData *) data;
+
+ gtk_widget_set_sensitive (GTK_WIDGET (url_dlg_data->ok), TRUE);
+}