diff options
Diffstat (limited to 'calendar/gui/calendar-component.c')
-rw-r--r-- | calendar/gui/calendar-component.c | 101 |
1 files changed, 84 insertions, 17 deletions
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c index 24880e98d0..7e89f6f0fa 100644 --- a/calendar/gui/calendar-component.c +++ b/calendar/gui/calendar-component.c @@ -26,38 +26,31 @@ #endif #include <string.h> - +#include <errno.h> +#include <bonobo/bonobo-control.h> +#include <bonobo/bonobo-i18n.h> +#include <bonobo/bonobo-exception.h> #include "calendar-config.h" #include "calendar-component.h" #include "calendar-commands.h" #include "gnome-cal.h" #include "migration.h" +#include "e-comp-editor-registry.h" +#include "comp-util.h" #include "dialogs/new-calendar.h" - +#include "dialogs/comp-editor.h" +#include "dialogs/event-editor.h" #include "widgets/misc/e-source-selector.h" -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-i18n.h> -#include <bonobo/bonobo-exception.h> -#include <gtk/gtkimage.h> -#include <gtk/gtkimagemenuitem.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkstock.h> -#include <gal/util/e-util.h> - -#include <errno.h> - /* IDs for user creatable items */ #define CREATE_EVENT_ID "event" #define CREATE_MEETING_ID "meeting" #define CREATE_ALLDAY_EVENT_ID "allday-event" - #define PARENT_TYPE bonobo_object_get_type () static BonoboObjectClass *parent_class = NULL; - struct _CalendarComponentPrivate { char *config_directory; @@ -71,6 +64,7 @@ struct _CalendarComponentPrivate { guint selected_not; }; +extern ECompEditorRegistry *comp_editor_registry; /* Utility functions. */ @@ -191,6 +185,46 @@ update_selection (CalendarComponent *calendar_component) g_slist_free (uids_selected); } +/* FIXME This is duplicated from comp-editor-factory.c, should it go in comp-util? */ +static ECalComponent * +get_default_event (ECal *client, gboolean all_day) +{ + ECalComponent *comp; + struct icaltimetype itt; + ECalComponentDateTime dt; + char *location; + icaltimezone *zone; + + comp = cal_comp_event_new_with_defaults (client); + + location = calendar_config_get_timezone (); + zone = icaltimezone_get_builtin_timezone (location); + + if (all_day) { + itt = icaltime_from_timet_with_zone (time (NULL), 1, zone); + + dt.value = &itt; + dt.tzid = icaltimezone_get_tzid (zone); + + e_cal_component_set_dtstart (comp, &dt); + e_cal_component_set_dtend (comp, &dt); + } else { + itt = icaltime_current_time_with_zone (zone); + icaltime_adjust (&itt, 0, 1, -itt.minute, -itt.second); + + dt.value = &itt; + dt.tzid = icaltimezone_get_tzid (zone); + + e_cal_component_set_dtstart (comp, &dt); + icaltime_adjust (&itt, 0, 1, 0, 0); + e_cal_component_set_dtend (comp, &dt); + } + + e_cal_component_commit_sequence (comp); + + return comp; +} + /* Callbacks. */ static void add_popup_menu_item (GtkMenu *menu, const char *label, const char *pixmap, @@ -480,9 +514,42 @@ impl_requestCreateItem (PortableServer_Servant servant, const CORBA_char *item_type_name, CORBA_Environment *ev) { - /* FIXME: fill me in */ + CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant)); + CalendarComponentPrivate *priv; + ECal *ecal; + ECalComponent *comp; + EventEditor *editor; + gboolean is_meeting = FALSE; + + priv = calendar_component->priv; + + ecal = gnome_calendar_get_default_client (priv->calendar); + if (!ecal) { + /* FIXME We should display a gui dialog or something */ + bonobo_exception_set (ev, ex_GNOME_Evolution_Component_UnknownType); + g_warning (G_STRLOC ": No default client"); + } + + editor = event_editor_new (ecal); + + if (strcmp (item_type_name, CREATE_EVENT_ID) == 0) { + comp = get_default_event (ecal, FALSE); + } else if (strcmp (item_type_name, CREATE_ALLDAY_EVENT_ID) == 0) { + comp = get_default_event (ecal, TRUE); + } else if (strcmp (item_type_name, CREATE_MEETING_ID) == 0) { + comp = get_default_event (ecal, FALSE); + is_meeting = TRUE; + } else { + bonobo_exception_set (ev, ex_GNOME_Evolution_Component_UnknownType); + return; + } + + comp_editor_edit_comp (COMP_EDITOR (editor), comp); + if (is_meeting) + event_editor_show_meeting (editor); + comp_editor_focus (COMP_EDITOR (editor)); - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UnknownType, NULL); + e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE); } |