[evolution] Bug 231666 - Ability to set different work time for different days



commit 94639e72247d0f3a142d1f0188b5be77006e1e0b
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jun 16 15:32:45 2015 +0200

    Bug 231666 - Ability to set different work time for different days

 calendar/gui/dialogs/comp-editor.c               |  742 +++++++++++++++++++++-
 calendar/gui/dialogs/comp-editor.h               |   77 +++
 calendar/gui/dialogs/schedule-page.c             |   18 +-
 calendar/gui/e-cal-model.c                       |  756 +++++++++++++++++++++-
 calendar/gui/e-cal-model.h                       |   77 +++
 calendar/gui/e-day-view-main-item.c              |   28 +-
 calendar/gui/e-day-view.c                        |  458 ++++++++------
 calendar/gui/e-meeting-time-sel.c                |  156 ++++--
 calendar/gui/e-meeting-time-sel.h                |    9 +-
 data/org.gnome.evolution.calendar.gschema.xml.in |   70 ++
 modules/settings/e-settings-cal-model.c          |   70 ++
 modules/settings/e-settings-comp-editor.c        |   70 ++
 12 files changed, 2265 insertions(+), 266 deletions(-)
---
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c
index 7aee23e..c6ffd0d 100644
--- a/calendar/gui/dialogs/comp-editor.c
+++ b/calendar/gui/dialogs/comp-editor.c
@@ -113,6 +113,20 @@ struct _CompEditorPrivate {
        gint work_day_end_minute;
        gint work_day_start_hour;
        gint work_day_start_minute;
+       gint work_day_start_mon;
+       gint work_day_end_mon;
+       gint work_day_start_tue;
+       gint work_day_end_tue;
+       gint work_day_start_wed;
+       gint work_day_end_wed;
+       gint work_day_start_thu;
+       gint work_day_end_thu;
+       gint work_day_start_fri;
+       gint work_day_end_fri;
+       gint work_day_start_sat;
+       gint work_day_end_sat;
+       gint work_day_start_sun;
+       gint work_day_end_sun;
 
        gboolean changed;
        gboolean needs_send;
@@ -142,7 +156,21 @@ enum {
        PROP_WORK_DAY_END_HOUR,
        PROP_WORK_DAY_END_MINUTE,
        PROP_WORK_DAY_START_HOUR,
-       PROP_WORK_DAY_START_MINUTE
+       PROP_WORK_DAY_START_MINUTE,
+       PROP_WORK_DAY_START_MON,
+       PROP_WORK_DAY_END_MON,
+       PROP_WORK_DAY_START_TUE,
+       PROP_WORK_DAY_END_TUE,
+       PROP_WORK_DAY_START_WED,
+       PROP_WORK_DAY_END_WED,
+       PROP_WORK_DAY_START_THU,
+       PROP_WORK_DAY_END_THU,
+       PROP_WORK_DAY_START_FRI,
+       PROP_WORK_DAY_END_FRI,
+       PROP_WORK_DAY_START_SAT,
+       PROP_WORK_DAY_END_SAT,
+       PROP_WORK_DAY_START_SUN,
+       PROP_WORK_DAY_END_SUN
 };
 
 static const gchar *ui =
@@ -1537,6 +1565,90 @@ comp_editor_set_property (GObject *object,
                                COMP_EDITOR (object),
                                g_value_get_int (value));
                        return;
+
+               case PROP_WORK_DAY_START_MON:
+                       comp_editor_set_work_day_start_mon (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_MON:
+                       comp_editor_set_work_day_end_mon (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_TUE:
+                       comp_editor_set_work_day_start_tue (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_TUE:
+                       comp_editor_set_work_day_end_tue (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_WED:
+                       comp_editor_set_work_day_start_wed (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_WED:
+                       comp_editor_set_work_day_end_wed (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_THU:
+                       comp_editor_set_work_day_start_thu (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_THU:
+                       comp_editor_set_work_day_end_thu (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_FRI:
+                       comp_editor_set_work_day_start_fri (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_FRI:
+                       comp_editor_set_work_day_end_fri (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_SAT:
+                       comp_editor_set_work_day_start_sat (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_SAT:
+                       comp_editor_set_work_day_end_sat (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_SUN:
+                       comp_editor_set_work_day_start_sun (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_SUN:
+                       comp_editor_set_work_day_end_sun (
+                               COMP_EDITOR (object),
+                               g_value_get_int (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1626,6 +1738,90 @@ comp_editor_get_property (GObject *object,
                                value, comp_editor_get_work_day_start_minute (
                                COMP_EDITOR (object)));
                        return;
+
+               case PROP_WORK_DAY_START_MON:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_mon (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_MON:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_mon (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_TUE:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_tue (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_TUE:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_tue (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_WED:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_wed (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_WED:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_wed (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_THU:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_thu (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_THU:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_thu (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_FRI:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_fri (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_FRI:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_fri (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_SAT:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_sat (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_SAT:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_sat (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_SUN:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_start_sun (
+                               COMP_EDITOR (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_SUN:
+                       g_value_set_int (
+                               value, comp_editor_get_work_day_end_sun (
+                               COMP_EDITOR (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -2049,6 +2245,174 @@ comp_editor_class_init (CompEditorClass *class)
                        0,
                        G_PARAM_READWRITE));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_MON,
+               g_param_spec_int (
+                       "work-day-start-mon",
+                       "Work Day Start for Monday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_MON,
+               g_param_spec_int (
+                       "work-day-end-mon",
+                       "Work Day End for Monday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_TUE,
+               g_param_spec_int (
+                       "work-day-start-tue",
+                       "Work Day Start for Tuesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_TUE,
+               g_param_spec_int (
+                       "work-day-end-tue",
+                       "Work Day End for Tuesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_WED,
+               g_param_spec_int (
+                       "work-day-start-wed",
+                       "Work Day Start for Wednesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_WED,
+               g_param_spec_int (
+                       "work-day-end-wed",
+                       "Work Day End for Wednesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_THU,
+               g_param_spec_int (
+                       "work-day-start-thu",
+                       "Work Day Start for Thursday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_THU,
+               g_param_spec_int (
+                       "work-day-end-thu",
+                       "Work Day End for Thursday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_FRI,
+               g_param_spec_int (
+                       "work-day-start-fri",
+                       "Work Day Start for Friday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_FRI,
+               g_param_spec_int (
+                       "work-day-end-fri",
+                       "Work Day End for Friday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_SAT,
+               g_param_spec_int (
+                       "work-day-start-sat",
+                       "Work Day Start for Saturday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_SAT,
+               g_param_spec_int (
+                       "work-day-end-sat",
+                       "Work Day End for Saturday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_SUN,
+               g_param_spec_int (
+                       "work-day-start-sun",
+                       "Work Day Start for Sunday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_SUN,
+               g_param_spec_int (
+                       "work-day-end-sun",
+                       "Work Day End for Sunday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
        signals[OBJECT_CREATED] = g_signal_new (
                "object_created",
                G_TYPE_FROM_CLASS (class),
@@ -2732,6 +3096,382 @@ comp_editor_set_work_day_start_minute (CompEditor *editor,
        g_object_notify (G_OBJECT (editor), "work-day-start-minute");
 }
 
+gint
+comp_editor_get_work_day_start_mon (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_mon;
+}
+
+void
+comp_editor_set_work_day_start_mon (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_mon == work_day_start)
+               return;
+
+       editor->priv->work_day_start_mon = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-mon");
+}
+
+gint
+comp_editor_get_work_day_end_mon (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_mon;
+}
+
+void
+comp_editor_set_work_day_end_mon (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_mon == work_day_end)
+               return;
+
+       editor->priv->work_day_end_mon = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-mon");
+}
+
+gint
+comp_editor_get_work_day_start_tue (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_tue;
+}
+
+void
+comp_editor_set_work_day_start_tue (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_tue == work_day_start)
+               return;
+
+       editor->priv->work_day_start_tue = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-tue");
+}
+
+gint
+comp_editor_get_work_day_end_tue (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_tue;
+}
+
+void
+comp_editor_set_work_day_end_tue (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_tue == work_day_end)
+               return;
+
+       editor->priv->work_day_end_tue = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-tue");
+}
+
+gint
+comp_editor_get_work_day_start_wed (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_wed;
+}
+
+void
+comp_editor_set_work_day_start_wed (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_wed == work_day_start)
+               return;
+
+       editor->priv->work_day_start_wed = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-wed");
+}
+
+gint
+comp_editor_get_work_day_end_wed (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_wed;
+}
+
+void
+comp_editor_set_work_day_end_wed (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_wed == work_day_end)
+               return;
+
+       editor->priv->work_day_end_wed = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-wed");
+}
+
+gint
+comp_editor_get_work_day_start_thu (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_thu;
+}
+
+void
+comp_editor_set_work_day_start_thu (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_thu == work_day_start)
+               return;
+
+       editor->priv->work_day_start_thu = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-thu");
+}
+
+gint
+comp_editor_get_work_day_end_thu (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_thu;
+}
+
+void
+comp_editor_set_work_day_end_thu (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_thu == work_day_end)
+               return;
+
+       editor->priv->work_day_end_thu = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-thu");
+}
+
+gint
+comp_editor_get_work_day_start_fri (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_fri;
+}
+
+void
+comp_editor_set_work_day_start_fri (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_fri == work_day_start)
+               return;
+
+       editor->priv->work_day_start_fri = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-fri");
+}
+
+gint
+comp_editor_get_work_day_end_fri (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_fri;
+}
+
+void
+comp_editor_set_work_day_end_fri (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_fri == work_day_end)
+               return;
+
+       editor->priv->work_day_end_fri = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-fri");
+}
+
+gint
+comp_editor_get_work_day_start_sat (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_sat;
+}
+
+void
+comp_editor_set_work_day_start_sat (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_sat == work_day_start)
+               return;
+
+       editor->priv->work_day_start_sat = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-sat");
+}
+
+gint
+comp_editor_get_work_day_end_sat (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_sat;
+}
+
+void
+comp_editor_set_work_day_end_sat (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_sat == work_day_end)
+               return;
+
+       editor->priv->work_day_end_sat = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-sat");
+}
+
+gint
+comp_editor_get_work_day_start_sun (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_start_sun;
+}
+
+void
+comp_editor_set_work_day_start_sun (CompEditor *editor,
+                                   gint work_day_start)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_start_sun == work_day_start)
+               return;
+
+       editor->priv->work_day_start_sun = work_day_start;
+
+       g_object_notify (G_OBJECT (editor), "work-day-start-sun");
+}
+
+gint
+comp_editor_get_work_day_end_sun (CompEditor *editor)
+{
+       g_return_val_if_fail (IS_COMP_EDITOR (editor), -1);
+
+       return editor->priv->work_day_end_sun;
+}
+
+void
+comp_editor_set_work_day_end_sun (CompEditor *editor,
+                                 gint work_day_end)
+{
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+
+       if (editor->priv->work_day_end_sun == work_day_end)
+               return;
+
+       editor->priv->work_day_end_sun = work_day_end;
+
+       g_object_notify (G_OBJECT (editor), "work-day-end-sun");
+}
+
+void
+comp_editor_get_work_day_range_for (CompEditor *editor,
+                                   GDateWeekday weekday,
+                                   gint *start_hour,
+                                   gint *start_minute,
+                                   gint *end_hour,
+                                   gint *end_minute)
+{
+       gint start_adept = -1, end_adept = -1;
+
+       g_return_if_fail (IS_COMP_EDITOR (editor));
+       g_return_if_fail (start_hour != NULL);
+       g_return_if_fail (start_minute != NULL);
+       g_return_if_fail (end_hour != NULL);
+       g_return_if_fail (end_minute != NULL);
+
+       switch (weekday) {
+               case G_DATE_MONDAY:
+                       start_adept = comp_editor_get_work_day_start_mon (editor);
+                       end_adept = comp_editor_get_work_day_end_mon (editor);
+                       break;
+               case G_DATE_TUESDAY:
+                       start_adept = comp_editor_get_work_day_start_tue (editor);
+                       end_adept = comp_editor_get_work_day_end_tue (editor);
+                       break;
+               case G_DATE_WEDNESDAY:
+                       start_adept = comp_editor_get_work_day_start_wed (editor);
+                       end_adept = comp_editor_get_work_day_end_wed (editor);
+                       break;
+               case G_DATE_THURSDAY:
+                       start_adept = comp_editor_get_work_day_start_thu (editor);
+                       end_adept = comp_editor_get_work_day_end_thu (editor);
+                       break;
+               case G_DATE_FRIDAY:
+                       start_adept = comp_editor_get_work_day_start_fri (editor);
+                       end_adept = comp_editor_get_work_day_end_fri (editor);
+                       break;
+               case G_DATE_SATURDAY:
+                       start_adept = comp_editor_get_work_day_start_sat (editor);
+                       end_adept = comp_editor_get_work_day_end_sat (editor);
+                       break;
+               case G_DATE_SUNDAY:
+                       start_adept = comp_editor_get_work_day_start_sun (editor);
+                       end_adept = comp_editor_get_work_day_end_sun (editor);
+                       break;
+               default:
+                       break;
+       }
+
+       if (start_adept > 0 && (start_adept / 100) >= 0 && (start_adept / 100) <= 23 &&
+           (start_adept % 100) >= 0 && (start_adept % 100) <= 59) {
+               *start_hour = start_adept / 100;
+               *start_minute = start_adept % 100;
+       } else {
+               *start_hour = comp_editor_get_work_day_start_hour (editor);
+               *start_minute = comp_editor_get_work_day_start_minute (editor);
+       }
+
+       if (end_adept > 0 && (end_adept / 100) >= 0 && (end_adept / 100) <= 23 &&
+           (end_adept % 100) >= 0 && (end_adept % 100) <= 59) {
+               *end_hour = end_adept / 100;
+               *end_minute = end_adept % 100;
+       } else {
+               *end_hour = comp_editor_get_work_day_end_hour (editor);
+               *end_minute = comp_editor_get_work_day_end_minute (editor);
+       }
+}
+
 /**
  * comp_editor_set_changed:
  * @editor: A component editor
diff --git a/calendar/gui/dialogs/comp-editor.h b/calendar/gui/dialogs/comp-editor.h
index e8c0126..f354c84 100644
--- a/calendar/gui/dialogs/comp-editor.h
+++ b/calendar/gui/dialogs/comp-editor.h
@@ -156,6 +156,83 @@ gint               comp_editor_get_work_day_start_minute
 void           comp_editor_set_work_day_start_minute
                                                (CompEditor *editor,
                                                 gint work_day_start_minute);
+gint           comp_editor_get_work_day_start_mon
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_mon
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_mon
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_mon
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_tue
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_tue
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_tue
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_tue
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_wed
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_wed
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_wed
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_wed
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_thu
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_thu
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_thu
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_thu
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_fri
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_fri
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_fri
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_fri
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_sat
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_sat
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_sat
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_sat
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+gint           comp_editor_get_work_day_start_sun
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_start_sun
+                                               (CompEditor *editor,
+                                                gint work_day_start);
+gint           comp_editor_get_work_day_end_sun
+                                               (CompEditor *editor);
+void           comp_editor_set_work_day_end_sun
+                                               (CompEditor *editor,
+                                                gint work_day_end);
+void           comp_editor_get_work_day_range_for
+                                               (CompEditor *editor,
+                                                GDateWeekday weekday,
+                                                gint *start_hour,
+                                                gint *start_minute,
+                                                gint *end_hour,
+                                                gint *end_minute);
 void           comp_editor_append_page         (CompEditor *editor,
                                                 CompEditorPage *page,
                                                 const gchar *label,
diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c
index 054fe13..870ef8e 100644
--- a/calendar/gui/dialogs/schedule-page.c
+++ b/calendar/gui/dialogs/schedule-page.c
@@ -393,6 +393,7 @@ schedule_page_construct (SchedulePage *spage,
 {
        SchedulePagePrivate *priv = spage->priv;
        CompEditor *editor;
+       gint weekday;
 
        editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
 
@@ -413,12 +414,17 @@ schedule_page_construct (SchedulePage *spage,
        /* Selector */
        priv->sel = E_MEETING_TIME_SELECTOR (e_meeting_time_selector_new (ems));
        gtk_widget_set_size_request ((GtkWidget *) priv->sel, -1, 400);
-       e_meeting_time_selector_set_working_hours (
-               priv->sel,
-               comp_editor_get_work_day_start_hour (editor),
-               comp_editor_get_work_day_start_minute (editor),
-               comp_editor_get_work_day_end_hour (editor),
-               comp_editor_get_work_day_end_minute (editor));
+
+       for (weekday = G_DATE_BAD_WEEKDAY; weekday <= G_DATE_SUNDAY; weekday++) {
+               gint start_hour, start_minute, end_hour, end_minute;
+
+               comp_editor_get_work_day_range_for (editor, weekday,
+                       &start_hour, &start_minute, &end_hour, &end_minute);
+
+               e_meeting_time_selector_set_working_hours (priv->sel, weekday,
+                       start_hour, start_minute, end_hour, end_minute);
+       }
+
        gtk_widget_show (GTK_WIDGET (priv->sel));
        gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->sel), TRUE, TRUE, 6);
 
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
index 700462c..17f9040 100644
--- a/calendar/gui/e-cal-model.c
+++ b/calendar/gui/e-cal-model.c
@@ -98,6 +98,20 @@ struct _ECalModelPrivate {
        gint work_day_start_minute;
        gint work_day_end_hour;
        gint work_day_end_minute;
+       gint work_day_start_mon;
+       gint work_day_end_mon;
+       gint work_day_start_tue;
+       gint work_day_end_tue;
+       gint work_day_start_wed;
+       gint work_day_end_wed;
+       gint work_day_start_thu;
+       gint work_day_end_thu;
+       gint work_day_start_fri;
+       gint work_day_end_fri;
+       gint work_day_start_sat;
+       gint work_day_end_sat;
+       gint work_day_start_sun;
+       gint work_day_end_sun;
 
        /* callback, to retrieve start time for newly added rows by click-to-add */
        ECalModelDefaultTimeFunc get_default_time;
@@ -144,7 +158,21 @@ enum {
        PROP_WORK_DAY_END_HOUR,
        PROP_WORK_DAY_END_MINUTE,
        PROP_WORK_DAY_START_HOUR,
-       PROP_WORK_DAY_START_MINUTE
+       PROP_WORK_DAY_START_MINUTE,
+       PROP_WORK_DAY_START_MON,
+       PROP_WORK_DAY_END_MON,
+       PROP_WORK_DAY_START_TUE,
+       PROP_WORK_DAY_END_TUE,
+       PROP_WORK_DAY_START_WED,
+       PROP_WORK_DAY_END_WED,
+       PROP_WORK_DAY_START_THU,
+       PROP_WORK_DAY_END_THU,
+       PROP_WORK_DAY_START_FRI,
+       PROP_WORK_DAY_END_FRI,
+       PROP_WORK_DAY_START_SAT,
+       PROP_WORK_DAY_END_SAT,
+       PROP_WORK_DAY_START_SUN,
+       PROP_WORK_DAY_END_SUN
 };
 
 enum {
@@ -772,6 +800,90 @@ cal_model_set_property (GObject *object,
                                E_CAL_MODEL (object),
                                g_value_get_int (value));
                        return;
+
+               case PROP_WORK_DAY_START_MON:
+                       e_cal_model_set_work_day_start_mon (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_MON:
+                       e_cal_model_set_work_day_end_mon (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_TUE:
+                       e_cal_model_set_work_day_start_tue (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_TUE:
+                       e_cal_model_set_work_day_end_tue (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_WED:
+                       e_cal_model_set_work_day_start_wed (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_WED:
+                       e_cal_model_set_work_day_end_wed (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_THU:
+                       e_cal_model_set_work_day_start_thu (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_THU:
+                       e_cal_model_set_work_day_end_thu (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_FRI:
+                       e_cal_model_set_work_day_start_fri (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_FRI:
+                       e_cal_model_set_work_day_end_fri (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_SAT:
+                       e_cal_model_set_work_day_start_sat (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_SAT:
+                       e_cal_model_set_work_day_end_sat (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_START_SUN:
+                       e_cal_model_set_work_day_start_sun (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
+
+               case PROP_WORK_DAY_END_SUN:
+                       e_cal_model_set_work_day_end_sun (
+                               E_CAL_MODEL (object),
+                               g_value_get_int (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -951,6 +1063,104 @@ cal_model_get_property (GObject *object,
                                e_cal_model_get_work_day_start_minute (
                                E_CAL_MODEL (object)));
                        return;
+
+               case PROP_WORK_DAY_START_MON:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_mon (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_MON:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_mon (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_TUE:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_tue (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_TUE:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_tue (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_WED:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_wed (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_WED:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_wed (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_THU:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_thu (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_THU:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_thu (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_FRI:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_fri (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_FRI:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_fri (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_SAT:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_sat (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_SAT:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_sat (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_START_SUN:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_start_sun (
+                               E_CAL_MODEL (object)));
+                       return;
+
+               case PROP_WORK_DAY_END_SUN:
+                       g_value_set_int (
+                               value,
+                               e_cal_model_get_work_day_end_sun (
+                               E_CAL_MODEL (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -2134,6 +2344,174 @@ e_cal_model_class_init (ECalModelClass *class)
                        0,
                        G_PARAM_READWRITE));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_MON,
+               g_param_spec_int (
+                       "work-day-start-mon",
+                       "Work Day Start for Monday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_MON,
+               g_param_spec_int (
+                       "work-day-end-mon",
+                       "Work Day End for Monday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_TUE,
+               g_param_spec_int (
+                       "work-day-start-tue",
+                       "Work Day Start for Tuesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_TUE,
+               g_param_spec_int (
+                       "work-day-end-tue",
+                       "Work Day End for Tuesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_WED,
+               g_param_spec_int (
+                       "work-day-start-wed",
+                       "Work Day Start for Wednesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_WED,
+               g_param_spec_int (
+                       "work-day-end-wed",
+                       "Work Day End for Wednesday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_THU,
+               g_param_spec_int (
+                       "work-day-start-thu",
+                       "Work Day Start for Thursday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_THU,
+               g_param_spec_int (
+                       "work-day-end-thu",
+                       "Work Day End for Thursday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_FRI,
+               g_param_spec_int (
+                       "work-day-start-fri",
+                       "Work Day Start for Friday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_FRI,
+               g_param_spec_int (
+                       "work-day-end-fri",
+                       "Work Day End for Friday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_SAT,
+               g_param_spec_int (
+                       "work-day-start-sat",
+                       "Work Day Start for Saturday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_SAT,
+               g_param_spec_int (
+                       "work-day-end-sat",
+                       "Work Day End for Saturday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_START_SUN,
+               g_param_spec_int (
+                       "work-day-start-sun",
+                       "Work Day Start for Sunday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_WORK_DAY_END_SUN,
+               g_param_spec_int (
+                       "work-day-end-sun",
+                       "Work Day End for Sunday",
+                       NULL,
+                       -1,
+                       2359,
+                       -1,
+                       G_PARAM_READWRITE));
+
        signals[TIME_RANGE_CHANGED] = g_signal_new (
                "time_range_changed",
                G_TYPE_FROM_CLASS (class),
@@ -2806,6 +3184,382 @@ e_cal_model_set_work_day_start_minute (ECalModel *model,
        g_object_notify (G_OBJECT (model), "work-day-start-minute");
 }
 
+gint
+e_cal_model_get_work_day_start_mon (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_mon;
+}
+
+void
+e_cal_model_set_work_day_start_mon (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_mon == work_day_start)
+               return;
+
+       model->priv->work_day_start_mon = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-mon");
+}
+
+gint
+e_cal_model_get_work_day_end_mon (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_mon;
+}
+
+void
+e_cal_model_set_work_day_end_mon (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_mon == work_day_end)
+               return;
+
+       model->priv->work_day_end_mon = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-mon");
+}
+
+gint
+e_cal_model_get_work_day_start_tue (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_tue;
+}
+
+void
+e_cal_model_set_work_day_start_tue (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_tue == work_day_start)
+               return;
+
+       model->priv->work_day_start_tue = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-tue");
+}
+
+gint
+e_cal_model_get_work_day_end_tue (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_tue;
+}
+
+void
+e_cal_model_set_work_day_end_tue (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_tue == work_day_end)
+               return;
+
+       model->priv->work_day_end_tue = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-tue");
+}
+
+gint
+e_cal_model_get_work_day_start_wed (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_wed;
+}
+
+void
+e_cal_model_set_work_day_start_wed (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_wed == work_day_start)
+               return;
+
+       model->priv->work_day_start_wed = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-wed");
+}
+
+gint
+e_cal_model_get_work_day_end_wed (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_wed;
+}
+
+void
+e_cal_model_set_work_day_end_wed (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_wed == work_day_end)
+               return;
+
+       model->priv->work_day_end_wed = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-wed");
+}
+
+gint
+e_cal_model_get_work_day_start_thu (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_thu;
+}
+
+void
+e_cal_model_set_work_day_start_thu (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_thu == work_day_start)
+               return;
+
+       model->priv->work_day_start_thu = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-thu");
+}
+
+gint
+e_cal_model_get_work_day_end_thu (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_thu;
+}
+
+void
+e_cal_model_set_work_day_end_thu (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_thu == work_day_end)
+               return;
+
+       model->priv->work_day_end_thu = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-thu");
+}
+
+gint
+e_cal_model_get_work_day_start_fri (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_fri;
+}
+
+void
+e_cal_model_set_work_day_start_fri (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_fri == work_day_start)
+               return;
+
+       model->priv->work_day_start_fri = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-fri");
+}
+
+gint
+e_cal_model_get_work_day_end_fri (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_fri;
+}
+
+void
+e_cal_model_set_work_day_end_fri (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_fri == work_day_end)
+               return;
+
+       model->priv->work_day_end_fri = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-fri");
+}
+
+gint
+e_cal_model_get_work_day_start_sat (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_sat;
+}
+
+void
+e_cal_model_set_work_day_start_sat (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_sat == work_day_start)
+               return;
+
+       model->priv->work_day_start_sat = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-sat");
+}
+
+gint
+e_cal_model_get_work_day_end_sat (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_sat;
+}
+
+void
+e_cal_model_set_work_day_end_sat (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_sat == work_day_end)
+               return;
+
+       model->priv->work_day_end_sat = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-sat");
+}
+
+gint
+e_cal_model_get_work_day_start_sun (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_start_sun;
+}
+
+void
+e_cal_model_set_work_day_start_sun (ECalModel *model,
+                                   gint work_day_start)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_start_sun == work_day_start)
+               return;
+
+       model->priv->work_day_start_sun = work_day_start;
+
+       g_object_notify (G_OBJECT (model), "work-day-start-sun");
+}
+
+gint
+e_cal_model_get_work_day_end_sun (ECalModel *model)
+{
+       g_return_val_if_fail (E_IS_CAL_MODEL (model), -1);
+
+       return model->priv->work_day_end_sun;
+}
+
+void
+e_cal_model_set_work_day_end_sun (ECalModel *model,
+                                 gint work_day_end)
+{
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+
+       if (model->priv->work_day_end_sun == work_day_end)
+               return;
+
+       model->priv->work_day_end_sun = work_day_end;
+
+       g_object_notify (G_OBJECT (model), "work-day-end-sun");
+}
+
+void
+e_cal_model_get_work_day_range_for (ECalModel *model,
+                                   GDateWeekday weekday,
+                                   gint *start_hour,
+                                   gint *start_minute,
+                                   gint *end_hour,
+                                   gint *end_minute)
+{
+       gint start_adept = -1, end_adept = -1;
+
+       g_return_if_fail (E_IS_CAL_MODEL (model));
+       g_return_if_fail (start_hour != NULL);
+       g_return_if_fail (start_minute != NULL);
+       g_return_if_fail (end_hour != NULL);
+       g_return_if_fail (end_minute != NULL);
+
+       switch (weekday) {
+               case G_DATE_MONDAY:
+                       start_adept = e_cal_model_get_work_day_start_mon (model);
+                       end_adept = e_cal_model_get_work_day_end_mon (model);
+                       break;
+               case G_DATE_TUESDAY:
+                       start_adept = e_cal_model_get_work_day_start_tue (model);
+                       end_adept = e_cal_model_get_work_day_end_tue (model);
+                       break;
+               case G_DATE_WEDNESDAY:
+                       start_adept = e_cal_model_get_work_day_start_wed (model);
+                       end_adept = e_cal_model_get_work_day_end_wed (model);
+                       break;
+               case G_DATE_THURSDAY:
+                       start_adept = e_cal_model_get_work_day_start_thu (model);
+                       end_adept = e_cal_model_get_work_day_end_thu (model);
+                       break;
+               case G_DATE_FRIDAY:
+                       start_adept = e_cal_model_get_work_day_start_fri (model);
+                       end_adept = e_cal_model_get_work_day_end_fri (model);
+                       break;
+               case G_DATE_SATURDAY:
+                       start_adept = e_cal_model_get_work_day_start_sat (model);
+                       end_adept = e_cal_model_get_work_day_end_sat (model);
+                       break;
+               case G_DATE_SUNDAY:
+                       start_adept = e_cal_model_get_work_day_start_sun (model);
+                       end_adept = e_cal_model_get_work_day_end_sun (model);
+                       break;
+               default:
+                       break;
+       }
+
+       if (start_adept > 0 && (start_adept / 100) >= 0 && (start_adept / 100) <= 23 &&
+           (start_adept % 100) >= 0 && (start_adept % 100) <= 59) {
+               *start_hour = start_adept / 100;
+               *start_minute = start_adept % 100;
+       } else {
+               *start_hour = e_cal_model_get_work_day_start_hour (model);
+               *start_minute = e_cal_model_get_work_day_start_minute (model);
+       }
+
+       if (end_adept > 0 && (end_adept / 100) >= 0 && (end_adept / 100) <= 23 &&
+           (end_adept % 100) >= 0 && (end_adept % 100) <= 59) {
+               *end_hour = end_adept / 100;
+               *end_minute = end_adept % 100;
+       } else {
+               *end_hour = e_cal_model_get_work_day_end_hour (model);
+               *end_minute = e_cal_model_get_work_day_end_minute (model);
+       }
+}
+
 const gchar *
 e_cal_model_get_default_source_uid (ECalModel *model)
 {
diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h
index cecc20a..c4a5230 100644
--- a/calendar/gui/e-cal-model.h
+++ b/calendar/gui/e-cal-model.h
@@ -243,6 +243,83 @@ gint               e_cal_model_get_work_day_start_minute
 void           e_cal_model_set_work_day_start_minute
                                                (ECalModel *model,
                                                 gint work_day_start_minute);
+gint           e_cal_model_get_work_day_start_mon
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_mon
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_mon
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_mon
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_tue
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_tue
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_tue
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_tue
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_wed
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_wed
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_wed
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_wed
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_thu
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_thu
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_thu
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_thu
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_fri
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_fri
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_fri
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_fri
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_sat
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_sat
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_sat
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_sat
+                                               (ECalModel *model,
+                                                gint work_day_end);
+gint           e_cal_model_get_work_day_start_sun
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_start_sun
+                                               (ECalModel *model,
+                                                gint work_day_start);
+gint           e_cal_model_get_work_day_end_sun
+                                               (ECalModel *model);
+void           e_cal_model_set_work_day_end_sun
+                                               (ECalModel *model,
+                                                gint work_day_end);
+void           e_cal_model_get_work_day_range_for
+                                               (ECalModel *model,
+                                                GDateWeekday weekday,
+                                                gint *start_hour,
+                                                gint *start_minute,
+                                                gint *end_hour,
+                                                gint *end_minute);
 const gchar *  e_cal_model_get_default_source_uid
                                                (ECalModel *model);
 void           e_cal_model_set_default_source_uid
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
index b03ac81..3b2d437 100644
--- a/calendar/gui/e-day-view-main-item.c
+++ b/calendar/gui/e-day-view-main-item.c
@@ -1002,13 +1002,8 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
        ECalendarView *cal_view;
        ECalModel *model;
        gint time_divisions;
-       gint work_day_start_hour;
-       gint work_day_start_minute;
-       gint work_day_end_hour;
-       gint work_day_end_minute;
        gint row, row_y, grid_x1, grid_x2;
        gint day, grid_y1, grid_y2;
-       gint work_day_start_y, work_day_end_y;
        gint day_x, day_w;
        gint start_row, end_row, rect_x, rect_y, rect_width, rect_height;
        gint days_shown;
@@ -1031,10 +1026,6 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
        time_divisions = e_calendar_view_get_time_divisions (cal_view);
 
        model = e_calendar_view_get_model (cal_view);
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
-       work_day_end_hour = e_cal_model_get_work_day_end_hour (model);
-       work_day_end_minute = e_cal_model_get_work_day_end_minute (model);
 
        rect.x = 0;
        rect.y = 0;
@@ -1046,10 +1037,6 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                draw_region = cairo_region_create ();
 
        /* Paint the background colors. */
-       work_day_start_y = e_day_view_convert_time_to_position (
-               day_view, work_day_start_hour, work_day_start_minute) - y;
-       work_day_end_y = e_day_view_convert_time_to_position (
-               day_view, work_day_end_hour, work_day_end_minute) - y;
 
        today_tt = icaltime_from_timet_with_zone (
                time (NULL), FALSE,
@@ -1093,6 +1080,21 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
                day_w = day_view->day_widths[day];
 
                if (e_cal_model_get_work_day (model, weekday)) {
+                       gint work_day_start_hour;
+                       gint work_day_start_minute;
+                       gint work_day_end_hour;
+                       gint work_day_end_minute;
+                       gint work_day_start_y, work_day_end_y;
+
+                       e_cal_model_get_work_day_range_for (model, weekday,
+                               &work_day_start_hour, &work_day_start_minute,
+                               &work_day_end_hour, &work_day_end_minute);
+
+                       work_day_start_y = e_day_view_convert_time_to_position (
+                               day_view, work_day_start_hour, work_day_start_minute) - y;
+                       work_day_end_y = e_day_view_convert_time_to_position (
+                               day_view, work_day_end_hour, work_day_end_minute) - y;
+
                        if (can_draw_in_region (draw_region, day_x, 0 - y, day_w, work_day_start_y - (0 - 
y))) {
                                cairo_save (cr);
                                gdk_cairo_set_source_color (cr, 
&day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]);
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index a02d8d5..b9a5cdc 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -106,6 +106,20 @@ struct _EDayViewPrivate {
        gulong notify_work_day_start_minute_handler_id;
        gulong notify_work_day_end_hour_handler_id;
        gulong notify_work_day_end_minute_handler_id;
+       gulong notify_work_day_start_mon_handler_id;
+       gulong notify_work_day_end_mon_handler_id;
+       gulong notify_work_day_start_tue_handler_id;
+       gulong notify_work_day_end_tue_handler_id;
+       gulong notify_work_day_start_wed_handler_id;
+       gulong notify_work_day_end_wed_handler_id;
+       gulong notify_work_day_start_thu_handler_id;
+       gulong notify_work_day_end_thu_handler_id;
+       gulong notify_work_day_start_fri_handler_id;
+       gulong notify_work_day_end_fri_handler_id;
+       gulong notify_work_day_start_sat_handler_id;
+       gulong notify_work_day_end_sat_handler_id;
+       gulong notify_work_day_start_sun_handler_id;
+       gulong notify_work_day_end_sun_handler_id;
        gulong time_range_changed_handler_id;
        gulong model_row_changed_handler_id;
        gulong model_cell_changed_handler_id;
@@ -546,17 +560,73 @@ day_view_notify_work_day_cb (ECalModel *model,
 }
 
 static void
-e_day_view_recalc_main_canvas_size (EDayView *day_view)
+e_day_view_get_work_day_range_for_day (EDayView *day_view,
+                                      gint day,
+                                      gint *start_hour,
+                                      gint *start_minute,
+                                      gint *end_hour,
+                                      gint *end_minute)
 {
        ECalModel *model;
-       gint work_day_start_hour;
-       gint work_day_start_minute;
-       gint day, scroll_y;
-       gboolean need_reshape;
+
+       g_return_if_fail (E_IS_DAY_VIEW (day_view));
+       g_return_if_fail (start_hour != NULL);
+       g_return_if_fail (start_minute != NULL);
+       g_return_if_fail (end_hour != NULL);
+       g_return_if_fail (end_minute != NULL);
 
        model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
+
+       if (day >= 0 && day < e_day_view_get_days_shown (day_view)) {
+               GDateWeekday weekday;
+               struct icaltimetype tt;
+
+               tt = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE,
+                       e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view)));
+
+               switch (icaltime_day_of_week (tt)) {
+                       case 1:
+                               weekday = G_DATE_SUNDAY;
+                               break;
+                       case 2:
+                               weekday = G_DATE_MONDAY;
+                               break;
+                       case 3:
+                               weekday = G_DATE_TUESDAY;
+                               break;
+                       case 4:
+                               weekday = G_DATE_WEDNESDAY;
+                               break;
+                       case 5:
+                               weekday = G_DATE_THURSDAY;
+                               break;
+                       case 6:
+                               weekday = G_DATE_FRIDAY;
+                               break;
+                       case 7:
+                               weekday = G_DATE_SATURDAY;
+                               break;
+                       default:
+                               weekday = G_DATE_BAD_WEEKDAY;
+                               break;
+               }
+
+               e_cal_model_get_work_day_range_for (model, weekday,
+                       start_hour, start_minute,
+                       end_hour, end_minute);
+       } else {
+               *start_hour = e_cal_model_get_work_day_start_hour (model);
+               *start_minute = e_cal_model_get_work_day_start_minute (model);
+               *end_hour = e_cal_model_get_work_day_end_hour (model);
+               *end_minute = e_cal_model_get_work_day_end_minute (model);
+       }
+}
+
+static void
+e_day_view_recalc_main_canvas_size (EDayView *day_view)
+{
+       gint day, scroll_y;
+       gboolean need_reshape;
 
        /* Set the scroll region of the top canvas */
        e_day_view_update_top_scroll (day_view, TRUE);
@@ -568,6 +638,15 @@ e_day_view_recalc_main_canvas_size (EDayView *day_view)
        /* Scroll to the start of the working day, if this is the initial
         * allocation. */
        if (day_view->scroll_to_work_day) {
+               gint work_day_start_hour;
+               gint work_day_start_minute;
+               gint work_day_end_hour;
+               gint work_day_end_minute;
+
+               e_day_view_get_work_day_range_for_day (day_view, 0,
+                       &work_day_start_hour, &work_day_start_minute,
+                       &work_day_end_hour, &work_day_end_minute);
+
                scroll_y = e_day_view_convert_time_to_position (
                        day_view, work_day_start_hour, work_day_start_minute);
                gnome_canvas_scroll_to (
@@ -935,131 +1014,47 @@ day_view_dispose (GObject *object)
                day_view->grabbed_pointer = NULL;
        }
 
-       if (day_view->priv->notify_work_day_monday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_monday_handler_id);
-               day_view->priv->notify_work_day_monday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_tuesday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_tuesday_handler_id);
-               day_view->priv->notify_work_day_tuesday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_wednesday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_wednesday_handler_id);
-               day_view->priv->notify_work_day_wednesday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_thursday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_thursday_handler_id);
-               day_view->priv->notify_work_day_thursday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_friday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_friday_handler_id);
-               day_view->priv->notify_work_day_friday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_saturday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_saturday_handler_id);
-               day_view->priv->notify_work_day_saturday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_sunday_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_sunday_handler_id);
-               day_view->priv->notify_work_day_sunday_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_week_start_day_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_week_start_day_handler_id);
-               day_view->priv->notify_week_start_day_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_start_hour_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_start_hour_handler_id);
-               day_view->priv->notify_work_day_start_hour_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_start_minute_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_start_minute_handler_id);
-               day_view->priv->notify_work_day_start_minute_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_end_hour_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_end_hour_handler_id);
-               day_view->priv->notify_work_day_end_hour_handler_id = 0;
-       }
-
-       if (day_view->priv->notify_work_day_end_minute_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->notify_work_day_end_minute_handler_id);
-               day_view->priv->notify_work_day_end_minute_handler_id = 0;
-       }
-
-       if (day_view->priv->time_range_changed_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->time_range_changed_handler_id);
-               day_view->priv->time_range_changed_handler_id = 0;
-       }
-
-       if (day_view->priv->model_row_changed_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->model_row_changed_handler_id);
-               day_view->priv->model_row_changed_handler_id = 0;
-       }
-
-       if (day_view->priv->model_cell_changed_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->model_cell_changed_handler_id);
-               day_view->priv->model_cell_changed_handler_id = 0;
-       }
-
-       if (day_view->priv->model_rows_inserted_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->model_rows_inserted_handler_id);
-               day_view->priv->model_rows_inserted_handler_id = 0;
-       }
-
-       if (day_view->priv->comps_deleted_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->comps_deleted_handler_id);
-               day_view->priv->comps_deleted_handler_id = 0;
-       }
-
-       if (day_view->priv->timezone_changed_handler_id > 0) {
-               g_signal_handler_disconnect (
-                       day_view->priv->model,
-                       day_view->priv->timezone_changed_handler_id);
-               day_view->priv->timezone_changed_handler_id = 0;
-       }
+       #define disconnect_model_handler(x) G_STMT_START { \
+               if ((x) > 0) { \
+                       g_signal_handler_disconnect (day_view->priv->model, (x)); \
+                       (x) = 0; \
+               } \
+       } G_STMT_END
+
+       disconnect_model_handler (day_view->priv->notify_work_day_monday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_tuesday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_wednesday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_thursday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_friday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_saturday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_sunday_handler_id);
+       disconnect_model_handler (day_view->priv->notify_week_start_day_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_hour_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_minute_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_hour_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_minute_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_mon_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_mon_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_tue_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_tue_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_wed_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_wed_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_thu_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_thu_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_fri_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_fri_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_sat_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_sat_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_start_sun_handler_id);
+       disconnect_model_handler (day_view->priv->notify_work_day_end_sun_handler_id);
+       disconnect_model_handler (day_view->priv->time_range_changed_handler_id);
+       disconnect_model_handler (day_view->priv->model_row_changed_handler_id);
+       disconnect_model_handler (day_view->priv->model_cell_changed_handler_id);
+       disconnect_model_handler (day_view->priv->model_rows_inserted_handler_id);
+       disconnect_model_handler (day_view->priv->comps_deleted_handler_id);
+       disconnect_model_handler (day_view->priv->timezone_changed_handler_id);
+
+       #undef disconnect_model_handler
 
        if (day_view->priv->top_canvas_button_press_event_handler_id > 0) {
                g_signal_handler_disconnect (
@@ -1320,6 +1315,76 @@ day_view_constructed (GObject *object)
                G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
        day_view->priv->notify_work_day_end_minute_handler_id = handler_id;
 
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-mon",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_mon_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-mon",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_mon_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-tue",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_tue_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-tue",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_tue_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-wed",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_wed_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-wed",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_wed_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-thu",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_thu_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-thu",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_thu_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-fri",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_fri_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-fri",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_fri_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-sat",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_sat_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-sat",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_sat_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-start-sun",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_start_sun_handler_id = handler_id;
+
+       handler_id = e_signal_connect_notify_swapped (
+               model, "notify::work-day-end-sun",
+               G_CALLBACK (gtk_widget_queue_draw), day_view->main_canvas);
+       day_view->priv->notify_work_day_end_sun_handler_id = handler_id;
+
        e_day_view_update_timezone_name_labels (day_view);
 }
 
@@ -1777,17 +1842,15 @@ day_view_set_selected_time_range (ECalendarView *cal_view,
                                   time_t start_time,
                                   time_t end_time)
 {
-       ECalModel *model;
        EDayView *day_view;
        gint work_day_start_hour;
        gint work_day_start_minute;
+       gint work_day_end_hour;
+       gint work_day_end_minute;
        gint start_row, start_col, end_row, end_col;
        gboolean need_redraw = FALSE, start_in_grid, end_in_grid;
 
        day_view = E_DAY_VIEW (cal_view);
-       model = e_calendar_view_get_model (cal_view);
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
 
        if (start_time == end_time)
                end_time += e_calendar_view_get_time_divisions (cal_view) * 60;
@@ -1804,6 +1867,10 @@ day_view_set_selected_time_range (ECalendarView *cal_view,
                &end_col,
                &end_row);
 
+       e_day_view_get_work_day_range_for_day (day_view, start_col,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
+
        /* If either of the times isn't in the grid, or the selection covers
         * an entire day, we set the selection to 1 row from the start of the
         * working day, in the day corresponding to the start time. */
@@ -3542,18 +3609,15 @@ e_day_view_set_selected_time_range_visible (EDayView *day_view,
                                             time_t start_time,
                                             time_t end_time)
 {
-       ECalModel *model;
        gint work_day_start_hour;
        gint work_day_start_minute;
+       gint work_day_end_hour;
+       gint work_day_end_minute;
        gint start_row, start_col, end_row, end_col;
        gboolean need_redraw = FALSE, start_in_grid, end_in_grid;
 
        g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
-       model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
-
        /* Set the selection. */
        start_in_grid = e_day_view_convert_time_to_grid_position (
                day_view,
@@ -3562,9 +3626,13 @@ e_day_view_set_selected_time_range_visible (EDayView *day_view,
                &start_row);
        end_in_grid = e_day_view_convert_time_to_grid_position (
                day_view,
-                                                               end_time - 60,
-                                                               &end_col,
-                                                               &end_row);
+               end_time - 60,
+               &end_col,
+               &end_row);
+
+       e_day_view_get_work_day_range_for_day (day_view, start_col,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
 
        /* If either of the times isn't in the grid, or the selection covers
         * an entire day, we set the selection to 1 row from the start of the
@@ -6350,21 +6418,23 @@ e_day_view_do_key_press (GtkWidget *widget,
 static void
 e_day_view_goto_start_of_work_day (EDayView *day_view)
 {
-       ECalModel *model;
        gint work_day_start_hour;
        gint work_day_start_minute;
-
-       model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
+       gint work_day_end_hour;
+       gint work_day_end_minute;
 
        if (day_view->selection_in_top_canvas)
                return;
-       else
-               day_view->selection_start_row =
-                       e_day_view_convert_time_to_row (
-                       day_view, work_day_start_hour, work_day_start_minute);
+
+       e_day_view_get_work_day_range_for_day (day_view, day_view->selection_start_day,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
+
+       day_view->selection_start_row =
+               e_day_view_convert_time_to_row (
+               day_view, work_day_start_hour, work_day_start_minute);
        day_view->selection_end_row = day_view->selection_start_row;
+       day_view->selection_end_day = day_view->selection_start_day;
 
        e_day_view_ensure_rows_visible (
                day_view,
@@ -6382,21 +6452,23 @@ e_day_view_goto_start_of_work_day (EDayView *day_view)
 static void
 e_day_view_goto_end_of_work_day (EDayView *day_view)
 {
-       ECalModel *model;
+       gint work_day_start_hour;
+       gint work_day_start_minute;
        gint work_day_end_hour;
        gint work_day_end_minute;
 
-       model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_end_hour = e_cal_model_get_work_day_end_hour (model);
-       work_day_end_minute = e_cal_model_get_work_day_end_minute (model);
-
        if (day_view->selection_in_top_canvas)
                return;
-       else
-               day_view->selection_start_row =
-                       e_day_view_convert_time_to_row (
-                       day_view, work_day_end_hour - 1, work_day_end_minute + 30);
+
+       e_day_view_get_work_day_range_for_day (day_view, day_view->selection_end_day,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
+
+       day_view->selection_start_row =
+               e_day_view_convert_time_to_row (
+               day_view, work_day_end_hour - 1, work_day_end_minute + 30);
        day_view->selection_end_row = day_view->selection_start_row;
+       day_view->selection_start_day = day_view->selection_end_day;
 
        e_day_view_ensure_rows_visible (
                day_view,
@@ -6414,29 +6486,27 @@ e_day_view_goto_end_of_work_day (EDayView *day_view)
 static void
 e_day_view_change_duration_to_start_of_work_day (EDayView *day_view)
 {
-       ECalModel *model;
+       gint work_start_row;
        gint work_day_start_hour;
        gint work_day_start_minute;
+       gint work_day_end_hour;
+       gint work_day_end_minute;
 
        g_return_if_fail (day_view != NULL);
 
-       model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_start_hour = e_cal_model_get_work_day_start_hour (model);
-       work_day_start_minute = e_cal_model_get_work_day_start_minute (model);
-
        if (day_view->selection_in_top_canvas)
                return;
-       else {
-               /* These are never used after being set? */
-               gint work_start_row,selection_start_row;
 
-               work_start_row = e_day_view_convert_time_to_row (
-                       day_view, work_day_start_hour, work_day_start_minute);
-               selection_start_row = day_view->selection_start_row;
-               if (selection_start_row < work_start_row)
-                       day_view->selection_end_row = work_start_row - 1;
-               else day_view->selection_start_row = work_start_row;
-       }
+       e_day_view_get_work_day_range_for_day (day_view, day_view->selection_start_day,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
+
+       work_start_row = e_day_view_convert_time_to_row (day_view, work_day_start_hour, 
work_day_start_minute);
+
+       if (day_view->selection_start_row < work_start_row)
+               day_view->selection_end_row = work_start_row - 1;
+       else
+               day_view->selection_start_row = work_start_row;
 
        e_day_view_ensure_rows_visible (
                day_view,
@@ -6454,30 +6524,30 @@ e_day_view_change_duration_to_start_of_work_day (EDayView *day_view)
 static void
 e_day_view_change_duration_to_end_of_work_day (EDayView *day_view)
 {
-       ECalModel *model;
+       gint selection_start_row, work_end_row;
+       gint work_day_start_hour;
+       gint work_day_start_minute;
        gint work_day_end_hour;
        gint work_day_end_minute;
 
        g_return_if_fail (day_view != NULL);
 
-       model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
-       work_day_end_hour = e_cal_model_get_work_day_end_hour (model);
-       work_day_end_minute = e_cal_model_get_work_day_end_minute (model);
-
        if (day_view->selection_in_top_canvas)
                return;
-       else {
-               gint work_end_row,selection_start_row;
 
-               work_end_row = e_day_view_convert_time_to_row (
-                       day_view, work_day_end_hour - 1, work_day_end_minute + 30);
-               selection_start_row = day_view->selection_start_row;
-               if (selection_start_row <= work_end_row)
-                       day_view->selection_end_row = work_end_row;
-               else {
-                       day_view->selection_start_row = work_end_row + 1;
-                       day_view->selection_end_row = selection_start_row;
-               }
+       e_day_view_get_work_day_range_for_day (day_view, day_view->selection_start_day,
+               &work_day_start_hour, &work_day_start_minute,
+               &work_day_end_hour, &work_day_end_minute);
+
+       work_end_row = e_day_view_convert_time_to_row (
+               day_view, work_day_end_hour - 1, work_day_end_minute + 30);
+       selection_start_row = day_view->selection_start_row;
+
+       if (selection_start_row <= work_end_row) {
+               day_view->selection_end_row = work_end_row;
+       } else {
+               day_view->selection_start_row = work_end_row + 1;
+               day_view->selection_end_row = selection_start_row;
        }
 
        e_day_view_ensure_rows_visible (
diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c
index bdc4047..36b0fcd 100644
--- a/calendar/gui/e-meeting-time-sel.c
+++ b/calendar/gui/e-meeting-time-sel.c
@@ -316,6 +316,8 @@ e_meeting_time_selector_class_init (EMeetingTimeSelectorClass *class)
 static void
 e_meeting_time_selector_init (EMeetingTimeSelector *mts)
 {
+       GDateWeekday weekday;
+
        mts->priv = E_MEETING_TIME_SELECTOR_GET_PRIVATE (mts);
 
        /* The shadow is drawn in the border so it must be >= 2 pixels. */
@@ -324,10 +326,14 @@ e_meeting_time_selector_init (EMeetingTimeSelector *mts)
        mts->accel_group = gtk_accel_group_new ();
 
        mts->working_hours_only = TRUE;
-       mts->day_start_hour = 9;
-       mts->day_start_minute = 0;
-       mts->day_end_hour = 18;
-       mts->day_end_minute = 0;
+
+       for (weekday = G_DATE_BAD_WEEKDAY; weekday <= G_DATE_SUNDAY; weekday++) {
+               mts->day_start_hour[weekday] = 9;
+               mts->day_start_minute[weekday] = 0;
+               mts->day_end_hour[weekday] = 18;
+               mts->day_end_minute[weekday] = 0;
+       }
+
        mts->zoomed_out = FALSE;
        mts->dragging_position = E_MEETING_TIME_SELECTOR_POS_NONE;
 
@@ -1344,6 +1350,7 @@ e_meeting_time_selector_set_working_hours_only (EMeetingTimeSelector *mts,
 
 void
 e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts,
+                                          GDateWeekday for_weekday,
                                            gint day_start_hour,
                                            gint day_start_minute,
                                            gint day_end_hour,
@@ -1352,23 +1359,31 @@ e_meeting_time_selector_set_working_hours (EMeetingTimeSelector *mts,
        EMeetingTime saved_time;
 
        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
-           && mts->day_end_hour == day_end_hour
-           && mts->day_end_minute == day_end_minute)
+       g_return_if_fail (for_weekday == G_DATE_MONDAY ||
+                         for_weekday == G_DATE_TUESDAY ||
+                         for_weekday == G_DATE_WEDNESDAY ||
+                         for_weekday == G_DATE_THURSDAY ||
+                         for_weekday == G_DATE_FRIDAY ||
+                         for_weekday == G_DATE_SATURDAY ||
+                         for_weekday == G_DATE_SUNDAY ||
+                         for_weekday == G_DATE_BAD_WEEKDAY);
+
+       if (mts->day_start_hour[for_weekday] == day_start_hour
+           && mts->day_start_minute[for_weekday] == day_start_minute
+           && mts->day_end_hour[for_weekday] == day_end_hour
+           && mts->day_end_minute[for_weekday] == day_end_minute)
                return;
 
-       mts->day_start_hour = day_start_hour;
-       mts->day_start_minute = day_start_minute;
+       mts->day_start_hour[for_weekday] = day_start_hour;
+       mts->day_start_minute[for_weekday] = day_start_minute;
 
        /* Make sure we always show atleast an hour */
        if (day_start_hour * 60 + day_start_minute + 60 < day_end_hour * 60 + day_end_minute) {
-               mts->day_end_hour = day_end_hour;
-               mts->day_end_minute = day_end_minute;
+               mts->day_end_hour[for_weekday] = day_end_hour;
+               mts->day_end_minute[for_weekday] = day_end_minute;
        } else {
-               mts->day_end_hour = day_start_hour + 1;
-               mts->day_end_minute = day_start_minute;
+               mts->day_end_hour[for_weekday] = day_start_hour + 1;
+               mts->day_end_minute[for_weekday] = day_start_minute;
        }
 
        e_meeting_time_selector_save_position (mts, &saved_time);
@@ -1913,6 +1928,22 @@ e_meeting_time_selector_calculate_time_difference (EMeetingTime *start,
        }
 }
 
+static GDateWeekday
+e_meeting_time_selector_get_time_weekday (const EMeetingTime *time)
+{
+       GDateWeekday weekday;
+
+       if (!time || !g_date_valid (&time->date))
+               return G_DATE_BAD_WEEKDAY;
+
+       weekday = g_date_get_weekday (&time->date);
+
+       if (weekday < G_DATE_BAD_WEEKDAY || weekday > G_DATE_SUNDAY)
+               weekday = G_DATE_BAD_WEEKDAY;
+
+       return weekday;
+}
+
 /* This moves the given time forward to the next suitable start of a meeting.
  * If zoomed_out is set, this means every hour. If not every half-hour. */
 static void
@@ -1923,6 +1954,7 @@ e_meeting_time_selector_find_nearest_interval (EMeetingTimeSelector *mts,
                                                gint hours,
                                                gint mins)
 {
+       GDateWeekday start_weekday, end_weekday;
        gint minutes_shown;
        gboolean set_to_start_of_working_day = FALSE;
 
@@ -1948,31 +1980,35 @@ e_meeting_time_selector_find_nearest_interval (EMeetingTimeSelector *mts,
         * If it isn't we don't worry about the working day. */
        if (!mts->working_hours_only || days > 0)
                return;
-       minutes_shown = (mts->day_end_hour - mts->day_start_hour) * 60;
-       minutes_shown += mts->day_end_minute - mts->day_start_minute;
+
+       start_weekday = e_meeting_time_selector_get_time_weekday (start_time);
+       end_weekday = e_meeting_time_selector_get_time_weekday (end_time);
+
+       minutes_shown = (mts->day_end_hour[end_weekday] - mts->day_start_hour[start_weekday]) * 60;
+       minutes_shown += mts->day_end_minute[end_weekday] - mts->day_start_minute[start_weekday];
        if (hours * 60 + mins > minutes_shown)
                return;
 
        /* If the meeting time finishes past the end of the working day, move
         * onto the start of the next working day. If the meeting time starts
         * before the working day, move it on as well. */
-       if (start_time->hour > mts->day_end_hour
-           || (start_time->hour == mts->day_end_hour
-               && start_time->minute > mts->day_end_minute)
-           || end_time->hour > mts->day_end_hour
-           || (end_time->hour == mts->day_end_hour
-               && end_time->minute > mts->day_end_minute)) {
+       if (start_time->hour > mts->day_end_hour[end_weekday]
+           || (start_time->hour == mts->day_end_hour[end_weekday]
+               && start_time->minute > mts->day_end_minute[end_weekday])
+           || end_time->hour > mts->day_end_hour[end_weekday]
+           || (end_time->hour == mts->day_end_hour[end_weekday]
+               && end_time->minute > mts->day_end_minute[end_weekday])) {
                g_date_add_days (&start_time->date, 1);
                set_to_start_of_working_day = TRUE;
-       } else if (start_time->hour < mts->day_start_hour
-                  || (start_time->hour == mts->day_start_hour
-                      && start_time->minute < mts->day_start_minute)) {
+       } else if (start_time->hour < mts->day_start_hour[start_weekday]
+                  || (start_time->hour == mts->day_start_hour[start_weekday]
+                      && start_time->minute < mts->day_start_minute[start_weekday])) {
                set_to_start_of_working_day = TRUE;
        }
 
        if (set_to_start_of_working_day) {
-               start_time->hour = mts->day_start_hour;
-               start_time->minute = mts->day_start_minute;
+               start_time->hour = mts->day_start_hour[start_weekday];
+               start_time->minute = mts->day_start_minute[start_weekday];
 
                if (mts->zoomed_out) {
                        if (start_time->minute > 0) {
@@ -2001,6 +2037,7 @@ e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mt
                                                         gint hours,
                                                         gint mins)
 {
+       GDateWeekday start_weekday, end_weekday;
        gint new_hour, minutes_shown;
        gboolean set_to_end_of_working_day = FALSE;
 
@@ -2037,8 +2074,13 @@ e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mt
         * If it isn't we don't worry about the working day. */
        if (!mts->working_hours_only || days > 0)
                return;
-       minutes_shown = (mts->day_end_hour - mts->day_start_hour) * 60;
-       minutes_shown += mts->day_end_minute - mts->day_start_minute;
+
+       start_weekday = e_meeting_time_selector_get_time_weekday (start_time);
+       end_weekday = e_meeting_time_selector_get_time_weekday (end_time);
+
+       minutes_shown = (mts->day_end_hour[end_weekday] - mts->day_start_hour[start_weekday]) * 60;
+       minutes_shown += mts->day_end_minute[end_weekday] - mts->day_start_minute[start_weekday];
+
        if (hours * 60 + mins > minutes_shown)
                return;
 
@@ -2046,23 +2088,23 @@ e_meeting_time_selector_find_nearest_interval_backward (EMeetingTimeSelector *mt
         * back to the end of the working day. If the meeting time starts
         * before the working day, move it back to the end of the previous
         * working day. */
-       if (start_time->hour > mts->day_end_hour
-           || (start_time->hour == mts->day_end_hour
-               && start_time->minute > mts->day_end_minute)
-           || end_time->hour > mts->day_end_hour
-           || (end_time->hour == mts->day_end_hour
-               && end_time->minute > mts->day_end_minute)) {
+       if (start_time->hour > mts->day_end_hour[end_weekday]
+           || (start_time->hour == mts->day_end_hour[end_weekday]
+               && start_time->minute > mts->day_end_minute[end_weekday])
+           || end_time->hour > mts->day_end_hour[end_weekday]
+           || (end_time->hour == mts->day_end_hour[end_weekday]
+               && end_time->minute > mts->day_end_minute[end_weekday])) {
                set_to_end_of_working_day = TRUE;
-       } else if (start_time->hour < mts->day_start_hour
-                  || (start_time->hour == mts->day_start_hour
-                      && start_time->minute < mts->day_start_minute)) {
+       } else if (start_time->hour < mts->day_start_hour[start_weekday]
+                  || (start_time->hour == mts->day_start_hour[start_weekday]
+                      && start_time->minute < mts->day_start_minute[start_weekday])) {
                g_date_subtract_days (&end_time->date, 1);
                set_to_end_of_working_day = TRUE;
        }
 
        if (set_to_end_of_working_day) {
-               end_time->hour = mts->day_end_hour;
-               end_time->minute = mts->day_end_minute;
+               end_time->hour = mts->day_end_hour[end_weekday];
+               end_time->minute = mts->day_end_minute[end_weekday];
                *start_time = *end_time;
                e_meeting_time_selector_adjust_time (start_time, -days, -hours, -mins);
 
@@ -2188,10 +2230,20 @@ static void
 e_meeting_time_selector_recalc_grid (EMeetingTimeSelector *mts)
 {
        if (mts->working_hours_only) {
-               mts->first_hour_shown = mts->day_start_hour;
-               mts->last_hour_shown = mts->day_end_hour;
-               if (mts->day_end_minute != 0)
-                       mts->last_hour_shown += 1;
+               GDateWeekday weekday;
+
+               mts->first_hour_shown = mts->day_start_hour[G_DATE_BAD_WEEKDAY];
+               mts->last_hour_shown = mts->day_end_hour[G_DATE_BAD_WEEKDAY];
+
+               for (weekday = G_DATE_BAD_WEEKDAY; weekday <= G_DATE_SUNDAY; weekday++) {
+                       if (mts->first_hour_shown > mts->day_start_hour[weekday])
+                               mts->first_hour_shown = mts->day_start_hour[weekday];
+                       if (mts->last_hour_shown <= mts->day_end_hour[weekday]) {
+                               mts->last_hour_shown = mts->day_end_hour[weekday];
+                               if (mts->day_end_minute[weekday] != 0)
+                                       mts->last_hour_shown += 1;
+                       }
+               }
        } else {
                mts->first_hour_shown = 0;
                mts->last_hour_shown = 24;
@@ -2509,8 +2561,18 @@ e_meeting_time_selector_update_date_popup_menus (EMeetingTimeSelector *mts)
        end_edit = E_DATE_EDIT (mts->end_date_edit);
 
        if (mts->working_hours_only) {
-               low_hour = mts->day_start_hour;
-               high_hour = mts->day_end_hour;
+               GDateWeekday weekday;
+
+               low_hour = mts->day_start_hour[G_DATE_MONDAY];
+               high_hour = mts->day_end_hour[G_DATE_MONDAY];
+
+               for (weekday = G_DATE_MONDAY; weekday <= G_DATE_SUNDAY; weekday++) {
+                       if (low_hour > mts->day_start_hour[weekday])
+                               low_hour = mts->day_start_hour[weekday];
+                       if (high_hour <= mts->day_end_hour[weekday]) {
+                               high_hour = mts->day_end_hour[weekday];
+                       }
+               }
        } else {
                low_hour = 0;
                high_hour = 23;
diff --git a/calendar/gui/e-meeting-time-sel.h b/calendar/gui/e-meeting-time-sel.h
index 20c5f0c..b3e0c9b 100644
--- a/calendar/gui/e-meeting-time-sel.h
+++ b/calendar/gui/e-meeting-time-sel.h
@@ -198,10 +198,10 @@ struct _EMeetingTimeSelector {
        /* If this is TRUE we only show hours between day_start_hour and
         * day_end_hour, defaults to TRUE (9am-6pm). */
        gboolean working_hours_only;
-       gint day_start_hour;
-       gint day_start_minute;
-       gint day_end_hour;
-       gint day_end_minute;
+       gint day_start_hour[G_DATE_SUNDAY + 1];
+       gint day_start_minute[G_DATE_SUNDAY + 1];
+       gint day_end_hour[G_DATE_SUNDAY + 1];
+       gint day_end_minute[G_DATE_SUNDAY + 1];
 
        /* If TRUE, view is compressed, with one cell for every 3 hours rather
         * than every hour. Defaults to FALSE. */
@@ -327,6 +327,7 @@ void                e_meeting_time_selector_set_working_hours_only
                                                 gboolean working_hours_only);
 void           e_meeting_time_selector_set_working_hours
                                                (EMeetingTimeSelector *mts,
+                                                GDateWeekday for_weekday,
                                                 gint day_start_hour,
                                                 gint day_start_minute,
                                                 gint day_end_hour,
diff --git a/data/org.gnome.evolution.calendar.gschema.xml.in 
b/data/org.gnome.evolution.calendar.gschema.xml.in
index cd5e341..960161d 100644
--- a/data/org.gnome.evolution.calendar.gschema.xml.in
+++ b/data/org.gnome.evolution.calendar.gschema.xml.in
@@ -79,6 +79,76 @@
       <_summary>Workday start minute</_summary>
       <_description>Minute the workday starts on, 0 to 59.</_description>
     </key>
+    <key name="day-start-mon" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Monday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-mon" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Monday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-tue" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Teusday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-tue" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Teusday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-wed" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Wednesday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-wed" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Wednesday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-thu" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Thursday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-thu" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Thursday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-fri" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Friday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-fri" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Friday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-sat" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Saturday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-sat" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Saturday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
+    <key name="day-start-sun" type="i">
+      <default>-1</default>
+      <_summary>Workday start time for Sunday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-start-hour and day-start-minute</_description>
+    </key>
+    <key name="day-end-sun" type="i">
+      <default>-1</default>
+      <_summary>Workday end time for Sunday</_summary>
+      <_description>Time the workday ends on, in twenty four hour format HHMM, 0000 to 2359, or -1 to use 
day-end-hour and day-end-minute</_description>
+    </key>
     <key name="day-second-zone" type="s">
       <default>''</default>
       <_summary>The second timezone for a Day View</_summary>
diff --git a/modules/settings/e-settings-cal-model.c b/modules/settings/e-settings-cal-model.c
index 4646d17..19401cd 100644
--- a/modules/settings/e-settings-cal-model.c
+++ b/modules/settings/e-settings-cal-model.c
@@ -178,6 +178,76 @@ settings_cal_model_constructed (GObject *object)
                extensible, "work-day-start-minute",
                G_SETTINGS_BIND_GET);
 
+       g_settings_bind (
+               settings, "day-start-mon",
+               extensible, "work-day-start-mon",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-mon",
+               extensible, "work-day-end-mon",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-tue",
+               extensible, "work-day-start-tue",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-tue",
+               extensible, "work-day-end-tue",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-wed",
+               extensible, "work-day-start-wed",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-wed",
+               extensible, "work-day-end-wed",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-thu",
+               extensible, "work-day-start-thu",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-thu",
+               extensible, "work-day-end-thu",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-fri",
+               extensible, "work-day-start-fri",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-fri",
+               extensible, "work-day-end-fri",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-sat",
+               extensible, "work-day-start-sat",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-sat",
+               extensible, "work-day-end-sat",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-sun",
+               extensible, "work-day-start-sun",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-sun",
+               extensible, "work-day-end-sun",
+               G_SETTINGS_BIND_GET);
+
        /*** ECalModelTasks ***/
 
        if (E_IS_CAL_MODEL_TASKS (extensible)) {
diff --git a/modules/settings/e-settings-comp-editor.c b/modules/settings/e-settings-comp-editor.c
index 54c43c2..01680c2 100644
--- a/modules/settings/e-settings-comp-editor.c
+++ b/modules/settings/e-settings-comp-editor.c
@@ -115,6 +115,76 @@ settings_comp_editor_constructed (GObject *object)
                extensible, "work-day-start-minute",
                G_SETTINGS_BIND_GET);
 
+       g_settings_bind (
+               settings, "day-start-mon",
+               extensible, "work-day-start-mon",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-mon",
+               extensible, "work-day-end-mon",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-tue",
+               extensible, "work-day-start-tue",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-tue",
+               extensible, "work-day-end-tue",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-wed",
+               extensible, "work-day-start-wed",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-wed",
+               extensible, "work-day-end-wed",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-thu",
+               extensible, "work-day-start-thu",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-thu",
+               extensible, "work-day-end-thu",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-fri",
+               extensible, "work-day-start-fri",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-fri",
+               extensible, "work-day-end-fri",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-sat",
+               extensible, "work-day-start-sat",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-sat",
+               extensible, "work-day-end-sat",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-start-sun",
+               extensible, "work-day-start-sun",
+               G_SETTINGS_BIND_GET);
+
+       g_settings_bind (
+               settings, "day-end-sun",
+               extensible, "work-day-end-sun",
+               G_SETTINGS_BIND_GET);
+
        g_object_unref (settings);
 
        /* Chain up to parent's constructed() method. */



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