UndoSupport.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 4370 a1ab0c18d19d
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     1
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     2
 COPYRIGHT (c) 2004 by eXept Software AG
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     3
              All Rights Reserved
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     4
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     5
 This software is furnished under a license and may be used
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     6
 only in accordance with the terms of that license and with the
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     8
 be provided or otherwise made available to, or used by, any
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
     9
 other person.  No title to or ownership of the software is
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    10
 hereby transferred.
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    11
"
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
3820
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
    14
"{ NameSpace: Smalltalk }"
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
    15
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#UndoSupport
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    17
	instanceVariableNames:'actionPerformer transaction undoList redoList
2136
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    18
		infoOfCurrentTransaction undoLimit'
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	classVariableNames:''
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	poolDictionaries:''
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	category:'Views-Text'
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
Object subclass:#CompoundAction
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    25
	instanceVariableNames:'actions userFriendlyInfo'
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
	classVariableNames:''
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
	poolDictionaries:''
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
	privateIn:UndoSupport
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
!UndoSupport class methodsFor:'documentation'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
1522
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    33
copyright
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    34
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    35
 COPYRIGHT (c) 2004 by eXept Software AG
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    36
              All Rights Reserved
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    37
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    38
 This software is furnished under a license and may be used
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    39
 only in accordance with the terms of that license and with the
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    40
 inclusion of the above copyright notice.   This software may not
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    41
 be provided or otherwise made available to, or used by, any
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    42
 other person.  No title to or ownership of the software is
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    43
 hereby transferred.
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    44
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    45
!
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1500
diff changeset
    46
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
documentation
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
"
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    Framework for undo & redo.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    See concrete usage in EditTextView.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    [author:]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
         (cg@betti)
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    [instance variables:]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    [class variables:]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    [see also:]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
"
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
examples
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
"
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    See usage in EditTextView
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
"
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
!UndoSupport class methodsFor:'instance creation'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
for:anActionPerformer
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    ^ self new actionPerformer:anActionPerformer.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
new
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    ^ self basicNew initialize.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    80
!UndoSupport methodsFor:'accessing'!
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    81
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    82
actionInfo:aString
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    83
    infoOfCurrentTransaction := aString
2136
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    84
!
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    85
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    86
undoLimit
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    87
    ^ undoLimit
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    88
!
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    89
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    90
undoLimit:something
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
    91
    undoLimit := something.
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    92
! !
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
    93
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
!UndoSupport methodsFor:'initialization'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
actionPerformer:something
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    actionPerformer := something.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
initialize
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    self resetHistories.
2136
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   102
    "/ undoLimit := 1000.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
resetHistories
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    transaction := nil.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    undoList := OrderedCollection new.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    redoList := OrderedCollection new.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
3820
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   111
!UndoSupport methodsFor:'queries'!
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   112
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   113
isInTransaction
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   114
    ^ transaction notNil
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   115
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   116
    "Created: / 30-04-2016 / 20:31:04 / cg"
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   117
!
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   118
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   119
transactionNotEmpty
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   120
    ^ transaction notEmptyOrNil
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   121
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   122
    "Created: / 30-04-2016 / 20:47:53 / cg"
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   123
! !
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   124
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
!UndoSupport methodsFor:'undo & again'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
addUndo:action
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    transaction notNil ifTrue:[
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
        transaction add:action
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    ].
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
3820
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   133
addUndoFirst:action
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   134
    transaction notNil ifTrue:[
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   135
        transaction addFirst:action
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   136
    ].
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   137
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   138
    "Created: / 30-04-2016 / 20:50:53 / cg"
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   139
!
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   140
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   141
closeTransactionAndAddTo:anUndoList
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   142
    "at the end of an operation, check the individual undo actions
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   143
     and add them to the given undoList.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   144
     (either individually or as a compound undo action).
4370
a1ab0c18d19d #DOCUMENTATION by mawalch
mawalch
parents: 3825
diff changeset
   145
     Check if the new action(s) can be combined with the previous undo action into one
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   146
     (this is done for individual keystrokes and character-deletions)"
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   147
     
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   148
    |anythingToUndo actionToAdd lastAction canCombine|
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   149
        
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   150
    anythingToUndo := false.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    transaction notEmptyOrNil ifTrue:[
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   152
        anythingToUndo := transaction size > 1
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   153
                          or:[ transaction first isRestoreSelectionAndCursor not].
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   154
    ].                    
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   155
    anythingToUndo ifTrue:[
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   156
        canCombine := false.
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   157
        
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   158
        anUndoList isEmpty ifTrue:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   159
            "/ nothing yet 
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   160
            anUndoList addAll:transaction
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   161
        ] ifFalse:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   162
            "/ append new actions
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   163
            (infoOfCurrentTransaction isNil and:[ transaction size == 1 ]) ifTrue:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   164
                actionToAdd := transaction first.
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   165
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   166
                lastAction := anUndoList last.
1550
7710a4b44cc9 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1549
diff changeset
   167
                canCombine := lastAction perform:#canCombineWithNext: with:actionToAdd ifNotUnderstood:false.
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   168
            ] ifFalse:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   169
                (infoOfCurrentTransaction isNil 
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   170
                and:[ transaction size == 2 
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   171
                and:[ transaction first isRestoreSelectionAndCursor 
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   172
                and:[ undoList contains:[:op | op isRestoreSelectionAndCursor] ]]]) ifTrue:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   173
                    actionToAdd := transaction second.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   174
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   175
                    lastAction := anUndoList last.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   176
                    canCombine := lastAction perform:#canCombineWithNext: with:actionToAdd ifNotUnderstood:false.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   177
                ] ifFalse:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   178
                    actionToAdd := (CompoundAction new actions:transaction).
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   179
                    actionToAdd info:infoOfCurrentTransaction.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   180
                ].
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   181
            ].
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   182
            canCombine ifTrue:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   183
                lastAction combineWithNext:actionToAdd.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   184
            ] ifFalse:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   185
                anUndoList add:actionToAdd.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   186
                (undoLimit notNil and:[anUndoList size > undoLimit]) ifTrue:[
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   187
                    Transcript showCR:'forget old undo-action'.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   188
                    anUndoList removeFirst.
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   189
                ].
