[Planner Dev] Last patch for undo resource dialog: undo calendar selection



Hi guys!

Here goes the last patch, if we don't find some prob, to implement the
undo system in the resource dialog. It implements undoing the calendar
selection.

Also I have found a bug that crash planner undoing the note in the
resource note editor and it is solved with this patch also (using a
DialogData when it could be destroyed to store data).

Now, it is time to test a lot this dialog in order to make it as robust
as we can. I have left some code for debugging because normally, we will
find some bugs in the first moments start using the new features.

Cheers

-- Alvaro

 
Index: src/planner-resource-dialog.c
===================================================================
RCS file: /cvs/gnome/planner/src/planner-resource-dialog.c,v
retrieving revision 1.9
diff -u -b -B -p -r1.9 planner-resource-dialog.c
--- src/planner-resource-dialog.c	1 May 2004 08:37:48 -0000	1.9
+++ src/planner-resource-dialog.c	1 May 2004 10:46:15 -0000
@@ -183,13 +183,21 @@ typedef struct {
 typedef struct {
 	PlannerCmd   base;
 
-	DialogData  *data;
 	MrpResource *resource;
 	gchar       *property;  
 	gchar       *note;
 	gchar       *old_note;
 } ResourceCmdEditNote;
 
+typedef struct {
+	PlannerCmd   base;
+
+	MrpResource *resource;
+	MrpCalendar *calendar;
+	MrpCalendar *old_calendar;
+} ResourceCmdCalendar;
+
+
 static gboolean
 foreach_find_calendar (GtkTreeModel *model,
 		       GtkTreePath  *path,
@@ -430,26 +438,98 @@ resource_dialog_resource_removed_cb (Gtk
 }
 
 static void
+resource_cmd_calendar_do (PlannerCmd *cmd_base)
+{
+	ResourceCmdCalendar *cmd;
+
+	cmd = (ResourceCmdCalendar*) cmd_base;	
+
+	mrp_resource_set_calendar (cmd->resource, cmd->calendar);
+}
+
+static void
+resource_cmd_calendar_undo (PlannerCmd *cmd_base)
+{
+	ResourceCmdCalendar *cmd;
+
+	cmd = (ResourceCmdCalendar*) cmd_base;	
+
+	mrp_resource_set_calendar (cmd->resource, cmd->old_calendar);
+
+}
+
+static void
+resource_cmd_calendar_free (PlannerCmd *cmd_base)
+{
+	ResourceCmdCalendar *cmd;
+
+	cmd = (ResourceCmdCalendar *) cmd_base;
+
+	g_free (cmd_base->label);
+	g_object_unref (cmd->resource);
+
+	if (cmd->old_calendar) {
+		g_object_unref (cmd->calendar);
+	}
+	if (cmd->old_calendar) {
+		g_object_unref (cmd->old_calendar);
+	}
+
+	g_free (cmd);
+}
+
+static PlannerCmd *
+resource_cmd_edit_calendar (DialogData  *data,
+			    MrpCalendar *calendar)
+{
+	PlannerCmd          *cmd_base;
+	ResourceCmdCalendar *cmd;
+	MrpCalendar         *current_calendar;
+
+	cmd = g_new0 (ResourceCmdCalendar, 1);
+
+	cmd_base = (PlannerCmd*) cmd;
+
+	cmd_base->label = g_strdup (_("Edit resource calendar from dialog"));
+	cmd_base->do_func = resource_cmd_calendar_do;
+	cmd_base->undo_func = resource_cmd_calendar_undo;
+	cmd_base->free_func = resource_cmd_calendar_free;
+
+	cmd->resource = g_object_ref (data->resource);
+
+	current_calendar = mrp_resource_get_calendar (data->resource);
+
+	if (current_calendar) {
+		cmd->old_calendar = g_object_ref (current_calendar);
+	} else {
+		cmd->old_calendar = NULL;	
+	}
+
+	if (calendar) {
+		cmd->calendar = g_object_ref (calendar);
+	} else {
+		cmd->calendar = NULL;
+	}
+
+	planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (data->main_window),
+					   cmd_base);
+
+	return cmd_base;
+}
+
+static void
 resource_cmd_note_do (PlannerCmd *cmd_base)
 {
 	ResourceCmdEditNote *cmd;
 
 	cmd = (ResourceCmdEditNote*) cmd_base;
 
-	g_signal_handlers_block_by_func (cmd->resource,
-					 resource_dialog_resource_note_changed_cb,
-					 cmd->resource);
-
 	if (g_getenv ("PLANNER_DEBUG_UNDO_RESOURCE")) {
 		g_message ("Doing the note change ... focus out: %s, focus in: %s", 
 			   cmd->note, cmd->old_note);
 	}
 
 	g_object_set (cmd->resource, "note", cmd->note, NULL);
-
-	g_signal_handlers_unblock_by_func (cmd->resource,
-					   resource_dialog_resource_note_changed_cb,
-					   cmd->resource);
 }
 
 static void
@@ -459,20 +539,12 @@ resource_cmd_note_undo (PlannerCmd *cmd_
 
 	cmd = (ResourceCmdEditNote*) cmd_base;
 
-	g_signal_handlers_block_by_func (cmd->data->note_buffer,
-					 resource_dialog_note_changed_cb,
-					 cmd->data->dialog);
-
 	if (g_getenv ("PLANNER_DEBUG_UNDO_RESOURCE")) {
 		g_message ("Undoing the note change to \"%s\" from the new \"%s\"", 
 			   cmd->old_note, cmd->note);
 	}
 
 	g_object_set (cmd->resource, "note", cmd->old_note, NULL);
-
-	g_signal_handlers_unblock_by_func (cmd->data->note_buffer,
-					   resource_dialog_note_changed_cb,
-					   cmd->data->dialog);
 }
 
 static void
@@ -517,7 +589,6 @@ resource_cmd_edit_note (DialogData  *dat
 	cmd_base->undo_func = resource_cmd_note_undo;
 	cmd_base->free_func = resource_cmd_note_free;
 
-	cmd->data = data;
 	cmd->property = g_strdup (property);
 	cmd->resource = g_object_ref (data->resource);
 
@@ -1329,6 +1400,12 @@ resource_dialog_calendar_toggled_cb (Gtk
 	GtkTreeIter   iter;
 	gboolean      selected;
 	MrpCalendar  *calendar;
+	PlannerCmd   *cmd;
+
+	if (g_getenv ("PLANNER_DEBUG_UNDO_RESOURCE")) {
+		g_message ("Changing the calendar for the resource %s", 
+			   mrp_resource_get_name (data->resource));
+	}
 	
 	path = gtk_tree_path_new_from_string (path_str);
 
@@ -1343,7 +1420,7 @@ resource_dialog_calendar_toggled_cb (Gtk
 			    -1);
 
 	if (!selected) {
-		mrp_resource_set_calendar (data->resource, calendar);
+		cmd = resource_cmd_edit_calendar (data, calendar);
 	}
 	
 	gtk_tree_path_free (path);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]