# -*- coding: utf-8 -*- ######################################################################## # # License: BSD # Created: February 15, 2005 # Author: Ivan Vilata - reverse:net.selidor@ivan # # $Source$ # $Id$ # ######################################################################## """Support for undoing and redoing actions. Functions: * undo(file, operation, *args) * redo(file, operation, *args) * move_to_shadow(file, path) * move_from_shadow(file, path) * attr_to_shadow(file, path, name) * attr_from_shadow(file, path, name) Misc variables: `__docformat__` The format of documentation strings in this module. """ from tables.path import split_path from tables._past import previous_api __docformat__ = 'reStructuredText' """The format of documentation strings in this module.""" def undo(file_, operation, *args): if operation == 'CREATE': undo_create(file_, args[0]) elif operation == 'REMOVE': undo_remove(file_, args[0]) elif operation == 'MOVE': undo_move(file_, args[0], args[1]) elif operation == 'ADDATTR': undo_add_attr(file_, args[0], args[1]) elif operation == 'DELATTR': undo_del_attr(file_, args[0], args[1]) else: raise NotImplementedError("the requested unknown operation %r can " "not be undone; please report this to the " "authors" % operation) def redo(file_, operation, *args): if operation == 'CREATE': redo_create(file_, args[0]) elif operation == 'REMOVE': redo_remove(file_, args[0]) elif operation == 'MOVE': redo_move(file_, args[0], args[1]) elif operation == 'ADDATTR': redo_add_attr(file_, args[0], args[1]) elif operation == 'DELATTR': redo_del_attr(file_, args[0], args[1]) else: raise NotImplementedError("the requested unknown operation %r can " "not be redone; please report this to the " "authors" % operation) def move_to_shadow(file_, path): node = file_._get_node(path) (shparent, shname) = file_._shadow_name() node._g_move(shparent, shname) moveToShadow = previous_api(move_to_shadow) def move_from_shadow(file_, path): (shparent, shname) = file_._shadow_name() node = shparent._f_get_child(shname) (pname, name) = split_path(path) parent = file_._get_node(pname) node._g_move(parent, name) moveFromShadow = previous_api(move_from_shadow) def undo_create(file_, path): move_to_shadow(file_, path) undoCreate = previous_api(undo_create) def redo_create(file_, path): move_from_shadow(file_, path) redoCreate = previous_api(redo_create) def undo_remove(file_, path): move_from_shadow(file_, path) undoRemove = previous_api(undo_remove) def redo_remove(file_, path): move_to_shadow(file_, path) redoRemove = previous_api(redo_remove) def undo_move(file_, origpath, destpath): (origpname, origname) = split_path(origpath) node = file_._get_node(destpath) origparent = file_._get_node(origpname) node._g_move(origparent, origname) undoMove = previous_api(undo_move) def redo_move(file_, origpath, destpath): (destpname, destname) = split_path(destpath) node = file_._get_node(origpath) destparent = file_._get_node(destpname) node._g_move(destparent, destname) redoMove = previous_api(redo_move) def attr_to_shadow(file_, path, name): node = file_._get_node(path) attrs = node._v_attrs value = getattr(attrs, name) (shparent, shname) = file_._shadow_name() shattrs = shparent._v_attrs # Set the attribute only if it has not been kept in the shadow. # This avoids re-pickling complex attributes on REDO. if not shname in shattrs: shattrs._g__setattr(shname, value) attrs._g__delattr(name) attrToShadow = previous_api(attr_to_shadow) def attr_from_shadow(file_, path, name): (shparent, shname) = file_._shadow_name() shattrs = shparent._v_attrs value = getattr(shattrs, shname) node = file_._get_node(path) node._v_attrs._g__setattr(name, value) # Keeping the attribute in the shadow allows reusing it on Undo/Redo. # shattrs._g__delattr(shname) attrFromShadow = previous_api(attr_from_shadow) def undo_add_attr(file_, path, name): attr_to_shadow(file_, path, name) undoAddAttr = previous_api(undo_add_attr) def redo_add_attr(file_, path, name): attr_from_shadow(file_, path, name) redoAddAttr = previous_api(redo_add_attr) def undo_del_attr(file_, path, name): attr_from_shadow(file_, path, name) undoDelAttr = previous_api(undo_del_attr) def redo_del_attr(file_, path, name): attr_to_shadow(file_, path, name) redoDelAttr = previous_api(redo_del_attr) ## Local Variables: ## mode: python ## py-indent-offset: 4 ## tab-width: 4 ## End: