Within each operation, entity changes can be recorded using QofEventHandler or individually.
Undo data consists of a list of operations that have changed data in this book and a list of entity changes for each of those operations. Each operation can relate to more than one entity change and cover more than one entity but must only relate to one book.
Files | |
file | qofundo.h |
QOF undo handling. | |
Defines | |
#define | QOF_MOD_UNDO "qof-undo" |
Functions | |
void | qof_undo_set_param (QofEntity *ent, const QofParam *param, gchar *value) |
Set a value in this parameter of the entity. | |
void | qof_undo_modify (QofInstance *inst, const QofParam *param) |
void | qof_undo_commit (QofInstance *inst, const QofParam *param) |
void | qof_undo_create (QofInstance *inst) |
void | qof_undo_delete (QofInstance *inst) |
void | qof_book_clear_undo (QofBook *book) |
Free the entire undo list for this book. | |
void | qof_book_undo (QofBook *book) |
Set parameter values from before the previous event. | |
void | qof_book_redo (QofBook *book) |
Set parameter values from after the previous event. | |
gboolean | qof_book_can_undo (QofBook *book) |
event handler for undo widget | |
gboolean | qof_book_can_redo (QofBook *book) |
event handler for redo widget | |
void | qof_book_start_operation (QofBook *book, gchar *label) |
Start recording operation. | |
void | qof_book_end_operation (QofBook *book) |
End recording the current operation. | |
QofTime * | qof_book_undo_first_modified (QofBook *book) |
HIG compliance aid to report time of first change. | |
gint | qof_book_undo_count (QofBook *book) |
Number of undo operations available. |
gboolean qof_book_can_redo | ( | QofBook * | book | ) |
event handler for redo widget
Definition at line 442 of file qofundo.c.
00443 { 00444 QofUndo *book_undo; 00445 gint length; 00446 00447 book_undo = book->undo_data; 00448 length = g_list_length (book_undo->undo_list); 00449 if ((book_undo->index_position == length) || (length == 0)) 00450 return FALSE; 00451 return TRUE; 00452 }
gboolean qof_book_can_undo | ( | QofBook * | book | ) |
event handler for undo widget
Definition at line 429 of file qofundo.c.
00430 { 00431 QofUndo *book_undo; 00432 gint length; 00433 00434 book_undo = book->undo_data; 00435 length = g_list_length (book_undo->undo_list); 00436 if ((book_undo->index_position == 0) || (length == 0)) 00437 return FALSE; 00438 return TRUE; 00439 }
void qof_book_clear_undo | ( | QofBook * | book | ) |
Free the entire undo list for this book.
The application needs to decide whether to reset the undo list upon session_save, application close, user intervention etc.
Definition at line 409 of file qofundo.c.
00410 { 00411 QofUndoOperation *operation; 00412 QofUndo *book_undo; 00413 00414 if (!book) 00415 return; 00416 book_undo = book->undo_data; 00417 while (book_undo != NULL) 00418 { 00419 operation = (QofUndoOperation *) book_undo->undo_list->data; 00420 if(operation->entity_list) 00421 g_list_free (operation->entity_list); 00422 book_undo->undo_list = g_list_next (book_undo->undo_list); 00423 } 00424 book_undo->index_position = 0; 00425 g_free (book_undo->undo_label); 00426 }
void qof_undo_commit | ( | QofInstance * | inst, | |
const QofParam * | param | |||
) |
Mark this instance parameter after modification
Prepare undo data for this instance after committal. Record the modified state of this parameter of this instance so that if this operation is undone and then redone, the modification can be recreated.
Definition at line 571 of file qofundo.c.
00572 { 00573 QofUndoEntity *undo_entity; 00574 QofUndo *book_undo; 00575 QofBook *book; 00576 00577 if (!instance || !param) 00578 return; 00579 book = instance->book; 00580 book_undo = book->undo_data; 00581 undo_entity = qof_prepare_undo (&instance->entity, param); 00582 book_undo->undo_cache = 00583 g_list_prepend (book_undo->undo_cache, undo_entity); 00584 }
void qof_undo_create | ( | QofInstance * | inst | ) |
prepare undo data for a new instance.
Record the creation of a new (empty) instance so that undo can delete it (and recreate it on redo).
Can be used within a QofEventHandler in response to QOF_EVENT_CREATE.
Definition at line 486 of file qofundo.c.
00487 { 00488 QofUndoEntity *undo_entity; 00489 QofBook *book; 00490 QofUndo *book_undo; 00491 00492 if (!instance) 00493 return; 00494 book = instance->book; 00495 book_undo = book->undo_data; 00496 undo_entity = g_new0 (QofUndoEntity, 1); 00497 // to undo a create, use a delete. 00498 undo_entity->how = UNDO_DELETE; 00499 undo_entity->guid = qof_instance_get_guid (instance); 00500 undo_entity->type = instance->entity.e_type; 00501 book_undo->undo_cache = 00502 g_list_prepend (book_undo->undo_cache, undo_entity); 00503 }
void qof_undo_delete | ( | QofInstance * | inst | ) |
prepare undo data for an instance to be deleted.
Prepare for the deletion of an entity by storing ALL data in all editable parameters so that this delete operation can be undone.
Can be used within a QofEventHandler in response to QOF_EVENT_DESTROY, before the instance itself is deleted.
Definition at line 523 of file qofundo.c.
00524 { 00525 QofUndoEntity *undo_entity; 00526 QofIdType type; 00527 QofUndo *book_undo; 00528 QofBook *book; 00529 00530 if (!instance) 00531 return; 00532 book = instance->book; 00533 book_undo = book->undo_data; 00534 // now need to store each parameter in a second entity, MODIFY. 00535 type = instance->entity.e_type; 00536 qof_class_param_foreach (type, undo_get_entity, instance); 00537 undo_entity = g_new0 (QofUndoEntity, 1); 00538 // to undo a delete, use a create. 00539 undo_entity->how = UNDO_CREATE; 00540 undo_entity->guid = qof_instance_get_guid (instance); 00541 undo_entity->type = type; 00542 book_undo->undo_cache = 00543 g_list_prepend (book_undo->undo_cache, undo_entity); 00544 }
void qof_undo_modify | ( | QofInstance * | inst, | |
const QofParam * | param | |||
) |
Mark this instance parameter before modification.
Prepare undo data for this parameter of this instance. Record the initial state of this parameter of this instance in preparation for modification so that undo can reset the value if required.
Definition at line 547 of file qofundo.c.
00548 { 00549 QofBook *book; 00550 QofUndo *book_undo; 00551 QofUndoEntity *undo_entity; 00552 00553 if (!instance || !param) 00554 return; 00555 book = instance->book; 00556 book_undo = book->undo_data; 00557 // handle if record is called without a commit. 00558 undo_entity = qof_prepare_undo (&instance->entity, param); 00559 book_undo->undo_cache = 00560 g_list_prepend (book_undo->undo_cache, undo_entity); 00561 // set the initial state that undo will reinstate. 00562 if (book_undo->index_position == 0) 00563 { 00564 book_undo->undo_list = g_list_prepend (book_undo->undo_list, 00565 qof_undo_new_operation (book, "initial")); 00566 book_undo->index_position++; 00567 } 00568 }
Set a value in this parameter of the entity.
Setting an arbitrary parameter in an entity can involve repetitive string comparisons and setter function prototypes. This function accepts a QofParam (which determines the type of value) and a string representing the value. e.g. for a boolean, pass "TRUE", for a GUID pass the result of guid_to_string_buff.
Sets the undo data for this modification at the same time, calling qof_undo_modify, sets the parameter and qof_undo_commit.
ent | An initialised QofEntity from an accessible QofBook. | |
param | from qof_class_get_parameter | |
value | A string representation of the required value - original type as specified in param->param_type. |
Definition at line 207 of file qofundo.c.
00209 { 00210 qof_undo_modify ((QofInstance*)ent, param); 00211 set_param (ent, param, value); 00212 qof_undo_commit ((QofInstance*)ent, param); 00213 }