[Planner Dev] Undoing add and remove calendars
- From: Alvaro del Castillo <acs lambdaux com>
- To: Planner Project Manager - Development List <planner-dev lists imendio com>
- Subject: [Planner Dev] Undoing add and remove calendars
- Date: Sat, 19 Jun 2004 11:15:47 +0000
Hi guys!
Here goes the patch for undo adding and removing calendars. It has been
easy to implement (very similar to the work done in tasks) and I think
it is bug free with my tests, but more testing is needing ;-)
Cheers
-- 
Alvaro del Castillo San Félix
Lambdaux Software Services S.R.L.
Universidad Rey Juan Carlos
Centro de Apoyo Tecnológico
C/ Tulipán sn 28933 Mostoles, Madrid-Spain
www.lambdaux.com
acs lambdaux com
Index: libplanner/mrp-calendar.c
===================================================================
RCS file: /cvs/gnome/planner/libplanner/mrp-calendar.c,v
retrieving revision 1.2
diff -u -b -B -p -r1.2 mrp-calendar.c
--- libplanner/mrp-calendar.c	18 Jun 2004 23:55:42 -0000	1.2
+++ libplanner/mrp-calendar.c	19 Jun 2004 09:01:16 -0000
@@ -396,6 +396,24 @@ foreach_copy_days (gpointer     key,
 }
 
 /**
+ * mrp_calendar_add:
+ * @calendar: a #MrpCalendar to add
+ * @parent: a #MrpCalendar to inherit from 
+ * 
+ * Add @calendar to the project 
+ * 
+ * Return value:
+ **/
+void
+mrp_calendar_add (MrpCalendar *calendar, MrpCalendar *parent)
+{
+	calendar_add_child (parent, calendar);
+
+	imrp_project_signal_calendar_tree_changed (calendar->priv->project);
+	imrp_project_set_needs_saving (calendar->priv->project, TRUE);
+}
+
+/**
  * mrp_calendar_copy:
  * @name: the name of the new calendar
  * @calendar: a #MrpCalendar to copy
Index: libplanner/mrp-calendar.h
===================================================================
RCS file: /cvs/gnome/planner/libplanner/mrp-calendar.h,v
retrieving revision 1.1.1.1
diff -u -b -B -p -r1.1.1.1 mrp-calendar.h
--- libplanner/mrp-calendar.h	1 Dec 2003 17:36:22 -0000	1.1.1.1
+++ libplanner/mrp-calendar.h	19 Jun 2004 09:01:17 -0000
@@ -80,6 +80,8 @@ enum {
 GType        mrp_calendar_get_type                 (void) G_GNUC_CONST;
 MrpCalendar *mrp_calendar_new                      (const gchar *name,
 						    MrpProject  *project);
+void         mrp_calendar_add                      (MrpCalendar *calendar,
+						    MrpCalendar *parent);
 MrpCalendar *mrp_calendar_copy                     (const gchar *name,
 						    MrpCalendar *calendar);
 MrpCalendar *mrp_calendar_derive                   (const gchar *name,
Index: src/planner-calendar-dialog.c
===================================================================
RCS file: /cvs/gnome/planner/src/planner-calendar-dialog.c,v
retrieving revision 1.4
diff -u -b -B -p -r1.4 planner-calendar-dialog.c
--- src/planner-calendar-dialog.c	18 Jun 2004 04:47:12 -0000	1.4
+++ src/planner-calendar-dialog.c	19 Jun 2004 09:01:23 -0000
@@ -201,6 +201,228 @@ planner_cal_cmd_day_type (PlannerWindow 
 	return cmd_base;
 }
 
+typedef struct {
+	PlannerCmd   base;
+
+	MrpProject  *project;
+	MrpCalendar *calendar;
+	MrpCalendar *parent;
+	/* Resources that use this calendar */
+	GList       *resources;
+	/* Calendar that inherits from this calendar */
+	GList       *children;
+} CalCmdRemove;
+
+static gboolean
+cal_cmd_remove_do (PlannerCmd *cmd_base)
+{
+	GList *all_resources, *r;
+
+	CalCmdRemove *cmd = (CalCmdRemove*) cmd_base;
+
+	if (g_getenv ("PLANNER_DEBUG_UNDO_CAL")) {
+		g_message ("Removing a calendar ...");
+	}
+
+	all_resources = mrp_project_get_resources (cmd->project);
+	for (r = all_resources; r; r = r->next) {
+		MrpResource *resource = r->data;
+		MrpCalendar *tmp_cal;
+		
+		tmp_cal = mrp_resource_get_calendar (resource);
+		if (tmp_cal == cmd->calendar) {			
+			cmd->resources = g_list_append (cmd->resources, 
+							g_object_ref (resource));
+		} 
+	}
+
+	cmd->children = g_list_copy (mrp_calendar_get_children (cmd->calendar));
+	if (cmd->children) {
+		g_list_foreach (cmd->children, (GFunc) g_object_ref, NULL);
+	}
+		
+	mrp_calendar_remove (cmd->calendar);
+
+	return TRUE;
+}
+
+/* Reassign resources and calendar childs */
+static void
+cal_cmd_remove_undo (PlannerCmd *cmd_base)
+{
+	GList        *r;
+	GList        *c;
+	CalCmdRemove *cmd = (CalCmdRemove*) cmd_base;
+
+	if (g_getenv ("PLANNER_DEBUG_UNDO_CAL")) {
+		g_message ("Undo removing calendar ...");
+	}
+
+	mrp_calendar_add (cmd->calendar, cmd->parent);
+
+	if (cmd->resources != NULL) {
+		for (r = cmd->resources; r; r = r->next) {
+			mrp_resource_set_calendar (r->data, cmd->calendar);
+		}
+		g_list_foreach (cmd->resources, (GFunc) g_object_unref, NULL);
+		g_list_free (cmd->resources);
+		cmd->resources = NULL;
+	}
+
+	if (cmd->children != NULL) {
+		for (c = cmd->children; c; c = c->next) {
+			mrp_calendar_reparent (cmd->calendar, c->data);
+		}
+		g_list_foreach (cmd->children, (GFunc) g_object_unref, NULL);
+		g_list_free (cmd->children);
+		cmd->children = NULL;
+	}
+}
+
+
+static void
+cal_cmd_remove_free (PlannerCmd *cmd_base)
+{
+	CalCmdRemove *cmd = (CalCmdRemove*) cmd_base;
+
+	g_object_unref (cmd->calendar);
+	g_object_unref (cmd->project);
+
+	if (cmd->resources != NULL) {
+		g_list_foreach (cmd->resources, (GFunc) g_object_unref, NULL);
+		g_list_free (cmd->resources);
+		cmd->resources = NULL;
+	}
+	if (cmd->children != NULL) {
+		g_list_foreach (cmd->children, (GFunc) g_object_unref, NULL);
+		g_list_free (cmd->children);
+		cmd->children = NULL;
+	}
+}
+
+static PlannerCmd *
+planner_cal_cmd_remove (PlannerWindow  *main_window,
+			MrpProject     *project,
+			MrpCalendar    *calendar)
+{
+	PlannerCmd   *cmd_base;
+	CalCmdRemove *cmd;
+
+	cmd_base = planner_cmd_new (CalCmdRemove,
+				    _("Remove calendar"),
+				    cal_cmd_remove_do,
+				    cal_cmd_remove_undo,
+				    cal_cmd_remove_free);
+
+	cmd = (CalCmdRemove*) cmd_base;
+
+	cmd->project = g_object_ref (project);
+	cmd->calendar = g_object_ref (calendar);
+	cmd->parent = g_object_ref (mrp_calendar_get_parent (cmd->calendar));
+
+	planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager 
+					   (main_window),
+					   cmd_base);
+	return cmd_base;
+}
+
+typedef struct {
+	PlannerCmd   base;
+
+	gchar       *name;
+	MrpProject  *project;
+	MrpCalendar *calendar;
+	MrpCalendar *parent;
+	MrpCalendar *copy;
+} CalCmdAdd;
+
+static gboolean
+cal_cmd_add_do (PlannerCmd *cmd_base)
+{
+	CalCmdAdd *cmd = (CalCmdAdd*) cmd_base;
+
+	if (g_getenv ("PLANNER_DEBUG_UNDO_CAL")) {
+		g_message ("Adding a new calendar ...");
+	}
+
+	if (cmd->calendar == NULL) {
+		if (cmd->parent != NULL && cmd->copy == NULL) {
+			cmd->calendar = mrp_calendar_derive (cmd->name, cmd->parent);
+			g_object_unref (cmd->parent);
+			cmd->parent = NULL;
+		} else if (cmd->parent == NULL && cmd->copy != NULL) {
+			cmd->calendar = mrp_calendar_copy (cmd->name, cmd->copy);
+			g_object_unref (cmd->copy);
+			cmd->copy = NULL;
+		} else if (cmd->parent == NULL && cmd->copy == NULL) {
+			cmd->calendar = mrp_calendar_new (cmd->name, cmd->project);
+			cmd->parent = g_object_ref (mrp_calendar_get_parent (cmd->calendar));
+		} else {
+			g_warning ("Incorrect use adding new calendar");
+		}
+		cmd->parent = g_object_ref (mrp_calendar_get_parent (cmd->calendar));
+	} else {
+		mrp_calendar_add (cmd->calendar, cmd->parent);
+	}
+
+	return TRUE;
+}
+
+static void
+cal_cmd_add_undo (PlannerCmd *cmd_base)
+{
+	CalCmdAdd *cmd = (CalCmdAdd*) cmd_base;
+
+	if (g_getenv ("PLANNER_DEBUG_UNDO_CAL")) {
+		g_message ("Undo adding calendar ...");
+	}
+	mrp_calendar_remove (cmd->calendar);
+}
+
+
+static void
+cal_cmd_add_free (PlannerCmd *cmd_base)
+{
+	CalCmdAdd *cmd = (CalCmdAdd*) cmd_base;
+
+	g_object_unref (cmd->calendar);
+	g_object_unref (cmd->parent);
+	g_object_unref (cmd->project);
+
+	g_free (cmd->name);
+}
+
+static PlannerCmd *
+planner_cal_cmd_add (PlannerWindow  *main_window,
+		     const gchar    *name,
+		     MrpCalendar    *parent,
+		     MrpCalendar    *copy)
+{
+	PlannerCmd *cmd_base;
+	CalCmdAdd  *cmd;
+
+	cmd_base = planner_cmd_new (CalCmdAdd,
+				    _("Add new calendar"),
+				    cal_cmd_add_do,
+				    cal_cmd_add_undo,
+				    cal_cmd_add_free);
+
+	cmd = (CalCmdAdd*) cmd_base;
+
+	cmd->project = g_object_ref (planner_window_get_project (main_window));
+	cmd->name = g_strdup (name);
+	if (parent != NULL) {
+		cmd->parent = g_object_ref (parent);
+	}
+	if (copy != NULL) {
+		cmd->copy = g_object_ref (copy);
+	}
+			
+	planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager 
+					   (main_window),
+					   cmd_base);
+	return cmd_base;
+}
 
 static void
 cal_dialog_setup_option_menu (DialogData *data)
