diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2009-08-08 09:43:09 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2009-08-09 09:03:18 +0800 |
commit | 3b0699fc304d0f4aecb261d19869de221f5d6abf (patch) | |
tree | eb434f85371c9d5ae75a8425fc622c31e08baa5b /calendar | |
parent | 65695ae516532a4b6e129a0703b1056a3996de0c (diff) | |
download | gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar.gz gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar.bz2 gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar.lz gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar.xz gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.tar.zst gsoc2013-evolution-3b0699fc304d0f4aecb261d19869de221f5d6abf.zip |
More refactoring of settings management.
Diffstat (limited to 'calendar')
30 files changed, 971 insertions, 3601 deletions
diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c index 4099f5fd4b..5ebd7e93e0 100644 --- a/calendar/gui/calendar-config.c +++ b/calendar/gui/calendar-config.c @@ -151,10 +151,15 @@ calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, return id; } -/* The current timezone, e.g. "Europe/London". It may be NULL, in which case - you should assume UTC (though Evolution will show the timezone-setting - dialog the next time a calendar or task folder is selected). */ -gchar * +static gchar * +calendar_config_get_timezone_stored (void) +{ + calendar_config_init (); + + return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL); +} + +static gchar * calendar_config_get_timezone (void) { EShell *shell; @@ -173,14 +178,6 @@ calendar_config_get_timezone (void) return calendar_config_get_timezone_stored (); } -gchar * -calendar_config_get_timezone_stored (void) -{ - calendar_config_init (); - - return gconf_client_get_string (config, CALENDAR_CONFIG_TIMEZONE, NULL); -} - icaltimezone * calendar_config_get_icaltimezone (void) { @@ -198,19 +195,6 @@ calendar_config_get_icaltimezone (void) return zone; } -/* Sets the timezone. If set to NULL it defaults to UTC. - FIXME: Should check it is being set to a valid timezone. */ -void -calendar_config_set_timezone (const gchar *timezone) -{ - calendar_config_init (); - - if (timezone && timezone[0]) - gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, timezone, NULL); - else - gconf_client_set_string (config, CALENDAR_CONFIG_TIMEZONE, "UTC", NULL); -} - /* Whether we use 24-hour format or 12-hour format (AM/PM). */ gboolean calendar_config_get_24_hour_format (void) @@ -862,36 +846,6 @@ calendar_config_get_hide_completed_tasks_sexp (gboolean get_completed) return sexp; } -gchar * -calendar_config_get_free_busy_template (void) -{ - calendar_config_init (); - - return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL); -} - -void -calendar_config_set_free_busy_template (const gchar *template) -{ - calendar_config_init (); - - gconf_client_set_string (config, CALENDAR_CONFIG_TEMPLATE, template, NULL); -} - -guint -calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, - gpointer data) -{ - guint id; - - calendar_config_init (); - - id = gconf_client_notify_add (config, CALENDAR_CONFIG_TEMPLATE, func, data, - NULL, NULL); - - return id; -} - void calendar_config_set_dir_path (const gchar *path) { diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h index 9a8a1dc2f8..d0b2598892 100644 --- a/calendar/gui/calendar-config.h +++ b/calendar/gui/calendar-config.h @@ -67,10 +67,7 @@ void calendar_config_set_calendars_selected (GSList *selected); guint calendar_config_add_notification_calendars_selected (GConfClientNotifyFunc func, gpointer data); /* The current timezone, e.g. "Europe/London". */ -gchar * calendar_config_get_timezone (void); -gchar * calendar_config_get_timezone_stored (void); icaltimezone *calendar_config_get_icaltimezone (void); -void calendar_config_set_timezone (const gchar *timezone); /* The working days of the week, a bit-wise combination of flags. */ CalWeekdays calendar_config_get_working_days (void); @@ -161,11 +158,6 @@ void calendar_config_set_default_reminder_units (CalUnits units); GSList * calendar_config_get_free_busy (void); void calendar_config_set_free_busy (GSList * url_list); -gchar *calendar_config_get_free_busy_template (void); -void calendar_config_set_free_busy_template (const gchar *template); -guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, - gpointer data); - /* Returns TRUE if the locale has 'am' and 'pm' strings defined, i.e. it supports 12-hour time format. */ gboolean calendar_config_locale_supports_12_hour_format(void); diff --git a/calendar/gui/dialogs/cal-prefs-dialog.c b/calendar/gui/dialogs/cal-prefs-dialog.c index 5c56d69007..8f22c98569 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.c +++ b/calendar/gui/dialogs/cal-prefs-dialog.c @@ -95,16 +95,6 @@ eccp_widget_glade (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget } static void -timezone_changed (GtkWidget *widget, CalendarPrefsDialog *prefs) -{ - icaltimezone *zone; - - zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (prefs->timezone)); - - calendar_config_set_timezone (icaltimezone_get_location (zone)); -} - -static void update_day_second_zone_caption (CalendarPrefsDialog *prefs) { gchar *location; @@ -402,12 +392,6 @@ alarms_selection_changed (ESourceSelector *selector, CalendarPrefsDialog *prefs) } static void -template_url_changed (GtkEntry *entry, CalendarPrefsDialog *prefs) -{ - calendar_config_set_free_busy_template (gtk_entry_get_text (entry)); -} - -static void update_system_tz_widgets (EShellSettings *shell_settings, GParamSpec *pspec, CalendarPrefsDialog *prefs) @@ -427,7 +411,6 @@ update_system_tz_widgets (EShellSettings *shell_settings, static void setup_changes (CalendarPrefsDialog *prefs) { - g_signal_connect (G_OBJECT (prefs->timezone), "changed", G_CALLBACK (timezone_changed), prefs); g_signal_connect (G_OBJECT (prefs->day_second_zone), "clicked", G_CALLBACK (day_second_zone_clicked), prefs); g_signal_connect (G_OBJECT (prefs->start_of_day), "changed", G_CALLBACK (start_of_day_changed), prefs); @@ -455,20 +438,6 @@ setup_changes (CalendarPrefsDialog *prefs) g_signal_connect (G_OBJECT (prefs->notify_with_tray), "toggled", G_CALLBACK (notify_with_tray_toggled), prefs); g_signal_connect (G_OBJECT (prefs->alarm_list_widget), "selection_changed", G_CALLBACK (alarms_selection_changed), prefs); - - g_signal_connect (G_OBJECT (prefs->template_url), "changed", G_CALLBACK (template_url_changed), prefs); -} - -/* Shows the current Free/Busy settings in the dialog */ -static void -show_fb_config (CalendarPrefsDialog *prefs) -{ - gchar *template_url; - - template_url = calendar_config_get_free_busy_template (); - gtk_entry_set_text (GTK_ENTRY (prefs->template_url), (template_url ? template_url : "")); - - g_free (template_url); } /* Shows the current task list settings in the dialog */ @@ -538,16 +507,9 @@ show_config (CalendarPrefsDialog *prefs) gint mask, day, time_divisions; icaltimezone *zone; gboolean sensitive, set = FALSE; - gchar *location; CalUnits units; gint interval; - /* Timezone. */ - location = calendar_config_get_timezone_stored (); - zone = icaltimezone_get_builtin_timezone (location); - e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (prefs->timezone), zone); - g_free (location); - /* Day's second zone */ update_day_second_zone_caption (prefs); @@ -573,9 +535,6 @@ show_config (CalendarPrefsDialog *prefs) /* Alarms list*/ show_alarms_config (prefs); - /* Free/Busy */ - show_fb_config (prefs); - /* Other page */ e_dialog_toggle_set (prefs->default_reminder, calendar_config_get_use_default_reminder ()); e_dialog_spin_set (prefs->default_reminder_interval, calendar_config_get_default_reminder_interval ()); @@ -662,13 +621,15 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs, G_CALLBACK (update_system_tz_widgets), prefs); widget = glade_xml_get_widget (gui, "timezone"); + e_mutual_binding_new ( + G_OBJECT (shell_settings), "cal-timezone", + G_OBJECT (widget), "timezone"); e_mutual_binding_new_with_negation ( G_OBJECT (shell_settings), "cal-use-system-timezone", G_OBJECT (widget), "sensitive"); /* General tab */ prefs->system_tz_label = glade_xml_get_widget (gui, "system-tz-label"); - prefs->timezone = glade_xml_get_widget (gui, "timezone"); prefs->day_second_zone = glade_xml_get_widget (gui, "day_second_zone"); widget = glade_xml_get_widget (gui, "sun_button"); @@ -764,7 +725,7 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs, widget = glade_xml_get_widget (gui, "dnav_show_week_no"); e_mutual_binding_new ( - G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers", + G_OBJECT (shell_settings), "cal-show-week-numbers", G_OBJECT (widget), "active"); widget = glade_xml_get_widget (gui, "dview_show_week_no"); @@ -799,7 +760,10 @@ calendar_prefs_dialog_construct (CalendarPrefsDialog *prefs, prefs->scrolled_window = glade_xml_get_widget (gui, "calendar-source-scrolled-window"); /* Free/Busy tab */ - prefs->template_url = glade_xml_get_widget (gui, "template_url"); + widget = glade_xml_get_widget (gui, "template_url"); + e_mutual_binding_new ( + G_OBJECT (shell_settings), "cal-free-busy-template", + G_OBJECT (widget), "text"); target = e_cal_config_target_new_prefs (ec, prefs->gconf); e_config_set_target ((EConfig *)ec, (EConfigTarget *) target); toplevel = e_config_create_widget ((EConfig *)ec); diff --git a/calendar/gui/dialogs/cal-prefs-dialog.h b/calendar/gui/dialogs/cal-prefs-dialog.h index 5d0a3716a6..ceaa379474 100644 --- a/calendar/gui/dialogs/cal-prefs-dialog.h +++ b/calendar/gui/dialogs/cal-prefs-dialog.h @@ -63,7 +63,6 @@ struct _CalendarPrefsDialog { /* General tab */ GtkWidget *system_tz_label; - GtkWidget *timezone; GtkWidget *day_second_zone; GtkWidget *working_days[7]; GtkWidget *week_start_day; diff --git a/calendar/gui/dialogs/comp-editor-util.c b/calendar/gui/dialogs/comp-editor-util.c index cfe4139708..697e8bda7f 100644 --- a/calendar/gui/dialogs/comp-editor-util.c +++ b/calendar/gui/dialogs/comp-editor-util.c @@ -239,7 +239,7 @@ comp_editor_new_date_edit (EShellSettings *shell_settings, #endif e_binding_new ( - G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers", + G_OBJECT (shell_settings), "cal-show-week-numbers", G_OBJECT (dedit), "show-week-numbers"); e_binding_new ( diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index e7d602c335..94006a961c 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -248,15 +248,6 @@ static GtkActionEntry meeting_entries[] = { }; static void -event_editor_client_changed_cb (EventEditor *ee) -{ - ECal *client; - - client = comp_editor_get_client (COMP_EDITOR (ee)); - e_meeting_store_set_e_cal (ee->priv->model, client); -} - -static void event_editor_model_changed_cb (EventEditor *ee) { if (!ee->priv->updating) { @@ -369,6 +360,31 @@ event_editor_dispose (GObject *object) } static void +event_editor_constructed (GObject *object) +{ + EventEditorPrivate *priv; + EShellSettings *shell_settings; + EShell *shell; + + priv = EVENT_EDITOR_GET_PRIVATE (object); + + shell = comp_editor_get_shell (COMP_EDITOR (object)); + shell_settings = e_shell_get_shell_settings (shell); + + e_binding_new ( + G_OBJECT (object), "client", + G_OBJECT (priv->model), "client"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-free-busy-template", + G_OBJECT (priv->model), "free-busy-template"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-timezone", + G_OBJECT (priv->model), "timezone"); +} + +static void event_editor_show_categories (CompEditor *editor, gboolean visible) { @@ -445,6 +461,7 @@ event_editor_class_init (EventEditorClass *class) object_class = G_OBJECT_CLASS (class); object_class->constructor = event_editor_constructor; object_class->dispose = event_editor_dispose; + object_class->constructed = event_editor_constructed; editor_class = COMP_EDITOR_CLASS (class); editor_class->help_section = "usage-calendar-apts"; @@ -502,10 +519,6 @@ event_editor_init (EventEditor *ee) action = comp_editor_get_action (editor, "send-options"); gtk_action_set_visible (action, FALSE); - g_signal_connect ( - ee, "notify::client", - G_CALLBACK (event_editor_client_changed_cb), NULL); - g_signal_connect_swapped ( ee->priv->model, "row_changed", G_CALLBACK (event_editor_model_changed_cb), ee); @@ -640,7 +653,7 @@ event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gboo ECal *client; gboolean result; - client = e_meeting_store_get_e_cal (priv->model); + client = e_meeting_store_get_client (priv->model); result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, client, NULL, NULL, NULL, strip_alarms); g_object_unref (comp); diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index 66f21522b5..bd9152afc7 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -2260,7 +2260,7 @@ init_widgets (RecurrencePage *rpage) ecal = E_CALENDAR (priv->preview_calendar); e_binding_new ( - G_OBJECT (shell_settings), "cal-date-navigator-show-week-numbers", + G_OBJECT (shell_settings), "cal-show-week-numbers", G_OBJECT (ecal->calitem), "show-week-numbers"); e_binding_new ( diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c index 712d2708b9..979e182a8c 100644 --- a/calendar/gui/dialogs/schedule-page.c +++ b/calendar/gui/dialogs/schedule-page.c @@ -218,7 +218,7 @@ update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalCompone if (start_zone != end_zone) { icaltimezone_convert_time (&end_tt, end_zone, start_zone); } - e_meeting_store_set_zone (priv->model, priv->zone); + e_meeting_store_set_timezone (priv->model, priv->zone); all_day = (start_tt.is_date && end_tt.is_date) ? TRUE : FALSE; @@ -385,10 +385,14 @@ SchedulePage * schedule_page_construct (SchedulePage *spage, EMeetingStore *ems) { SchedulePagePrivate *priv = spage->priv; + EShellSettings *shell_settings; + EShell *shell; CompEditor *editor; gchar *gladefile; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); + shell = comp_editor_get_shell (editor); + shell_settings = e_shell_get_shell_settings (shell); gladefile = g_build_filename (EVOLUTION_GLADEDIR, "schedule-page.glade", @@ -423,6 +427,18 @@ schedule_page_construct (SchedulePage *spage, EMeetingStore *ems) gtk_widget_show (GTK_WIDGET (priv->sel)); gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->sel), TRUE, TRUE, 6); + e_binding_new ( + G_OBJECT (shell_settings), "cal-show-week-numbers", + G_OBJECT (priv->sel), "show-week-numbers"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-use-24-hour-format", + G_OBJECT (priv->sel), "use-24-hour-format"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-week-start-day", + G_OBJECT (priv->sel), "week-start-day"); + if (!init_widgets (spage)) { g_message ("schedule_page_construct(): " "Could not initialize the widgets!"); diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index 2829def666..a309a51d91 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -126,15 +126,6 @@ static GtkActionEntry assigned_task_entries[] = { }; static void -task_editor_client_changed_cb (TaskEditor *te) -{ - ECal *client; - - client = comp_editor_get_client (COMP_EDITOR (te)); - e_meeting_store_set_e_cal (te->priv->model, client); -} - -static void task_editor_model_changed_cb (TaskEditor *te) { if (!te->priv->updating) { @@ -208,6 +199,31 @@ task_editor_dispose (GObject *object) } static void +task_editor_constructed (GObject *object) +{ + TaskEditorPrivate *priv; + EShellSettings *shell_settings; + EShell *shell; + + priv = TASK_EDITOR_GET_PRIVATE (object); + + shell = comp_editor_get_shell (COMP_EDITOR (object)); + shell_settings = e_shell_get_shell_settings (shell); + + e_binding_new ( + G_OBJECT (object), "client", + G_OBJECT (priv->model), "client"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-free-busy-template", + G_OBJECT (priv->model), "free-busy-template"); + + e_binding_new ( + G_OBJECT (shell_settings), "cal-timezone", + G_OBJECT (priv->model), "timezone"); +} + +static void task_editor_show_categories (CompEditor *editor, gboolean visible) { @@ -284,6 +300,7 @@ task_editor_class_init (TaskEditorClass *class) object_class = G_OBJECT_CLASS (class); object_class->constructor = task_editor_constructor; object_class->dispose = task_editor_dispose; + object_class->constructed = task_editor_constructed; editor_class = COMP_EDITOR_CLASS (class); editor_class->help_section = "usage-calendar-todo"; @@ -356,10 +373,6 @@ task_editor_init (TaskEditor *te) g_error_free (error); } - g_signal_connect ( - te, "notify::client", - G_CALLBACK (task_editor_client_changed_cb), NULL); - g_signal_connect_swapped ( te->priv->model, "row_changed", G_CALLBACK (task_editor_model_changed_cb), te); @@ -465,7 +478,7 @@ task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method, gbool ECal *client; gboolean result; - client = e_meeting_store_get_e_cal (priv->model); + client = e_meeting_store_get_client (priv->model); result = itip_send_comp (E_CAL_COMPONENT_METHOD_CANCEL, comp, client, NULL, NULL, NULL, strip_alarms); g_object_unref (comp); diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index cbe3326760..d5a922625f 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -35,7 +35,6 @@ #include "e-cal-model.h" #include "itip-utils.h" #include "misc.h" -#include "calendar-config.h" #include "e-util/e-binding.h" #include "e-util/e-util.h" @@ -1600,14 +1599,16 @@ add_instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end return TRUE; } -/* We do this check since the calendar items are downloaded from the server in the open_method, - since the default timezone might not be set there */ +/* We do this check since the calendar items are downloaded from the server + * in the open_method, since the default timezone might not be set there. */ static void -ensure_dates_are_in_default_zone (icalcomponent *icalcomp) +ensure_dates_are_in_default_zone (ECalModel *model, + icalcomponent *icalcomp) { icaltimetype dt; - icaltimezone *zone = calendar_config_get_icaltimezone (); + icaltimezone *zone; + zone = e_cal_model_get_timezone (model); if (!zone) return; @@ -1670,7 +1671,7 @@ e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer user_data e_cal_component_free_id (id); g_object_unref (comp); - ensure_dates_are_in_default_zone (l->data); + ensure_dates_are_in_default_zone (model, l->data); if (e_cal_util_component_has_recurrences (l->data) && (priv->flags & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES)) { RecurrenceExpansionData rdata; diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index 755dfebec0..a61477d081 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -287,6 +287,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table, GString *tmp2; gchar buff[1001]; gboolean free_text = FALSE; + gboolean use_24_hour_format; ECalComponent *new_comp; ECalComponentOrganizer organizer; ECalComponentDateTime dtstart, dtdue; @@ -385,6 +386,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table, e_cal_component_get_due (new_comp, &dtdue); default_zone = e_cal_model_get_timezone (model); + use_24_hour_format = e_cal_model_get_use_24_hour_format (model); if (dtstart.tzid) { zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (new_comp), dtstart.tzid); @@ -405,7 +407,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table, tmp_tm = icaltimetype_to_tm_with_zone ( dtstart.value, zone, default_zone); e_time_format_date_and_time ( - &tmp_tm, calendar_config_get_24_hour_format (), + &tmp_tm, use_24_hour_format, FALSE, FALSE, buff, 1000); if (buff [0]) { @@ -420,7 +422,7 @@ calendar_table_query_tooltip_cb (ECalendarTable *cal_table, tmp_tm = icaltimetype_to_tm_with_zone ( dtdue.value, zone, default_zone); e_time_format_date_and_time ( - &tmp_tm, calendar_config_get_24_hour_format (), + &tmp_tm, use_24_hour_format, FALSE, FALSE, buff, 1000); if (buff [0]) { @@ -1614,12 +1616,15 @@ e_calendar_table_save_state (ECalendarTable *cal_table, static struct tm e_calendar_table_get_current_time (ECellDateEdit *ecde, gpointer data) { + ECalendarTable *cal_table = data; + ECalModel *model; icaltimezone *zone; struct tm tmp_tm = { 0 }; struct icaltimetype tt; /* Get the current timezone. */ - zone = calendar_config_get_icaltimezone (); + model = e_calendar_table_get_model (cal_table); + zone = e_cal_model_get_timezone (model); tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone); diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c index 276c31ab01..32aa1d3a0e 100644 --- a/calendar/gui/e-meeting-list-view.c +++ b/calendar/gui/e-meeting-list-view.c @@ -827,7 +827,7 @@ process_section (EMeetingListView *view, GList *destinations, icalparameter_role name = e_destination_get_name (dest); /* Get the field as attendee from the backend */ - if (e_cal_get_ldap_attribute (e_meeting_store_get_e_cal (priv->store), + if (e_cal_get_ldap_attribute (e_meeting_store_get_client (priv->store), &attr, NULL)) { /* FIXME this should be more general */ if (!g_ascii_strcasecmp (attr, "icscalendar")) { diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c index 20bc6388da..8b9f02c5a5 100644 --- a/calendar/gui/e-meeting-store.c +++ b/calendar/gui/e-meeting-store.c @@ -31,13 +31,17 @@ #include <libecal/e-cal-util.h> #include <libecal/e-cal-time-util.h> #include <libedataserver/e-data-server-util.h> -#include "calendar-config.h" #include "itip-utils.h" #include "e-meeting-utils.h" #include "e-meeting-attendee.h" #include "e-meeting-store.h" -#define ROW_VALID(store, row) (row >= 0 && row < store->priv->attendees->len) +#define ROW_VALID(store, row) \ + (row >= 0 && row < store->priv->attendees->len) + +#define E_MEETING_STORE_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MEETING_STORE, EMeetingStorePrivate)) struct _EMeetingStorePrivate { GPtrArray *attendees; @@ -76,7 +80,14 @@ struct _EMeetingStoreQueueData { GPtrArray *data; }; -static GObjectClass *parent_class = NULL; +enum { + PROP_0, + PROP_CLIENT, + PROP_FREE_BUSY_TEMPLATE, + PROP_TIMEZONE +}; + +static gpointer parent_class; static icalparameter_cutype text_to_type (const gchar *type) @@ -523,13 +534,73 @@ refresh_queue_remove (EMeetingStore *store, EMeetingAttendee *attendee) } static void -ems_finalize (GObject *obj) +meeting_store_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_CLIENT: + e_meeting_store_set_client ( + E_MEETING_STORE (object), + g_value_get_object (value)); + return; + + case PROP_FREE_BUSY_TEMPLATE: + e_meeting_store_set_free_busy_template ( + E_MEETING_STORE (object), + g_value_get_string (value)); + return; + + case PROP_TIMEZONE: + e_meeting_store_set_timezone ( + E_MEETING_STORE (object), + g_value_get_pointer (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +meeting_store_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_CLIENT: + g_value_set_object ( + value, + e_meeting_store_get_client ( + E_MEETING_STORE (object))); + return; + + case PROP_FREE_BUSY_TEMPLATE: + g_value_set_string ( + value, + e_meeting_store_get_free_busy_template ( + E_MEETING_STORE (object))); + return; + + case PROP_TIMEZONE: + g_value_set_pointer ( + value, + e_meeting_store_get_timezone ( + E_MEETING_STORE (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +meeting_store_finalize (GObject *object) { - EMeetingStore *store = E_MEETING_STORE (obj); EMeetingStorePrivate *priv; gint i; - priv = store->priv; + priv = E_MEETING_STORE_GET_PRIVATE (object); for (i = 0; i < priv->attendees->len; i++) g_object_unref (g_ptr_array_index (priv->attendees, i)); @@ -539,7 +610,9 @@ ems_finalize (GObject *obj) g_object_unref (priv->client); while (priv->refresh_queue->len > 0) - refresh_queue_remove (store, g_ptr_array_index (priv->refresh_queue, 0)); + refresh_queue_remove ( + E_MEETING_STORE (object), + g_ptr_array_index (priv->refresh_queue, 0)); g_ptr_array_free (priv->refresh_queue, TRUE); g_hash_table_destroy (priv->refresh_data); @@ -550,75 +623,100 @@ ems_finalize (GObject *obj) g_mutex_free (priv->mutex); - g_free (priv); - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (obj); + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); } static void -ems_class_init (GObjectClass *klass) +meeting_store_class_init (GObjectClass *class) { - parent_class = g_type_class_peek_parent (klass); - - klass->finalize = ems_finalize; + GObjectClass *object_class; + + parent_class = g_type_class_peek_parent (class); + g_type_class_add_private (class, sizeof (EMeetingStorePrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = meeting_store_set_property; + object_class->get_property = meeting_store_get_property; + object_class->finalize = meeting_store_finalize; + + g_object_class_install_property ( + object_class, + PROP_CLIENT, + g_param_spec_object ( + "client", + "Client", + NULL, + E_TYPE_CAL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_FREE_BUSY_TEMPLATE, + g_param_spec_string ( + "free-busy-template", + "Free/Busy Template", + NULL, + NULL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_TIMEZONE, + g_param_spec_pointer ( + "timezone", + "Timezone", + NULL, + G_PARAM_READWRITE)); } static void -ems_init (EMeetingStore *store) +meeting_store_init (EMeetingStore *store) { - EMeetingStorePrivate *priv; - - priv = g_new0 (EMeetingStorePrivate, 1); - - store->priv = priv; - - priv->attendees = g_ptr_array_new (); - - priv->zone = calendar_config_get_icaltimezone (); + store->priv = E_MEETING_STORE_GET_PRIVATE (store); - priv->fb_uri = calendar_config_get_free_busy_template (); + store->priv->attendees = g_ptr_array_new (); + store->priv->refresh_queue = g_ptr_array_new (); + store->priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal); - priv->refresh_queue = g_ptr_array_new (); - priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal); + store->priv->mutex = g_mutex_new (); - priv->mutex = g_mutex_new (); - - priv->num_queries = 0; + store->priv->num_queries = 0; } GType e_meeting_store_get_type (void) { - static GType ems_type = 0; - - if (!ems_type) { - static const GTypeInfo ems_info = { - sizeof (EMeetingStoreClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) ems_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMeetingStore), - 0, - (GInstanceInitFunc) ems_init }; + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + static const GTypeInfo type_info = { + sizeof (EMeetingStoreClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) meeting_store_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EMeetingStore), + 0, /* n_preallocs */ + (GInstanceInitFunc) meeting_store_init, + NULL /* value_table */ + }; static const GInterfaceInfo tree_model_info = { - (GInterfaceInitFunc) ems_tree_model_init, - NULL, - NULL }; + (GInterfaceInitFunc) ems_tree_model_init, + NULL, + NULL + }; - ems_type = g_type_register_static (GTK_TYPE_LIST_STORE, - "EMeetingStore", - &ems_info, 0); + type = g_type_register_static ( + GTK_TYPE_LIST_STORE, "EMeetingStore", &type_info, 0); - g_type_add_interface_static (ems_type, - GTK_TYPE_TREE_MODEL, - &tree_model_info); + g_type_add_interface_static ( + type, GTK_TYPE_TREE_MODEL, &tree_model_info); } - return ems_type; + return type; } GObject * @@ -628,53 +726,69 @@ e_meeting_store_new (void) } ECal * -e_meeting_store_get_e_cal (EMeetingStore *store) +e_meeting_store_get_client (EMeetingStore *store) { + g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL); + return store->priv->client; } void -e_meeting_store_set_e_cal (EMeetingStore *store, ECal *client) +e_meeting_store_set_client (EMeetingStore *store, + ECal *client) { + g_return_if_fail (E_IS_MEETING_STORE (store)); + + if (client != NULL) { + g_return_if_fail (E_IS_CAL (client)); + g_object_ref (client); + } + if (store->priv->client != NULL) g_object_unref (store->priv->client); - if (client != NULL) - g_object_ref (client); store->priv->client = client; + + g_object_notify (G_OBJECT (store), "client"); } -icaltimezone * -e_meeting_store_get_zone (EMeetingStore *store) +const gchar * +e_meeting_store_get_free_busy_template (EMeetingStore *store) { g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL); - return store->priv->zone; + return store->priv->fb_uri; } void -e_meeting_store_set_zone (EMeetingStore *store, icaltimezone *zone) +e_meeting_store_set_free_busy_template (EMeetingStore *store, + const gchar *free_busy_template) { g_return_if_fail (E_IS_MEETING_STORE (store)); - store->priv->zone = zone; + g_free (store->priv->fb_uri); + store->priv->fb_uri = g_strdup (free_busy_template); + + g_object_notify (G_OBJECT (store), "free-busy-template"); } -gchar * -e_meeting_store_get_fb_uri (EMeetingStore *store) +icaltimezone * +e_meeting_store_get_timezone (EMeetingStore *store) { g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL); - return g_strdup (store->priv->fb_uri); + return store->priv->zone; } void -e_meeting_store_set_fb_uri (EMeetingStore *store, const gchar *fb_uri) +e_meeting_store_set_timezone (EMeetingStore *store, + icaltimezone *timezone) { g_return_if_fail (E_IS_MEETING_STORE (store)); - g_free (store->priv->fb_uri); - store->priv->fb_uri = g_strdup (fb_uri); + store->priv->zone = timezone; + + g_object_notify (G_OBJECT (store), "timezone"); } static void diff --git a/calendar/gui/e-meeting-store.h b/calendar/gui/e-meeting-store.h index f67ad92ddd..62287a7b7e 100644 --- a/calendar/gui/e-meeting-store.h +++ b/calendar/gui/e-meeting-store.h @@ -20,24 +20,37 @@ * */ -#ifndef _E_MEETING_STORE_H_ -#define _E_MEETING_STORE_H_ +#ifndef E_MEETING_STORE_H +#define E_MEETING_STORE_H #include <gtk/gtk.h> #include <libecal/e-cal.h> #include "e-meeting-attendee.h" -G_BEGIN_DECLS +/* Standard GObject macros */ +#define E_TYPE_MEETING_STORE \ + (e_meeting_store_get_type ()) +#define E_MEETING_STORE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_MEETING_STORE, EMeetingStore)) +#define E_MEETING_STORE_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_MEETING_STORE, EMeetingStoreClass)) +#define E_IS_MEETING_STORE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_MEETING_STORE)) +#define E_IS_MEETING_STORE_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((obj), E_TYPE_MEETING_STORE)) +#define E_MEETING_STORE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_MEETING_STORE, EMeetingStoreClass)) -#define E_TYPE_MEETING_STORE (e_meeting_store_get_type ()) -#define E_MEETING_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEETING_STORE, EMeetingStore)) -#define E_MEETING_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MEETING_STORE, EMeetingStoreClass)) -#define E_IS_MEETING_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEETING_STORE)) -#define E_IS_MEETING_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MEETING_STORE)) +G_BEGIN_DECLS -typedef struct _EMeetingStore EMeetingStore; +typedef struct _EMeetingStore EMeetingStore; +typedef struct _EMeetingStoreClass EMeetingStoreClass; typedef struct _EMeetingStorePrivate EMeetingStorePrivate; -typedef struct _EMeetingStoreClass EMeetingStoreClass; typedef enum { E_MEETING_STORE_ADDRESS_COL, @@ -57,7 +70,6 @@ typedef enum { struct _EMeetingStore { GtkListStore parent; - EMeetingStorePrivate *priv; }; @@ -65,48 +77,64 @@ struct _EMeetingStoreClass { GtkListStoreClass parent_class; }; -typedef gboolean (* EMeetingStoreRefreshCallback) (gpointer data); - -GType e_meeting_store_get_type (void); -GObject *e_meeting_store_new (void); - -void e_meeting_store_set_value (EMeetingStore *im, gint row, gint col, const gchar *val); - -ECal *e_meeting_store_get_e_cal (EMeetingStore *im); -void e_meeting_store_set_e_cal (EMeetingStore *im, ECal *client); - -icaltimezone *e_meeting_store_get_zone (EMeetingStore *im); -void e_meeting_store_set_zone (EMeetingStore *im, icaltimezone *zone); - -gchar *e_meeting_store_get_fb_uri (EMeetingStore *im); -void e_meeting_store_set_fb_uri (EMeetingStore *im, const gchar *fb_uri); - -void e_meeting_store_add_attendee (EMeetingStore *im, EMeetingAttendee *ia); -EMeetingAttendee *e_meeting_store_add_attendee_with_defaults (EMeetingStore *im); - -void e_meeting_store_remove_attendee (EMeetingStore *im, EMeetingAttendee *ia); -void e_meeting_store_remove_all_attendees (EMeetingStore *im); - -EMeetingAttendee *e_meeting_store_find_attendee (EMeetingStore *im, const gchar *address, gint *row); -EMeetingAttendee *e_meeting_store_find_attendee_at_row (EMeetingStore *im, gint row); -GtkTreePath *e_meeting_store_find_attendee_path (EMeetingStore *store, EMeetingAttendee *attendee); - -gint e_meeting_store_count_actual_attendees (EMeetingStore *im); -const GPtrArray *e_meeting_store_get_attendees (EMeetingStore *im); - -void e_meeting_store_refresh_all_busy_periods (EMeetingStore *im, - EMeetingTime *start, - EMeetingTime *end, - EMeetingStoreRefreshCallback call_back, - gpointer data); -void e_meeting_store_refresh_busy_periods (EMeetingStore *im, - gint row, - EMeetingTime *start, - EMeetingTime *end, - EMeetingStoreRefreshCallback call_back, - gpointer data); - -guint e_meeting_store_get_num_queries (EMeetingStore *store); +typedef gboolean (*EMeetingStoreRefreshCallback) (gpointer data); + +GType e_meeting_store_get_type (void); +GObject * e_meeting_store_new (void); +void e_meeting_store_set_value (EMeetingStore *meeting_store, + gint row, + gint col, + const gchar *val); +ECal * e_meeting_store_get_client (EMeetingStore *meeting_store); +void e_meeting_store_set_client (EMeetingStore *meeting_store, + ECal *client); +const gchar * e_meeting_store_get_free_busy_template + (EMeetingStore *meeting_store); +void e_meeting_store_set_free_busy_template + (EMeetingStore *meeting_store, + const gchar *free_busy_template); +icaltimezone * e_meeting_store_get_timezone (EMeetingStore *meeting_store); +void e_meeting_store_set_timezone (EMeetingStore *meeting_store, + icaltimezone *timezone); +void e_meeting_store_add_attendee (EMeetingStore *meeting_store, + EMeetingAttendee *attendee); +EMeetingAttendee * + e_meeting_store_add_attendee_with_defaults + (EMeetingStore *meeting_store); +void e_meeting_store_remove_attendee (EMeetingStore *meeting_store, + EMeetingAttendee *attendee); +void e_meeting_store_remove_all_attendees + (EMeetingStore *meeting_store); +EMeetingAttendee * + e_meeting_store_find_attendee (EMeetingStore *meeting_store, + const gchar *address, + gint *row); +EMeetingAttendee * + e_meeting_store_find_attendee_at_row + (EMeetingStore *meeting_store, + gint row); +GtkTreePath * e_meeting_store_find_attendee_path + (EMeetingStore *meeting_store, + EMeetingAttendee *attendee); +gint e_meeting_store_count_actual_attendees + (EMeetingStore *meeting_store); +const GPtrArray * + e_meeting_store_get_attendees (EMeetingStore *meeting_store); +void e_meeting_store_refresh_all_busy_periods + (EMeetingStore *meeting_store, + EMeetingTime *start, + EMeetingTime *end, + EMeetingStoreRefreshCallback call_back, + gpointer data); +void e_meeting_store_refresh_busy_periods + (EMeetingStore *meeting_store, + gint row, + EMeetingTime *start, + EMeetingTime *end, + EMeetingStoreRefreshCallback call_back, + gpointer data); + +guint e_meeting_store_get_num_queries (EMeetingStore *meeting_store); G_END_DECLS diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c index 9ca98268e7..ea6fca83c9 100644 --- a/calendar/gui/e-meeting-time-sel.c +++ b/calendar/gui/e-meeting-time-sel.c @@ -39,14 +39,24 @@ #include "misc/e-canvas-utils.h" #include "misc/e-dateedit.h" +#include "e-util/e-binding.h" #include "e-util/e-cursor.h" #include "e-util/e-util.h" -#include "calendar-config.h" #include "e-meeting-utils.h" #include "e-meeting-list-view.h" #include "e-meeting-time-sel-item.h" +#define E_MEETING_TIME_SELECTOR_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelectorPrivate)) + +struct _EMeetingTimeSelectorPrivate { + gint week_start_day; + guint show_week_numbers : 1; + guint use_24_hour_format : 1; +}; + /* An array of hour strings for 24 hour time, "0:00" .. "23:00". */ const gchar *EMeetingTimeSelectorHours[24] = { "0:00", "1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", @@ -75,15 +85,20 @@ const gchar *EMeetingTimeSelectorHours12[24] = { /* This is the maximum scrolling speed. */ #define E_MEETING_TIME_SELECTOR_MAX_SCROLL_SPEED 4 -/* Signals */ +enum { + PROP_0, + PROP_SHOW_WEEK_NUMBERS, + PROP_USE_24_HOUR_FORMAT, + PROP_WEEK_START_DAY +}; + enum { CHANGED, LAST_SIGNAL }; -static gint mts_signals [LAST_SIGNAL] = { 0 }; +static gint signals [LAST_SIGNAL] = { 0 }; -static void e_meeting_time_selector_destroy (GtkObject *object); static void e_meeting_time_selector_alloc_named_color (EMeetingTimeSelector * mts, const gchar *name, GdkColor *c); static void e_meeting_time_selector_add_key_color (EMeetingTimeSelector * mts, @@ -187,40 +202,179 @@ static void row_inserted_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter static void row_changed_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data); static void row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data); -static void free_busy_template_changed_cb (GConfClient *client, guint cnxn_id, - GConfEntry *entry, gpointer user_data); +static void free_busy_template_changed_cb (EMeetingTimeSelector *mts); G_DEFINE_TYPE (EMeetingTimeSelector, e_meeting_time_selector, GTK_TYPE_TABLE) static void -e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * klass) +meeting_time_selector_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SHOW_WEEK_NUMBERS: + e_meeting_time_selector_set_show_week_numbers ( + E_MEETING_TIME_SELECTOR (object), + g_value_get_boolean (value)); + return; + + case PROP_USE_24_HOUR_FORMAT: + e_meeting_time_selector_set_use_24_hour_format ( + E_MEETING_TIME_SELECTOR (object), + g_value_get_boolean (value)); + return; + + case PROP_WEEK_START_DAY: + e_meeting_time_selector_set_week_start_day ( + E_MEETING_TIME_SELECTOR (object), + g_value_get_int (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +meeting_time_selector_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_SHOW_WEEK_NUMBERS: + g_value_set_boolean ( + value, + e_meeting_time_selector_get_show_week_numbers ( + E_MEETING_TIME_SELECTOR (object))); + return; + + case PROP_USE_24_HOUR_FORMAT: + g_value_set_boolean ( + value, + e_meeting_time_selector_get_use_24_hour_format ( + E_MEETING_TIME_SELECTOR (object))); + return; + + case PROP_WEEK_START_DAY: + g_value_set_int ( + value, + e_meeting_time_selector_get_week_start_day ( + E_MEETING_TIME_SELECTOR (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +meeting_time_selector_destroy (GtkObject *object) +{ + EMeetingTimeSelector *mts; + + mts = E_MEETING_TIME_SELECTOR (object); + + e_meeting_time_selector_remove_timeout (mts); + + if (mts->stipple) { + g_object_unref (mts->stipple); + mts->stipple = NULL; + } + + if (mts->model) { + g_signal_handlers_disconnect_matched ( + mts->model, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, mts); + g_object_unref (mts->model); + mts->model = NULL; + } + + mts->display_top = NULL; + mts->display_main = NULL; + + if (mts->fb_refresh_not != 0) { + g_source_remove (mts->fb_refresh_not); + mts->fb_refresh_not = 0; + } + + if (mts->style_change_idle_id != 0) { + g_source_remove (mts->style_change_idle_id); + mts->style_change_idle_id = 0; + } + + if (GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy) + (*GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)(object); +} + +static void +e_meeting_time_selector_class_init (EMeetingTimeSelectorClass * class) { - GtkObjectClass *object_class; + GObjectClass *object_class; + GtkObjectClass *gtk_object_class; GtkWidgetClass *widget_class; - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; + g_type_class_add_private (class, sizeof (EMeetingTimeSelectorPrivate)); - mts_signals [CHANGED] = - g_signal_new ("changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMeetingTimeSelectorClass, changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + object_class = G_OBJECT_CLASS (class); + object_class->set_property = meeting_time_selector_set_property; + object_class->get_property = meeting_time_selector_get_property; - object_class->destroy = e_meeting_time_selector_destroy; + gtk_object_class = GTK_OBJECT_CLASS (class); + gtk_object_class->destroy = meeting_time_selector_destroy; - widget_class->realize = e_meeting_time_selector_realize; - widget_class->unrealize = e_meeting_time_selector_unrealize; - widget_class->style_set = e_meeting_time_selector_style_set; + widget_class = GTK_WIDGET_CLASS (class); + widget_class->realize = e_meeting_time_selector_realize; + widget_class->unrealize = e_meeting_time_selector_unrealize; + widget_class->style_set = e_meeting_time_selector_style_set; widget_class->expose_event = e_meeting_time_selector_expose_event; + + g_object_class_install_property ( + object_class, + PROP_SHOW_WEEK_NUMBERS, + g_param_spec_boolean ( + "show-week-numbers", + "Show Week Numbers", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_USE_24_HOUR_FORMAT, + g_param_spec_boolean ( + "use-24-hour-format", + "Use 24-Hour Format", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_WEEK_START_DAY, + g_param_spec_int ( + "week-start-day", + "Week Start Day", + NULL, + 0, /* Monday */ + 6, /* Sunday */ + 0, + G_PARAM_READWRITE)); + + signals[CHANGED] = g_signal_new ( + "changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (EMeetingTimeSelectorClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void e_meeting_time_selector_init (EMeetingTimeSelector * mts) { + mts->priv = E_MEETING_TIME_SELECTOR_GET_PRIVATE (mts); + /* The shadow is drawn in the border so it must be >= 2 pixels. */ gtk_container_set_border_width (GTK_CONTAINER (mts), 2); @@ -236,10 +390,6 @@ e_meeting_time_selector_init (EMeetingTimeSelector * mts) mts->list_view = NULL; - mts->fb_uri_not = - calendar_config_add_notification_free_busy_template ((GConfClientNotifyFunc) free_busy_template_changed_cb, - mts); - mts->fb_refresh_not = 0; mts->style_change_idle_id = 0; } @@ -300,6 +450,10 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em if (mts->model) g_object_ref (mts->model); + g_signal_connect_swapped ( + mts->model, "notify::free-busy-template", + G_CALLBACK (free_busy_template_changed_cb), mts); + g_signal_connect (mts->model, "row_inserted", G_CALLBACK (row_inserted_cb), mts); g_signal_connect (mts->model, "row_changed", G_CALLBACK (row_changed_cb), mts); g_signal_connect (mts->model, "row_deleted", G_CALLBACK (row_deleted_cb), mts); @@ -586,8 +740,18 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em a11y_label); } e_date_edit_set_show_time (E_DATE_EDIT (mts->start_date_edit), TRUE); - e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->start_date_edit), - calendar_config_get_24_hour_format ()); + + e_binding_new ( + G_OBJECT (mts), "show-week-numbers", + G_OBJECT (mts->start_date_edit), "show-week-numbers"); + + e_binding_new ( + G_OBJECT (mts), "use-24-hour-format", + G_OBJECT (mts->start_date_edit), "use-24-hour-format"); + + e_binding_new ( + G_OBJECT (mts), "week-start-day", + G_OBJECT (mts->start_date_edit), "week-start-day"); gtk_table_attach (GTK_TABLE (table), mts->start_date_edit, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); @@ -613,8 +777,18 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em a11y_label); } e_date_edit_set_show_time (E_DATE_EDIT (mts->end_date_edit), TRUE); - e_date_edit_set_use_24_hour_format (E_DATE_EDIT (mts->end_date_edit), - calendar_config_get_24_hour_format ()); + + e_binding_new ( + G_OBJECT (mts), "show-week-numbers", + G_OBJECT (mts->end_date_edit), "show-week-numbers"); + + e_binding_new ( + G_OBJECT (mts), "use-24-hour-format", + G_OBJECT (mts->end_date_edit), "use-24-hour-format"); + + e_binding_new ( + G_OBJECT (mts), "week-start-day", + G_OBJECT (mts->end_date_edit), "week-start-day"); gtk_table_attach (GTK_TABLE (table), mts->end_date_edit, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); @@ -666,7 +840,7 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em e_meeting_time_selector_update_end_date_edit (mts); e_meeting_time_selector_update_date_popup_menus (mts); - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); } /* This adds a color to the color key beneath the main display. If color is @@ -754,7 +928,7 @@ e_meeting_time_selector_options_menu_detacher (GtkWidget *widget, EMeetingTimeSelector *mts; g_return_if_fail (widget != NULL); - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (widget)); mts = E_MEETING_TIME_SELECTOR (widget); g_return_if_fail (mts->options_menu == (GtkWidget*) menu); @@ -769,7 +943,7 @@ e_meeting_time_selector_autopick_menu_detacher (GtkWidget *widget, EMeetingTimeSelector *mts; g_return_if_fail (widget != NULL); - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (widget)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (widget)); mts = E_MEETING_TIME_SELECTOR (widget); g_return_if_fail (mts->autopick_menu == (GtkWidget*) menu); @@ -782,52 +956,68 @@ e_meeting_time_selector_new (EMeetingStore *ems) { GtkWidget *mts; - mts = GTK_WIDGET (g_object_new (e_meeting_time_selector_get_type (), NULL)); + mts = g_object_new (E_TYPE_MEETING_TIME_SELECTOR, NULL); e_meeting_time_selector_construct (E_MEETING_TIME_SELECTOR (mts), ems); return mts; } -static void -e_meeting_time_selector_destroy (GtkObject *object) +gboolean +e_meeting_time_selector_get_show_week_numbers (EMeetingTimeSelector *mts) { - EMeetingTimeSelector *mts; + g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE); - mts = E_MEETING_TIME_SELECTOR (object); + return mts->priv->show_week_numbers; +} - e_meeting_time_selector_remove_timeout (mts); +void +e_meeting_time_selector_set_show_week_numbers (EMeetingTimeSelector *mts, + gboolean show_week_numbers) +{ + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); - if (mts->stipple) { - g_object_unref (mts->stipple); - mts->stipple = NULL; - } + mts->priv->show_week_numbers = show_week_numbers; - if (mts->model) { - g_object_unref (mts->model); - mts->model = NULL; - } + g_object_notify (G_OBJECT (mts), "show-week-numbers"); +} - mts->display_top = NULL; - mts->display_main = NULL; +gboolean +e_meeting_time_selector_get_use_24_hour_format (EMeetingTimeSelector *mts) +{ + g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE); - if (mts->fb_uri_not) { - calendar_config_remove_notification (mts->fb_uri_not); - mts->fb_uri_not = 0; - } + return mts->priv->use_24_hour_format; +} - if (mts->fb_refresh_not != 0) { - g_source_remove (mts->fb_refresh_not); - mts->fb_refresh_not = 0; - } +void +e_meeting_time_selector_set_use_24_hour_format (EMeetingTimeSelector *mts, + gboolean use_24_hour_format) +{ + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); - if (mts->style_change_idle_id != 0) { - g_source_remove (mts->style_change_idle_id); - mts->style_change_idle_id = 0; - } + mts->priv->use_24_hour_format = use_24_hour_format; - if (GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy) - (*GTK_OBJECT_CLASS (e_meeting_time_selector_parent_class)->destroy)(object); + g_object_notify (G_OBJECT (mts), "use-24-hour-format"); +} + +gint +e_meeting_time_selector_get_week_start_day (EMeetingTimeSelector *mts) +{ + g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), 0); + + return mts->priv->week_start_day; +} + +void +e_meeting_time_selector_set_week_start_day (EMeetingTimeSelector *mts, + gint week_start_day) +{ + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); + + mts->priv->week_start_day = week_start_day; + + g_object_notify (G_OBJECT (mts), "week-start-day"); } static void @@ -895,7 +1085,7 @@ style_change_idle_func (gpointer widget) /* Calculate the widths of the hour strings in the style's font. */ max_hour_width = 0; for (hour = 0; hour < 24; hour++) { - if (calendar_config_get_24_hour_format ()) + if (e_meeting_time_selector_get_use_24_hour_format (mts)) pango_layout_set_text (layout, EMeetingTimeSelectorHours [hour], -1); else pango_layout_set_text (layout, EMeetingTimeSelectorHours12 [hour], -1); @@ -1053,7 +1243,7 @@ e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts, gint end_hour, gint end_minute) { - g_return_val_if_fail (IS_E_MEETING_TIME_SELECTOR (mts), FALSE); + g_return_val_if_fail (E_IS_MEETING_TIME_SELECTOR (mts), FALSE); /* Check the dates are valid. */ if (!g_date_valid_dmy (start_day, start_month, start_year) @@ -1082,7 +1272,7 @@ e_meeting_time_selector_set_meeting_time (EMeetingTimeSelector *mts, e_meeting_time_selector_update_start_date_edit (mts); e_meeting_time_selector_update_end_date_edit (mts); - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); return TRUE; } @@ -1115,7 +1305,7 @@ e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts, { EMeetingTime saved_time; - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); if (mts->working_hours_only == working_hours_only) return; @@ -1140,7 +1330,7 @@ e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts, { EMeetingTime saved_time; - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); if (mts->day_start_hour == day_start_hour && mts->day_start_minute == day_start_minute @@ -1175,7 +1365,7 @@ e_meeting_time_selector_set_zoomed_out (EMeetingTimeSelector *mts, { EMeetingTime saved_time; - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); if (mts->zoomed_out == zoomed_out) return; @@ -1269,7 +1459,7 @@ void e_meeting_time_selector_set_autopick_option (EMeetingTimeSelector *mts, EMeetingTimeSelectorAutopickOption autopick_option) { - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); switch (autopick_option) { case E_MEETING_TIME_SELECTOR_ALL_PEOPLE_AND_RESOURCES: @@ -1294,7 +1484,7 @@ e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts, { EMeetingTimeSelectorAttendee *attendee; - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); g_return_if_fail (row >= 0); g_return_if_fail (row < mts->attendees->len); @@ -1307,7 +1497,7 @@ e_meeting_time_selector_attendee_set_send_meeting_to (EMeetingTimeSelector *mts, void e_meeting_time_selector_set_read_only (EMeetingTimeSelector *mts, gboolean read_only) { - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); gtk_widget_set_sensitive (GTK_WIDGET (mts->list_view), !read_only); gtk_widget_set_sensitive (mts->display_main, !read_only); @@ -1334,7 +1524,7 @@ e_meeting_time_selector_dump (EMeetingTimeSelector *mts) gint row, period_num; gchar buffer[128]; - g_return_if_fail (IS_E_MEETING_TIME_SELECTOR (mts)); + g_return_if_fail (E_IS_MEETING_TIME_SELECTOR (mts)); g_print ("\n\nAttendee Information:\n"); @@ -1627,7 +1817,7 @@ e_meeting_time_selector_autopick (EMeetingTimeSelector *mts, e_meeting_time_selector_update_start_date_edit (mts); e_meeting_time_selector_update_end_date_edit (mts); - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); return; } @@ -2180,7 +2370,7 @@ e_meeting_time_selector_on_start_time_changed (GtkWidget *widget, gtk_widget_queue_draw (mts->display_top); gtk_widget_queue_draw (mts->display_main); - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); } /* This is called when the meeting end time GnomeDateEdit is changed, @@ -2229,7 +2419,7 @@ e_meeting_time_selector_on_end_time_changed (GtkWidget *widget, gtk_widget_queue_draw (mts->display_top); gtk_widget_queue_draw (mts->display_main); - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); } /* This updates the ranges shown in the GnomeDateEdit popup menus, according @@ -2443,7 +2633,7 @@ e_meeting_time_selector_drag_meeting_time (EMeetingTimeSelector *mts, if (set_both_times || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START) - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); } /* This is the timeout function which handles auto-scrolling when the user is @@ -2582,7 +2772,7 @@ e_meeting_time_selector_timeout_handler (gpointer data) if (set_both_times || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_END || mts->dragging_position == E_MEETING_TIME_SELECTOR_POS_START) - g_signal_emit (mts, mts_signals [CHANGED], 0); + g_signal_emit (mts, signals [CHANGED], 0); scroll: /* Redraw the canvases. We freeze and thaw the layouts so that they @@ -2861,14 +3051,8 @@ row_deleted_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data) static gboolean free_busy_timeout_refresh (gpointer data) { - gchar *fb_uri; - EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data); - fb_uri = calendar_config_get_free_busy_template (); - e_meeting_store_set_fb_uri (mts->model, fb_uri); - g_free (fb_uri); - /* Update all free/busy info, so we use the new template uri */ e_meeting_time_selector_refresh_free_busy (mts, 0, TRUE); @@ -2878,19 +3062,12 @@ free_busy_timeout_refresh (gpointer data) } static void -free_busy_template_changed_cb (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer data) +free_busy_template_changed_cb (EMeetingTimeSelector *mts) { - EMeetingTimeSelector *mts = E_MEETING_TIME_SELECTOR (data); - /* Wait REFRESH_PAUSE before refreshing, using the latest uri value */ - if (mts->fb_refresh_not != 0) { + if (mts->fb_refresh_not != 0) g_source_remove (mts->fb_refresh_not); - } - mts->fb_refresh_not = g_timeout_add_seconds (REFRESH_PAUSE, - free_busy_timeout_refresh, - data); + mts->fb_refresh_not = g_timeout_add_seconds ( + REFRESH_PAUSE, free_busy_timeout_refresh, mts); } diff --git a/calendar/gui/e-meeting-time-sel.h b/calendar/gui/e-meeting-time-sel.h index b38dd98f74..540443a255 100644 --- a/calendar/gui/e-meeting-time-sel.h +++ b/calendar/gui/e-meeting-time-sel.h @@ -20,8 +20,8 @@ * */ -#ifndef _E_MEETING_TIME_SELECTOR_H_ -#define _E_MEETING_TIME_SELECTOR_H_ +#ifndef E_MEETING_TIME_SELECTOR_H +#define E_MEETING_TIME_SELECTOR_H #include <gtk/gtk.h> #include <libgnomecanvas/gnome-canvas.h> @@ -31,14 +31,31 @@ #include "e-meeting-store.h" #include "e-meeting-list-view.h" -G_BEGIN_DECLS - /* * EMeetingTimeSelector displays a list of attendees for a meeting and a * graphical summary of the times which they are free and busy, allowing the * user to select an appropriate time for a meeting. */ +/* Standard GObject macros */ +#define E_TYPE_MEETING_TIME_SELECTOR \ + (e_meeting_time_selector_get_type ()) +#define E_MEETING_TIME_SELECTOR(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelector)) +#define E_MEETING_TIME_SELECTOR_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_MEETING_TIME_SELECTOR, EMeetingTimeSelectorClass)) +#define E_IS_MEETING_TIME_SELECTOR(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_MEETING_TIME_SELECTOR)) +#define E_IS_MEETING_TIME_SELECTOR_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_MEETING_TIME_SELECTOR)) +#define E_MEETING_TIME_SELECTOR_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_MEETING_TIME_SELECTOR)) + /* Define this to include the debugging functions. */ #undef E_MEETING_TIME_SELECTOR_DEBUG @@ -48,6 +65,8 @@ G_BEGIN_DECLS #define E_MEETING_TIME_SELECTOR_TEXT_Y_PAD 3 #define E_MEETING_TIME_SELECTOR_TEXT_X_PAD 2 +G_BEGIN_DECLS + /* This is used to specify the format used when displaying the dates. The full format is like 'Sunday, September 12, 1999'. The abbreviated format is like 'Sun 12/9/99'. The short format is like '12/9/99'. The actual @@ -84,19 +103,17 @@ extern const gchar *EMeetingTimeSelectorHours[24]; /* An array of hour strings for 12 hour time, "12:00am" .. "11:00pm". */ extern const gchar *EMeetingTimeSelectorHours12[24]; -#define E_MEETING_TIME_SELECTOR(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, e_meeting_time_selector_get_type (), EMeetingTimeSelector) -#define E_MEETING_TIME_SELECTOR_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, e_meeting_time_selector_get_type (), EMeetingTimeSelectorClass) -#define IS_E_MEETING_TIME_SELECTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, e_meeting_time_selector_get_type ()) +typedef struct _EMeetingTimeSelector EMeetingTimeSelector; +typedef struct _EMeetingTimeSelectorClass EMeetingTimeSelectorClass; +typedef struct _EMeetingTimeSelectorPrivate EMeetingTimeSelectorPrivate; -typedef struct _EMeetingTimeSelector EMeetingTimeSelector; -typedef struct _EMeetingTimeSelectorClass EMeetingTimeSelectorClass; - -struct _EMeetingTimeSelector -{ +struct _EMeetingTimeSelector { /* We subclass a GtkTable which makes it easy to add extra widgets if neccesary. */ GtkTable table; + EMeetingTimeSelectorPrivate *priv; + /* * User Interface stuff - widgets, colors etc. */ @@ -246,9 +263,6 @@ struct _EMeetingTimeSelector /* This is used to determine the delay between scrolls. */ gint scroll_count; - /* The notification function id for Free/Busy template uri changes */ - guint fb_uri_not; - /* The notification function id for Free/Busy refreshes */ gboolean fb_refresh_not; @@ -257,8 +271,7 @@ struct _EMeetingTimeSelector guint style_change_idle_id; }; -struct _EMeetingTimeSelectorClass -{ +struct _EMeetingTimeSelectorClass { GtkTableClass parent_class; void (* changed) (EMeetingTimeSelector *mts); @@ -269,9 +282,26 @@ struct _EMeetingTimeSelectorClass * know where the data is coming from. This is mainly just for testing for now. */ -GType e_meeting_time_selector_get_type (void); -GtkWidget* e_meeting_time_selector_new (EMeetingStore *ems); -void e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *ems); +GType e_meeting_time_selector_get_type (void); +GtkWidget * e_meeting_time_selector_new (EMeetingStore *ems); +void e_meeting_time_selector_construct + (EMeetingTimeSelector *mts, + EMeetingStore *ems); +gboolean e_meeting_time_selector_get_show_week_numbers + (EMeetingTimeSelector *mts); +void e_meeting_time_selector_set_show_week_numbers + (EMeetingTimeSelector *mts, + gboolean show_week_numbers); +gboolean e_meeting_time_selector_get_use_24_hour_format + (EMeetingTimeSelector *mts); +void e_meeting_time_selector_set_use_24_hour_format + (EMeetingTimeSelector *mts, + gboolean use_24_hour_format); +gint e_meeting_time_seletor_get_week_start_day + (EMeetingTimeSelector *mts); +void e_meeting_time_selector_set_week_start_day + (EMeetingTimeSelector *mts, + gint week_start_day); /* This returns the currently selected meeting time. Note that months are 1-12 and days are 1-31. The start time is guaranteed to @@ -383,4 +413,4 @@ gchar * e_meeting_time_selector_dump_date (GDate *date); G_END_DECLS -#endif /* _E_MEETING_TIME_SELECTOR_H_ */ +#endif /* E_MEETING_TIME_SELECTOR_H */ diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c index a7f2508b3f..e23f82108b 100644 --- a/calendar/gui/e-memo-table.c +++ b/calendar/gui/e-memo-table.c @@ -48,7 +48,6 @@ #include <libecal/e-cal-time-util.h> #include <libedataserver/e-time-utils.h> -#include "calendar-config.h" #include "dialogs/delete-comp.h" #include "dialogs/delete-error.h" #include "dialogs/memo-editor.h" @@ -1243,12 +1242,15 @@ e_memo_table_save_state (EMemoTable *memo_table, static struct tm e_memo_table_get_current_time (ECellDateEdit *ecde, gpointer data) { + EMemoTable *memo_table = data; + ECalModel *model; icaltimezone *zone; struct tm tmp_tm = { 0 }; struct icaltimetype tt; /* Get the current timezone. */ - zone = calendar_config_get_icaltimezone (); + model = e_memo_table_get_model (memo_table); + zone = e_cal_model_get_timezone (model); tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone); diff --git a/calendar/gui/e-memos.c b/calendar/gui/e-memos.c deleted file mode 100644 index 8a10802bff..0000000000 --- a/calendar/gui/e-memos.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Federico Mena Quintero <federico@ximian.com> - * Damon Chaplin <damon@ximian.com> - * Rodrigo Moya <rodrigo@ximian.com> - * Nathan Owens <pianocomp81@yahoo.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <glib/gi18n.h> -#include <libedataserver/e-time-utils.h> -#include <table/e-table-scrolled.h> -#include <widgets/menus/gal-view-instance.h> -#include <widgets/menus/gal-view-factory-etable.h> -#include <widgets/menus/gal-view-etable.h> - -#include "e-util/e-error.h" -#include "e-util/e-categories-config.h" -#include "e-util/e-util-private.h" -#include <libecal/e-cal-time-util.h> -#include <libedataserver/e-url.h> -#include <libedataserver/e-categories.h> -#include "widgets/menus/gal-view-menus.h" -#include "dialogs/delete-error.h" -#include "calendar-config.h" -#include "cal-search-bar.h" -#include "comp-util.h" -#include "e-memo-table-config.h" -#include "misc.h" -#include "e-cal-component-memo-preview.h" -#include "e-memos.h" -#include "common/authentication.h" - -/* Private part of the GnomeCalendar structure */ -struct _EMemosPrivate { - /* The memo lists for display */ - GHashTable *clients; - GList *clients_list; - ECal *default_client; - - ECalView *query; - - /* The EMemoTable showing the memos. */ - GtkWidget *memos_view; - EMemoTableConfig *memos_view_config; - - /* Calendar search bar for memos */ - GtkWidget *search_bar; - - /* The preview */ - GtkWidget *preview; - - gchar *current_uid; - gchar *sexp; - - /* View instance and the view menus handler */ - GalViewInstance *view_instance; - GalViewMenus *view_menus; - - GList *notifications; -}; - -static void setup_widgets (EMemos *memos); -static void e_memos_destroy (GtkObject *object); -static void update_view (EMemos *memos); - -static void categories_changed_cb (gpointer object, gpointer user_data); - -/* Signal IDs */ -enum { - SELECTION_CHANGED, - SOURCE_ADDED, - SOURCE_REMOVED, - LAST_SIGNAL -}; - -static guint e_memos_signals[LAST_SIGNAL] = { 0 }; - -G_DEFINE_TYPE (EMemos, e_memos, GTK_TYPE_TABLE) - -/* Callback used when the sexp in the search bar changes */ -static void -search_bar_sexp_changed_cb (CalSearchBar *cal_search, const gchar *sexp, gpointer data) -{ - EMemos *memos; - EMemosPrivate *priv; - - memos = E_MEMOS (data); - priv = memos->priv; - - if (priv->sexp) - g_free (priv->sexp); - - priv->sexp = g_strdup (sexp); - - update_view (memos); -} - -/* Callback used when the selected category in the search bar changes */ -static void -search_bar_category_changed_cb (CalSearchBar *cal_search, const gchar *category, gpointer data) -{ - EMemos *memos; - EMemosPrivate *priv; - ECalModel *model; - - memos = E_MEMOS (data); - priv = memos->priv; - - model = e_memo_table_get_model (E_MEMO_TABLE (priv->memos_view)); - e_cal_model_set_default_category (model, category); -} - -static void -set_timezone (EMemos *memos) -{ - EMemosPrivate *priv; - icaltimezone *zone; - GList *l; - - priv = memos->priv; - - zone = calendar_config_get_icaltimezone (); - for (l = priv->clients_list; l != NULL; l = l->next) { - ECal *client = l->data; - - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) - /* FIXME Error checking */ - e_cal_set_default_timezone (client, zone, NULL); - } - - if (priv->preview) - e_cal_component_memo_preview_set_default_timezone (E_CAL_COMPONENT_MEMO_PREVIEW (priv->preview), zone); -} - -static void -timezone_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - EMemos *memos = data; - - set_timezone (memos); -} - -static void -update_view (EMemos *memos) -{ - EMemosPrivate *priv; - ECalModel *model; - - priv = memos->priv; - - model = e_memo_table_get_model (E_MEMO_TABLE (priv->memos_view)); - - e_cal_model_set_search_query (model, priv->sexp); - - e_cal_component_memo_preview_clear (E_CAL_COMPONENT_MEMO_PREVIEW (priv->preview)); -} - -static void -setup_config (EMemos *memos) -{ - EMemosPrivate *priv; - guint not; - - priv = memos->priv; - - /* Timezone */ - set_timezone (memos); - - not = calendar_config_add_notification_timezone (timezone_changed_cb, memos); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); -} - -static void -setup_widgets (EMemos *memos) -{ - EMemosPrivate *priv; - ETable *etable; - ECalModel *model; - - priv = memos->priv; - - priv->search_bar = cal_search_bar_new (CAL_SEARCH_MEMOS_DEFAULT); - g_signal_connect (priv->search_bar, "sexp_changed", - G_CALLBACK (search_bar_sexp_changed_cb), memos); - g_signal_connect (priv->search_bar, "category_changed", - G_CALLBACK (search_bar_category_changed_cb), memos); - - categories_changed_cb (NULL, memos); - - gtk_table_attach (GTK_TABLE (memos), priv->search_bar, 0, 1, 0, 1, - GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); - gtk_widget_show (priv->search_bar); - - /* create the memo list */ - priv->memos_view = e_memo_table_new (); - priv->memos_view_config = e_memo_table_config_new (E_MEMO_TABLE (priv->memos_view)); - - g_signal_connect (etable, "table_drag_data_get", - G_CALLBACK(table_drag_data_get), memos); -} - -/* Class initialization function for the gnome calendar */ -static void -e_memos_class_init (EMemosClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass *) klass; - - e_memos_signals[SELECTION_CHANGED] = - g_signal_new ("selection_changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMemosClass, selection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - e_memos_signals[SOURCE_ADDED] = - g_signal_new ("source_added", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMemosClass, source_added), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - G_TYPE_OBJECT); - - e_memos_signals[SOURCE_REMOVED] = - g_signal_new ("source_removed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMemosClass, source_removed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - G_TYPE_OBJECT); - - object_class->destroy = e_memos_destroy; - - klass->selection_changed = NULL; - klass->source_added = NULL; - klass->source_removed = NULL; -} - -static void -categories_changed_cb (gpointer object, gpointer user_data) -{ - GList *cat_list; - GPtrArray *cat_array; - EMemosPrivate *priv; - EMemos *memos = user_data; - - priv = memos->priv; - - cat_array = g_ptr_array_new (); - cat_list = e_categories_get_list (); - while (cat_list != NULL) { - if (e_categories_is_searchable ((const gchar *) cat_list->data)) - g_ptr_array_add (cat_array, cat_list->data); - cat_list = g_list_remove (cat_list, cat_list->data); - } - - cal_search_bar_set_categories (CAL_SEARCH_BAR(priv->search_bar), cat_array); - - g_ptr_array_free (cat_array, TRUE); -} - -/* Object initialization function for the gnome calendar */ -static void -e_memos_init (EMemos *memos) -{ - EMemosPrivate *priv; - - priv = g_new0 (EMemosPrivate, 1); - memos->priv = priv; - - setup_config (memos); - setup_widgets (memos); - - e_categories_register_change_listener (G_CALLBACK (categories_changed_cb), memos); - - priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - priv->query = NULL; - priv->view_instance = NULL; - priv->view_menus = NULL; - priv->current_uid = NULL; - priv->sexp = g_strdup ("#t"); - update_view (memos); -} - -static void -e_memos_destroy (GtkObject *object) -{ - EMemos *memos; - EMemosPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (E_IS_MEMOS (object)); - - memos = E_MEMOS (object); - priv = memos->priv; - - if (priv) { - GList *l; - - e_categories_unregister_change_listener (G_CALLBACK (categories_changed_cb), memos); - - /* disconnect from signals on all the clients */ - for (l = priv->clients_list; l != NULL; l = l->next) { - g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, memos); - } - - g_hash_table_destroy (priv->clients); - g_list_free (priv->clients_list); - - if (priv->current_uid) { - g_free (priv->current_uid); - priv->current_uid = NULL; - } - - if (priv->sexp) { - g_free (priv->sexp); - priv->sexp = NULL; - } - - if (priv->memos_view_config) { - g_object_unref (priv->memos_view_config); - priv->memos_view_config = NULL; - } - - for (l = priv->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - priv->notifications = NULL; - - g_free (priv); - memos->priv = NULL; - } - - if (GTK_OBJECT_CLASS (e_memos_parent_class)->destroy) - (* GTK_OBJECT_CLASS (e_memos_parent_class)->destroy) (object); -} - -ECal * -e_memos_get_default_client (EMemos *memos) -{ - EMemosPrivate *priv; - - g_return_val_if_fail (memos != NULL, NULL); - g_return_val_if_fail (E_IS_MEMOS (memos), NULL); - - priv = memos->priv; - - return e_cal_model_get_default_client (e_memo_table_get_model (E_MEMO_TABLE (priv->memos_view))); -} diff --git a/calendar/gui/e-memos.h b/calendar/gui/e-memos.h deleted file mode 100644 index 4c49f56a79..0000000000 --- a/calendar/gui/e-memos.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Federico Mena Quintero <federico@ximian.com> - * Damon Chaplin <damon@ximian.com> - * Nathan Owens <pianocomp81@yahoo.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef _E_MEMOS_H_ -#define _E_MEMOS_H_ - -#include <gtk/gtk.h> -#include <libedataserver/e-source.h> -#include <libecal/e-cal.h> -#include "e-memo-table.h" - -#define E_TYPE_MEMOS (e_memos_get_type ()) -#define E_MEMOS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MEMOS, EMemos)) -#define E_MEMOS_CLASS(klass) (G_TYPE_CHECK_INSTANCE_CAST_CLASS ((klass), E_TYPE_MEMOS, \ - EMemosClass)) -#define E_IS_MEMOS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MEMOS)) -#define E_IS_MEMOS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_MEMOS)) - -typedef struct _EMemos EMemos; -typedef struct _EMemosClass EMemosClass; -typedef struct _EMemosPrivate EMemosPrivate; - -struct _EMemos { - GtkTable table; - - /* Private data */ - EMemosPrivate *priv; -}; - -struct _EMemosClass { - GtkTableClass parent_class; - - /* Notification signals */ - void (* selection_changed) (EMemos *memos, gint n_selected); - void (* source_added) (EMemos *memos, ESource *source); - void (* source_removed) (EMemos *memos, ESource *source); -}; - -GType e_memos_get_type (void); -GtkWidget *e_memos_construct (EMemos *memos); - -GtkWidget *e_memos_new (void); - -gboolean e_memos_add_memo_source (EMemos *memos, ESource *source); -gboolean e_memos_remove_memo_source (EMemos *memos, ESource *source); -gboolean e_memos_set_default_source (EMemos *memos, ESource *source); -ECal *e_memos_get_default_client (EMemos *memos); - -void e_memos_open_memo (EMemos *memos); -void e_memos_new_memo (EMemos *memos); -void e_memos_complete_selected (EMemos *memos); -void e_memos_delete_selected (EMemos *memos); - -void e_memos_setup_view_menus (EMemos *memos, BonoboUIComponent *uic); -void e_memos_discard_view_menus (EMemos *memos); - -EMemoTable *e_memos_get_calendar_table (EMemos *memos); -GtkWidget *e_memos_get_preview (EMemos *memos); - -#endif /* _E_MEMOS_H_ */ diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c deleted file mode 100644 index 2f24ebfbc2..0000000000 --- a/calendar/gui/e-tasks.c +++ /dev/null @@ -1,724 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Federico Mena Quintero <federico@ximian.com> - * Damon Chaplin <damon@ximian.com> - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <glib/gi18n.h> -#include <libedataserver/e-time-utils.h> -#include <table/e-table-scrolled.h> -#include <widgets/menus/gal-view-instance.h> -#include <widgets/menus/gal-view-factory-etable.h> -#include <widgets/menus/gal-view-etable.h> - -#include "e-util/e-error.h" -#include "e-util/e-categories-config.h" -#include "e-util/e-util-private.h" -#include "shell/e-user-creatable-items-handler.h" -#include <libedataserver/e-url.h> -#include <libedataserver/e-categories.h> -#include <libecal/e-cal-time-util.h> -#include "widgets/menus/gal-view-menus.h" -#include "dialogs/delete-error.h" -#include "dialogs/task-editor.h" -#include "cal-search-bar.h" -#include "calendar-config.h" -#include "calendar-component.h" -#include "comp-util.h" -#include "e-calendar-table-config.h" -#include "misc.h" -#include "tasks-component.h" -#include "e-cal-component-preview.h" -#include "e-tasks.h" -#include "common/authentication.h" -#include "e-cal-menu.h" -#include "e-cal-model-tasks.h" - -/* Private part of the GnomeCalendar structure */ -struct _ETasksPrivate { - /* The task lists for display */ - GHashTable *clients; - GList *clients_list; - ECal *default_client; - - ECalView *query; - - /* The ECalendarTable showing the tasks. */ - GtkWidget *tasks_view; - ECalendarTableConfig *tasks_view_config; - - /* Calendar search bar for tasks */ - GtkWidget *search_bar; - - /* Paned widget */ - GtkWidget *paned; - - /* The preview */ - GtkWidget *preview; - - gchar *current_uid; - gchar *sexp; - guint update_timeout; - - GList *notifications; -}; - -static void setup_widgets (ETasks *tasks); -static void e_tasks_destroy (GtkObject *object); - -static void backend_error_cb (ECal *client, const gchar *message, gpointer data); - -/* Signal IDs */ -enum { - SELECTION_CHANGED, - SOURCE_ADDED, - SOURCE_REMOVED, - LAST_SIGNAL -}; - -static guint e_tasks_signals[LAST_SIGNAL] = { 0 }; - -G_DEFINE_TYPE (ETasks, e_tasks, GTK_TYPE_TABLE) - -/* Callback used when the selected category in the search bar changes */ -static void -search_bar_category_changed_cb (CalSearchBar *cal_search, const gchar *category, gpointer data) -{ - ETasks *tasks; - ETasksPrivate *priv; - ECalModel *model; - - tasks = E_TASKS (data); - priv = tasks->priv; - - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - e_cal_model_set_default_category (model, category); -} - -/** - * get_selected_components_cb - * Helper function to fill list of selected components in ECalendarTable. - * This function is called from e_table_selected_row_foreach. - **/ -static void -get_selected_components_cb (gint model_row, gpointer data) -{ - struct AffectedComponents *ac = (struct AffectedComponents *) data; - - if (!ac || !ac->cal_table) - return; - - ac->components = g_slist_prepend (ac->components, e_cal_model_get_component_at (E_CAL_MODEL (ac->cal_table->model), model_row)); -} - -/** - * do_for_selected_components - * Calls function func for all selected components in cal_table. - * - * @param cal_table Table with selected components of our interest. - * @param func Function to be called on each selected component from cal_table. - * The first parameter of this function is a pointer to ECalModelComponent and - * the second parameter of this function is pointer to cal_table - * @param user_data User data, will be passed to func. - **/ -static void -do_for_selected_components (ECalendarTable *cal_table, GFunc func, gpointer user_data) -{ - ETable *etable; - struct AffectedComponents ac; - - g_return_if_fail (cal_table != NULL); - - ac.cal_table = cal_table; - ac.components = NULL; - - etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)); - e_table_selected_row_foreach (etable, get_selected_components_cb, &ac); - - g_slist_foreach (ac.components, func, user_data); - g_slist_free (ac.components); -} - -/** - * obtain_list_of_components - * As a callback function to convert each ECalModelComponent to string - * of format "source_uid\ncomponent_str" and add this newly allocated - * string to the list of components. Strings should be freed with g_free. - * - * @param data ECalModelComponent object. - * @param user_data Pointer to GSList list, where to put new strings. - **/ -static void -obtain_list_of_components (gpointer data, gpointer user_data) -{ - GSList **list; - ECalModelComponent *comp_data; - - list = (GSList **) user_data; - comp_data = (ECalModelComponent *) data; - - if (list && comp_data) { - gchar *comp_str; - icalcomponent *vcal; - - vcal = e_cal_util_new_top_level (); - e_cal_util_add_timezones_from_component (vcal, comp_data->icalcomp); - icalcomponent_add_component (vcal, icalcomponent_new_clone (comp_data->icalcomp)); - - comp_str = icalcomponent_as_ical_string_r (vcal); - if (comp_str) { - ESource *source = e_cal_get_source (comp_data->client); - const gchar *source_uid = e_source_peek_uid (source); - - *list = g_slist_prepend (*list, g_strdup_printf ("%s\n%s", source_uid, comp_str)); - - /* do not free this pointer, it owns libical */ - /* g_free (comp_str); */ - } - - icalcomponent_free (vcal); - g_free (comp_str); - } -} - -static void -table_drag_data_get (ETable *table, - gint row, - gint col, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - ETasks *tasks) -{ - ETasksPrivate *priv; - - priv = tasks->priv; - - if (info == TARGET_VCALENDAR) { - /* we will pass an icalcalendar component for both types */ - GSList *components = NULL; - - do_for_selected_components (E_CALENDAR_TABLE (priv->tasks_view), obtain_list_of_components, &components); - - if (components) { - cal_comp_selection_set_string_list (selection_data, components); - - g_slist_foreach (components, (GFunc)g_free, NULL); - g_slist_free (components); - } - } -} - -/* -static void -table_drag_begin (ETable *table, - gint row, - gint col, - GdkDragContext *context, - ETasks *tasks) -{ - -} - -static void -table_drag_end (ETable *table, - gint row, - gint col, - GdkDragContext *context, - ETasks *tasks) -{ - -} -*/ - -static void -table_drag_data_delete (ETable *table, - gint row, - gint col, - GdkDragContext *context, - ETasks *tasks) -{ - /* Moved components are deleted from source immediately when moved, - because some of them can be part of destination source, and we - don't want to delete not-moved tasks. There is no such information - which event has been moved and which not, so skip this method. - */ -} - -#define E_TASKS_TABLE_DEFAULT_STATE \ - "<?xml version=\"1.0\"?>" \ - "<ETableState>" \ - "<column source=\"13\"/>" \ - "<column source=\"14\"/>" \ - "<column source=\"9\"/>" \ - "<column source=\"5\"/>" \ - "<grouping/>" \ - "</ETableState>" - -static void -pane_realized (GtkWidget *widget, ETasks *tasks) -{ - gtk_paned_set_position ((GtkPaned *)widget, calendar_config_get_task_vpane_pos ()); -} - -static void -setup_widgets (ETasks *tasks) -{ - ETasksPrivate *priv; - ETable *etable; - ECalModel *model; - gboolean state; - - priv = tasks->priv; - - priv->search_bar = cal_search_bar_new (CAL_SEARCH_TASKS_DEFAULT); - g_signal_connect (priv->search_bar, "sexp_changed", - G_CALLBACK (search_bar_sexp_changed_cb), tasks); - g_signal_connect (priv->search_bar, "category_changed", - G_CALLBACK (search_bar_category_changed_cb), tasks); - - gtk_table_attach (GTK_TABLE (tasks), priv->search_bar, 0, 1, 0, 1, - GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); - gtk_widget_show (priv->search_bar); - - /* add the paned widget for the task list and task detail areas */ - priv->paned = gtk_vpaned_new (); - g_signal_connect (priv->paned, "realize", G_CALLBACK (pane_realized), tasks); - - gtk_table_attach (GTK_TABLE (tasks), priv->paned, 0, 1, 1, 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - gtk_widget_show (priv->paned); - - /* create the task list */ - priv->tasks_view = e_calendar_table_new (); - g_object_set_data (G_OBJECT (priv->tasks_view), "tasks", tasks); - priv->tasks_view_config = e_calendar_table_config_new (E_CALENDAR_TABLE (priv->tasks_view)); - - g_signal_connect (priv->tasks_view, "user_created", G_CALLBACK (user_created_cb), tasks); - - etable = e_table_scrolled_get_table ( - E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable)); - e_table_set_state (etable, E_TASKS_TABLE_DEFAULT_STATE); - gtk_paned_add1 (GTK_PANED (priv->paned), priv->tasks_view); - gtk_widget_show (priv->tasks_view); - - e_table_drag_source_set (etable, GDK_BUTTON1_MASK, - list_drag_types, num_list_drag_types, - GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_ASK); - - g_signal_connect (etable, "table_drag_data_get", - G_CALLBACK(table_drag_data_get), tasks); - g_signal_connect (etable, "table_drag_data_delete", - G_CALLBACK(table_drag_data_delete), tasks); - - /* - e_table_drag_dest_set (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - 0, list_drag_types, num_list_drag_types, GDK_ACTION_LINK); - - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_motion", G_CALLBACK(table_drag_motion_cb), editor); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_drop", G_CALLBACK (table_drag_drop_cb), editor); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_data_received", G_CALLBACK(table_drag_data_received_cb), editor); - */ - - g_signal_connect (etable, "selection_change", G_CALLBACK (table_selection_change_cb), tasks); - - /* create the task detail */ - priv->preview = e_cal_component_preview_new (); - e_cal_component_preview_set_default_timezone (E_CAL_COMPONENT_PREVIEW (priv->preview), calendar_config_get_icaltimezone ()); - gtk_paned_add2 (GTK_PANED (priv->paned), priv->preview); - state = calendar_config_get_preview_state (); - - if (state) - gtk_widget_show (priv->preview); -} - -/* Class initialization function for the gnome calendar */ -static void -e_tasks_class_init (ETasksClass *class) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass *) class; - - e_tasks_signals[SELECTION_CHANGED] = - g_signal_new ("selection_changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ETasksClass, selection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - e_tasks_signals[SOURCE_ADDED] = - g_signal_new ("source_added", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (ETasksClass, source_added), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - G_TYPE_OBJECT); - - e_tasks_signals[SOURCE_REMOVED] = - g_signal_new ("source_removed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (ETasksClass, source_removed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - G_TYPE_OBJECT); - - object_class->destroy = e_tasks_destroy; - - class->selection_changed = NULL; - class->source_added = NULL; - class->source_removed = NULL; -} - -/* Object initialization function for the gnome calendar */ -static void -e_tasks_init (ETasks *tasks) -{ - ETasksPrivate *priv; - - priv = g_new0 (ETasksPrivate, 1); - tasks->priv = priv; - - setup_widgets (tasks); - - priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - priv->query = NULL; - priv->current_uid = NULL; - priv->sexp = g_strdup ("#t"); - priv->default_client = NULL; -} - -GtkWidget * -e_tasks_new (void) -{ - ETasks *tasks; - - tasks = g_object_new (e_tasks_get_type (), NULL); - - return GTK_WIDGET (tasks); -} - -static void -e_tasks_destroy (GtkObject *object) -{ - ETasks *tasks; - ETasksPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (E_IS_TASKS (object)); - - tasks = E_TASKS (object); - priv = tasks->priv; - - if (priv) { - GList *l; - - /* disconnect from signals on all the clients */ - for (l = priv->clients_list; l != NULL; l = l->next) { - g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, tasks); - } - - g_hash_table_destroy (priv->clients); - g_list_free (priv->clients_list); - - if (priv->default_client) - g_object_unref (priv->default_client); - priv->default_client = NULL; - - if (priv->current_uid) { - g_free (priv->current_uid); - priv->current_uid = NULL; - } - - if (priv->sexp) { - g_free (priv->sexp); - priv->sexp = NULL; - } - - if (priv->tasks_view_config) { - g_object_unref (priv->tasks_view_config); - priv->tasks_view_config = NULL; - } - - for (l = priv->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - priv->notifications = NULL; - - g_free (priv); - tasks->priv = NULL; - } - - if (GTK_OBJECT_CLASS (e_tasks_parent_class)->destroy) - (* GTK_OBJECT_CLASS (e_tasks_parent_class)->destroy) (object); -} - -static void -set_status_message (ETasks *tasks, const gchar *message, ...) -{ - ETasksPrivate *priv; - va_list args; - gchar sz[2048], *msg_string = NULL; - - if (message) { - va_start (args, message); - vsnprintf (sz, sizeof sz, message, args); - va_end (args); - msg_string = sz; - } - - priv = tasks->priv; - - e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->tasks_view), msg_string, -1); -} - -typedef void (*open_func) (ECal *, ECalendarStatus, ETasks *); - -static gboolean -open_ecal (ETasks *tasks, ECal *cal, gboolean only_if_exists, open_func of) -{ - ETasksPrivate *priv; - icaltimezone *zone; - - priv = tasks->priv; - - zone = calendar_config_get_icaltimezone (); - e_cal_set_default_timezone (cal, zone, NULL); - - set_status_message (tasks, _("Opening tasks at %s"), e_cal_get_uri (cal)); - - g_signal_connect (G_OBJECT (cal), "cal_opened", G_CALLBACK (of), tasks); - e_cal_open_async (cal, only_if_exists); - - return TRUE; -} - -void -e_tasks_open_task (ETasks *tasks) -{ - ECalendarTable *cal_table; - - cal_table = e_tasks_get_calendar_table (tasks); - e_calendar_table_open_selected (cal_table); -} - -void -e_tasks_new_task (ETasks *tasks) -{ - ETasksPrivate *priv; - CompEditor *editor; - ECalComponent *comp; - const gchar *category; - ECal *ecal; - guint32 flags = 0; - - g_return_if_fail (E_IS_TASKS (tasks)); - - priv = tasks->priv; - - /* FIXME What to do about no default client */ - ecal = e_tasks_get_default_client (tasks); - if (!ecal) - return; - - flags |= COMP_EDITOR_NEW_ITEM | COMP_EDITOR_USER_ORG; - - comp = cal_comp_task_new_with_defaults (ecal); - - category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar)); - e_cal_component_set_categories (comp, category); - - editor = task_editor_new (ecal, flags); - comp_editor_edit_comp (editor, comp); - g_object_unref (comp); - - gtk_window_present (GTK_WINDOW (editor)); -} - -gboolean -e_tasks_remove_todo_source (ETasks *tasks, ESource *source) -{ - ETasksPrivate *priv; - ECal *client; - ECalModel *model; - const gchar *uid; - - g_return_val_if_fail (tasks != NULL, FALSE); - g_return_val_if_fail (E_IS_TASKS (tasks), FALSE); - g_return_val_if_fail (E_IS_SOURCE (source), FALSE); - - priv = tasks->priv; - - uid = e_source_peek_uid (source); - client = g_hash_table_lookup (priv->clients, uid); - if (!client) - return TRUE; - - priv->clients_list = g_list_remove (priv->clients_list, client); - g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, tasks); - - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - e_cal_model_remove_client (model, client); - - g_hash_table_remove (priv->clients, uid); - - g_signal_emit (tasks, e_tasks_signals[SOURCE_REMOVED], 0, source); - - return TRUE; -} - -gboolean -e_tasks_set_default_source (ETasks *tasks, ESource *source) -{ - ETasksPrivate *priv; - ECal *ecal; - - g_return_val_if_fail (tasks != NULL, FALSE); - g_return_val_if_fail (E_IS_TASKS (tasks), FALSE); - g_return_val_if_fail (E_IS_SOURCE (source), FALSE); - - priv = tasks->priv; - - ecal = g_hash_table_lookup (priv->clients, e_source_peek_uid (source)); - - if (priv->default_client) - g_object_unref (priv->default_client); - - if (ecal) { - priv->default_client = g_object_ref (ecal); - } else { - priv->default_client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO); - if (!priv->default_client) - return FALSE; - } - - open_ecal (tasks, priv->default_client, FALSE, default_client_cal_opened_cb); - - return TRUE; -} - -/** - * e_tasks_expunge: - * @tasks: A tasks control widget - * - * Removes all tasks marked as completed - **/ -void -e_tasks_delete_completed (ETasks *tasks) -{ - ETasksPrivate *priv; - gchar *sexp; - GList *l; - - g_return_if_fail (tasks != NULL); - g_return_if_fail (E_IS_TASKS (tasks)); - - priv = tasks->priv; - - sexp = g_strdup ("(is-completed?)"); - - set_status_message (tasks, _("Expunging")); - - for (l = priv->clients_list; l != NULL; l = l->next) { - ECal *client = l->data; - GList *objects, *m; - gboolean read_only = TRUE; - - e_cal_is_read_only (client, &read_only, NULL); - if (read_only) - continue; - - if (!e_cal_get_object_list (client, sexp, &objects, NULL)) { - g_warning (G_STRLOC ": Could not get the objects"); - - continue; - } - - for (m = objects; m; m = m->next) { - /* FIXME Better error handling */ - e_cal_remove_object (client, icalcomponent_get_uid (m->data), NULL); - } - - g_list_foreach (objects, (GFunc) icalcomponent_free, NULL); - g_list_free (objects); - } - - set_status_message (tasks, NULL); - - g_free (sexp); -} - -void -e_tasks_open_task_id (ETasks *tasks, - const gchar *src_uid, - const gchar *comp_uid, - const gchar *comp_rid) -{ - ECal *client = NULL; - GList *l; - icalcomponent* icalcomp = NULL; - icalproperty *attendee_prop = NULL; - - if (!src_uid || !comp_uid) - return; - - for (l = tasks->priv->clients_list; l != NULL; l = l->next) { - ESource *client_src; - - client = l->data; - client_src = e_cal_get_source (client); - - if (!strcmp (src_uid, e_source_peek_uid (client_src))) - break; - } - - if (!client) - return; - - e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, NULL); - - if (!icalcomp) - return; - - attendee_prop = icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY); - e_calendar_table_open_task (E_CALENDAR_TABLE (tasks->priv->tasks_view), client, icalcomp, attendee_prop != NULL); - icalcomponent_free (icalcomp); - - return; -} diff --git a/calendar/gui/e-tasks.h b/calendar/gui/e-tasks.h deleted file mode 100644 index a37db26117..0000000000 --- a/calendar/gui/e-tasks.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Federico Mena Quintero <federico@ximian.com> - * Damon Chaplin <damon@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef _E_TASKS_H_ -#define _E_TASKS_H_ - -#include <bonobo/bonobo-ui-component.h> -#include <gtk/gtk.h> -#include <libedataserver/e-source.h> -#include <libecal/e-cal.h> -#include "e-calendar-table.h" - -#define E_TYPE_TASKS (e_tasks_get_type ()) -#define E_TASKS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_TASKS, ETasks)) -#define E_TASKS_CLASS(klass) (G_TYPE_CHECK_INSTANCE_CAST_CLASS ((klass), E_TYPE_TASKS, \ - ETasksClass)) -#define E_IS_TASKS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_TASKS)) -#define E_IS_TASKS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_TASKS)) - -typedef struct _ETasks ETasks; -typedef struct _ETasksClass ETasksClass; -typedef struct _ETasksPrivate ETasksPrivate; - -struct _ETasks { - GtkTable table; - - /* Private data */ - ETasksPrivate *priv; -}; - -struct _ETasksClass { - GtkTableClass parent_class; - - /* Notification signals */ - void (* selection_changed) (ETasks *tasks, gint n_selected); - void (* source_added) (ETasks *tasks, ESource *source); - void (* source_removed) (ETasks *tasks, ESource *source); -}; - -GType e_tasks_get_type (void); -GtkWidget *e_tasks_construct (ETasks *tasks); - -GtkWidget *e_tasks_new (void); - -gboolean e_tasks_add_todo_source (ETasks *tasks, ESource *source); -gboolean e_tasks_remove_todo_source (ETasks *tasks, ESource *source); -gboolean e_tasks_set_default_source (ETasks *tasks, ESource *source); -void e_tasks_open_task (ETasks *tasks); -void e_tasks_open_task_id (ETasks *tasks, - const gchar *src_uid, - const gchar *comp_uid, - const gchar *comp_rid); -void e_tasks_new_task (ETasks *tasks); -void e_tasks_delete_completed (ETasks *tasks); - -#endif /* _E_TASKS_H_ */ diff --git a/calendar/gui/e-timezone-entry.c b/calendar/gui/e-timezone-entry.c index f3e239aa63..53a8a4498b 100644 --- a/calendar/gui/e-timezone-entry.c +++ b/calendar/gui/e-timezone-entry.c @@ -33,12 +33,16 @@ #include <glib/gi18n.h> #include "e-timezone-entry.h" +#define E_TIMEZONE_ENTRY_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryPrivate)) + struct _ETimezoneEntryPrivate { /* The current timezone, set in e_timezone_entry_set_timezone() or from the timezone dialog. Note that we don't copy it or use a ref count - we assume it is never destroyed for the lifetime of this widget. */ - icaltimezone *zone; + icaltimezone *timezone; /* This can be set to the default timezone. If the current timezone setting in the ETimezoneEntry matches this, then the entry field @@ -50,314 +54,320 @@ struct _ETimezoneEntryPrivate { }; enum { - CHANGED, - LAST_SIGNAL + PROP_0, + PROP_TIMEZONE }; -static void e_timezone_entry_destroy (GtkObject *object); - -static gboolean e_timezone_entry_mnemonic_activate (GtkWidget *widget, - gboolean group_cycling); -static gboolean e_timezone_entry_focus (GtkWidget *widget, - GtkDirectionType direction); -static void on_entry_changed (GtkEntry *entry, - ETimezoneEntry *tentry); -static void on_button_clicked (GtkWidget *widget, - ETimezoneEntry *tentry); -static void add_relation (ETimezoneEntry *tentry, - GtkWidget *widget); - -static void e_timezone_entry_set_entry (ETimezoneEntry *tentry); +enum { + CHANGED, + LAST_SIGNAL +}; -static guint timezone_entry_signals[LAST_SIGNAL] = { 0 }; +static guint signals[LAST_SIGNAL]; G_DEFINE_TYPE (ETimezoneEntry, e_timezone_entry, GTK_TYPE_HBOX) static void -e_timezone_entry_class_init (ETimezoneEntryClass *class) +timezone_entry_emit_changed (ETimezoneEntry *timezone_entry) { - GtkObjectClass *object_class = (GtkObjectClass *) class; - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); - - object_class = (GtkObjectClass*) class; - - widget_class->mnemonic_activate = e_timezone_entry_mnemonic_activate; - widget_class->focus = e_timezone_entry_focus; - timezone_entry_signals[CHANGED] = - g_signal_new ("changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ETimezoneEntryClass, changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - object_class->destroy = e_timezone_entry_destroy; - - class->changed = NULL; + g_signal_emit (timezone_entry, signals[CHANGED], 0); } static void -e_timezone_entry_init (ETimezoneEntry *tentry) +timezone_entry_update_entry (ETimezoneEntry *timezone_entry) { - ETimezoneEntryPrivate *priv; - AtkObject *a11y; - - tentry->priv = priv = g_new0 (ETimezoneEntryPrivate, 1); + const gchar *display_name; + gchar *name_buffer; + icaltimezone *timezone; - priv->zone = NULL; - priv->default_zone = NULL; + timezone = e_timezone_entry_get_timezone (timezone_entry); - priv->entry = gtk_entry_new (); - gtk_editable_set_editable (GTK_EDITABLE (priv->entry), FALSE); - /*gtk_widget_set_usize (priv->date_entry, 90, 0);*/ - gtk_box_pack_start (GTK_BOX (tentry), priv->entry, TRUE, TRUE, 0); - gtk_widget_show (priv->entry); - g_signal_connect (priv->entry, "changed", G_CALLBACK (on_entry_changed), tentry); + if (timezone != NULL) { + display_name = icaltimezone_get_display_name (timezone); - priv->button = gtk_button_new_with_label (_("Select...")); - g_signal_connect (priv->button, "clicked", G_CALLBACK (on_button_clicked), tentry); - gtk_box_pack_start (GTK_BOX (tentry), priv->button, FALSE, FALSE, 6); - gtk_widget_show (priv->button); - a11y = gtk_widget_get_accessible (priv->button); - if (a11y != NULL) { - atk_object_set_name (a11y, _("Select Timezone")); - } -} + /* We check if it is one of our builtin timezone + names, in which case we call gettext to translate + it. If it isn't a builtin timezone name, we don't. */ + if (icaltimezone_get_builtin_timezone (display_name)) + display_name = _(display_name); + } else + display_name = ""; -/** - * e_timezone_entry_new: - * - * Description: Creates a new #ETimezoneEntry widget which can be used - * to provide an easy to use way for entering dates and times. - * - * Returns: a new #ETimezoneEntry widget. - */ -GtkWidget * -e_timezone_entry_new (void) -{ - ETimezoneEntry *tentry; + name_buffer = g_strdup (display_name); - tentry = g_object_new (e_timezone_entry_get_type (), NULL); + gtk_entry_set_text (GTK_ENTRY (timezone_entry->priv->entry), name_buffer); - GTK_WIDGET_SET_FLAGS (GTK_WIDGET(tentry), GTK_CAN_FOCUS); + /* XXX Do we need to hide the timezone entry at all? I know + * this overrules the previous case of hiding the timezone + * entry field when we select the default timezone. */ + gtk_widget_show (timezone_entry->priv->entry); - return GTK_WIDGET (tentry); + g_free (name_buffer); } - static void -e_timezone_entry_destroy (GtkObject *object) +timezone_entry_add_relation (ETimezoneEntry *timezone_entry) { - ETimezoneEntry *tentry; + AtkObject *a11y_timezone_entry; + AtkObject *a11y_widget; + AtkRelationSet *set; + AtkRelation *relation; + GtkWidget *widget; + GPtrArray *target; + gpointer target_object; - g_return_if_fail (E_IS_TIMEZONE_ENTRY (object)); + /* add a labelled_by relation for widget for accessibility */ - tentry = E_TIMEZONE_ENTRY (object); + widget = GTK_WIDGET (timezone_entry); + a11y_timezone_entry = gtk_widget_get_accessible (widget); - g_free (tentry->priv); - tentry->priv = NULL; + widget = timezone_entry->priv->entry; + a11y_widget = gtk_widget_get_accessible (widget); - if (GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy) - (* GTK_OBJECT_CLASS (e_timezone_entry_parent_class)->destroy) (object); + set = atk_object_ref_relation_set (a11y_widget); + if (set != NULL) { + relation = atk_relation_set_get_relation_by_type ( + set, ATK_RELATION_LABELLED_BY); + /* check whether has a labelled_by relation already */ + if (relation != NULL) + return; + } + + set = atk_object_ref_relation_set (a11y_timezone_entry); + if (!set) + return; + + relation = atk_relation_set_get_relation_by_type ( + set, ATK_RELATION_LABELLED_BY); + if (relation != NULL) { + target = atk_relation_get_target (relation); + target_object = g_ptr_array_index (target, 0); + if (ATK_IS_OBJECT (target_object)) { + atk_object_add_relationship ( + a11y_widget, + ATK_RELATION_LABELLED_BY, + ATK_OBJECT (target_object)); + } + } } /* The arrow button beside the date field has been clicked, so we show the popup with the ECalendar in. */ static void -on_button_clicked (GtkWidget *widget, - ETimezoneEntry *tentry) +timezone_entry_button_clicked_cb (ETimezoneEntry *timezone_entry) { - ETimezoneEntryPrivate *priv; ETimezoneDialog *timezone_dialog; GtkWidget *dialog; - - priv = tentry->priv; + icaltimezone *timezone; timezone_dialog = e_timezone_dialog_new (); - e_timezone_dialog_set_timezone (timezone_dialog, priv->zone); + timezone = e_timezone_entry_get_timezone (timezone_entry); + e_timezone_dialog_set_timezone (timezone_dialog, timezone); dialog = e_timezone_dialog_get_toplevel (timezone_dialog); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { - priv->zone = e_timezone_dialog_get_timezone (timezone_dialog); - e_timezone_entry_set_entry (tentry); - } + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT) + goto exit; + timezone = e_timezone_dialog_get_timezone (timezone_dialog); + e_timezone_entry_set_timezone (timezone_entry, timezone); + timezone_entry_update_entry (timezone_entry); + +exit: g_object_unref (timezone_dialog); } static void -on_entry_changed (GtkEntry *entry, - ETimezoneEntry *tentry) +timezone_entry_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - g_signal_emit (GTK_OBJECT (tentry), timezone_entry_signals[CHANGED], 0); -} - -icaltimezone* -e_timezone_entry_get_timezone (ETimezoneEntry *tentry) -{ - ETimezoneEntryPrivate *priv; - - g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (tentry), NULL); - - priv = tentry->priv; + switch (property_id) { + case PROP_TIMEZONE: + e_timezone_entry_set_timezone ( + E_TIMEZONE_ENTRY (object), + g_value_get_pointer (value)); + return; + } - return priv->zone; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void -add_relation (ETimezoneEntry *tentry, - GtkWidget *widget) +timezone_entry_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { - AtkObject *a11ytentry, *a11yWidget; - AtkRelationSet *set; - AtkRelation *relation; - GPtrArray *target; - gpointer target_object; - - /* add a labelled_by relation for widget for accessibility */ - - a11ytentry = gtk_widget_get_accessible (GTK_WIDGET (tentry)); - a11yWidget = gtk_widget_get_accessible (widget); - - set = atk_object_ref_relation_set (a11yWidget); - if (set != NULL) { - relation = atk_relation_set_get_relation_by_type (set, - ATK_RELATION_LABELLED_BY); - /* check whether has a labelled_by relation already */ - if (relation != NULL) + switch (property_id) { + case PROP_TIMEZONE: + g_value_set_pointer ( + value, e_timezone_entry_get_timezone ( + E_TIMEZONE_ENTRY (object))); return; } - set = atk_object_ref_relation_set (a11ytentry); - if (!set) - return; - - relation = atk_relation_set_get_relation_by_type (set, - ATK_RELATION_LABELLED_BY); - if (relation != NULL) { - target = atk_relation_get_target (relation); - target_object = g_ptr_array_index (target, 0); - if (ATK_IS_OBJECT (target_object)) { - atk_object_add_relationship (a11yWidget, - ATK_RELATION_LABELLED_BY, - ATK_OBJECT (target_object)); - } - } + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } -void -e_timezone_entry_set_timezone (ETimezoneEntry *tentry, - icaltimezone *zone) +static gboolean +timezone_entry_mnemonic_activate (GtkWidget *widget, + gboolean group_cycling) { ETimezoneEntryPrivate *priv; - g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry)); + priv = E_TIMEZONE_ENTRY_GET_PRIVATE (widget); - priv = tentry->priv; - - priv->zone = zone; - - e_timezone_entry_set_entry (tentry); + if (GTK_WIDGET_CAN_FOCUS (widget)) { + if (priv->button != NULL) + gtk_widget_grab_focus (priv->button); + } - add_relation (tentry, priv->entry); + return TRUE; } -/* Sets the default timezone. If the current timezone matches this, then the - entry field is hidden. This is useful since most people do not use timezones - so it makes the user interface simpler. */ -void -e_timezone_entry_set_default_timezone (ETimezoneEntry *tentry, - icaltimezone *zone) +static gboolean +timezone_entry_focus (GtkWidget *widget, + GtkDirectionType direction) { ETimezoneEntryPrivate *priv; - g_return_if_fail (E_IS_TIMEZONE_ENTRY (tentry)); + priv = E_TIMEZONE_ENTRY_GET_PRIVATE (widget); - priv = tentry->priv; + if (direction == GTK_DIR_TAB_FORWARD) { + if (GTK_WIDGET_HAS_FOCUS (priv->entry)) + gtk_widget_grab_focus (priv->button); + else if (GTK_WIDGET_HAS_FOCUS (priv->button)) + return FALSE; + else if (GTK_WIDGET_VISIBLE (priv->entry)) + gtk_widget_grab_focus (priv->entry); + else + gtk_widget_grab_focus (priv->button); - priv->default_zone = zone; + } else if (direction == GTK_DIR_TAB_BACKWARD) { + if (GTK_WIDGET_HAS_FOCUS (priv->entry)) + return FALSE; + else if (GTK_WIDGET_HAS_FOCUS (priv->button)) { + if (GTK_WIDGET_VISIBLE (priv->entry)) + gtk_widget_grab_focus (priv->entry); + else + return FALSE; + } else + gtk_widget_grab_focus (priv->button); + } else + return FALSE; - e_timezone_entry_set_entry (tentry); + return TRUE; } static void -e_timezone_entry_set_entry (ETimezoneEntry *tentry) +e_timezone_entry_class_init (ETimezoneEntryClass *class) { - ETimezoneEntryPrivate *priv; - const gchar *display_name; - gchar *name_buffer; + GObjectClass *object_class; + GtkWidgetClass *widget_class; + + g_type_class_add_private (class, sizeof (ETimezoneEntryPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = timezone_entry_set_property; + object_class->get_property = timezone_entry_get_property; + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->mnemonic_activate = timezone_entry_mnemonic_activate; + widget_class->focus = timezone_entry_focus; + + g_object_class_install_property ( + object_class, + PROP_TIMEZONE, + g_param_spec_pointer ( + "timezone", + "Timezone", + NULL, + G_PARAM_READWRITE)); + + signals[CHANGED] = g_signal_new ( + "changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ETimezoneEntryClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} - priv = tentry->priv; +static void +e_timezone_entry_init (ETimezoneEntry *timezone_entry) +{ + AtkObject *a11y; + GtkWidget *widget; - if (priv->zone) { - display_name = icaltimezone_get_display_name (priv->zone); + timezone_entry->priv = E_TIMEZONE_ENTRY_GET_PRIVATE (timezone_entry); - /* We check if it is one of our builtin timezone - names, in which case we call gettext to translate - it. If it isn't a builtin timezone name, we - don't. */ - if (icaltimezone_get_builtin_timezone (display_name)) - display_name = _(display_name); - } else - display_name = ""; + GTK_WIDGET_SET_FLAGS (GTK_WIDGET (timezone_entry), GTK_CAN_FOCUS); - name_buffer = g_strdup (display_name); + widget = gtk_entry_new (); + gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE); + gtk_box_pack_start (GTK_BOX (timezone_entry), widget, TRUE, TRUE, 0); + timezone_entry->priv->entry = widget; + gtk_widget_show (widget); - gtk_entry_set_text (GTK_ENTRY (priv->entry), name_buffer); + g_signal_connect_swapped ( + widget, "changed", + G_CALLBACK (timezone_entry_emit_changed), timezone_entry); - /* do we need to hide the timezone entry at all? i know this overrules the previous case of hiding the timezone - * entry field when we select the default timezone - */ - gtk_widget_show (priv->entry); + widget = gtk_button_new_with_label (_("Select...")); + gtk_box_pack_start (GTK_BOX (timezone_entry), widget, FALSE, FALSE, 6); + timezone_entry->priv->button = widget; + gtk_widget_show (widget); - g_free (name_buffer); + g_signal_connect_swapped ( + widget, "clicked", + G_CALLBACK (timezone_entry_button_clicked_cb), timezone_entry); + + a11y = gtk_widget_get_accessible (timezone_entry->priv->button); + if (a11y != NULL) + atk_object_set_name (a11y, _("Select Timezone")); } -static gboolean -e_timezone_entry_mnemonic_activate (GtkWidget *widget, - gboolean group_cycling) +GtkWidget * +e_timezone_entry_new (void) { - GtkButton *button = NULL; + return g_object_new (E_TYPE_TIMEZONE_ENTRY, NULL); +} - if (GTK_WIDGET_CAN_FOCUS (widget)) { - button = GTK_BUTTON (((ETimezoneEntryPrivate *) ((ETimezoneEntry *) widget)->priv)->button); - if (button != NULL) - gtk_widget_grab_focus (GTK_WIDGET (button)); - } +icaltimezone * +e_timezone_entry_get_timezone (ETimezoneEntry *timezone_entry) +{ + g_return_val_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry), NULL); - return TRUE; + return timezone_entry->priv->timezone; } -static gboolean -e_timezone_entry_focus (GtkWidget *widget, GtkDirectionType direction) +void +e_timezone_entry_set_timezone (ETimezoneEntry *timezone_entry, + icaltimezone *timezone) { - ETimezoneEntry *tentry; + g_return_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry)); - tentry = E_TIMEZONE_ENTRY (widget); + timezone_entry->priv->timezone = timezone; - if (direction == GTK_DIR_TAB_FORWARD) { - if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry)) - gtk_widget_grab_focus (tentry->priv->button); - else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button)) - return FALSE; - else if (GTK_WIDGET_VISIBLE (tentry->priv->entry)) - gtk_widget_grab_focus (tentry->priv->entry); - else - gtk_widget_grab_focus (tentry->priv->button); - } else if (direction == GTK_DIR_TAB_BACKWARD) { - if (GTK_WIDGET_HAS_FOCUS (tentry->priv->entry)) - return FALSE; - else if (GTK_WIDGET_HAS_FOCUS (tentry->priv->button)) { - if (GTK_WIDGET_VISIBLE (tentry->priv->entry)) - gtk_widget_grab_focus (tentry->priv->entry); - else - return FALSE; - } else - gtk_widget_grab_focus (tentry->priv->button); - } else - return FALSE; - return TRUE; + timezone_entry_update_entry (timezone_entry); + timezone_entry_add_relation (timezone_entry); + + g_object_notify (G_OBJECT (timezone_entry), "timezone"); } +/* Sets the default timezone. If the current timezone matches this, + * then the entry field is hidden. This is useful since most people + * do not use timezones so it makes the user interface simpler. */ +void +e_timezone_entry_set_default_timezone (ETimezoneEntry *timezone_entry, + icaltimezone *timezone) +{ + g_return_if_fail (E_IS_TIMEZONE_ENTRY (timezone_entry)); + + timezone_entry->priv->default_zone = timezone; + + timezone_entry_update_entry (timezone_entry); +} diff --git a/calendar/gui/e-timezone-entry.h b/calendar/gui/e-timezone-entry.h index c1bf482aef..6c0cd1dc6b 100644 --- a/calendar/gui/e-timezone-entry.h +++ b/calendar/gui/e-timezone-entry.h @@ -29,50 +29,61 @@ * timezone. */ -#ifndef __E_TIMEZONE_ENTRY_H_ -#define __E_TIMEZONE_ENTRY_H_ +#ifndef E_TIMEZONE_ENTRY_H +#define E_TIMEZONE_ENTRY_H #include <gtk/gtk.h> #include <libecal/e-cal.h> -G_BEGIN_DECLS +/* Standard GObject macros */ +#define E_TYPE_TIMEZONE_ENTRY \ + (e_timezone_entry_get_type ()) +#define E_TIMEZONE_ENTRY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry)) +#define E_TIMEZONE_ENTRY_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass)) +#define E_IS_TIMEZONE_ENTRY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_TIMEZONE_ENTRY)) +#define E_IS_TIMEZONE_ENTRY_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_TIMEZONE_ENTRY)) +#define E_IS_TIMEZONE_ENTRY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass)) -#define E_TYPE_TIMEZONE_ENTRY (e_timezone_entry_get_type ()) -#define E_TIMEZONE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntry)) -#define E_TIMEZONE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_TIMEZONE_ENTRY, ETimezoneEntryClass)) -#define E_IS_TIMEZONE_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_TIMEZONE_ENTRY)) -#define E_IS_TIMEZONE_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_TIMEZONE_ENTRY)) +G_BEGIN_DECLS -typedef struct _ETimezoneEntry ETimezoneEntry; +typedef struct _ETimezoneEntry ETimezoneEntry; +typedef struct _ETimezoneEntryClass ETimezoneEntryClass; typedef struct _ETimezoneEntryPrivate ETimezoneEntryPrivate; -typedef struct _ETimezoneEntryClass ETimezoneEntryClass; struct _ETimezoneEntry { - GtkHBox hbox; - - /*< private >*/ + GtkHBox parent; ETimezoneEntryPrivate *priv; }; struct _ETimezoneEntryClass { GtkHBoxClass parent_class; - void (* changed) (ETimezoneEntry *tentry); + void (*changed) (ETimezoneEntry *timezone_entry); }; -GType e_timezone_entry_get_type (void); -GtkWidget* e_timezone_entry_new (void); - -icaltimezone* e_timezone_entry_get_timezone (ETimezoneEntry *tentry); -void e_timezone_entry_set_timezone (ETimezoneEntry *tentry, - icaltimezone *zone); +GType e_timezone_entry_get_type (void); +GtkWidget * e_timezone_entry_new (void); +icaltimezone * e_timezone_entry_get_timezone (ETimezoneEntry *timezone_entry); +void e_timezone_entry_set_timezone (ETimezoneEntry *timezone_entry, + icaltimezone *timezone); -/* Sets the default timezone. If the current timezone matches this, then the - entry field is hidden. This is useful since most people do not use timezones - so it makes the user interface simpler. */ -void e_timezone_entry_set_default_timezone(ETimezoneEntry *tentry, - icaltimezone *zone); +/* Sets the default timezone. If the current timezone matches this, + * then the entry field is hidden. This is useful since most people + * do not use timezones so it makes the user interface simpler. */ +void e_timezone_entry_set_default_timezone + (ETimezoneEntry *timezone_entry, + icaltimezone *timezone); G_END_DECLS -#endif /* __E_TIMEZONE_ENTRY_H_ */ +#endif /* E_TIMEZONE_ENTRY_H */ diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index 6283e6b8dd..4944630727 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -723,14 +723,16 @@ gnome_calendar_class_init (GnomeCalendarClass *class) } -/* We do this check since the calendar items are downloaded from the server in the open_method, - since the default timezone might not be set there */ +/* We do this check since the calendar items are downloaded from the server + * in the open_method, since the default timezone might not be set there. */ static void -ensure_dates_are_in_default_zone (icalcomponent *icalcomp) +ensure_dates_are_in_default_zone (GnomeCalendar *gcal, + icalcomponent *icalcomp) { icaltimetype dt; - icaltimezone *zone = calendar_config_get_icaltimezone (); + icaltimezone *zone; + zone = gnome_calendar_get_timezone (gcal); if (!zone) return; @@ -761,7 +763,7 @@ dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data) for (l = objects; l; l = l->next) { ECalComponent *comp = NULL; - ensure_dates_are_in_default_zone (l->data); + ensure_dates_are_in_default_zone (gcal, l->data); comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) { g_object_unref (comp); diff --git a/calendar/gui/memos-component.c b/calendar/gui/memos-component.c deleted file mode 100644 index 2e45ad4ec9..0000000000 --- a/calendar/gui/memos-component.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * Nathan Owens <pianocomp81@yahoo.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <errno.h> -#include <string.h> -#include <glib/gi18n-lib.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-exception.h> -#include <gconf/gconf-client.h> -#include <libecal/e-cal.h> -#include <libedataserver/e-data-server-util.h> -#include <libedataserverui/e-source-selector.h> -#include <shell/e-user-creatable-items-handler.h> -#include <shell/e-component-view.h> -#include "e-cal-model.h" -#include "e-memos.h" -#include "memos-component.h" -#include "memos-control.h" -#include "e-comp-editor-registry.h" -#include "migration.h" -#include "comp-util.h" -#include "calendar-config.h" -#include "e-cal-popup.h" -#include "common/authentication.h" -#include "dialogs/calendar-setup.h" -#include "dialogs/comp-editor.h" -#include "dialogs/copy-source-dialog.h" -#include "dialogs/memo-editor.h" -#include "widgets/misc/e-info-label.h" -#include "e-util/e-error.h" -#include "calendar-component.h" - -#define CREATE_MEMO_ID "memo" -#define CREATE_SHARED_MEMO_ID "shared-memo" -#define CREATE_MEMO_LIST_ID "memo-list" - -#define WEB_BASE_URI "webcal://" -#define PERSONAL_RELATIVE_URI "system" - -#define PARENT_TYPE bonobo_object_get_type () - -static BonoboObjectClass *parent_class = NULL; - -typedef struct _MemosComponentView -{ - ESourceList *source_list; - - GSList *source_selection; - - EMemos *memos; - ETable *table; - ETableModel *model; - - GtkWidget *source_selector; - - GList *notifications; - -} MemosComponentView; - -struct _MemosComponentPrivate { - - ESourceList *source_list; - GSList *source_selection; - - ECal *create_ecal; - - GList *notifications; -}; - -#define d(x) - -/* Utility functions. */ -/* FIXME Some of these are duplicated from calendar-component.c */ -static gboolean -is_in_selection (GSList *selection, ESource *source) -{ - GSList *l; - - for (l = selection; l; l = l->next) { - ESource *selected_source = l->data; - - if (!strcmp (e_source_peek_uid (selected_source), e_source_peek_uid (source))) - return TRUE; - } - - return FALSE; -} - -static gboolean -is_in_uids (GSList *uids, ESource *source) -{ - GSList *l; - - for (l = uids; l; l = l->next) { - const gchar *uid = l->data; - - if (!strcmp (uid, e_source_peek_uid (source))) - return TRUE; - } - - return FALSE; -} - -static void -source_selection_changed_cb (ESourceSelector *selector, MemosComponentView *component_view) -{ - GSList *selection, *l, *uids_selected = NULL; - - selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - - for (l = component_view->source_selection; l; l = l->next) { - ESource *old_selected_source = l->data; - - if (!is_in_selection (selection, old_selected_source)) - e_memos_remove_memo_source (component_view->memos, old_selected_source); - } - - for (l = selection; l; l = l->next) { - ESource *selected_source = l->data; - - e_memos_add_memo_source (component_view->memos, selected_source); - uids_selected = g_slist_append (uids_selected, (gchar *)e_source_peek_uid (selected_source)); - } - - e_source_selector_free_selection (component_view->source_selection); - component_view->source_selection = selection; - - /* Save the selection for next time we start up */ - calendar_config_set_memos_selected (uids_selected); - g_slist_free (uids_selected); -} - -/* Evolution::Component CORBA methods */ - -static gboolean -selector_tree_data_dropped (ESourceSelector *selector, - GtkSelectionData *data, - ESource *destination, - GdkDragAction action, - guint info, - MemosComponent *component) -{ - gboolean success = FALSE; - icalcomponent *icalcomp = NULL; - ECal *client = NULL; - GSList *components, *p; - - client = auth_new_cal_from_source ( - destination, E_CAL_SOURCE_TYPE_JOURNAL); - - if (!client || !e_cal_open (client, TRUE, NULL)) - goto finish; - - components = cal_comp_selection_get_string_list (data); - success = components != NULL; - for (p = components; p && success; p = p->next) { - gchar *comp_str; /* do not free this! */ - - /* p->data is "source_uid\ncomponent_string" */ - comp_str = strchr (p->data, '\n'); - if (!comp_str) - continue; - - comp_str [0] = 0; - comp_str++; - icalcomp = icalparser_parse_string (comp_str); - - if (!icalcomp) - continue; - - success = cal_comp_process_source_list_drop (client, icalcomp, action, p->data, component->priv->source_list); - icalcomponent_free (icalcomp); - } - - g_slist_foreach (components, (GFunc)g_free, NULL); - g_slist_free (components); - - finish: - if (client) - g_object_unref (client); - - return success; -} - -static void -config_create_ecal_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - MemosComponent *component = data; - MemosComponentPrivate *priv; - - priv = component->priv; - - g_object_unref (priv->create_ecal); - priv->create_ecal = NULL; - - priv->notifications = g_list_remove (priv->notifications, GUINT_TO_POINTER (id)); -} - -static ECal * -setup_create_ecal (MemosComponent *component, MemosComponentView *component_view) -{ - MemosComponentPrivate *priv; - ESource *source = NULL; - gchar *uid; - guint not; - - priv = component->priv; - - if (component_view) { - ECal *default_ecal; - - default_ecal = e_memos_get_default_client (component_view->memos); - if (default_ecal) - return default_ecal; - } - - if (priv->create_ecal) - return priv->create_ecal; - - /* Get the current primary calendar, or try to set one if it doesn't already exist */ - uid = calendar_config_get_primary_memos (); - if (uid) { - source = e_source_list_peek_source_by_uid (priv->source_list, uid); - g_free (uid); - - priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL); - } - - if (!priv->create_ecal) { - /* Try to create a default if there isn't one */ - source = e_source_list_peek_source_any (priv->source_list); - if (source) - priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL); - } - - if (priv->create_ecal) { - - if (!e_cal_open (priv->create_ecal, FALSE, NULL)) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - _("Unable to open the memo list '%s' for creating events and meetings"), - e_source_peek_name (source)); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return NULL; - } - - } else { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - "%s", _("There is no calendar available for creating memos")); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return NULL; - } - - /* Handle the fact it may change on us */ - not = calendar_config_add_notification_primary_memos (config_create_ecal_changed_cb, - component); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Save the primary source for use elsewhere */ - calendar_config_set_primary_memos (e_source_peek_uid (source)); - - return priv->create_ecal; -} - -/* Ensures the calendar is selected */ -static void -object_created_cb (CompEditor *ce, EMemoTable *memo_table) -{ - g_return_if_fail (memo_table != NULL); - - memo_table->user_created_cal = comp_editor_get_client (ce); - g_signal_emit_by_name (memo_table, "user_created"); - memo_table->user_created_cal = NULL; -} - -static gboolean -create_new_memo (MemosComponent *memo_component, gboolean is_assigned, MemosComponentView *component_view) -{ - ECal *ecal; - ECalComponent *comp; - CompEditor *editor; - CompEditorFlags flags = 0; - - ecal = setup_create_ecal (memo_component, component_view); - if (!ecal) - return FALSE; - - flags |= COMP_EDITOR_NEW_ITEM; - if (is_assigned) { - flags |= COMP_EDITOR_IS_SHARED; - flags |= COMP_EDITOR_USER_ORG; - } - - editor = memo_editor_new (ecal, flags); - comp = cal_comp_memo_new_with_defaults (ecal); - - if (component_view) - g_signal_connect (editor, "object_created", G_CALLBACK (object_created_cb), e_memos_get_calendar_table (component_view->memos)); - - comp_editor_edit_comp (editor, comp); - gtk_window_present (GTK_WINDOW (editor)); - - e_comp_editor_registry_add (comp_editor_registry, editor, TRUE); - - return TRUE; -} - -static MemosComponentView * -create_component_view (MemosComponent *memos_component) -{ - MemosComponentPrivate *priv; - MemosComponentView *component_view; - GtkWidget *statusbar_widget; - - priv = memos_component->priv; - - /* Create the calendar component view */ - component_view = g_new0 (MemosComponentView, 1); - - /* Create sidebar selector */ - g_signal_connect (component_view->source_selector, "drag-data-received", - G_CALLBACK (selector_tree_drag_data_received), memos_component); - - component_view->memos = (EMemos *) bonobo_control_get_widget (component_view->view_control); - component_view->table = e_memo_table_get_table (e_memos_get_calendar_table (component_view->memos)); - component_view->model = E_TABLE_MODEL (e_memo_table_get_model (e_memos_get_calendar_table (component_view->memos))); - - /* connect after setting the initial selections, or we'll get unwanted calls - to calendar_control_sensitize_calendar_commands */ - g_signal_connect (component_view->source_selector, "selection_changed", - G_CALLBACK (source_selection_changed_cb), component_view); - g_signal_connect (component_view->source_selector, "primary_selection_changed", - G_CALLBACK (primary_source_selection_changed_cb), component_view); - - return component_view; -} - -static void -destroy_component_view (MemosComponentView *component_view) -{ - GList *l; - - if (component_view->source_list) - g_object_unref (component_view->source_list); - - if (component_view->source_selection) - e_source_selector_free_selection (component_view->source_selection); - - for (l = component_view->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - g_list_free (component_view->notifications); - - g_free (component_view); -} - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - MemosComponent *memos_component = MEMOS_COMPONENT (object); - MemosComponentPrivate *priv = memos_component->priv; - GList *l; - - if (priv->source_list != NULL) { - g_object_unref (priv->source_list); - priv->source_list = NULL; - } - if (priv->source_selection != NULL) { - e_source_selector_free_selection (priv->source_selection); - priv->source_selection = NULL; - } - - if (priv->create_ecal) { - g_object_unref (priv->create_ecal); - priv->create_ecal = NULL; - } - - for (l = priv->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - g_list_free (priv->notifications); - priv->notifications = NULL; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} diff --git a/calendar/gui/memos-component.h b/calendar/gui/memos-component.h deleted file mode 100644 index b46095c629..0000000000 --- a/calendar/gui/memos-component.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * Nathan Owens <pianocomp81@yahoo.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef _MEMOS_COMPONENT_H_ -#define _MEMOS_COMPONENT_H_ - -#include <bonobo/bonobo-object.h> -#include <libedataserver/e-source-list.h> -#include <widgets/misc/e-activity-handler.h> -#include "Evolution.h" - -#define MEMOS_TYPE_COMPONENT (memos_component_get_type ()) -#define MEMOS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MEMOS_TYPE_COMPONENT, MemosComponent)) -#define MEMOS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MEMOS_TYPE_COMPONENT, MemosComponentClass)) -#define MEMOS_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MEMOS_TYPE_COMPONENT)) -#define MEMOS_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), MEMOS_TYPE_COMPONENT)) - -typedef struct _MemosComponent MemosComponent; -typedef struct _MemosComponentPrivate MemosComponentPrivate; -typedef struct _MemosComponentClass MemosComponentClass; - -struct _MemosComponent { - BonoboObject parent; - - MemosComponentPrivate *priv; -}; - -struct _MemosComponentClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Component__epv epv; -}; - -GType memos_component_get_type (void); -MemosComponent *memos_component_peek (void); - -#endif /* _MEMOS_COMPONENT_H_ */ diff --git a/calendar/gui/tasks-component.c b/calendar/gui/tasks-component.c deleted file mode 100644 index 02783496f6..0000000000 --- a/calendar/gui/tasks-component.c +++ /dev/null @@ -1,801 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <errno.h> -#include <string.h> -#include <glib/gi18n-lib.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-exception.h> -#include <gconf/gconf-client.h> -#include <libecal/e-cal.h> -#include <libedataserver/e-data-server-util.h> -#include <libedataserver/e-url.h> -#include <libedataserverui/e-source-selector.h> -#include <shell/e-user-creatable-items-handler.h> -#include <shell/e-component-view.h> -#include "e-cal-model.h" -#include "e-tasks.h" -#include "tasks-component.h" -#include "tasks-control.h" -#include "e-comp-editor-registry.h" -#include "migration.h" -#include "comp-util.h" -#include "calendar-config.h" -#include "e-cal-popup.h" -#include "common/authentication.h" -#include "dialogs/calendar-setup.h" -#include "dialogs/comp-editor.h" -#include "dialogs/copy-source-dialog.h" -#include "dialogs/task-editor.h" -#include "misc/e-info-label.h" -#include "e-util/e-error.h" - -#define CREATE_TASK_ID "task" -#define CREATE_TASK_ASSIGNED_ID "task-assigned" -#define CREATE_TASK_LIST_ID "task-list" - -#define WEB_BASE_URI "webcal://" -#define PERSONAL_RELATIVE_URI "system" - -#define PARENT_TYPE bonobo_object_get_type () - -static BonoboObjectClass *parent_class = NULL; - -typedef struct -{ - ESourceList *source_list; - - GSList *source_selection; - - ETasks *tasks; - ETable *table; - ETableModel *model; - - GtkWidget *source_selector; - - BonoboControl *view_control; - - GList *notifications; - -} TasksComponentView; - -struct _TasksComponentPrivate { - - ESourceList *source_list; - GSList *source_selection; - - GList *views; - - ECal *create_ecal; - - GList *notifications; -}; - -/* Utility functions. */ -/* FIXME Some of these are duplicated from calendar-component.c */ -static gboolean -is_in_selection (GSList *selection, ESource *source) -{ - GSList *l; - - for (l = selection; l; l = l->next) { - ESource *selected_source = l->data; - - if (!strcmp (e_source_peek_uid (selected_source), e_source_peek_uid (source))) - return TRUE; - } - - return FALSE; -} - -static gboolean -is_in_uids (GSList *uids, ESource *source) -{ - GSList *l; - - for (l = uids; l; l = l->next) { - const gchar *uid = l->data; - - if (!strcmp (uid, e_source_peek_uid (source))) - return TRUE; - } - - return FALSE; -} - -static void -update_uris_for_selection (TasksComponentView *component_view) -{ - GSList *selection, *l, *uids_selected = NULL; - - selection = e_source_selector_get_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - - for (l = component_view->source_selection; l; l = l->next) { - ESource *old_selected_source = l->data; - - if (!is_in_selection (selection, old_selected_source)) - e_tasks_remove_todo_source (component_view->tasks, old_selected_source); - } - - for (l = selection; l; l = l->next) { - ESource *selected_source = l->data; - - e_tasks_add_todo_source (component_view->tasks, selected_source); - uids_selected = g_slist_append (uids_selected, (gchar *)e_source_peek_uid (selected_source)); - } - - e_source_selector_free_selection (component_view->source_selection); - component_view->source_selection = selection; - - /* Save the selection for next time we start up */ - calendar_config_set_tasks_selected (uids_selected); - g_slist_free (uids_selected); -} - -static void -update_uri_for_primary_selection (TasksComponentView *component_view) -{ - ESource *source; - ECalendarTable *cal_table; - ETable *etable; - - source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - if (!source) - return; - - /* Set the default */ - e_tasks_set_default_source (component_view->tasks, source); - - cal_table = e_tasks_get_calendar_table (component_view->tasks); - etable = e_calendar_table_get_table (cal_table); - - tasks_control_sensitize_commands (component_view->view_control, component_view->tasks, e_table_selected_count (etable)); - - /* Save the selection for next time we start up */ - calendar_config_set_primary_tasks (e_source_peek_uid (source)); -} - -/* Callbacks. */ -static void -copy_task_list_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - TasksComponentView *component_view = data; - ESource *selected_source; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - if (!selected_source) - return; - - copy_source_dialog (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source, E_CAL_SOURCE_TYPE_TODO); -} - -static void -delete_task_list_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - TasksComponentView *component_view = data; - ESource *selected_source; - ECal *cal; - gchar *uri; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - if (!selected_source) - return; - - if (e_error_run((GtkWindow *)gtk_widget_get_toplevel(ep->target->widget), - "calendar:prompt-delete-task-list", e_source_peek_name(selected_source), NULL) != GTK_RESPONSE_YES) - return; - - /* first, ask the backend to remove the task list */ - uri = e_source_get_uri (selected_source); - cal = e_cal_model_get_client_for_uri ( - e_calendar_table_get_model (E_CALENDAR_TABLE (e_tasks_get_calendar_table (component_view->tasks))), - uri); - if (!cal) - cal = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_TODO); - g_free (uri); - if (cal) { - if (e_cal_remove (cal, NULL)) { - if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (component_view->source_selector), - selected_source)) { - e_tasks_remove_todo_source (component_view->tasks, selected_source); - e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), - selected_source); - } - - e_source_group_remove_source (e_source_peek_group (selected_source), selected_source); - e_source_list_sync (component_view->source_list, NULL); - } - } -} - -static void -new_task_list_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - calendar_setup_new_task_list (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget))); -} - -static void -rename_task_list_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - TasksComponentView *component_view = data; - ESourceSelector *selector; - - selector = E_SOURCE_SELECTOR (component_view->source_selector); - e_source_selector_edit_primary_selection (selector); -} - -static void -edit_task_list_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - TasksComponentView *component_view = data; - ESource *selected_source; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - if (!selected_source) - return; - - calendar_setup_edit_task_list (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source); -} - -static void -set_offline_availability (EPopup *ep, EPopupItem *pitem, gpointer data, const gchar *value) -{ - TasksComponentView *component_view = data; - ESource *selected_source; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (component_view->source_selector)); - if (!selected_source) - return; - - e_source_set_property (selected_source, "offline_sync", value); -} - -static void -mark_no_offline_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - set_offline_availability (ep, pitem, data, "0"); -} - -static void -mark_offline_cb (EPopup *ep, EPopupItem *pitem, gpointer data) -{ - set_offline_availability (ep, pitem, data, "1"); -} - -static EPopupItem etc_source_popups[] = { - { E_POPUP_ITEM, (gchar *) "10.new", (gchar *) N_("_New Task List"), new_task_list_cb, NULL, (gchar *) "stock_todo", 0, 0 }, - { E_POPUP_ITEM, (gchar *) "15.copy", (gchar *) N_("_Copy..."), copy_task_list_cb, NULL, (gchar *) "edit-copy", 0, E_CAL_POPUP_SOURCE_PRIMARY }, - { E_POPUP_ITEM, (gchar *) "18.rename", (gchar *) N_("_Rename..."), rename_task_list_cb, NULL, NULL, 0, E_CAL_POPUP_SOURCE_PRIMARY }, - - { E_POPUP_BAR, (gchar *) "20.bar" }, - { E_POPUP_ITEM, (gchar *) "20.delete", (gchar *) N_("_Delete"), delete_task_list_cb, NULL, (gchar *) "edit-delete", 0, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY }, - { E_POPUP_ITEM, (gchar *) "30.mark_tasks_offline", (gchar *) N_("_Make available for offline use"), mark_offline_cb, NULL, (gchar *) "stock_disconnect", E_CAL_POPUP_SOURCE_OFFLINE, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY|E_CAL_POPUP_SOURCE_OFFLINE }, - { E_POPUP_ITEM, (gchar *) "40.mark_tasks_no_offline", (gchar *) N_("_Do not make available for offline use"), mark_no_offline_cb, NULL, (gchar *) "stock_connect", E_CAL_POPUP_SOURCE_NO_OFFLINE, E_CAL_POPUP_SOURCE_USER|E_CAL_POPUP_SOURCE_PRIMARY|E_CAL_POPUP_SOURCE_NO_OFFLINE }, - - { E_POPUP_BAR, (gchar *) "99.bar" }, - { E_POPUP_ITEM, (gchar *) "99.properties", (gchar *) N_("_Properties"), edit_task_list_cb, NULL, (gchar *) "document-properties", 0, E_CAL_POPUP_SOURCE_PRIMARY }, -}; - -static void -etc_source_popup_free(EPopup *ep, GSList *list, gpointer data) -{ - g_slist_free(list); -} - -static gboolean -popup_event_cb(ESourceSelector *selector, ESource *insource, GdkEventButton *event, TasksComponentView *component_view) -{ - ECalPopup *ep; - ECalPopupTargetSource *t; - GSList *menus = NULL; - gint i; - GtkMenu *menu; - - /** @HookPoint-ECalPopup: Tasks Source Selector Context Menu - * @Id: org.gnome.evolution.tasks.source.popup - * @Class: org.gnome.evolution.calendar.popup:1.0 - * @Target: ECalPopupTargetSource - * - * The context menu on the source selector in the tasks window. - */ - ep = e_cal_popup_new("org.gnome.evolution.tasks.source.popup"); - t = e_cal_popup_target_new_source(ep, selector); - t->target.widget = (GtkWidget *)component_view->tasks; - - for (i=0;i<sizeof(etc_source_popups)/sizeof(etc_source_popups[0]);i++) - menus = g_slist_prepend(menus, &etc_source_popups[i]); - - e_popup_add_items((EPopup *)ep, menus, NULL,etc_source_popup_free, component_view); - - menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time()); - - return TRUE; -} - -static void -source_selection_changed_cb (ESourceSelector *selector, TasksComponentView *component_view) -{ - update_uris_for_selection (component_view); -} - -static void -primary_source_selection_changed_cb (ESourceSelector *selector, TasksComponentView *component_view) -{ - update_uri_for_primary_selection (component_view); -} - -static void -source_removed_cb (ETasks *tasks, ESource *source, TasksComponentView *component_view) -{ - e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source); -} - -static gboolean -selector_tree_data_dropped (ESourceSelector *selector, - GtkSelectionData *data, - ESource *destination, - GdkDragAction action, - guint info, - TasksComponent *component) -{ - gboolean success = FALSE; - icalcomponent *icalcomp = NULL; - ECal *client = NULL; - GSList *components, *p; - - client = auth_new_cal_from_source ( - destination, E_CAL_SOURCE_TYPE_TODO); - - if (!client || !e_cal_open (client, TRUE, NULL)) - goto finish; - - components = cal_comp_selection_get_string_list (data); - success = components != NULL; - for (p = components; p && success; p = p->next) { - gchar *comp_str; /* do not free this! */ - - /* p->data is "source_uid\ncomponent_string" */ - comp_str = strchr (p->data, '\n'); - if (!comp_str) - continue; - - comp_str [0] = 0; - comp_str++; - icalcomp = icalparser_parse_string (comp_str); - - if (!icalcomp) - continue; - - success = cal_comp_process_source_list_drop (client, icalcomp, action, p->data, component->priv->source_list); - icalcomponent_free (icalcomp); - } - g_slist_foreach (components, (GFunc)g_free, NULL); - g_slist_free (components); - - finish: - if (client) - g_object_unref (client); - - return success; -} - -static void -config_create_ecal_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - TasksComponent *component = data; - TasksComponentPrivate *priv; - - priv = component->priv; - - g_object_unref (priv->create_ecal); - priv->create_ecal = NULL; - - priv->notifications = g_list_remove (priv->notifications, GUINT_TO_POINTER (id)); -} - -static ECal * -setup_create_ecal (TasksComponent *component, TasksComponentView *component_view) -{ - TasksComponentPrivate *priv; - ESource *source = NULL; - gchar *uid; - guint not; - - priv = component->priv; - - if (component_view) { - ECal *default_ecal; - - default_ecal = e_tasks_get_default_client (component_view->tasks); - if (default_ecal) - return default_ecal; - } - - if (priv->create_ecal) - return priv->create_ecal; - - /* Get the current primary calendar, or try to set one if it doesn't already exist */ - uid = calendar_config_get_primary_tasks (); - if (uid) { - source = e_source_list_peek_source_by_uid (priv->source_list, uid); - g_free (uid); - - priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO); - } - - if (!priv->create_ecal) { - /* Try to create a default if there isn't one */ - source = e_source_list_peek_source_any (priv->source_list); - if (source) - priv->create_ecal = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO); - } - - if (priv->create_ecal) { - icaltimezone *zone; - - zone = calendar_config_get_icaltimezone (); - e_cal_set_default_timezone (priv->create_ecal, zone, NULL); - - if (!e_cal_open (priv->create_ecal, FALSE, NULL)) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - _("Unable to open the task list '%s' for creating events and meetings"), - e_source_peek_name (source)); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return NULL; - } - - } else { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - "%s", _("There is no calendar available for creating tasks")); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return NULL; - } - - /* Handle the fact it may change on us */ - not = calendar_config_add_notification_primary_tasks (config_create_ecal_changed_cb, - component); - priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); - - /* Save the primary source for use elsewhere */ - calendar_config_set_primary_tasks (e_source_peek_uid (source)); - - return priv->create_ecal; -} - -/* Ensures the calendar is selected */ -static void -object_created_cb (CompEditor *ce, ECalendarTable *cal_table) -{ - g_return_if_fail (cal_table != NULL); - - cal_table->user_created_cal = comp_editor_get_client (ce); - g_signal_emit_by_name (cal_table, "user_created"); - cal_table->user_created_cal = NULL; -} - -static gboolean -create_new_todo (TasksComponent *task_component, gboolean is_assigned, TasksComponentView *component_view) -{ - ECal *ecal; - ECalComponent *comp; - CompEditor *editor; - guint32 flags = 0; - - ecal = setup_create_ecal (task_component, component_view); - if (!ecal) - return FALSE; - - if (is_assigned) - flags |= COMP_EDITOR_IS_ASSIGNED; - - flags |= COMP_EDITOR_NEW_ITEM | COMP_EDITOR_USER_ORG; - - editor = task_editor_new (ecal, flags); - comp = cal_comp_task_new_with_defaults (ecal); - - if (component_view) - g_signal_connect (editor, "object_created", G_CALLBACK (object_created_cb), e_tasks_get_calendar_table (component_view->tasks)); - - comp_editor_edit_comp (editor, comp); - if (is_assigned) - task_editor_show_assignment (TASK_EDITOR (editor)); - gtk_window_present (GTK_WINDOW (editor)); - - e_comp_editor_registry_add (comp_editor_registry, editor, TRUE); - - return TRUE; -} - -static TasksComponentView * -create_component_view (TasksComponent *tasks_component) -{ - TasksComponentPrivate *priv; - TasksComponentView *component_view; - - priv = tasks_component->priv; - - /* Create the calendar component view */ - component_view = g_new0 (TasksComponentView, 1); - - /* Add the source lists */ - component_view->source_list = g_object_ref (priv->source_list); - - /* Create sidebar selector */ - component_view->source_selector = e_source_selector_new (tasks_component->priv->source_list); - - g_signal_connect (component_view->source_selector, "drag-data-received", - G_CALLBACK (selector_tree_drag_data_received), tasks_component); - - component_view->tasks = (ETasks *) bonobo_control_get_widget (component_view->view_control); - component_view->table = e_calendar_table_get_table (e_tasks_get_calendar_table (component_view->tasks)); - component_view->model = E_TABLE_MODEL (e_calendar_table_get_model (e_tasks_get_calendar_table (component_view->tasks))); - - /* This signal is thrown if backends die - we update the selector */ - g_signal_connect (component_view->tasks, "source_removed", - G_CALLBACK (source_removed_cb), component_view); - - /* connect after setting the initial selections, or we'll get unwanted calls - to calendar_control_sensitize_calendar_commands */ - g_signal_connect (component_view->source_selector, "selection_changed", - G_CALLBACK (source_selection_changed_cb), component_view); - g_signal_connect (component_view->source_selector, "primary_selection_changed", - G_CALLBACK (primary_source_selection_changed_cb), component_view); - g_signal_connect (component_view->source_selector, "popup_event", - G_CALLBACK (popup_event_cb), component_view); - - return component_view; -} - -static void -destroy_component_view (TasksComponentView *component_view) -{ - GList *l; - - g_signal_handlers_disconnect_matched (component_view->model, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, component_view); - - if (component_view->source_list) - g_object_unref (component_view->source_list); - - if (component_view->source_selection) - e_source_selector_free_selection (component_view->source_selection); - - for (l = component_view->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - g_list_free (component_view->notifications); - - g_free (component_view); -} - -static void -view_destroyed_cb (gpointer data, GObject *where_the_object_was) -{ - TasksComponent *tasks_component = data; - TasksComponentPrivate *priv; - GList *l; - - priv = tasks_component->priv; - - for (l = priv->views; l; l = l->next) { - TasksComponentView *component_view = l->data; - - if (G_OBJECT (component_view->view_control) == where_the_object_was) { - priv->views = g_list_remove (priv->views, component_view); - destroy_component_view (component_view); - - break; - } - } -} - -static void -impl_handleURI (PortableServer_Servant servant, const gchar *uri, CORBA_Environment *ev) -{ - TasksComponent *tasks_component = TASKS_COMPONENT (bonobo_object_from_servant (servant)); - TasksComponentPrivate *priv; - GList *l; - TasksComponentView *view = NULL; - - gchar *src_uid = NULL; - gchar *uid = NULL; - gchar *rid = NULL; - - priv = tasks_component->priv; - - l = g_list_last (priv->views); - if (!l) - return; - - view = l->data; - - if (!strncmp (uri, "task:", 5)) { - EUri *euri = e_uri_new (uri); - const gchar *p; - gchar *header, *content; - gsize len, clen; - - p = euri->query; - if (p) { - while (*p) { - len = strcspn (p, "=&"); - - /* If it's malformed, give up. */ - if (p[len] != '=') - break; - - header = (gchar *) p; - header[len] = '\0'; - p += len + 1; - - clen = strcspn (p, "&"); - - content = g_strndup (p, clen); - if (!g_ascii_strcasecmp (header, "source-uid")) { - src_uid = g_strdup (content); - } else if (!g_ascii_strcasecmp (header, "comp-uid")) { - uid = g_strdup (content); - } else if (!g_ascii_strcasecmp (header, "comp-rid")) { - rid = g_strdup (content); - } - g_free (content); - - p += clen; - if (*p == '&') { - p++; - if (!strcmp (p, "amp;")) - p += 4; - } - } - - if (uid && src_uid) { - e_tasks_open_task_id (view->tasks, src_uid, uid, rid); - } - - g_free (src_uid); - g_free (uid); - g_free (rid); - } - e_uri_free (euri); - } - - return; -} - -static void -impl_requestCreateItem (PortableServer_Servant servant, - const CORBA_char *item_type_name, - CORBA_Environment *ev) -{ - TasksComponent *tasks_component = TASKS_COMPONENT (bonobo_object_from_servant (servant)); - - if (strcmp (item_type_name, CREATE_TASK_ID) == 0) { - if (!create_new_todo (tasks_component, FALSE, NULL)) - bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed); - } else if (strcmp (item_type_name, CREATE_TASK_ASSIGNED_ID) == 0) { - if (!create_new_todo (tasks_component, TRUE, NULL)) - bonobo_exception_set (ev, ex_GNOME_Evolution_Component_Failed); - } else if (strcmp (item_type_name, CREATE_TASK_LIST_ID) == 0) { - /* FIXME Should we use the last opened window? */ - calendar_setup_new_task_list (NULL); - } else { - bonobo_exception_set (ev, ex_GNOME_Evolution_Component_UnknownType); - } -} - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - TasksComponent *tasks_component = TASKS_COMPONENT (object); - TasksComponentPrivate *priv = tasks_component->priv; - GList *l; - - if (priv->source_list != NULL) { - g_object_unref (priv->source_list); - priv->source_list = NULL; - } - if (priv->source_selection != NULL) { - e_source_selector_free_selection (priv->source_selection); - priv->source_selection = NULL; - } - - if (priv->create_ecal) { - g_object_unref (priv->create_ecal); - priv->create_ecal = NULL; - } - - for (l = priv->views; l; l = l->next) { - TasksComponentView *component_view = l->data; - - g_object_weak_unref (G_OBJECT (component_view->view_control), view_destroyed_cb, tasks_component); - } - g_list_free (priv->views); - priv->views = NULL; - - for (l = priv->notifications; l; l = l->next) - calendar_config_remove_notification (GPOINTER_TO_UINT (l->data)); - g_list_free (priv->notifications); - priv->notifications = NULL; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - TasksComponentPrivate *priv = TASKS_COMPONENT (object)->priv; - GList *l; - - for (l = priv->views; l; l = l->next) { - TasksComponentView *component_view = l->data; - - destroy_component_view (component_view); - } - g_list_free (priv->views); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -static void -tasks_component_class_init (TasksComponentClass *klass) -{ - POA_GNOME_Evolution_Component__epv *epv = &klass->epv; - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - - parent_class = g_type_class_peek_parent (klass); - - epv->requestCreateItem = impl_requestCreateItem; - epv->handleURI = impl_handleURI; - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; -} - -static void -tasks_component_init (TasksComponent *component, TasksComponentClass *klass) -{ - TasksComponentPrivate *priv; - - priv = g_new0 (TasksComponentPrivate, 1); - - component->priv = priv; -} diff --git a/calendar/gui/tasks-component.h b/calendar/gui/tasks-component.h deleted file mode 100644 index 851d3d0381..0000000000 --- a/calendar/gui/tasks-component.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef _TASKS_COMPONENT_H_ -#define _TASKS_COMPONENT_H_ - -#include <bonobo/bonobo-object.h> -#include <libedataserver/e-source-list.h> -#include <misc/e-activity-handler.h> -#include "Evolution.h" - -#define TASKS_TYPE_COMPONENT (tasks_component_get_type ()) -#define TASKS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TASKS_TYPE_COMPONENT, TasksComponent)) -#define TASKS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TASKS_TYPE_COMPONENT, TasksComponentClass)) -#define TASKS_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TASKS_TYPE_COMPONENT)) -#define TASKS_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TASKS_TYPE_COMPONENT)) - -typedef struct _TasksComponent TasksComponent; -typedef struct _TasksComponentPrivate TasksComponentPrivate; -typedef struct _TasksComponentClass TasksComponentClass; - -struct _TasksComponent { - BonoboObject parent; - - TasksComponentPrivate *priv; -}; - -struct _TasksComponentClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Component__epv epv; -}; - -GType tasks_component_get_type (void); - -#endif /* _TASKS_COMPONENT_H_ */ diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c deleted file mode 100644 index 61f7eb4848..0000000000 --- a/calendar/gui/tasks-control.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Damon Chaplin <damon@ximian.com> - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtk.h> -#include <glib/gi18n.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-ui-util.h> -#include <e-util/e-dialog-utils.h> -#include <e-util/e-icon-factory.h> -#include <e-util/e-print.h> -#include <e-util/e-util-private.h> -#include "dialogs/cal-prefs-dialog.h" -#include "calendar-config.h" -#include "calendar-commands.h" -#include "e-tasks.h" -#include "e-calendar-table.h" -#include "print.h" -#include "tasks-control.h" -#include "evolution-shell-component-utils.h" -#include "e-util/e-menu.h" -#include "e-cal-menu.h" -#include "e-cal-component-preview.h" -#include "e-util/e-menu.h" -#include "itip-utils.h" - -#define FIXED_MARGIN .05 - -static void tasks_control_activate_cb (BonoboControl *control, - gboolean activate, - gpointer user_data); -static void tasks_control_new_task_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path); -static void tasks_control_complete_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path); -static void tasks_control_purge_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path); -static void tasks_control_assign_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path); - -static void tasks_control_forward_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path); - -struct _tasks_sensitize_item { - const gchar *command; - guint32 enable; -}; - -static void -sensitize_items(BonoboUIComponent *uic, struct _tasks_sensitize_item *items, guint32 mask) -{ - while (items->command) { - gchar command[32]; - - if (strlen(items->command)>=21) { - g_warning ("Size more than 21: %s\n", items->command); - continue; - } - - sprintf(command, "/commands/%s", items->command); - - bonobo_ui_component_set_prop (uic, command, "sensitive", - (items->enable & mask) == 0 ? "1" : "0", - NULL); - items++; - } -} - -#define E_CAL_TASKS_PREVIEW_ACTIVE (1<<31) - -static struct _tasks_sensitize_item tasks_sensitize_table[] = { - { "TasksOpenTask", E_CAL_MENU_SELECT_ONE }, - { "TasksCut", E_CAL_MENU_SELECT_ANY | E_CAL_MENU_SELECT_EDITABLE | E_CAL_TASKS_PREVIEW_ACTIVE }, - { "TasksCopy", E_CAL_MENU_SELECT_ANY }, - { "TasksPaste", E_CAL_MENU_SELECT_EDITABLE | E_CAL_TASKS_PREVIEW_ACTIVE }, - { "TasksDelete", E_CAL_MENU_SELECT_ANY | E_CAL_MENU_SELECT_EDITABLE }, - { "TasksMarkComplete", E_CAL_MENU_SELECT_ANY | E_CAL_MENU_SELECT_EDITABLE | E_CAL_MENU_SELECT_NOTCOMPLETE}, - { "TasksPurge", E_CAL_MENU_SELECT_EDITABLE }, - { "TasksAssign", E_CAL_MENU_SELECT_ONE | E_CAL_MENU_SELECT_EDITABLE | E_CAL_MENU_SELECT_ASSIGNABLE }, - { "TasksForward", E_CAL_MENU_SELECT_ONE }, - { NULL } -}; - -/* Sensitizes the UI Component menu/toolbar commands based on the number of - * selected tasks. - */ -void -tasks_control_sensitize_commands (BonoboControl *control, ETasks *tasks, gint n_selected) -{ - BonoboUIComponent *uic; - gboolean read_only = TRUE; - ECal *ecal; - ECalModel *model; - ECalMenu *menu; - ECalMenuTargetSelect *t; - GPtrArray *events; - GSList *selected = NULL, *l = NULL; - ECalendarTable *cal_table; - GtkWidget *preview; - - uic = bonobo_control_get_ui_component (control); - g_return_if_fail (uic != NULL); - - if (bonobo_ui_component_get_container (uic) == CORBA_OBJECT_NIL) - return; - - menu = e_tasks_get_tasks_menu (tasks); - cal_table = e_tasks_get_calendar_table (tasks); - model = e_calendar_table_get_model (cal_table); - events = g_ptr_array_new (); - selected = e_calendar_table_get_selected (cal_table); - - for (l = selected;l;l = g_slist_next (l)) { - g_ptr_array_add (events, e_cal_model_copy_component_data ((ECalModelComponent *)l->data)); - } - - g_slist_free (selected); - - t = e_cal_menu_target_new_select (menu, model, events); - - ecal = e_cal_model_get_default_client (model); - - if (ecal) - e_cal_is_read_only (ecal, &read_only, NULL); - - preview = e_cal_component_preview_get_html (E_CAL_COMPONENT_PREVIEW (e_tasks_get_preview (tasks))); - if (preview && GTK_WIDGET_VISIBLE (preview) && GTK_WIDGET_HAS_FOCUS (preview)) - t->target.mask = t->target.mask | E_CAL_TASKS_PREVIEW_ACTIVE; - else - t->target.mask = t->target.mask & (~E_CAL_TASKS_PREVIEW_ACTIVE); - - sensitize_items (uic, tasks_sensitize_table, t->target.mask); - e_menu_update_target ((EMenu *)menu, (EMenuTarget *)t); -} - -/* Callback used when the selection in the table changes */ -static void -selection_changed_cb (ETasks *tasks, gint n_selected, gpointer data) -{ - BonoboControl *control; - - control = BONOBO_CONTROL (data); - - tasks_control_sensitize_commands (control, tasks, n_selected); -} - -static gboolean -tasks_control_focus_changed (GtkWidget *widget, GdkEventFocus *event, struct focus_changed_data *fc_data) -{ - g_return_val_if_fail (fc_data != NULL, FALSE); - - tasks_control_sensitize_commands (fc_data->control, fc_data->tasks, -1); - - return FALSE; -} - -static BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("TasksNewTask", tasks_control_new_task_cmd), - BONOBO_UI_VERB ("TasksMarkComplete", tasks_control_complete_cmd), - BONOBO_UI_VERB ("TasksPurge", tasks_control_purge_cmd), - BONOBO_UI_VERB ("TasksAssign", tasks_control_assign_cmd), - BONOBO_UI_VERB ("TasksForward", tasks_control_forward_cmd), - BONOBO_UI_VERB_END -}; - -void -tasks_control_activate (BonoboControl *control, ETasks *tasks) -{ - Bonobo_UIContainer remote_uih; - BonoboUIComponent *uic; - gint n_selected; - ECalendarTable *cal_table; - ETable *etable; - gboolean state; - gchar *xmlfile; - - uic = bonobo_control_get_ui_component (control); - g_return_if_fail (uic != NULL); - - remote_uih = bonobo_control_get_remote_ui_container (control, NULL); - bonobo_ui_component_set_container (uic, remote_uih, NULL); - bonobo_object_release_unref (remote_uih, NULL); - - e_tasks_set_ui_component (tasks, uic); - - bonobo_ui_component_add_verb_list_with_data (uic, verbs, tasks); - - bonobo_ui_component_freeze (uic, NULL); - - xmlfile = g_build_filename (EVOLUTION_UIDIR, - "evolution-tasks.xml", - NULL); - bonobo_ui_util_set_ui (uic, PREFIX, - xmlfile, - "evolution-tasks", - NULL); - g_free (xmlfile); - - e_tasks_setup_view_menus (tasks, uic); - - /* Signals from the tasks widget; also sensitize the menu items as appropriate */ - - g_signal_connect (tasks, "selection_changed", G_CALLBACK (selection_changed_cb), control); - - e_menu_activate ((EMenu *)e_tasks_get_tasks_menu (tasks), uic, 1); - cal_table = e_tasks_get_calendar_table (tasks); - etable = e_calendar_table_get_table (cal_table); - n_selected = e_table_selected_count (etable); - - tasks_control_sensitize_commands (control, tasks, n_selected); - - state = calendar_config_get_preview_state(); - - bonobo_ui_component_thaw (uic, NULL); - - bonobo_ui_component_add_listener(uic, "ViewPreview", tasks_control_view_preview, tasks); - bonobo_ui_component_set_prop(uic, "/commands/ViewPreview", "state", state?"1":"0", NULL); -} - -void -tasks_control_deactivate (BonoboControl *control, ETasks *tasks) -{ - BonoboUIComponent *uic = bonobo_control_get_ui_component (control); - - g_return_if_fail (uic != NULL); - - e_menu_activate ((EMenu *)e_tasks_get_tasks_menu (tasks), uic, 0); - e_tasks_set_ui_component (tasks, NULL); - - e_tasks_discard_view_menus (tasks); - - /* Stop monitoring the "selection_changed" signal */ - g_signal_handlers_disconnect_matched (tasks, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, control); - - bonobo_ui_component_rm (uic, "/", NULL); - bonobo_ui_component_unset_container (uic, NULL); -} - -static void -tasks_control_new_task_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path) -{ - ETasks *tasks; - - tasks = E_TASKS (data); - e_tasks_new_task (tasks); -} - -static void -tasks_control_complete_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path) -{ - ETasks *tasks; - - bonobo_ui_component_set_prop (uic, "/commands/TasksMarkComplete", "sensitive", - "0", - NULL); - tasks = E_TASKS (data); - e_tasks_complete_selected (tasks); -} - -static gboolean -confirm_purge (ETasks *tasks) -{ - GtkWidget *dialog, *checkbox, *parent; - gint button; - - if (!calendar_config_get_confirm_purge ()) - return TRUE; - - parent = gtk_widget_get_toplevel (GTK_WIDGET (tasks)); - dialog = gtk_message_dialog_new ( - (GtkWindow *)parent, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_YES_NO, - "%s", - _("This operation will permanently erase all tasks marked as completed. If you continue, you will not be able to recover these tasks.\n\nReally erase these tasks?")); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO); - - checkbox = gtk_check_button_new_with_label (_("Do not ask me again.")); - gtk_widget_show (checkbox); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), checkbox, TRUE, TRUE, 6); - - button = gtk_dialog_run (GTK_DIALOG (dialog)); - if (button == GTK_RESPONSE_YES && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox))) - calendar_config_set_confirm_purge (FALSE); - gtk_widget_destroy (dialog); - - return button == GTK_RESPONSE_YES ? TRUE : FALSE; -} - -static void -tasks_control_purge_cmd (BonoboUIComponent *uic, - gpointer data, - const gchar *path) -{ - ETasks *tasks; - - tasks = E_TASKS (data); - if (confirm_purge (tasks)) - e_tasks_delete_completed (tasks); -} diff --git a/calendar/gui/tasks-control.h b/calendar/gui/tasks-control.h deleted file mode 100644 index de98914e40..0000000000 --- a/calendar/gui/tasks-control.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Federico Mena Quintero <federico@ximian.com> - * Damon Chaplin <damon@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef _TASKS_CONTROL_H_ -#define _TASKS_CONTROL_H_ - -#include "e-tasks.h" - -BonoboControl *tasks_control_new (void); -void tasks_control_activate (BonoboControl *control, ETasks *tasks); -void tasks_control_deactivate (BonoboControl *control, ETasks *tasks); -void tasks_control_sensitize_commands (BonoboControl *control, ETasks *tasks, gint n_selected); - -#endif /* _TASKS_CONTROL_H_ */ |