d14a1e2856
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())
|