@@ -292,7 +514,8 @@ cal_dialog_response_cb (GtkWidget  *dial
 	
 	switch (response) {
 	case RESPONSE_REMOVE:
-		mrp_calendar_remove (calendar);
+		/* mrp_calendar_remove (calendar); */
+		planner_cal_cmd_remove (data->main_window, data->project, calendar);
 		break;
 
 	case RESPONSE_ADD:
@@ -1026,7 +1249,6 @@ cal_dialog_new_dialog_run (DialogData *d
 	GladeXML         *glade;
 	GtkWidget        *dialog;
 	MrpCalendar      *parent;
-	MrpCalendar      *calendar;
 	GtkTreeSelection *selection;
 	GtkWidget        *entry;
 	GtkWidget        *tree_view;
@@ -1081,13 +1303,17 @@ cal_dialog_new_dialog_run (DialogData *d
 		parent = cal_dialog_get_selected_calendar (GTK_TREE_VIEW (tree_view));
 
 		if (parent && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->new_copy_radiobutton))) {
-			calendar = mrp_calendar_copy (name, parent);
+			/* calendar = mrp_calendar_copy (name, parent); */
+			planner_cal_cmd_add (data->main_window, name, NULL, parent);
 		}
 		else if (parent && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->new_derive_radiobutton))) {
-			calendar = mrp_calendar_derive (name, parent);
+			/* calendar = mrp_calendar_derive (name, parent); */
+			planner_cal_cmd_add (data->main_window, name, parent, NULL);
 		}
 		else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->new_empty_radiobutton))) {
-			calendar = mrp_calendar_new (name, data->project);
+			/* calendar = mrp_calendar_new (name, data->project); */
+			planner_cal_cmd_add (data->main_window, name, NULL, NULL);
+			   
 		}
 	}
 
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]