Skip to content

Commit

Permalink
Merge 9da987e
Browse files Browse the repository at this point in the history
  • Loading branch information
syrel committed Mar 27, 2024
2 parents 3277bab + 9da987e commit 31b20e4
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 8 deletions.
183 changes: 183 additions & 0 deletions src/GToolkit-Coder/GtRefactoryChangeManager.class.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
Class {
#name : #GtRefactoryChangeManager,
#superclass : #Object,
#traits : 'TGtAnnouncer',
#classTraits : 'TGtAnnouncer classTrait',
#instVars : [
'undo',
'redo',
'isPerformingChanges',
'announcer'
],
#classVars : [
'Instance',
'UndoSize'
],
#category : #'GToolkit-Coder-Refactoring'
}

{ #category : #'class initialization' }
GtRefactoryChangeManager class >> initialize [
self nuke.
UndoSize := 200
]

{ #category : #accessing }
GtRefactoryChangeManager class >> instance [
^ Instance ifNil: [ Instance := self new ]
]

{ #category : #'class initialization' }
GtRefactoryChangeManager class >> nuke [
Instance notNil ifTrue: [ Instance release ].
Instance := nil
]

{ #category : #accessing }
GtRefactoryChangeManager class >> undoSize [
^ UndoSize
]

{ #category : #accessing }
GtRefactoryChangeManager class >> undoSize: anInteger [
UndoSize := anInteger max: 0.
Instance
ifNotNil: [ Instance checkUndoStackLimit ifTrue: [ Instance announceUndoChanged ] ]
]

{ #category : #accessing }
GtRefactoryChangeManager class >> unload [
self nuke
]

{ #category : #'undo/redo' }
GtRefactoryChangeManager >> addUndo: aChange [
undo addLast: aChange.
self checkUndoStackLimit.
redo removeAll.
self announceUndoChanged
]

{ #category : #executing }
GtRefactoryChangeManager >> announceUndoChanged [
self
announce: (GtRefactoryChangeManagerUndoChangedEvent new
changeManager: self;
yourself)
]

{ #category : #announcer }
GtRefactoryChangeManager >> announcer [
^ announcer ifNil: [ announcer := Announcer new ]
]

{ #category : #accessing }
GtRefactoryChangeManager >> changeFactory [
^ RBRefactoryChangeFactory new
]

{ #category : #'undo/redo' }
GtRefactoryChangeManager >> checkUndoStackLimit [
| previousSize |
previousSize := undo size.
[ undo size > UndoSize ] whileTrue: [ undo removeFirst ].
^ previousSize ~= undo size
]

{ #category : #private }
GtRefactoryChangeManager >> clearUndoRedoList [
(undo isEmpty and: [ redo isEmpty ]) ifTrue: [ ^ self ].
undo removeAll.
redo removeAll.
self announceUndoChanged
]

{ #category : #private }
GtRefactoryChangeManager >> connectToChanges [
SystemAnnouncer uniqueInstance weak
when: ClassAdded , ClassModifiedClassDefinition , ClassRemoved , ClassRenamed
, MethodAdded , MethodModified , MethodRemoved
send: #update:
to: self
]

{ #category : #private }
GtRefactoryChangeManager >> disconnectFromChanges [
SystemAnnouncer uniqueInstance unsubscribe: self
]

{ #category : #accessing }
GtRefactoryChangeManager >> gtRedoFor: aView [
<gtView>
redo isEmpty ifTrue: [ ^ aView empty ].
^ aView list
title: 'Redo';
priority: 15;
items: [ redo reversed ];
itemText: #gtDescription
]

{ #category : #accessing }
GtRefactoryChangeManager >> gtUndoFor: aView [
<gtView>
^ aView list
title: 'Undo';
priority: 10;
items: [ undo reversed ];
itemText: #gtDescription
]

{ #category : #testing }
GtRefactoryChangeManager >> hasRedoableOperations [
^ redo notEmpty
]

{ #category : #testing }
GtRefactoryChangeManager >> hasUndoableOperations [
^ undo notEmpty
]

{ #category : #executing }
GtRefactoryChangeManager >> ignoreChangesWhile: aBlock [
isPerformingChanges ifTrue: [ ^ aBlock value ].
isPerformingChanges := true.
aBlock ensure: [ isPerformingChanges := false ]
]

{ #category : #initialization }
GtRefactoryChangeManager >> initialize [
super initialize.
undo := OrderedCollection new.
redo := OrderedCollection new.
isPerformingChanges := false
]

{ #category : #executing }
GtRefactoryChangeManager >> performChange: aRefactoringChange [
self ignoreChangesWhile: [ self addUndo: aRefactoringChange execute ]
]

{ #category : #executing }
GtRefactoryChangeManager >> redoChange [
redo isEmpty ifTrue: [ ^ self ].
self ignoreChangesWhile: [ undo add: redo removeLast execute ].
self announceUndoChanged
]

{ #category : #initialization }
GtRefactoryChangeManager >> release [
self disconnectFromChanges.
super release
]

{ #category : #executing }
GtRefactoryChangeManager >> undoChange [
undo isEmpty ifTrue: [ ^ self ].
self ignoreChangesWhile: [ redo add: undo removeLast execute ].
self announceUndoChanged
]

{ #category : #private }
GtRefactoryChangeManager >> update: anEvent [
isPerformingChanges ifFalse: [ self clearUndoRedoList ]
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Class {
#name : #GtRefactoryChangeManagerUndoChangedEvent,
#superclass : #Announcement,
#instVars : [
'changeManager'
],
#category : #'GToolkit-Coder-Refactoring'
}

{ #category : #accessing }
GtRefactoryChangeManagerUndoChangedEvent >> changeManager [
^ changeManager
]

{ #category : #accessing }
GtRefactoryChangeManagerUndoChangedEvent >> changeManager: anObject [
changeManager := anObject
]
8 changes: 0 additions & 8 deletions src/GToolkit-Coder/RBRefactoring.extension.st
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,6 @@ RBRefactoring >> gtDangers [
description: (eachCondition errorMacro expandMacrosWith: false) ]
]

{ #category : #'*GToolkit-Coder' }
RBRefactoring >> gtExecute: isForce [
isForce
ifTrue: [ self transform ]
ifFalse: [ self primitiveExecute ].
RBRefactoryChangeManager instance performChange: self changes; addUndoPointer: 1
]

{ #category : #'*GToolkit-Coder' }
RBRefactoring >> gtPreconditions [
^ self preconditions
Expand Down

0 comments on commit 31b20e4

Please sign in to comment.