[evolution] [ECompEditor] Preserve original duration when changing time



commit 407d4e1d4e96461087bfee99c5a770ef2dc0593b
Author: Milan Crha <mcrha redhat com>
Date:   Tue Aug 22 13:29:25 2017 +0200

    [ECompEditor] Preserve original duration when changing time
    
    When changing start time after end or end time before start, the other
    time had been modified to be one hour duration. This change uses the original
    duration instead, if possible.
    
    Reported downstream at:
    https://bugzilla.redhat.com/show_bug.cgi?id=1480029

 src/calendar/gui/e-comp-editor.c |   47 +++++++++++++++++++++++++++++++++-----
 1 files changed, 41 insertions(+), 6 deletions(-)
---
diff --git a/src/calendar/gui/e-comp-editor.c b/src/calendar/gui/e-comp-editor.c
index 391b910..8a43cbc 100644
--- a/src/calendar/gui/e-comp-editor.c
+++ b/src/calendar/gui/e-comp-editor.c
@@ -3151,14 +3151,36 @@ e_comp_editor_add_error (ECompEditor *comp_editor,
 
 
 static gboolean
-ece_check_start_before_end (struct icaltimetype *start_tt,
+ece_check_start_before_end (ECompEditor *comp_editor,
+                           struct icaltimetype *start_tt,
                            struct icaltimetype *end_tt,
                            gboolean adjust_end_time)
 {
        struct icaltimetype end_tt_copy;
        icaltimezone *start_zone, *end_zone;
+       gint duration = -1;
        gint cmp;
 
+       if ((e_comp_editor_get_flags (comp_editor) & E_COMP_EDITOR_FLAG_IS_NEW) == 0) {
+               icalcomponent *icomp;
+
+               icomp = e_comp_editor_get_component (comp_editor);
+               if (icomp &&
+                   icalcomponent_get_first_property (icomp, ICAL_DTSTART_PROPERTY) &&
+                   (icalcomponent_get_first_property (icomp, ICAL_DTEND_PROPERTY) ||
+                    icalcomponent_get_first_property (icomp, ICAL_DUE_PROPERTY))) {
+                       struct icaltimetype orig_start, orig_end;
+
+                       orig_start = icalcomponent_get_dtstart (icomp);
+                       orig_end = icalcomponent_get_dtend (icomp);
+
+                       if (icaltime_is_valid_time (orig_start) &&
+                           icaltime_is_valid_time (orig_end)) {
+                               duration = icaltime_as_timet (orig_end) - icaltime_as_timet (orig_start);
+                       }
+               }
+       }
+
        start_zone = (icaltimezone *) start_tt->zone;
        end_zone = (icaltimezone *) end_tt->zone;
 
@@ -3182,10 +3204,18 @@ ece_check_start_before_end (struct icaltimetype *start_tt,
                        if (start_zone && end_zone && start_zone != end_zone)
                                icaltimezone_convert_time (&end_tt_copy, end_zone, start_zone);
 
+                       if (duration > 0)
+                               icaltime_adjust (&end_tt_copy, 0, 0, 0, -duration);
+
                        if (icaltime_compare (*start_tt, end_tt_copy) >= 0) {
-                               /* Modify the end time, to be the start + 1 hour/day. */
                                *end_tt = *start_tt;
-                               icaltime_adjust (end_tt, 0, start_tt->is_date ? 24 : 1, 0, 0);
+
+                               if (duration >= 0) {
+                                       icaltime_adjust (end_tt, 0, 0, 0, duration);
+                               } else {
+                                       /* Modify the end time, to be the start + 1 hour/day. */
+                                       icaltime_adjust (end_tt, 0, start_tt->is_date ? 24 : 1, 0, 0);
+                               }
 
                                if (start_zone && end_zone && start_zone != end_zone)
                                        icaltimezone_convert_time (end_tt, start_zone, end_zone);
@@ -3197,9 +3227,14 @@ ece_check_start_before_end (struct icaltimetype *start_tt,
                        start_tt->day = end_tt->day;
 
                        if (icaltime_compare (*start_tt, end_tt_copy) >= 0) {
-                               /* Modify the start time, to be the end - 1 hour/day. */
                                *start_tt = *end_tt;
-                               icaltime_adjust (start_tt, 0, start_tt->is_date ? -24 : -1, 0, 0);
+
+                               if (duration >= 0) {
+                                       icaltime_adjust (start_tt, 0, 0, 0, -duration);
+                               } else {
+                                       /* Modify the start time, to be the end - 1 hour/day. */
+                                       icaltime_adjust (start_tt, 0, start_tt->is_date ? -24 : -1, 0, 0);
+                               }
 
                                if (start_zone && end_zone && start_zone != end_zone)
                                        icaltimezone_convert_time (start_tt, end_zone, start_zone);
@@ -3258,7 +3293,7 @@ e_comp_editor_ensure_start_before_end (ECompEditor *comp_editor,
                        }
                }
        } else {
-               if (ece_check_start_before_end (&start_tt, &end_tt, change_end_datetime)) {
+               if (ece_check_start_before_end (comp_editor, &start_tt, &end_tt, change_end_datetime)) {
                        if (change_end_datetime)
                                set_dtend = TRUE;
                        else


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]