From 8b5bd65751016d6ef8ba2ed2fd9b5fb5e7748624 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 20 Aug 2007 09:45:44 +0000 Subject: 2007-08-20 mcrha Fix for bug #262226 svn path=/trunk/; revision=34043 --- calendar/gui/calendar-component.c | 9 ------ calendar/gui/dialogs/event-page.c | 11 ++++--- calendar/gui/e-calendar-view.c | 60 +++++++++++++++++++++++++++++++-------- calendar/gui/e-calendar-view.h | 2 +- calendar/gui/e-week-view.c | 2 +- 5 files changed, 57 insertions(+), 27 deletions(-) (limited to 'calendar/gui') diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c index ab445b03d6..7998b7bff6 100644 --- a/calendar/gui/calendar-component.c +++ b/calendar/gui/calendar-component.c @@ -1267,15 +1267,6 @@ create_new_event (CalendarComponent *calendar_component, CalendarComponentView * return FALSE; if (component_view && (view = E_CALENDAR_VIEW (gnome_calendar_get_current_view_widget (component_view->calendar)))) { - GnomeCalendarViewType view_type; - - /* Force all for these view types because thats what's selected and it mimics a double click */ - view_type = gnome_calendar_get_view (component_view->calendar); - if (view_type == GNOME_CAL_WEEK_VIEW - || view_type == GNOME_CAL_MONTH_VIEW - || view_type == GNOME_CAL_LIST_VIEW) - is_allday = TRUE; - e_calendar_view_new_appointment_full (view, is_allday, is_meeting, TRUE); } else { ECalComponent *comp; diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index 0c52fdcdbf..54281be172 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -268,8 +268,6 @@ event_page_init (EventPage *epage) priv->is_meeting = FALSE; priv->sync_timezones = FALSE; - priv->default_address = NULL; - priv->alarm_list_dlg_widget = NULL; } @@ -322,6 +320,9 @@ event_page_finalize (GObject *object) priv->alarm_list_dlg_widget = NULL; + g_free (priv->default_address); + priv->default_address = NULL; + g_free (priv); epage->priv = NULL; @@ -587,7 +588,8 @@ clear_widgets (EventPage *epage) /* Categories */ e_dialog_editable_set (priv->categories, NULL); - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->organizer)->entry), priv->default_address); + if (priv->default_address) + gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->organizer)->entry), priv->default_address); } static gboolean @@ -3180,7 +3182,8 @@ event_page_select_organizer (EventPage *epage, const char *backend_address) priv->default_address = full; } else if (a == def_account && !priv->default_address) priv->default_address = full; - + else + g_free (full); } g_object_unref(it); diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 0ef3fde70c..3f24b162b3 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -1886,31 +1886,67 @@ e_calendar_view_new_appointment_for (ECalendarView *cal_view, } /** - * e_calendar_view_new_appointment - * @cal_view: A calendar view. + * e_calendar_view_new_appointment_full + * @param cal_view: A calendar view. + * @param all_day: Whether create all day event or not. + * @param meeting: This is a meeting or an appointment. + * @param no_past_date: Don't create event in past date, use actual date instead (if TRUE). * * Opens an event editor dialog for a new appointment. The appointment's * start and end times are set to the currently selected time range in * the calendar view. * - * With @actual_day set to TRUE, there will be always used actual day. + * When the selection is for all day and we don't need @all_day event, + * then this do a rounding to the actual hour for actual day (today) and + * to the 'day begins' from preferences in other selected day. */ void -e_calendar_view_new_appointment_full (ECalendarView *cal_view, gboolean all_day, gboolean meeting, gboolean actual_day) +e_calendar_view_new_appointment_full (ECalendarView *cal_view, gboolean all_day, gboolean meeting, gboolean no_past_date) { - time_t dtstart, dtend; + time_t dtstart, dtend, now; + gboolean do_rounding = FALSE; g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view)); - if (actual_day || - !e_calendar_view_get_selected_time_range (cal_view, &dtstart, &dtend)) { - dtstart = time (NULL); + now = time (NULL); + + if (!e_calendar_view_get_selected_time_range (cal_view, &dtstart, &dtend)) { + dtstart = now; dtend = dtstart + 3600; } - /* FIXME This is a rough hack to make sure "all day" is set for */ - if ((dtend - dtstart) % (60 * 60 * 24) == 0) - all_day = TRUE; - + + if (no_past_date && dtstart < now) { + dtend = time_day_begin (now) + (dtend - dtstart); + dtstart = time_day_begin (now); + do_rounding = TRUE; + } + + /* We either need rounding or don't want to set all_day for this, we will rather use actual */ + /* time in this cases; dtstart should be a midnight in this case */ + if (do_rounding || (!all_day && (dtend - dtstart) % (60 * 60 * 24) == 0)) { + struct tm local = *localtime (&now); + int time_div = calendar_config_get_time_divisions (); + int hours, mins; + + if (time_day_begin (now) == time_day_begin (dtstart)) { + /* same day as today */ + hours = local.tm_hour; + mins = local.tm_min; + + /* round minutes to nearest time division, up or down */ + if ((mins % time_div) >= time_div / 2) + mins += time_div; + mins = (mins - (mins % time_div)); + } else { + /* other day than today */ + hours = calendar_config_get_day_start_hour (); + mins = calendar_config_get_day_start_minute (); + } + + dtstart = dtstart + (60 * 60 * hours) + (mins * 60); + dtend = dtstart + (time_div * 60); + } + e_calendar_view_new_appointment_for (cal_view, dtstart, dtend, all_day, meeting); } diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index 81c6081cea..7e26ee84cb 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -153,7 +153,7 @@ void e_calendar_view_new_appointment_for (ECalendarView *cal_view, void e_calendar_view_new_appointment_full (ECalendarView *cal_view, gboolean all_day, gboolean meeting, - gboolean actual_day); + gboolean no_past_date); void e_calendar_view_new_appointment (ECalendarView *cal_view); void e_calendar_view_edit_appointment (ECalendarView *cal_view, ECal *client, diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index 0cc9b7f66d..b2a8ccad2f 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -2061,7 +2061,7 @@ e_week_view_on_button_press (GtkWidget *widget, return FALSE; if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { - e_calendar_view_new_appointment_full (E_CALENDAR_VIEW (week_view), TRUE, FALSE, FALSE); + e_calendar_view_new_appointment_full (E_CALENDAR_VIEW (week_view), FALSE, FALSE, FALSE); return TRUE; } -- cgit v1.2.3