diff options
author | Milan Crha <mcrha@redhat.com> | 2009-05-04 22:31:12 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2009-05-04 22:31:12 +0800 |
commit | b73ed1d9ffd6975d94638364b6a7fcd7f29a6c23 (patch) | |
tree | 8d4629a4e1e88fbd807e115667bcad514e81c378 /plugins | |
parent | 62085ae755dcd578448ffb35be6cb911c58a89e7 (diff) | |
download | gsoc2013-evolution-b73ed1d9ffd6975d94638364b6a7fcd7f29a6c23.tar.gz gsoc2013-evolution-b73ed1d9ffd6975d94638364b6a7fcd7f29a6c23.tar.zst gsoc2013-evolution-b73ed1d9ffd6975d94638364b6a7fcd7f29a6c23.zip |
BUGFIX: 547414 - Publish Free/Busy calendar for configurable time
Allow user define time duration for the Free/Busy calendar information
in the publish-calendar plugin.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/publish-calendar/publish-calendar.glade | 102 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-format-fb.c | 18 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-location.c | 34 | ||||
-rw-r--r-- | plugins/publish-calendar/publish-location.h | 8 | ||||
-rw-r--r-- | plugins/publish-calendar/url-editor-dialog.c | 21 | ||||
-rw-r--r-- | plugins/publish-calendar/url-editor-dialog.h | 5 |
6 files changed, 171 insertions, 17 deletions
diff --git a/plugins/publish-calendar/publish-calendar.glade b/plugins/publish-calendar/publish-calendar.glade index 6f6ae9dcf2..1f1dca0202 100644 --- a/plugins/publish-calendar/publish-calendar.glade +++ b/plugins/publish-calendar/publish-calendar.glade @@ -382,7 +382,7 @@ <child> <widget class="GtkTable" id="table1"> <property name="visible">True</property> - <property name="n_rows">2</property> + <property name="n_rows">3</property> <property name="n_columns">2</property> <property name="homogeneous">False</property> <property name="row_spacing">6</property> @@ -418,6 +418,24 @@ </child> <child> + <widget class="GtkComboBox" id="type_selector"> + <property name="visible">True</property> + <property name="items" translatable="yes">iCal +Free/Busy</property> + <property name="add_tearoffs">False</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> <widget class="GtkLabel" id="label29"> <property name="visible">True</property> <property name="label" translatable="yes">Publishing _Frequency:</property> @@ -439,8 +457,8 @@ <packing> <property name="left_attach">0</property> <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">fill</property> <property name="y_options"></property> </packing> @@ -458,25 +476,87 @@ Manual (via Actions menu)</property> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="fb_duration_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Time _duration:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">fb_duration_spin</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="y_options">fill</property> + <property name="x_options">fill</property> + <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkComboBox" id="type_selector"> + <widget class="GtkHBox" id="hbox20"> <property name="visible">True</property> - <property name="items" translatable="yes">iCal -Free/Busy</property> - <property name="add_tearoffs">False</property> - <property name="focus_on_click">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkSpinButton" id="fb_duration_spin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 1 100 1 10 0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkComboBox" id="fb_duration_combo"> + <property name="visible">True</property> + <property name="items" translatable="yes">days +weeks +months</property> + <property name="add_tearoffs">False</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> </widget> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> <property name="x_options">fill</property> <property name="y_options">fill</property> </packing> diff --git a/plugins/publish-calendar/publish-format-fb.c b/plugins/publish-calendar/publish-format-fb.c index 5956b0ff8d..a4b3a44544 100644 --- a/plugins/publish-calendar/publish-format-fb.c +++ b/plugins/publish-calendar/publish-format-fb.c @@ -33,7 +33,7 @@ #include "publish-format-fb.h" static gboolean -write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GError **error) +write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, int dur_type, int dur_value, GError **error) { ESource *source; ECal *client = NULL; @@ -47,7 +47,19 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GEr utc = icaltimezone_get_utc_timezone (); start = time_day_begin_with_zone (start, utc); - end = time_add_week_with_zone (start, 6, utc); + + switch (dur_type) { + case FB_DURATION_DAYS: + end = time_add_day_with_zone (start, dur_value, utc); + break; + default: + case FB_DURATION_WEEKS: + end = time_add_week_with_zone (start, dur_value, utc); + break; + case FB_DURATION_MONTHS: + end = time_add_month_with_zone (start, dur_value, utc); + break; + } source = e_source_list_peek_source_by_uid (source_list, uid); if (source) @@ -109,7 +121,7 @@ publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri, GError **error) l = uri->events; while (l) { gchar *uid = l->data; - if (!write_calendar (uid, source_list, stream, error)) + if (!write_calendar (uid, source_list, stream, uri->fb_duration_type, uri->fb_duration_value, error)) break; l = g_slist_next (l); } diff --git a/plugins/publish-calendar/publish-location.c b/plugins/publish-calendar/publish-location.c index 2de877b093..1ebe2cfefb 100644 --- a/plugins/publish-calendar/publish-location.c +++ b/plugins/publish-calendar/publish-location.c @@ -120,7 +120,7 @@ e_publish_uri_from_xml (const gchar *xml) { xmlDocPtr doc; xmlNodePtr root, p; - xmlChar *location, *enabled, *frequency; + xmlChar *location, *enabled, *frequency, *fb_duration_value, *fb_duration_type; xmlChar *publish_time, *format, *username = NULL; GSList *events = NULL; EPublishUri *uri; @@ -146,6 +146,8 @@ e_publish_uri_from_xml (const gchar *xml) frequency = xmlGetProp (root, (const unsigned char *)"frequency"); format = xmlGetProp (root, (const unsigned char *)"format"); publish_time = xmlGetProp (root, (const unsigned char *)"publish_time"); + fb_duration_value = xmlGetProp (root, (xmlChar *)"fb_duration_value"); + fb_duration_type = xmlGetProp (root, (xmlChar *)"fb_duration_type"); if (location != NULL) uri->location = (char *)location; @@ -158,6 +160,23 @@ e_publish_uri_from_xml (const gchar *xml) if (publish_time != NULL) uri->last_pub_time = (char *)publish_time; + if (fb_duration_value) + uri->fb_duration_value = atoi ((char *)fb_duration_value); + else + uri->fb_duration_value = -1; + + if (uri->fb_duration_value < 1) + uri->fb_duration_value = 6; + else if (uri->fb_duration_value > 100) + uri->fb_duration_value = 100; + + if (fb_duration_type && g_str_equal ((char *)fb_duration_type, "days")) + uri->fb_duration_type = FB_DURATION_DAYS; + else if (fb_duration_type && g_str_equal ((char *)fb_duration_type, "months")) + uri->fb_duration_type = FB_DURATION_MONTHS; + else + uri->fb_duration_type = FB_DURATION_WEEKS; + uri->password = g_strdup (""); for (p = root->children; p != NULL; p = p->next) { @@ -173,6 +192,8 @@ e_publish_uri_from_xml (const gchar *xml) xmlFree (enabled); xmlFree (frequency); xmlFree (format); + xmlFree (fb_duration_value); + xmlFree (fb_duration_type); xmlFreeDoc (doc); return uri; @@ -204,6 +225,17 @@ e_publish_uri_to_xml (EPublishUri *uri) xmlSetProp (root, (const unsigned char *)"format", (unsigned char *)format); xmlSetProp (root, (const unsigned char *)"publish_time", (unsigned char *)uri->last_pub_time); + g_free (format); + format = g_strdup_printf ("%d", uri->fb_duration_value); + xmlSetProp (root, (xmlChar *)"fb_duration_value", (xmlChar *)format); + + if (uri->fb_duration_type == FB_DURATION_DAYS) + xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"days"); + else if (uri->fb_duration_type == FB_DURATION_MONTHS) + xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"months"); + else + xmlSetProp (root, (xmlChar *)"fb_duration_type", (xmlChar *)"weeks"); + for (calendars = uri->events; calendars != NULL; calendars = g_slist_next (calendars)) { xmlNodePtr node; node = xmlNewChild (root, NULL, (const unsigned char *)"event", NULL); diff --git a/plugins/publish-calendar/publish-location.h b/plugins/publish-calendar/publish-location.h index f3fbf03d49..ec627d18ce 100644 --- a/plugins/publish-calendar/publish-location.h +++ b/plugins/publish-calendar/publish-location.h @@ -56,6 +56,12 @@ static const int publish_format_type_mask[] = { -1, }; +enum FBDurationType { + FB_DURATION_DAYS, + FB_DURATION_WEEKS, + FB_DURATION_MONTHS +}; + typedef struct _EPublishUri EPublishUri; struct _EPublishUri { gboolean enabled; @@ -65,6 +71,8 @@ struct _EPublishUri { gchar *password; GSList *events; gchar *last_pub_time; + int fb_duration_value; + int fb_duration_type; gint service_type; }; diff --git a/plugins/publish-calendar/url-editor-dialog.c b/plugins/publish-calendar/url-editor-dialog.c index 8e1c735dc3..ea03320ae8 100644 --- a/plugins/publish-calendar/url-editor-dialog.c +++ b/plugins/publish-calendar/url-editor-dialog.c @@ -90,6 +90,9 @@ create_uri (UrlEditorDialog *dialog) g_free (username); g_free (password); } + + uri->fb_duration_value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (dialog->fb_duration_spin)); + uri->fb_duration_type = gtk_combo_box_get_active (GTK_COMBO_BOX (dialog->fb_duration_combo)); } static void @@ -101,6 +104,16 @@ check_input (UrlEditorDialog *dialog) uri = dialog->uri; + if (gtk_combo_box_get_active (GTK_COMBO_BOX (dialog->type_selector)) == 1) { + gtk_widget_show (dialog->fb_duration_label); + gtk_widget_show (dialog->fb_duration_spin); + gtk_widget_show (dialog->fb_duration_combo); + } else { + gtk_widget_hide (dialog->fb_duration_label); + gtk_widget_hide (dialog->fb_duration_spin); + gtk_widget_hide (dialog->fb_duration_combo); + } + if (GTK_WIDGET_IS_SENSITIVE (dialog->events_selector)) { sources = e_source_selector_get_selection (E_SOURCE_SELECTOR (dialog->events_selector)); n += g_slist_length (sources); @@ -329,8 +342,11 @@ url_editor_dialog_construct (UrlEditorDialog *dialog) dialog->gui = gui; #define GW(name) ((dialog->name) = glade_xml_get_widget (dialog->gui, #name)) - GW(publish_frequency); GW(type_selector); + GW(fb_duration_label); + GW(fb_duration_spin); + GW(fb_duration_combo); + GW(publish_frequency); GW(events_swin); @@ -429,6 +445,9 @@ url_editor_dialog_construct (UrlEditorDialog *dialog) } } + gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->fb_duration_spin), uri->fb_duration_value); + gtk_combo_box_set_active (GTK_COMBO_BOX (dialog->fb_duration_combo), uri->fb_duration_type); + g_signal_connect (G_OBJECT (dialog->publish_service), "changed", G_CALLBACK (publish_service_changed), dialog); g_signal_connect (G_OBJECT (dialog->type_selector), "changed", G_CALLBACK (type_selector_changed), dialog); g_signal_connect (G_OBJECT (dialog->publish_frequency), "changed", G_CALLBACK (frequency_changed_cb), dialog); diff --git a/plugins/publish-calendar/url-editor-dialog.h b/plugins/publish-calendar/url-editor-dialog.h index 2d985e90e5..3a85fc895e 100644 --- a/plugins/publish-calendar/url-editor-dialog.h +++ b/plugins/publish-calendar/url-editor-dialog.h @@ -64,8 +64,11 @@ struct _UrlEditorDialog { GladeXML *gui; - GtkWidget *publish_frequency; GtkWidget *type_selector; + GtkWidget *fb_duration_label; + GtkWidget *fb_duration_spin; + GtkWidget *fb_duration_combo; + GtkWidget *publish_frequency; GtkWidget *events_swin; |