2136
2accac6ffb0f allow for the undoList size to be limited
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   190
            ].
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   191
        ].
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    ].
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   193
    infoOfCurrentTransaction := nil.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    transaction := nil
4370
a1ab0c18d19d #DOCUMENTATION by mawalch
mawalch
parents: 3825
diff changeset
   195
a1ab0c18d19d #DOCUMENTATION by mawalch
mawalch
parents: 3825
diff changeset
   196
    "Modified (comment): / 22-05-2017 / 12:48:07 / mawalch"
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
executeActionFrom:doList addUndoTo:unDoList
1588
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   200
    |action previousTransaction|
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    doList notEmptyOrNil ifTrue:[
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
        action := doList removeLast.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
1588
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   205
        previousTransaction := transaction.
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   206
        [
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   207
            transaction := OrderedCollection new.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
1588
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   209
            action executeIn:actionPerformer.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
1588
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   211
            self closeTransactionAndAddTo:unDoList.
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   212
        ] ensure:[
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   213
            transaction := previousTransaction.
7a69b6a027b0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
   214
        ]
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
hasRedoAction
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    ^ redoList size > 0
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
hasUndoAction
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    ^ undoList size > 0
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
lastRedoAction
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    ^ redoList removeLast
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
lastUndoAction
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    ^ undoList removeLast
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
nonUndoableDo:aBlock
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    |prev|
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    prev := transaction.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    transaction := nil.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    aBlock 
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
        ensure:[
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
            transaction := prev.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
        ].
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
redo
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    self executeActionFrom:redoList addUndoTo:undoList
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
1932
7bafb4c076d3 also show \"what-would-be-done\" in redo item
Claus Gittinger <cg@exept.de>
parents: 1588
diff changeset
   249
redoActionInfo
7bafb4c076d3 also show \"what-would-be-done\" in redo item
Claus Gittinger <cg@exept.de>
parents: 1588
diff changeset
   250
    ^ redoList last info
7bafb4c076d3 also show \"what-would-be-done\" in redo item
Claus Gittinger <cg@exept.de>
parents: 1588
diff changeset
   251
!
7bafb4c076d3 also show \"what-would-be-done\" in redo item
Claus Gittinger <cg@exept.de>
parents: 1588
diff changeset
   252
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
undo
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    self executeActionFrom:undoList addUndoTo:redoList
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
1500
f94575558ca5 info string in undo
Claus Gittinger <cg@exept.de>
parents: 1454
diff changeset
   257
undoActionInfo
f94575558ca5 info string in undo
Claus Gittinger <cg@exept.de>
parents: 1454
diff changeset
   258
    ^ undoList last info
f94575558ca5 info string in undo
Claus Gittinger <cg@exept.de>
parents: 1454
diff changeset
   259
!
f94575558ca5 info string in undo
Claus Gittinger <cg@exept.de>
parents: 1454
diff changeset
   260
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
undoableDo:aBlock
1526
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   262
    self undoableDo:aBlock info:nil.
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   263
!
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   264
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   265
undoableDo:aBlock info:aString
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    transaction notNil ifTrue:[
1526
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   267
        infoOfCurrentTransaction := infoOfCurrentTransaction ? aString.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
        aBlock value.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    ] ifFalse:[
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
        transaction := OrderedCollection new.
1526
f980a40d3c69 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1525
diff changeset
   271
        infoOfCurrentTransaction := aString.
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
        aBlock 
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
            ensure:[  
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
                self closeTransactionAndAddTo:undoList.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
            ].
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    ].
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
1525
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   279
!UndoSupport::CompoundAction methodsFor:'accessing'!
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   280
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   281
info
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   282
    ^ userFriendlyInfo
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   283
!
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   284
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   285
info:aString
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   286
    userFriendlyInfo := aString
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   287
! !
6384f91af636 better info of replace action (compound-undo-action has info, too)
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   288
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!UndoSupport::CompoundAction methodsFor:'adding'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
actions:aCollection
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    actions := aCollection
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
add:action
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    actions isNil ifTrue:[
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
        actions := OrderedCollection new.
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    ].
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    actions add:action
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
!UndoSupport::CompoundAction methodsFor:'execution'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
executeIn:editor 
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    actions reverseDo:[:each | each executeIn:editor ]
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
! !
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   308
!UndoSupport::CompoundAction methodsFor:'queries'!
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   309
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   310
canCombineWithNext:nextAction
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   311
    ^ false.
3825
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   312
!
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   313
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   314
isRestoreSelectionAndCursor
42ad9ef77333 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 3820
diff changeset
   315
    ^ false.
1549
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   316
! !
b35755379765 undo - combine multiple-single keystrokes
Claus Gittinger <cg@exept.de>
parents: 1526
diff changeset
   317
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
!UndoSupport class methodsFor:'documentation'!
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
version
3820
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   321
    ^ '$Header$'
1454
d77bede2a767 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
! !
3820
d4100babd7c8 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 2136
diff changeset
   323