"{ Package: 'stx:libbasic2' }"
Object subclass:#UndoSupport
instanceVariableNames:'actionPerformer transaction undoList redoList'
classVariableNames:''
poolDictionaries:''
category:'Views-Text'
!
Object subclass:#CompoundAction
instanceVariableNames:'actions'
classVariableNames:''
poolDictionaries:''
privateIn:UndoSupport
!
!UndoSupport class methodsFor:'documentation'!
documentation
"
Framework for undo & redo.
See concrete usage in EditTextView.
[author:]
(cg@betti)
[instance variables:]
[class variables:]
[see also:]
"
!
examples
"
See usage in EditTextView
"
! !
!UndoSupport class methodsFor:'instance creation'!
for:anActionPerformer
^ self new actionPerformer:anActionPerformer.
!
new
^ self basicNew initialize.
! !
!UndoSupport methodsFor:'initialization'!
actionPerformer:something
actionPerformer := something.
!
initialize
self resetHistories.
!
resetHistories
transaction := nil.
undoList := OrderedCollection new.
redoList := OrderedCollection new.
! !
!UndoSupport methodsFor:'undo & again'!
addUndo:action
transaction notNil ifTrue:[
transaction add:action
].
!
closeTransactionAndAddTo:aList
transaction notEmptyOrNil ifTrue:[
transaction size == 1 ifTrue:[
aList add:transaction first
] ifFalse:[
aList add:(CompoundAction new actions:transaction)
]
].
transaction := nil
!
executeActionFrom:doList addUndoTo:unDoList
|action trans|
doList notEmptyOrNil ifTrue:[
action := doList removeLast.
trans := transaction.
transaction := OrderedCollection new.
action executeIn:actionPerformer.
self closeTransactionAndAddTo:unDoList.
transaction := trans.
]
!
hasRedoAction
^ redoList size > 0
!
hasUndoAction
^ undoList size > 0
!
lastRedoAction
^ redoList removeLast
!
lastUndoAction
^ undoList removeLast
!
nonUndoableDo:aBlock
|prev|
prev := transaction.
transaction := nil.
aBlock
ensure:[
transaction := prev.
].
!
redo
self executeActionFrom:redoList addUndoTo:undoList
!
undo
self executeActionFrom:undoList addUndoTo:redoList
!
undoActionInfo
^ undoList last info
!
undoableDo:aBlock
transaction notNil ifTrue:[
aBlock value.
] ifFalse:[
transaction := OrderedCollection new.
aBlock
ensure:[
self closeTransactionAndAddTo:undoList.
].
].
! !
!UndoSupport::CompoundAction methodsFor:'adding'!
actions:aCollection
actions := aCollection
!
add:action
actions isNil ifTrue:[
actions := OrderedCollection new.
].
actions add:action
! !
!UndoSupport::CompoundAction methodsFor:'execution'!
executeIn:editor
actions reverseDo:[:each | each executeIn:editor ]
!
info
^ actions first info , '..'
! !
!UndoSupport class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libbasic2/UndoSupport.st,v 1.2 2004-11-30 11:53:01 cg Exp $'
! !