diff options
author | Gary Ekker <gekker@novell.com> | 2004-01-13 09:59:28 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2004-01-13 09:59:28 +0800 |
commit | 449f48576b556874742934cacfbc80c041ff12fd (patch) | |
tree | 373f3fbea0dcc0c4aa8756ce56d7b085a079b6c9 /calendar/gui/dialogs/cal-prefs-dialog.c | |
parent | 99f392e5f1db3f927ae93eef5ca657f5a3db7f72 (diff) | |
download | gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar.gz gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar.bz2 gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar.lz gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar.xz gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.tar.zst gsoc2013-evolution-449f48576b556874742934cacfbc80c041ff12fd.zip |
add e-pub-utils.[ch] for Free/Busy publishing
2004-01-12 Gary Ekker <gekker@novell.com>
* gui/Makefile.am: add e-pub-utils.[ch]
for Free/Busy publishing
* gui/apps_evolution_calendar.schemas.in.in: add schema for
/apps/evo/calendar/free_busy key
* gui/calendar-commands.c (publish_freebusy_cmd): change to
publish component rather than attach as email
* gui/calendar-config-keys.h: add free_busy/urls key definition
* gui/calendar-config.[ch] (calendar_config_get_free_busy): new
method for retrieving FB gconf key
(calendar_config_set_free_busy): new method for saving FB
gconf key
* gui/e-cal-view.c (on_publish): change to publish component
rather than attach as email
* gui/itip-utils.[ch] (itip_publish_begin): new method to process
e_cal_components and aggregate the data if we are publishing
for multiple calendars
(itip_publish_comp): new method to publish the ical data to an
http server via libsoup
(comp_fb_normalize): new static method to ensure rfc 2446
compliant
data before publishing icalcomponent_get_uid
(fb_sort): new static method to sort FB properties in ascending
order
* gui/dialogs/Makefile.am: add url-editor-dialog.[ch] and
url-editor-dialog.glade for configure FB publishing
* gui/dialogs/cal-prefs-dialog.[ch]
(cal_prefs_dialog_url_add_clicked):
(cal_prefs_dialog_url_edit_clicked):new method for events in FB
tab
of cal-prefs-dialog
(cal_prefs_dialog_url_remove_clicked): ditto
(cal_prefs_dialog_url_enable_clicked): ditto
(cal_prefs_dialog_url_url_list_change): ditto
(cal_prefs_dialog_url_url_list_enable_toggled): ditto
(cal_prefs_dialog_url_url_list_double_click): ditto
(show_fb_config): new method for updating dialog with FB specific
data in gconf
(update_fb_config): new method for updating gconf with FB specific
data from dialogs
(setup_changes): detect changes in url_list gtk_tree_view
(get_widgets): include new dialog widgets for FB config
(init_widgets): connect signals for new FB config widgets
* gui/dialogs/cal-prefs-dialog.glade: add new widgets for FB
config
* gui/dialogs/url-editor-dialog.[ch]: add files for FB url-editor
dialog
* gui/dialogs/url-editor-dialog.glade: ditto
* gui/e-pub-utils.[ch]: add files with FB publishing utilities
* gui/calendar-component.c (init_calendar_publishing): sets up
listeners to publish calendar, g_idle_add, and on gconf change
(init_calendar_publishing_cb): ditto
(conf_changed_callback): ditto
(impl_createControls): ditto
svn path=/trunk/; revision=24190
Diffstat (limited to 'calendar/gui/dialogs/cal-prefs-dialog.c')
-rw-r--r-- | calendar/gui/dialogs/cal-prefs-dialog.c | 472 |
1 files changed, 435 insertions, 37 deletions
diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c index 83363a3ac0..635c665cc1 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.c +++ b/calendar/gui/dialogs/cal-prefs-dialog.c @@ -34,10 +34,16 @@ #include "../e-timezone-entry.h" #include "cal-prefs-dialog.h" #include "../calendar-config.h" +#include "url-editor-dialog.h" +#include <gtk/gtk.h> +#include <gtk/gtkmain.h> #include <gtk/gtksignal.h> #include <gtk/gtkoptionmenu.h> #include <gtk/gtktogglebutton.h> +#include <libxml/tree.h> +#include <string.h> +#include <libgnome/gnome-i18n.h> #include <libgnomeui/gnome-color-picker.h> #include <glade/glade.h> #include <gal/util/e-util.h> @@ -45,40 +51,6 @@ #include <widgets/misc/e-dateedit.h> -struct _DialogData { - /* Glade XML data */ - GladeXML *xml; - - GtkWidget *page; - - GtkWidget *timezone; - GtkWidget *working_days[7]; - GtkWidget *week_start_day; - GtkWidget *start_of_day; - GtkWidget *end_of_day; - GtkWidget *use_12_hour; - GtkWidget *use_24_hour; - GtkWidget *time_divisions; - GtkWidget *show_end_times; - GtkWidget *compress_weekend; - GtkWidget *dnav_show_week_no; - - /* Widgets for the task list options */ - GtkWidget *tasks_due_today_color; - GtkWidget *tasks_overdue_color; - - GtkWidget *tasks_hide_completed_checkbutton; - GtkWidget *tasks_hide_completed_spinbutton; - GtkWidget *tasks_hide_completed_optionmenu; - - /* Other page options */ - GtkWidget *confirm_delete; - GtkWidget *default_reminder; - GtkWidget *default_reminder_interval; - GtkWidget *default_reminder_units; -}; -typedef struct _DialogData DialogData; - static const int week_start_day_map[] = { 1, 2, 3, 4, 5, 6, 0, -1 }; @@ -96,7 +68,6 @@ static const int default_reminder_units_map[] = { CAL_MINUTES, CAL_HOURS, CAL_DAYS, -1 }; - static gboolean get_widgets (DialogData *data); static void widget_changed_callback (GtkWidget *, void *data); @@ -115,8 +86,23 @@ static void cal_prefs_dialog_end_of_day_changed (GtkWidget *button, void *data); static void cal_prefs_dialog_start_of_day_changed (GtkWidget *button, void *data); static void cal_prefs_dialog_hide_completed_tasks_toggled (GtkWidget *button, void *data); +static void cal_prefs_dialog_url_add_clicked (GtkWidget *button, void *data); +static void cal_prefs_dialog_url_edit_clicked (GtkWidget *button, void *data); +static void cal_prefs_dialog_url_remove_clicked (GtkWidget *button, void *data); +static void cal_prefs_dialog_url_enable_clicked (GtkWidget *button, void *data); +static void cal_prefs_dialog_url_list_change (GtkTreeSelection *selection, + DialogData *dialog_data); +static void cal_prefs_dialog_url_list_enable_toggled (GtkCellRendererToggle *renderer, const char *path_string, void *data); +static void cal_prefs_dialog_url_list_double_click(GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + DialogData *dialog_data); +static void show_fb_config (DialogData *dialog_data); +static void update_fb_config (DialogData *dialog_data); + GtkWidget *cal_prefs_dialog_create_time_edit (void); +#define PREFS_WINDOW(dialog_data) GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (dialog_data), GTK_TYPE_WINDOW)) /** * cal_prefs_dialog_new: @@ -233,6 +219,8 @@ setup_changes (DialogData *dialog_data, connect_changed (dialog_data->default_reminder_interval, "changed", config_control); connect_changed (GTK_OPTION_MENU (dialog_data->default_reminder_units)->menu, "selection_done", config_control); + connect_changed ((GtkWidget *) gtk_tree_view_get_selection (dialog_data->url_list), "changed", config_control); + /* These use GnomeColorPicker so we have to use a different signal. */ g_signal_connect((dialog_data->tasks_due_today_color), "color_set", G_CALLBACK (color_set_callback), config_control); @@ -282,6 +270,12 @@ get_widgets (DialogData *data) data->default_reminder = GW ("default-reminder"); data->default_reminder_interval = GW ("default-reminder-interval"); data->default_reminder_units = GW ("default-reminder-units"); + + data->url_add = GW ("url_add"); + data->url_edit = GW ("url_edit"); + data->url_remove = GW ("url_remove"); + data->url_enable = GW ("url_enable"); + data->url_list = GTK_TREE_VIEW (GW ("url_list")); #undef GW @@ -311,7 +305,12 @@ get_widgets (DialogData *data) && data->confirm_delete && data->default_reminder && data->default_reminder_interval - && data->default_reminder_units); + && data->default_reminder_units + && data->url_add + && data->url_edit + && data->url_remove + && data->url_enable + && data->url_list); } @@ -361,6 +360,13 @@ cal_prefs_dialog_create_time_edit (void) static void init_widgets (DialogData *dialog_data) { + GtkCellRenderer *renderer = NULL; + GtkTreeSelection *selection; + GtkListStore *model; + + dialog_data->url_editor = FALSE; + dialog_data->url_editor_dlg =NULL; + g_signal_connect((dialog_data->use_24_hour), "toggled", G_CALLBACK (cal_prefs_dialog_use_24_hour_toggled), dialog_data); @@ -377,8 +383,65 @@ init_widgets (DialogData *dialog_data) "toggled", G_CALLBACK (cal_prefs_dialog_hide_completed_tasks_toggled), dialog_data); -} + + /* Free/Busy ... */ + g_signal_connect ((dialog_data->url_add), "clicked", + G_CALLBACK (cal_prefs_dialog_url_add_clicked), + dialog_data); + + g_signal_connect ((dialog_data->url_edit), "clicked", + G_CALLBACK (cal_prefs_dialog_url_edit_clicked), + dialog_data); + g_signal_connect ((dialog_data->url_remove), "clicked", + G_CALLBACK (cal_prefs_dialog_url_remove_clicked), + dialog_data); + + g_signal_connect ((dialog_data->url_enable), "clicked", + G_CALLBACK (cal_prefs_dialog_url_enable_clicked), + dialog_data); + + /* Free/Busy Listview */ + renderer = gtk_cell_renderer_toggle_new(); + g_object_set ((GObject *) renderer, "activatable", TRUE, NULL); + + model = gtk_list_store_new (URL_LIST_N_COLUMNS, G_TYPE_BOOLEAN, + G_TYPE_STRING, G_TYPE_POINTER); + + gtk_tree_view_set_model (dialog_data->url_list, + (GtkTreeModel *) model); + + gtk_tree_view_insert_column_with_attributes (dialog_data->url_list, -1, + _("Enabled"), renderer, + "active", + URL_LIST_ENABLED_COLUMN, + NULL); + + g_signal_connect (renderer, "toggled", + G_CALLBACK (cal_prefs_dialog_url_list_enable_toggled), + dialog_data); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (dialog_data->url_list, -1, + _("Location"), renderer, + "text", + URL_LIST_LOCATION_COLUMN, + NULL); + + selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + gtk_tree_view_set_headers_visible ((GtkTreeView *) dialog_data->url_list, TRUE); + + + g_signal_connect (gtk_tree_view_get_selection (dialog_data->url_list), + "changed", + G_CALLBACK (cal_prefs_dialog_url_list_change), + dialog_data); + + g_signal_connect (dialog_data->url_list, "row-activated", + G_CALLBACK (cal_prefs_dialog_url_list_double_click), + dialog_data); +} static void cal_prefs_dialog_use_24_hour_toggled (GtkWidget *button, @@ -479,6 +542,300 @@ set_color_picker (GtkWidget *picker, const char *spec) 65535); } +static void +cal_prefs_dialog_url_add_clicked (GtkWidget *button, void *data) +{ + DialogData *dialog_data = (DialogData *) data; + EPublishUri *url = NULL; + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection *selection; + + model = gtk_tree_view_get_model (dialog_data->url_list); + url = g_new0 (EPublishUri, 1); + url->enabled = TRUE; + url->location = ""; + + if (!dialog_data->url_editor) { + + dialog_data->url_editor = url_editor_dialog_new (dialog_data, + url); + + if (url->location != "") { + gtk_list_store_append(GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, + URL_LIST_ENABLED_COLUMN, + url->enabled, + URL_LIST_LOCATION_COLUMN, + g_strdup (url->location), + URL_LIST_FREE_BUSY_URL_COLUMN, url, + -1); + + if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->url_remove)) { + selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list); + gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter); + gtk_widget_set_sensitive ((GtkWidget*) dialog_data->url_remove, TRUE); + gtk_tree_selection_select_iter (selection, &iter); + } + } + dialog_data->url_editor = FALSE; + dialog_data->url_editor_dlg = NULL; + } else { + gdk_window_raise (dialog_data->url_editor_dlg->window); + } +} + +static void +cal_prefs_dialog_url_edit_clicked (GtkWidget *button, void *data) +{ + DialogData *dialog_data = (DialogData *) data; + + if (!dialog_data->url_editor) { + GtkTreeSelection *selection; + EPublishUri *url = NULL; + GtkTreeModel *model; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list); + if (gtk_tree_selection_get_selected (selection, &model, &iter)){ + gtk_tree_model_get (model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, + &url, + -1); + + } + + if (url) { + + dialog_data->url_editor = url_editor_dialog_new (dialog_data, url); + + gtk_list_store_set ((GtkListStore *) model, &iter, + URL_LIST_LOCATION_COLUMN, + g_strdup (url->location), + URL_LIST_ENABLED_COLUMN, + url->enabled, + URL_LIST_FREE_BUSY_URL_COLUMN, url, + -1); + + if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->url_remove)) { + selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list); + gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter); + gtk_widget_set_sensitive ((GtkWidget*) dialog_data->url_remove, TRUE); + gtk_tree_selection_select_iter (selection, &iter); + } + dialog_data->url_editor = FALSE; + dialog_data->url_editor_dlg = NULL; + } + } else { + gdk_window_raise (dialog_data->url_editor_dlg->window); + } +} + +static void +cal_prefs_dialog_url_remove_clicked (GtkWidget *button, void *data) +{ + DialogData *dialog_data = (DialogData *) data; + EPublishUri *url = NULL; + GtkTreeSelection * selection; + GtkTreeModel *model; + GtkWidget *confirm; + GtkTreeIter iter; + int ans; + + selection = gtk_tree_view_get_selection (dialog_data->url_list); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + gtk_tree_model_get (model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, &url, + -1); + + /* make sure we have a valid account selected and that + we aren't editing anything... */ + if (url == NULL || dialog_data->url_editor) + return; + + confirm = gtk_message_dialog_new (PREFS_WINDOW (dialog_data), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + _("Are you sure you want to remove this URL?")); + + (GtkButton *) button = gtk_button_new_from_stock (GTK_STOCK_YES); + gtk_button_set_label ((GtkButton *) button, _("Remove")); + gtk_dialog_add_action_widget ((GtkDialog *) confirm, (GtkWidget *) button, GTK_RESPONSE_YES); + gtk_widget_show ((GtkWidget *) button); + + (GtkButton *) button = gtk_button_new_from_stock (GTK_STOCK_NO); + gtk_button_set_label ((GtkButton *) button, _("Don't Remove")); + gtk_dialog_add_action_widget ((GtkDialog *) confirm, + (GtkWidget *) button, GTK_RESPONSE_NO); + + gtk_widget_show ((GtkWidget *) button); + + ans = gtk_dialog_run ((GtkDialog *) confirm); + gtk_widget_destroy (confirm); + + if (ans == GTK_RESPONSE_YES) { + int len; + + gtk_list_store_remove ((GtkListStore *) model, &iter); + + len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL); + if (len > 0) { + gtk_tree_selection_select_iter (selection, &iter); + } else { + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), FALSE); + } + g_free (url); + } +} + +static void +cal_prefs_dialog_url_enable_clicked (GtkWidget *button, void *data) +{ + DialogData *dialog_data = (DialogData *) data; + EPublishUri *url = NULL; + GtkTreeSelection * selection; + GtkTreeModel *model; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection (dialog_data->url_list); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_tree_model_get (model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, &url, + -1); + url->enabled = !url->enabled; + gtk_list_store_set ((GtkListStore *) model, &iter, + URL_LIST_ENABLED_COLUMN, url->enabled, + -1); + + gtk_button_set_label ((GtkButton *) dialog_data->url_enable, + url->enabled ? _("Disable") : _("Enable")); + } +} + +static void +cal_prefs_dialog_url_list_enable_toggled (GtkCellRendererToggle *renderer, + const char *path_string, + void *data) +{ + DialogData *dialog_data = (DialogData *) data; + GtkTreeSelection * selection; + EPublishUri *url = NULL; + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + + path = gtk_tree_path_new_from_string (path_string); + model = gtk_tree_view_get_model (dialog_data->url_list); + selection = gtk_tree_view_get_selection (dialog_data->url_list); + + if (gtk_tree_model_get_iter (model, &iter, path)) { + gtk_tree_model_get (model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, &url, + -1); + + url->enabled = !url->enabled; + gtk_list_store_set((GtkListStore *) model, &iter, + URL_LIST_ENABLED_COLUMN, + url->enabled, -1); + + if (gtk_tree_selection_iter_is_selected (selection, &iter)) + gtk_button_set_label ((GtkButton *) dialog_data->url_enable, + url->enabled ? _("Disable") : _("Enable")); + } + + gtk_tree_path_free (path); +} + +static void +cal_prefs_dialog_url_list_double_click (GtkTreeView *treeview, + GtkTreePath *path, + GtkTreeViewColumn *column, + DialogData *dialog_data) +{ + cal_prefs_dialog_url_edit_clicked (NULL, dialog_data); +} + +static void +cal_prefs_dialog_url_list_change (GtkTreeSelection *selection, + DialogData *dialog_data) +{ + EPublishUri *url = NULL; + GtkTreeModel *model; + GtkTreeIter iter; + int state; + + state = gtk_tree_selection_get_selected (selection, &model, &iter); + if (state) { + gtk_tree_model_get (model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, &url, + -1); + + if (url->location && url->enabled) + gtk_button_set_label ((GtkButton *) dialog_data->url_enable, _("Disable")); + else + gtk_button_set_label ((GtkButton *) dialog_data->url_enable, _("Enable")); + } else { + gtk_widget_grab_focus (GTK_WIDGET (dialog_data->url_add)); + } + + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit), state); + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), state); + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), state); +} + +/* Shows the current Free/Busy settings in the dialog */ +static void +show_fb_config (DialogData *dialog_data) +{ + GSList *url_config_list; + GtkListStore *model; + GtkTreeIter iter; + + model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->url_list); + gtk_list_store_clear (model); + + /* restore urls from gconf */ + url_config_list = calendar_config_get_free_busy(); + + while (url_config_list) { + gchar *xml = (gchar *)url_config_list->data; + EPublishUri *url; + url = g_new0 (EPublishUri, 1); + + e_pub_uri_from_xml (url, xml); + if (url->location) { + gtk_list_store_append (model, &iter); + gtk_list_store_set (model, &iter, + URL_LIST_ENABLED_COLUMN, + url->enabled, + URL_LIST_LOCATION_COLUMN, + url->location, + URL_LIST_FREE_BUSY_URL_COLUMN, url, + -1); + } + + url_config_list = g_slist_next (url_config_list); + g_free (xml); + } + + g_slist_foreach (url_config_list, (GFunc) g_free, NULL); + g_slist_free (url_config_list); + if (!gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter)) { + /* list is empty-disable edit, remove, and enable buttons */ + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_edit), + FALSE); + + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), + FALSE); + + gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), + FALSE); + } +} + /* Shows the current task list settings in the dialog */ static void show_task_list_config (DialogData *dialog_data) @@ -576,6 +933,9 @@ show_config (DialogData *dialog_data) /* Task list */ show_task_list_config (dialog_data); + + /* Free/Busy */ + show_fb_config (dialog_data); /* Other page */ @@ -605,6 +965,41 @@ spec_from_picker (GtkWidget *picker) return spec; } +/* Updates the Free/Busy config values from the settings in the dialog*/ +static void +update_fb_config (DialogData *dialog_data) +{ + GtkTreeIter iter; + GtkListStore *model = NULL; + gboolean valid; + GSList *url_list; + + url_list = NULL; + + model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->url_list); + + valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter); + while (valid) { + EPublishUri *url; + gchar *xml; + + gtk_tree_model_get ((GtkTreeModel *) model, &iter, + URL_LIST_FREE_BUSY_URL_COLUMN, &url, + -1); + + xml = e_pub_uri_to_xml (url); + if (xml != NULL) { + url_list = g_slist_append(url_list, xml); + } + g_free (url); + + valid = gtk_tree_model_iter_next((GtkTreeModel *) model, &iter); + } + calendar_config_set_free_busy (url_list); + + g_slist_free (url_list); +} + /* Updates the task list config values from the settings in the dialog */ static void update_task_list_config (DialogData *dialog_data) @@ -671,6 +1066,9 @@ update_config (DialogData *dialog_data) /* Task list */ update_task_list_config (dialog_data); + + /* Free/Busy */ + update_fb_config (dialog_data); /* Other page */ |