diff -ru planner-0.14.5.orig/src/planner-calendar.c planner-0.14.5/src/planner-calendar.c --- planner-0.14.5.orig/src/planner-calendar.c 2010-03-16 11:18:21.000000000 +0000 +++ planner-0.14.5/src/planner-calendar.c 2010-04-13 13:07:42.000000000 +0100 @@ -291,7 +291,7 @@ static void planner_calendar_paint_main (GtkWidget *widget); static void planner_calendar_select_and_focus_day (PlannerCalendar *calendar, - guint day); + guint day, gboolean multiselect); static void planner_calendar_paint_arrow (GtkWidget *widget, guint arrow); @@ -305,6 +305,10 @@ gint column); static gint top_y_for_row (PlannerCalendar *calendar, gint row); +static void planner_calendar_append_select_day (PlannerCalendar *calendar, + guint day); +static void planner_calendar_deselect_days (PlannerCalendar *calendar); + static char *default_abbreviated_dayname[7]; static char *default_monthname[12]; @@ -492,7 +496,7 @@ for (i=0;i<14;i++) calendar->mark_colors[i] = tango_palette[i]; - calendar->selected_day = tm->tm_mday; + calendar->selected_days = g_list_append(NULL, GINT_TO_POINTER(tm->tm_mday)); calendar->display_flags = ( PLANNER_CALENDAR_SHOW_HEADING | PLANNER_CALENDAR_SHOW_DAY_NAMES ); @@ -669,6 +673,24 @@ } static void +planner_reset_selected_days (PlannerCalendar *calendar, gint month_len) +{ + GList *entry, *old_selected_days; + + old_selected_days = g_list_copy (calendar->selected_days); + planner_calendar_deselect_days(calendar); + for (entry = old_selected_days; entry; entry = g_list_next(entry)) + { + gint selected_day = GPOINTER_TO_INT (entry->data); + if (month_len < selected_day) + planner_calendar_append_select_day(calendar, month_len); + else + planner_calendar_append_select_day(calendar, selected_day); + } + g_list_free (old_selected_days); +} + +static void planner_calendar_set_month_prev (PlannerCalendar *calendar) { gint month_len; @@ -696,17 +718,7 @@ planner_calendar_signals[MONTH_CHANGED_SIGNAL], 0); - if (month_len < calendar->selected_day) - { - calendar->selected_day = 0; - planner_calendar_select_day (calendar, month_len); - } - else - { - if (calendar->selected_day < 0) - calendar->selected_day = calendar->selected_day + 1 + month_length[leap (calendar->year)][calendar->month + 1]; - planner_calendar_select_day (calendar, calendar->selected_day); - } + planner_reset_selected_days (calendar, month_len); gtk_widget_queue_draw (GTK_WIDGET (calendar)); planner_calendar_thaw (calendar); @@ -743,13 +755,7 @@ month_len = month_length[leap (calendar->year)][calendar->month + 1]; - if (month_len < calendar->selected_day) - { - calendar->selected_day = 0; - planner_calendar_select_day (calendar, month_len); - } - else - planner_calendar_select_day (calendar, calendar->selected_day); + planner_reset_selected_days (calendar, month_len); gtk_widget_queue_draw (GTK_WIDGET (calendar)); planner_calendar_thaw (calendar); @@ -774,13 +780,7 @@ month_len = month_length[leap (calendar->year)][calendar->month + 1]; - if (month_len < calendar->selected_day) - { - calendar->selected_day = 0; - planner_calendar_select_day (calendar, month_len); - } - else - planner_calendar_select_day (calendar, calendar->selected_day); + planner_reset_selected_days (calendar, month_len); gtk_widget_queue_draw (GTK_WIDGET (calendar)); planner_calendar_thaw (calendar); @@ -806,13 +806,7 @@ month_len = month_length[leap (calendar->year)][calendar->month + 1]; - if (month_len < calendar->selected_day) - { - calendar->selected_day = 0; - planner_calendar_select_day (calendar, month_len); - } - else - planner_calendar_select_day (calendar, calendar->selected_day); + planner_reset_selected_days (calendar, month_len); gtk_widget_queue_draw (GTK_WIDGET (calendar)); planner_calendar_thaw (calendar); @@ -854,7 +848,7 @@ if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); - planner_calendar_select_and_focus_day (calendar, day); + planner_calendar_select_and_focus_day (calendar, day, event->state & GDK_CONTROL_MASK); } else if (event->type == GDK_2BUTTON_PRESS) @@ -1791,6 +1785,7 @@ gint y_top; gint y_loc; gint focus_width; + gboolean is_selected_day; PlannerCalendarPrivateData *private_data; PangoLayout *layout; @@ -1818,6 +1813,8 @@ day = calendar->day[row][col]; + is_selected_day = (NULL != g_list_find(calendar->selected_days, GINT_TO_POINTER(day))); + x_left = left_x_for_column (calendar, col); x_loc = x_left + private_data->day_width / 2 + private_data->max_day_char_width; @@ -1846,7 +1843,7 @@ private_data->day_width, day_height); } */ - if (calendar->selected_day == day) + if (is_selected_day) { gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (GTK_WIDGET (calendar))); gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top, @@ -1859,7 +1856,7 @@ private_data->day_width, day_height); } - if (calendar->selected_day == day) + if (is_selected_day) gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (GTK_WIDGET (calendar))); else gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_WIDGET_STATE (calendar)])); @@ -1881,7 +1878,7 @@ { gtk_paint_focus (widget->style, private_data->main_win, - (calendar->selected_day == day) + is_selected_day ? GTK_STATE_SELECTED : GTK_STATE_NORMAL, NULL, widget, "calendar-day", x_left, y_top, @@ -2151,31 +2148,17 @@ return TRUE; } -void -planner_calendar_select_day (PlannerCalendar *calendar, - guint day) +static void +planner_calendar_append_select_day (PlannerCalendar *calendar, + guint day) { - g_return_if_fail (PLANNER_IS_CALENDAR (calendar)); g_return_if_fail (day <= 31); - /* planner_calendar_compute_days (calendar); */ - - /* Deselect the old day */ - if (calendar->selected_day > 0) - { - gint selected_day; - - selected_day = calendar->selected_day; - calendar->selected_day = 0; - if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) - planner_calendar_paint_day_num (GTK_WIDGET (calendar), selected_day); - } - - calendar->selected_day = day; - /* Select the new day */ - if (day != 0) + if (day != 0 && (NULL == g_list_find(calendar->selected_days, GINT_TO_POINTER(day)))) { + calendar->selected_days = g_list_append(calendar->selected_days, GINT_TO_POINTER(day)); + if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) planner_calendar_paint_day_num (GTK_WIDGET (calendar), day); } @@ -2186,8 +2169,42 @@ } static void +planner_calendar_deselect_days (PlannerCalendar *calendar) +{ + g_return_if_fail (PLANNER_IS_CALENDAR (calendar)); + + /* Deselect the old days */ + if (calendar->selected_days) + { + GList* old_selected_days = calendar->selected_days; + GList* entry; + + calendar->selected_days = NULL; + + for (entry = old_selected_days; entry; entry = g_list_next(entry)) + { + gint day = GPOINTER_TO_INT (entry->data); + if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) + planner_calendar_paint_day_num (GTK_WIDGET (calendar), day); + } + + g_list_free (old_selected_days); + } +} + +void +planner_calendar_select_day (PlannerCalendar *calendar, + guint day) +{ + g_return_if_fail (PLANNER_IS_CALENDAR (calendar)); + + planner_calendar_deselect_days (calendar); + planner_calendar_append_select_day(calendar, day); +} + +static void planner_calendar_select_and_focus_day (PlannerCalendar *calendar, - guint day) + guint day, gboolean multiselect) { gint old_focus_row = calendar->focus_row; gint old_focus_col = calendar->focus_col; @@ -2207,17 +2224,29 @@ if (old_focus_row != -1 && old_focus_col != -1) planner_calendar_paint_day (GTK_WIDGET (calendar), old_focus_row, old_focus_col); - - planner_calendar_select_day (calendar, day); + + if (multiselect) + { + gboolean is_selected_day = (NULL != g_list_find (calendar->selected_days, GINT_TO_POINTER(day))); + if (!is_selected_day) + planner_calendar_append_select_day (calendar, day); + else if (g_list_length (calendar->selected_days) > 1) + { + calendar->selected_days = g_list_remove (calendar->selected_days, GINT_TO_POINTER(day)); + if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (calendar))) + planner_calendar_paint_day_num (GTK_WIDGET (calendar), day); + } + } + else + planner_calendar_select_day (calendar, day); } -void -planner_calendar_get_date (PlannerCalendar *calendar, +GList* +planner_calendar_get_dates (PlannerCalendar *calendar, guint *year, - guint *month, - guint *day) + guint *month) { - g_return_if_fail (PLANNER_IS_CALENDAR (calendar)); + g_return_val_if_fail (PLANNER_IS_CALENDAR (calendar), NULL); if (year) *year = calendar->year; @@ -2225,8 +2254,7 @@ if (month) *month = calendar->month; - if (day) - *day = calendar->selected_day; + return calendar->selected_days; } static gboolean @@ -2519,11 +2547,16 @@ static void planner_calendar_finalize (GObject *object) { + PlannerCalendar *calendar; PlannerCalendarPrivateData *private_data; + + calendar = PLANNER_CALENDAR (object); private_data = PLANNER_CALENDAR_PRIVATE_DATA (object); g_free (private_data); + g_list_free(calendar->selected_days); + if (G_OBJECT_CLASS (parent_class)->finalize) (* G_OBJECT_CLASS (parent_class)->finalize) (object); } @@ -2648,7 +2681,7 @@ planner_calendar_set_month_next (calendar); } - planner_calendar_select_and_focus_day (calendar, day); + planner_calendar_select_and_focus_day (calendar, day, event->state & GDK_CONTROL_MASK); planner_calendar_thaw (calendar); } @@ -2697,7 +2730,8 @@ GList *daytypes; gint dayindex; - planner_calendar_get_date (calendar, &y, &m, &d); + y = calendar->year; + m = calendar->month; g_object_get (mrp_calendar, "project", &project, NULL); diff -ru planner-0.14.5.orig/src/planner-calendar-dialog.c planner-0.14.5/src/planner-calendar-dialog.c --- planner-0.14.5.orig/src/planner-calendar-dialog.c 2010-03-16 11:18:21.000000000 +0000 +++ planner-0.14.5/src/planner-calendar-dialog.c 2010-04-13 12:53:04.000000000 +0100 @@ -823,9 +823,10 @@ DialogData *data) { MrpCalendar *calendar; - guint y, m, d; + guint y, m; mrptime t; MrpDay *day; + GList *days, *entry; calendar = cal_dialog_get_selected_calendar (GTK_TREE_VIEW (data->tree_view)); @@ -842,10 +843,12 @@ return; } - planner_calendar_get_date (PLANNER_CALENDAR (data->calendar), &y, &m, &d); - t = mrp_time_compose (y, m + 1, d, 0, 0, 0); - /* mrp_calendar_set_days (calendar, t, day, (mrptime) -1); */ - planner_cal_cmd_day_type (data->main_window, calendar, day, t); + days = planner_calendar_get_dates (PLANNER_CALENDAR (data->calendar), &y, &m); + for (entry = days; entry; entry = g_list_next(entry)) { + t = mrp_time_compose (y, m + 1, GPOINTER_TO_INT(entry->data), 0, 0, 0); + /* mrp_calendar_set_days (calendar, t, day, (mrptime) -1); */ + planner_cal_cmd_day_type (data->main_window, calendar, day, t); + } } static void @@ -944,6 +947,7 @@ GList *ivals, *l; MrpCalendar *calendar, *root; PlannerCalendar *calendar_widget; + GList *days; guint y, m, d; mrptime t; gint i; @@ -989,54 +993,66 @@ calendar_widget = PLANNER_CALENDAR (data->calendar); - planner_calendar_get_date (calendar_widget, &y, &m, &d); - t = mrp_time_compose (y, m + 1, d, 0, 0, 0); - - day = mrp_calendar_get_day (calendar, t, FALSE); - - if (day == mrp_day_get_use_base ()) { - gtk_widget_set_sensitive (data->option_menu, FALSE); + days = planner_calendar_get_dates (calendar_widget, &y, &m); - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON (data->base_radiobutton), TRUE); - } else { + if (g_list_length(days) > 1) { + /*allow multi-selection to control setting multiple days to the same type*/ gtk_widget_set_sensitive (data->option_menu, TRUE); - cal_dialog_option_menu_set_day (data->option_menu, day); - gtk_toggle_button_set_active ( - GTK_TOGGLE_BUTTON (data->type_radiobutton), TRUE); - } + GTK_TOGGLE_BUTTON (data->type_radiobutton), TRUE); - calendar = cal_dialog_get_selected_calendar (GTK_TREE_VIEW (data->tree_view)); + gtk_widget_set_sensitive (data->apply_button, TRUE); + } else { + d = GPOINTER_TO_INT(days->data); + t = mrp_time_compose (y, m + 1, d, 0, 0, 0); - if (day == mrp_day_get_use_base ()) { - day = mrp_calendar_get_day (calendar, t, TRUE); - } + day = mrp_calendar_get_day (calendar, t, FALSE); - ivals = mrp_calendar_day_get_intervals (calendar, day, TRUE); + if (day == mrp_day_get_use_base ()) { + gtk_widget_set_sensitive (data->option_menu, FALSE); + + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (data->base_radiobutton), TRUE); + } else { + gtk_widget_set_sensitive (data->option_menu, TRUE); + + cal_dialog_option_menu_set_day (data->option_menu, day); - for (i = 0; i < 5; i++) { - gtk_entry_set_text (GTK_ENTRY (data->from_entry[i]), ""); - gtk_entry_set_text (GTK_ENTRY (data->to_entry[i]), ""); - } + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (data->type_radiobutton), TRUE); + } - for (l = ivals, i = 0; l && i < 5; l = l->next, i++) { - MrpInterval *ival; - mrptime start, end; - gchar *str; + calendar = cal_dialog_get_selected_calendar (GTK_TREE_VIEW (data->tree_view)); - ival = l->data; + if (day == mrp_day_get_use_base ()) { + day = mrp_calendar_get_day (calendar, t, TRUE); + } - mrp_interval_get_absolute (ival, 0, &start, &end); + ivals = mrp_calendar_day_get_intervals (calendar, day, TRUE); - str = mrp_time_format ("%H:%M", start); - gtk_entry_set_text (GTK_ENTRY (data->from_entry[i]), str); - g_free (str); + for (i = 0; i < 5; i++) { + gtk_entry_set_text (GTK_ENTRY (data->from_entry[i]), ""); + gtk_entry_set_text (GTK_ENTRY (data->to_entry[i]), ""); + } - str = mrp_time_format ("%H:%M", end); - gtk_entry_set_text (GTK_ENTRY (data->to_entry[i]), str); - g_free (str); + for (l = ivals, i = 0; l && i < 5; l = l->next, i++) { + MrpInterval *ival; + mrptime start, end; + gchar *str; + + ival = l->data; + + mrp_interval_get_absolute (ival, 0, &start, &end); + + str = mrp_time_format ("%H:%M", start); + gtk_entry_set_text (GTK_ENTRY (data->from_entry[i]), str); + g_free (str); + + str = mrp_time_format ("%H:%M", end); + gtk_entry_set_text (GTK_ENTRY (data->to_entry[i]), str); + g_free (str); + } } g_signal_handlers_unblock_by_func (data->option_menu, diff -ru planner-0.14.5.orig/src/planner-calendar.h planner-0.14.5/src/planner-calendar.h --- planner-0.14.5.orig/src/planner-calendar.h 2010-03-16 11:18:21.000000000 +0000 +++ planner-0.14.5/src/planner-calendar.h 2010-04-13 12:53:04.000000000 +0100 @@ -61,7 +61,7 @@ gint month; gint year; - gint selected_day; + GList* selected_days; gint day_month[6][7]; gint day[6][7]; @@ -117,10 +117,9 @@ void planner_calendar_display_options (PlannerCalendar *calendar, PlannerCalendarDisplayOptions flags); -void planner_calendar_get_date (PlannerCalendar *calendar, +GList* planner_calendar_get_dates (PlannerCalendar *calendar, guint *year, - guint *month, - guint *day); + guint *month); void planner_calendar_freeze (PlannerCalendar *calendar); void planner_calendar_thaw (PlannerCalendar *calendar); diff -ru planner-0.14.5.orig/src/planner-task-date-widget.c planner-0.14.5/src/planner-task-date-widget.c --- planner-0.14.5.orig/src/planner-task-date-widget.c 2010-03-16 11:18:21.000000000 +0000 +++ planner-0.14.5/src/planner-task-date-widget.c 2010-04-13 12:53:04.000000000 +0100 @@ -293,15 +293,16 @@ planner_task_date_widget_get_date (PlannerTaskDateWidget *widget) { PlannerTaskDateWidgetPriv *priv; - gint year, month, day; + gint year, month; + GList *days; priv = GET_PRIV (widget); - planner_calendar_get_date (GTK_CALENDAR (priv->calendar), - &year, &month, &day); + days = planner_calendar_get_dates (PLANNER_CALENDAR (priv->calendar), + &year, &month); month++; - return mrp_time_compose (year, month, day, 0, 0, 0); + return mrp_time_compose (year, month, GPOINTER_TO_INT(days->data), 0, 0, 0); } void