aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc/e-calendar-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc/e-calendar-item.c')
-rw-r--r--widgets/misc/e-calendar-item.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c
index 53f2608347..4c82f1c5f2 100644
--- a/widgets/misc/e-calendar-item.c
+++ b/widgets/misc/e-calendar-item.c
@@ -241,6 +241,7 @@ enum {
ARG_SHOW_WEEK_NUMBERS,
ARG_MAXIMUM_DAYS_SELECTED,
ARG_DAYS_TO_START_WEEK_SELECTION,
+ ARG_MOVE_SELECTION_WHEN_MOVING,
ARG_ROUND_SELECTION_WHEN_MOVING
};
@@ -328,6 +329,9 @@ e_calendar_item_class_init (ECalendarItemClass *class)
gtk_object_add_arg_type ("ECalendarItem::days_to_start_week_selection",
GTK_TYPE_INT, GTK_ARG_READWRITE,
ARG_DAYS_TO_START_WEEK_SELECTION);
+ gtk_object_add_arg_type ("ECalendarItem::move_selection_when_moving",
+ GTK_TYPE_BOOL, GTK_ARG_READWRITE,
+ ARG_MOVE_SELECTION_WHEN_MOVING);
gtk_object_add_arg_type ("ECalendarItem::round_selection_when_moving",
GTK_TYPE_BOOL, GTK_ARG_READWRITE,
ARG_ROUND_SELECTION_WHEN_MOVING);
@@ -395,6 +399,7 @@ e_calendar_item_init (ECalendarItem *calitem)
calitem->expand = TRUE;
calitem->max_days_selected = 42;
calitem->days_to_start_week_selection = 9;
+ calitem->move_selection_when_moving = TRUE;
calitem->round_selection_when_moving = FALSE;
calitem->x1 = 0.0;
@@ -404,7 +409,7 @@ e_calendar_item_init (ECalendarItem *calitem)
calitem->buttons_space = 0.0;
- calitem->selection_start_month_offset = -2;
+ calitem->selection_set = FALSE;
calitem->selection_changed = FALSE;
calitem->date_range_changed = FALSE;
@@ -512,6 +517,9 @@ e_calendar_item_get_arg (GtkObject *o, GtkArg *arg, guint arg_id)
case ARG_DAYS_TO_START_WEEK_SELECTION:
GTK_VALUE_INT (*arg) = calitem->days_to_start_week_selection;
break;
+ case ARG_MOVE_SELECTION_WHEN_MOVING:
+ GTK_VALUE_BOOL (*arg) = calitem->move_selection_when_moving;
+ break;
case ARG_ROUND_SELECTION_WHEN_MOVING:
GTK_VALUE_BOOL (*arg) = calitem->round_selection_when_moving;
break;
@@ -654,6 +662,10 @@ e_calendar_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
ivalue = GTK_VALUE_INT (*arg);
calitem->days_to_start_week_selection = ivalue;
break;
+ case ARG_MOVE_SELECTION_WHEN_MOVING:
+ bvalue = GTK_VALUE_BOOL (*arg);
+ calitem->move_selection_when_moving = bvalue;
+ break;
case ARG_ROUND_SELECTION_WHEN_MOVING:
bvalue = GTK_VALUE_BOOL (*arg);
calitem->round_selection_when_moving = bvalue;
@@ -1258,7 +1270,7 @@ e_calendar_item_draw_day_numbers (ECalendarItem *calitem,
&& months[mon] == today_month
&& day_num == today_mday;
- selected = calitem->selection_start_month_offset != -2
+ selected = calitem->selection_set
&& (calitem->selection_start_month_offset < month_offset
|| (calitem->selection_start_month_offset == month_offset
&& calitem->selection_start_day <= day_num))
@@ -1631,6 +1643,7 @@ e_calendar_item_button_press (ECalendarItem *calitem,
NULL, event->button.time) != 0)
return FALSE;
+ calitem->selection_set = TRUE;
calitem->selection_start_month_offset = month_offset;
calitem->selection_start_day = day;
calitem->selection_end_month_offset = month_offset;
@@ -2077,9 +2090,10 @@ e_calendar_item_set_first_month(ECalendarItem *calitem,
months_diff = (new_year - calitem->year) * 12
+ new_month - calitem->month;
- if (calitem->selection_start_month_offset != -2) {
- if (calitem->selection_start_month_offset - months_diff >= 0
- && calitem->selection_end_month_offset - months_diff < num_months) {
+ if (calitem->selection_set) {
+ if (!calitem->move_selection_when_moving
+ || (calitem->selection_start_month_offset - months_diff >= 0
+ && calitem->selection_end_month_offset - months_diff < num_months)) {
calitem->selection_start_month_offset -= months_diff;
calitem->selection_end_month_offset -= months_diff;
calitem->selection_real_start_month_offset -= months_diff;
@@ -2441,7 +2455,7 @@ e_calendar_item_get_selection (ECalendarItem *calitem,
g_date_clear (start_date, 1);
g_date_clear (end_date, 1);
- if (calitem->selection_start_month_offset == -2)
+ if (!calitem->selection_set)
return FALSE;
start_year = calitem->year;
@@ -2473,6 +2487,20 @@ e_calendar_item_set_selection (ECalendarItem *calitem,
gboolean need_update;
g_return_if_fail (E_IS_CALENDAR_ITEM (calitem));
+
+ /* If start_date is NULL, we clear the selection without changing the
+ month shown. */
+ if (start_date == NULL) {
+ calitem->selection_set = FALSE;
+ calitem->selection_changed = TRUE;
+ e_calendar_item_queue_signal_emission (calitem);
+ gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (calitem));
+ return;
+ }
+
+ if (end_date == NULL)
+ end_date = start_date;
+
g_return_if_fail (g_date_compare (start_date, end_date) <= 0);
start_year = g_date_year (start_date);
@@ -2500,13 +2528,15 @@ e_calendar_item_set_selection (ECalendarItem *calitem,
new_end_day = end_day;
- if (calitem->selection_start_month_offset != new_start_month_offset
+ if (!calitem->selection_set
+ || calitem->selection_start_month_offset != new_start_month_offset
|| calitem->selection_start_day != new_start_day
|| calitem->selection_end_month_offset != new_end_month_offset
|| calitem->selection_end_day != new_end_day) {
need_update = TRUE;
calitem->selection_changed = TRUE;
e_calendar_item_queue_signal_emission (calitem);
+ calitem->selection_set = TRUE;
calitem->selection_start_month_offset = new_start_month_offset;
calitem->selection_start_day = new_start_day;
calitem->selection_end_month_offset = new_end_month_offset;