# # Copyright (c) 2004, 2005 Art Haas # # This file is part of PythonCAD. # # PythonCAD is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # PythonCAD is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with PythonCAD; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # base class for entity history storage and undo/redo mechanisms # from PythonCAD.Generic import message class Logger(message.Messenger): def __init__(self): super(Logger, self).__init__() self.__undo = None self.__redo = None self.__inredo = False self.__undone = False def detatch(self): pass def saveUndoData(self, *data): if self.__undo is None: self.__undo = [] # print "saveUndoData: " + str(data) self.__undo.append(data) if self.__undone and not self.__inredo: self.__redo = None self.__undone = False def printUndoData(self): print "Undo stack ..." if self.__undo is None: print "None" else: for _d in self.__undo: print _d def getUndoData(self): _data = None if self.__undo is not None: _data = self.__undo.pop() if len(self.__undo) == 0: self.__undo = None return _data def undo(self): if self.__undo is not None: _data = self.__undo.pop() if len(self.__undo) == 0: self.__undo = None self.execute(True, *_data) self.__undone = True def saveRedoData(self, *data): if self.__redo is None: self.__redo = [] # print "saveRedoData: " + str(data) self.__redo.append(data) def getRedoData(self): _data = None if self.__redo is not None: _data = self.__redo.pop() if len(self.__redo) == 0: self.__redo = None return _data def printRedoData(self): print "Redo stack ..." if self.__redo is None: print "None" else: for _d in self.__redo: print _d def redo(self): if self.__redo is not None: _data = self.__redo.pop() if len(self.__redo) == 0: self.__redo = None self.__inredo = True try: self.execute(False, *_data) finally: self.__inredo = False def execute(self, undo, *args): pass def clear(self): self.__undo = None self.__redo = None def transferData(self, log): if not isinstance(log, Logger): raise TypeError, "Invalid Logger: " + `log` _undo = [] _redo = [] _data = log.getUndoData() while _data is not None: _undo.append(_data) _data = log.getUndoData() if len(_undo): if self.__undo is None: self.__undo = [] _undo.reverse() for _data in _undo: self.__undo.append(_data) _data = log.getRedoData() while _data is not None: _redo.append(_data) _data = log.getRedoData() if len(_redo): if self.__redo is None: self.__redo = [] _redo.reverse() for _data in _redo: self.__redo.append(_data)