Hi guys! Here goes the last patch to implement undo completly in the task dialog. After this email I plan to send a report of what remains to be done in the undo world. Cheers -- Alvaro
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/planner/ChangeLog,v
retrieving revision 1.137
diff -u -b -B -p -r1.137 ChangeLog
--- ChangeLog 12 Jun 2004 05:39:20 -0000 1.137
+++ ChangeLog 12 Jun 2004 05:46:42 -0000
@@ -1,5 +1,13 @@
2004-06-12 Alvaro del Castillo <acs barrapunto com>
+ * src/planner-task-dialog.c: implemented undo for note
+ task dialog editor
+
+ * libplanner/mrp-task.c: init task note with a "" string like
+ we do for a resource.
+
+2004-06-12 Alvaro del Castillo <acs barrapunto com>
+
* src/planner-task-tree.c: moved undo code to planner-task-dialog
in last commit but failed to commit this file.
Index: libplanner/mrp-task.c
===================================================================
RCS file: /cvs/gnome/planner/libplanner/mrp-task.c,v
retrieving revision 1.4
diff -u -b -B -p -r1.4 mrp-task.c
--- libplanner/mrp-task.c 25 Apr 2004 22:11:35 -0000 1.4
+++ libplanner/mrp-task.c 12 Jun 2004 05:46:45 -0000
@@ -187,6 +187,7 @@ task_init (MrpTask *task)
priv->sorted_node = g_node_new (task);
priv->assignments = NULL;
priv->constraint.type = MRP_CONSTRAINT_ASAP;
+ priv->note = g_strdup ("");
}
static void
Index: src/planner-task-dialog.c
===================================================================
RCS file: /cvs/gnome/planner/src/planner-task-dialog.c,v
retrieving revision 1.15
diff -u -b -B -p -r1.15 planner-task-dialog.c
--- src/planner-task-dialog.c 10 Jun 2004 11:30:36 -0000 1.15
+++ src/planner-task-dialog.c 12 Jun 2004 05:46:51 -0000
@@ -130,6 +130,12 @@ static void task_dialog_task_note_chang
GtkWidget *dialog);
static void task_dialog_note_changed_cb (GtkWidget *w,
DialogData *data);
+static gboolean task_dialog_note_focus_in_cb (GtkWidget *w,
+ GdkEventFocus *event,
+ DialogData *data);
+static gboolean task_dialog_note_focus_out_cb (GtkWidget *w,
+ GdkEventFocus *event,
+ DialogData *data);
static void task_dialog_note_stamp_cb (GtkWidget *w,
DialogData *data);
static void
@@ -253,6 +259,15 @@ typedef struct {
guint old_lag;
} TaskCmdEditLag;
+typedef struct {
+ PlannerCmd base;
+
+ MrpTask *task;
+ gchar *property;
+ gchar *note;
+ gchar *old_note;
+} TaskCmdEditNote;
+
static void
task_dialog_setup_option_menu (GtkWidget *option_menu,
GCallback func,
@@ -1117,6 +1132,73 @@ task_cmd_edit_lag (PlannerWindow *main_w
return cmd_base;
}
+static gboolean
+task_cmd_edit_note_do (PlannerCmd *cmd_base)
+{
+ TaskCmdEditNote *cmd = (TaskCmdEditNote*) cmd_base;
+
+ g_object_set (cmd->task, "note", cmd->note, NULL);
+
+ return TRUE;
+}
+
+static void
+task_cmd_edit_note_undo (PlannerCmd *cmd_base)
+{
+
+ TaskCmdEditNote *cmd = (TaskCmdEditNote*) cmd_base;
+
+ g_object_set (cmd->task, "note", cmd->old_note, NULL);
+}
+
+static void
+task_cmd_edit_note_free (PlannerCmd *cmd_base)
+{
+ TaskCmdEditNote *cmd = (TaskCmdEditNote*) cmd_base;
+
+ g_free (cmd->note);
+ g_free (cmd->old_note);
+ g_free (cmd->property);
+
+ g_object_unref (cmd->task);
+}
+
+static PlannerCmd *
+task_cmd_edit_note (DialogData *data,
+ const gchar *focus_in_note)
+{
+ PlannerCmd *cmd_base;
+ TaskCmdEditNote *cmd;
+ gchar *note;
+
+ g_object_get (data->task, "note", ¬e, NULL);
+
+ if (strcmp (note, focus_in_note) == 0) {
+ g_free (note);
+ return NULL;
+ }
+
+ cmd_base = planner_cmd_new (TaskCmdEditNote,
+ _("Edit task note from dialog"),
+ task_cmd_edit_note_do,
+ task_cmd_edit_note_undo,
+ task_cmd_edit_note_free);
+
+ cmd = (TaskCmdEditNote *) cmd_base;
+
+ cmd->property = g_strdup ("note");
+ cmd->task = g_object_ref (data->task);
+
+ cmd->old_note = g_strdup (focus_in_note);
+ cmd->note = note;
+
+ planner_cmd_manager_insert_and_do (planner_window_get_cmd_manager (data->main_window),
+ cmd_base);
+
+ return cmd_base;
+}
+
+
static void
task_dialog_close_clicked_cb (GtkWidget *w, DialogData *data)
{
@@ -1792,13 +1874,13 @@ task_dialog_task_note_changed_cb (MrpTas
g_signal_handlers_block_by_func (data->note_buffer,
task_dialog_note_changed_cb,
- dialog);
+ data);
gtk_text_buffer_set_text (data->note_buffer, note, -1);
g_signal_handlers_unblock_by_func (data->note_buffer,
task_dialog_note_changed_cb,
- dialog);
+ data);
g_free (note);
}
@@ -1828,6 +1910,52 @@ task_dialog_note_changed_cb (GtkWidget
data->dialog);
}
+static gboolean
+task_dialog_note_focus_out_cb (GtkWidget *w,
+ GdkEventFocus *event,
+ DialogData *data)
+{
+ gchar *focus_in_note;
+ PlannerCmd *cmd;
+
+ focus_in_note = g_object_get_data (G_OBJECT (data->task),"focus_in_note");
+
+ cmd = task_cmd_edit_note (data, focus_in_note);
+
+ if (g_getenv ("PLANNER_DEBUG_UNDO_TASK")) {
+ gchar *note;
+
+ g_object_get (data->task, "note", ¬e, NULL);
+ g_message ("Note focus out value: %s", note);
+ g_free (note);
+ }
+
+ g_free (focus_in_note);
+
+ return FALSE;
+}
+
+static gboolean
+task_dialog_note_focus_in_cb (GtkWidget *w,
+ GdkEventFocus *event,
+ DialogData *data)
+{
+ gchar *note;
+
+ g_object_get (data->task, "note", ¬e, NULL);
+
+ if (g_getenv ("PLANNER_DEBUG_UNDO_RESOURCE")) {
+ g_message ("Note focus in value: %s", note);
+ }
+
+ gtk_text_buffer_set_text (data->note_buffer, note, -1);
+
+ g_object_set_data (G_OBJECT (data->task),
+ "focus_in_note", (gpointer) note);
+
+ return FALSE;
+}
+
static void
task_dialog_note_stamp_cb (GtkWidget *w,
DialogData *data)
@@ -2506,6 +2634,15 @@ task_dialog_setup_widgets (DialogData *d
g_signal_connect (data->note_buffer,
"changed",
G_CALLBACK (task_dialog_note_changed_cb),
+ data);
+ g_signal_connect (data->note_textview,
+ "focus_out_event",
+ G_CALLBACK (task_dialog_note_focus_out_cb),
+ data);
+
+ g_signal_connect (data->note_textview,
+ "focus_in_event",
+ G_CALLBACK (task_dialog_note_focus_in_cb),
data);
w = glade_xml_get_widget (glade, "stamp_button");
Attachment:
signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente