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);
@@ -809,13 +809,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);
@@ -857,7 +851,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)
@@ -1800,6 +1794,7 @@
gint y_loc;
gint day_xspace;
gint focus_width;
+ gboolean is_selected_day;
PlannerCalendarPrivateData *private_data;
PangoLayout *layout;
@@ -1829,6 +1824,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;
@@ -1857,7 +1854,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,
@@ -1870,7 +1867,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)]));
@@ -1892,15 +1889,14 @@
{
GtkStateType state;
- if (calendar->selected_day == day)
+ if (is_selected_day)
state = GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
else
state = GTK_STATE_NORMAL;
gtk_paint_focus (widget->style,
private_data->main_win,
- (calendar->selected_day == day)
- ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
+ is_selected_day ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
NULL, widget, "calendar-day",
x_left, y_top,
private_data->day_width,
@@ -2171,31 +2167,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);
}
@@ -2206,8 +2188,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;
@@ -2227,17 +2243,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;
@@ -2245,8 +2273,7 @@
if (month)
*month = calendar->month;
- if (day)
- *day = calendar->selected_day;
+ return calendar->selected_days;
}
static gboolean
@@ -2547,11 +2574,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);
}
@@ -2676,7 +2708,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);
}
@@ -2725,7 +2757,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