UIObjectView.st
author ca
Sat, 15 Feb 1997 19:15:25 +0100
changeset 50 fb4359c9bdc4
parent 49 7f58dd5fc836
child 51 01d0c9394944
permissions -rw-r--r--
checkin from browser
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     1
Object subclass:#UndoHistory
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     2
	instanceVariableNames:'history transaction enabled modifiedAction'
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     3
	classVariableNames:''
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     4
	poolDictionaries:''
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     5
	privateIn:UIObjectView
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     6
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
     7
50
fb4359c9bdc4 checkin from browser
ca
parents: 49
diff changeset
     8
!UIObjectView::UndoHistory class methodsFor:'instance creation'!
44
cb65ce16c150 intitial checkin
ca
parents:
diff changeset
     9
50
fb4359c9bdc4 checkin from browser
ca
parents: 49
diff changeset
    10
new
fb4359c9bdc4 checkin from browser
ca
parents: 49
diff changeset
    11
    ^ self basicNew initialize
44
cb65ce16c150 intitial checkin
ca
parents:
diff changeset
    12
cb65ce16c150 intitial checkin
ca
parents:
diff changeset
    13
cb65ce16c150 intitial checkin
ca
parents:
diff changeset
    14
! !
cb65ce16c150 intitial checkin
ca
parents:
diff changeset
    15
47
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    16
!UIObjectView::UndoHistory class methodsFor:'constants'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    17
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    18
maxHistorySize
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    19
    "returns maximum size of history before removing oldest
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    20
     record
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    21
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    22
    ^ 50
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    23
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    24
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    25
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    26
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    27
!UIObjectView::UndoHistory methodsFor:'accessing'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    28
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    29
modifiedAction:aBlockWithOneArg
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    30
    "the block is evaluated whenever the history changed; the argument to the
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    31
     block is the newest transaction identifier retrived from 'openTransaction'
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    32
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    33
    modifiedAction := aBlockWithOneArg
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    34
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    35
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    36
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    37
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    38
!UIObjectView::UndoHistory methodsFor:'initialization'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    39
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    40
initialize
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    41
    super initialize.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    42
    self  reinitialize.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    43
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    44
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    45
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    46
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    47
reinitialize
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    48
    "reinitialize all attributes
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    49
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    50
    history := OrderedCollection new.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    51
    transaction := nil.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    52
    enabled := true.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    53
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    54
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    55
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    56
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    57
!UIObjectView::UndoHistory methodsFor:'notifications'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    58
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    59
modified
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    60
    "raise notification; history changed
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    61
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    62
    modifiedAction notNil ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    63
        |what|
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    64
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    65
        history isEmpty ifTrue:[what := nil]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    66
                       ifFalse:[what := history last first].
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    67
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    68
        modifiedAction value:what
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    69
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    70
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    71
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    72
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    73
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    74
!UIObjectView::UndoHistory methodsFor:'testing'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    75
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    76
isEmpty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    77
    "returns true if undo history is empty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    78
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    79
    ^ history isEmpty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    80
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    81
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    82
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    83
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    84
isTransactionOpen
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    85
    ^ (enabled and:[transaction notNil])
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    86
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    87
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    88
notEmpty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    89
    "returns true if undo history is not empty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    90
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    91
    ^ history notEmpty
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    92
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    93
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    94
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    95
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    96
!UIObjectView::UndoHistory methodsFor:'transaction'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    97
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    98
addUndoBlock:anUndoBlock
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
    99
    "undo block to restore changes; add block to current transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   100
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   101
    enabled ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   102
        transaction isNil ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   103
            "no existing transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   104
            "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   105
            self halt
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   106
        ] ifFalse:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   107
            (transaction at:2) add:anUndoBlock
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   108
        ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   109
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   110
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   111
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   112
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   113
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   114
closeTransaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   115
    "close current transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   116
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   117
    self isTransactionOpen ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   118
        transaction last isEmpty ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   119
            "empty undo transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   120
            "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   121
            transaction := nil
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   122
        ] ifFalse:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   123
            history addLast:transaction.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   124
            transaction := nil.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   125
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   126
            history size > (self class maxHistorySize) ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   127
                history removeFirst
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   128
            ].
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   129
            self modified
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   130
        ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   131
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   132
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   133
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   134
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   135
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   136
disabledTransitionDo:aBlock
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   137
    "disable transitions during evaluating the block
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   138
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   139
    |oldState|
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   140
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   141
    oldState := enabled.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   142
    enabled  := false.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   143
    aBlock value.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   144
    enabled  := oldState.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   145
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   146
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   147
openTransaction:what
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   148
    "open a new transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   149
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   150
    enabled ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   151
        transaction notNil ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   152
            "transaction within transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   153
            "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   154
            self halt.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   155
        ] ifFalse:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   156
            transaction := Array with:what with:OrderedCollection new
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   157
        ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   158
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   159
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   160
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   161
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   162
transactionNamed:what do:aBlock
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   163
    "open a transaction; perform the block; at least close the transaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   164
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   165
    self isTransactionOpen ifFalse:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   166
        self openTransaction:what.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   167
        aBlock value.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   168
        self closeTransaction
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   169
    ] ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   170
        aBlock value
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   171
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   172
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   173
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   174
!UIObjectView::UndoHistory methodsFor:'undo'!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   175
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   176
undoLast
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   177
    "undo last transactions; an open transaction will be closed;
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   178
     transactions during undo are disabled
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   179
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   180
    self undoLast:1
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   181
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   182
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   183
!
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   184
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   185
undoLast:nTransactions
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   186
    "undo last n transactions; an open transaction will be closed;
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   187
     transactions during undo are disabled
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   188
    "
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   189
    |actions n|
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   190
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   191
    transaction := nil.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   192
    n := nTransactions min:(history size).
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   193
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   194
    n ~~ 0 ifTrue:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   195
        enabled := false.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   196
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   197
        n timesRepeat:[
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   198
            actions := (history removeLast) last.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   199
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   200
            actions reverseDo:[:aUndoBlock|
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   201
                aUndoBlock value
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   202
            ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   203
        ].
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   204
        enabled := true.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   205
        self modified.
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   206
    ]
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   207
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   208
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   209
! !
5e4319953a0b *** empty log message ***
ca
parents: 44
diff changeset
   210