UndoSupport.st
author Claus Gittinger <cg@exept.de>
Tue, 30 Nov 2004 12:53:01 +0100
changeset 1500 f94575558ca5
parent 1454 d77bede2a767
child 1522 7a569eca4d68
permissions -rw-r--r--
info string in undo

"{ 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 $'
! !