git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24541 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			152 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Name:         undo.py
 | |
| # Purpose:      XRC editor, undo/redo module
 | |
| # Author:       Roman Rolinsky <rolinsky@mema.ucl.ac.be>
 | |
| # Created:      01.12.2002
 | |
| # RCS-ID:       $Id$
 | |
| 
 | |
| from globals import *
 | |
| #from panel import *
 | |
| 
 | |
| # Undo/redo classes
 | |
| class UndoManager:
 | |
|     # Undo/redo stacks
 | |
|     undo = []
 | |
|     redo = []
 | |
|     def RegisterUndo(self, undoObj):
 | |
|         self.undo.append(undoObj)
 | |
|         for i in self.redo: i.destroy()
 | |
|         self.redo = []
 | |
|     def Undo(self):
 | |
|         undoObj = self.undo.pop()
 | |
|         undoObj.undo()
 | |
|         self.redo.append(undoObj)
 | |
|         g.frame.modified = True
 | |
|         g.frame.SetStatusText('Undone')
 | |
|     def Redo(self):
 | |
|         undoObj = self.redo.pop()
 | |
|         undoObj.redo()
 | |
|         self.undo.append(undoObj)
 | |
|         g.frame.modified = True
 | |
|         g.frame.SetStatusText('Redone')
 | |
|     def Clear(self):
 | |
|         for i in self.undo: i.destroy()
 | |
|         self.undo = []
 | |
|         for i in self.redo: i.destroy()
 | |
|         self.redo = []
 | |
|     def CanUndo(self):
 | |
|         return not not self.undo
 | |
|     def CanRedo(self):
 | |
|         return not not self.redo
 | |
| 
 | |
| class UndoCutDelete:
 | |
|     def __init__(self, itemIndex, parent, elem):
 | |
|         self.itemIndex = itemIndex
 | |
|         self.parent = parent
 | |
|         self.elem = elem
 | |
|     def destroy(self):
 | |
|         if self.elem: self.elem.unlink()
 | |
|     def undo(self):
 | |
|         item = g.tree.InsertNode(g.tree.ItemAtFullIndex(self.itemIndex[:-1]),
 | |
|                                  self.parent, self.elem,
 | |
|                                  g.tree.ItemAtFullIndex(self.itemIndex))
 | |
|         # Scroll to show new item (!!! redundant?)
 | |
|         g.tree.EnsureVisible(item)
 | |
|         g.tree.SelectItem(item)
 | |
|         self.elem = None
 | |
|         # Update testWin if needed
 | |
|         if g.testWin and g.tree.IsHighlatable(item):
 | |
|             if g.conf.autoRefresh:
 | |
|                 g.tree.needUpdate = True
 | |
|                 g.tree.pendingHighLight = item
 | |
|             else:
 | |
|                 g.tree.pendingHighLight = None
 | |
|     def redo(self):
 | |
|         item = g.tree.ItemAtFullIndex(self.itemIndex)
 | |
|         # Delete testWin?
 | |
|         if g.testWin:
 | |
|             # If deleting top-level item, delete testWin
 | |
|             if item == g.testWin.item:
 | |
|                 g.testWin.Destroy()
 | |
|                 g.testWin = None
 | |
|             else:
 | |
|                 # Remove highlight, update testWin
 | |
|                 if g.testWin.highLight:
 | |
|                     g.testWin.highLight.Remove()
 | |
|                 g.tree.needUpdate = True
 | |
|         self.elem = g.tree.RemoveLeaf(item)
 | |
|         g.tree.Unselect()
 | |
|         g.panel.Clear()
 | |
| 
 | |
| class UndoPasteCreate:
 | |
|     def __init__(self, itemParent, parent, item, selected):
 | |
|         self.itemParentIndex = g.tree.ItemFullIndex(itemParent)
 | |
|         self.parent = parent
 | |
|         self.itemIndex = g.tree.ItemFullIndex(item) # pasted item
 | |
|         self.selectedIndex = g.tree.ItemFullIndex(selected) # maybe different from item
 | |
|         self.elem = None
 | |
|     def destroy(self):
 | |
|         if self.elem: self.elem.unlink()
 | |
|     def undo(self):
 | |
|         self.elem = g.tree.RemoveLeaf(g.tree.ItemAtFullIndex(self.itemIndex))
 | |
|         # Restore old selection
 | |
|         selected = g.tree.ItemAtFullIndex(self.selectedIndex)
 | |
|         g.tree.EnsureVisible(selected)
 | |
|         g.tree.SelectItem(selected)
 | |
|         # Delete testWin?
 | |
|         if g.testWin:
 | |
|             # If deleting top-level item, delete testWin
 | |
|             if selected == g.testWin.item:
 | |
|                 g.testWin.Destroy()
 | |
|                 g.testWin = None
 | |
|             else:
 | |
|                 # Remove highlight, update testWin
 | |
|                 if g.testWin.highLight:
 | |
|                     g.testWin.highLight.Remove()
 | |
|                 g.tree.needUpdate = True
 | |
|     def redo(self):
 | |
|         item = g.tree.InsertNode(g.tree.ItemAtFullIndex(self.itemParentIndex),
 | |
|                                  self.parent, self.elem,
 | |
|                                  g.tree.ItemAtFullIndex(self.itemIndex))
 | |
|         # Scroll to show new item
 | |
|         g.tree.EnsureVisible(item)
 | |
|         g.tree.SelectItem(item)
 | |
|         self.elem = None
 | |
|         # Update testWin if needed
 | |
|         if g.testWin and g.tree.IsHighlatable(item):
 | |
|             if g.conf.autoRefresh:
 | |
|                 g.tree.needUpdate = True
 | |
|                 g.tree.pendingHighLight = item
 | |
|             else:
 | |
|                 g.tree.pendingHighLight = None
 | |
| 
 | |
| class UndoEdit:
 | |
|     def __init__(self):
 | |
|         self.pages = map(ParamPage.GetState, g.panel.pages)
 | |
|         self.selectedIndex = g.tree.ItemFullIndex(g.tree.GetSelection())
 | |
|     def destroy(self):
 | |
|         pass
 | |
|     # Update test view
 | |
|     def update(self, selected):
 | |
|         g.tree.Apply(g.tree.GetPyData(selected), selected)
 | |
|         # Update view
 | |
|         if g.testWin:
 | |
|             if g.testWin.highLight:
 | |
|                 g.testWin.highLight.Remove()
 | |
|             g.tree.pendingHighLight = selected
 | |
|         if g.testWin:
 | |
|             g.tree.needUpdate = True
 | |
|     def undo(self):
 | |
|         # Restore selection
 | |
|         selected = g.tree.ItemAtFullIndex(self.selectedIndex)
 | |
|         if selected != g.tree.GetSelection():
 | |
|             g.tree.SelectItem(selected)
 | |
|         # Save current state for redo
 | |
|         map(ParamPage.SaveState, g.panel.pages)
 | |
|         pages = map(ParamPage.GetState, g.panel.pages)
 | |
|         map(ParamPage.SetState, g.panel.pages, self.pages)
 | |
|         self.pages = pages
 | |
|         self.update(selected)
 | |
|     def redo(self):
 | |
|         self.undo()
 | |
|         self.update(g.tree.GetSelection())
 |