Blob Blame History Raw
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