#UI_ENHANCEMENT by cg
class: ChangesBrowser
usability: info line
added:
#showNumberOfChanges
#updateInfoAfterChangedSelection
#updateSourceCodeAfterChangedSelection
comment/format in:5 methods
changed:6 methods
--- a/ChangesBrowser.st Fri May 06 14:42:33 2016 +0200
+++ b/ChangesBrowser.st Fri May 06 15:02:17 2016 +0200
@@ -23,7 +23,7 @@
showingDiffs diffViewBox autoloadAsRequired
classesNotToBeAutoloaded encodingIfKnown
ignorePublicPrivateCategories changeListSelectionHolder
- defaultApplicationForVAGEClasses'
+ defaultApplicationForVAGEClasses infoHolder'
classVariableNames:'CompressSnapshotInfo NoColoring ShowWarningDialogs
DefaultAutoCompare DefaultShowingDiffs LastEnforcedNameSpace
KeepEnforcedNameSpace'
@@ -1415,7 +1415,7 @@
!
initialize
- |panel v upperFrame buttonPanel menuPanel mH toolbarMenu tmH
+ |panel infoLabel v upperFrame buttonPanel menuPanel mH toolbarMenu tmH
checkBox oldStyle codeViewBox lbl applyInOriginal|
"/ oldStyle := true.
@@ -1479,11 +1479,27 @@
mH := 0.0
].
- panel := VariableVerticalPanel origin:(0.0 @ mH)
- corner:(1.0 @ 1.0)
- borderWidth:0
- in:self.
-
+ panel := VariableVerticalPanel in:self.
+ "/ panel origin:(0.0 @ mH) corner:(1.0 @ 1.0)
+ panel layout:(LayoutFrame
+ leftFraction:0.0 offset:0
+ rightFraction:1.0 offset:0
+ topFraction:0.0 offset:mH
+ bottomFraction:1.0 offset:-30).
+ panel borderWidth:0.
+
+ infoLabel := Label in:self.
+ infoLabel layout:(LayoutFrame
+ leftFraction:0.0 offset:0
+ rightFraction:1.0 offset:0
+ topFraction:1.0 offset:-28
+ bottomFraction:1.0 offset:-2).
+ infoLabel borderWidth:0.
+ infoLabel sizeFixed:true.
+ infoLabel level:-1.
+ infoLabel adjust:#left.
+ infoLabel labelChannel:(infoHolder := '' asValue).
+
upperFrame := panel.
oldStyle ifTrue:[
upperFrame := VariableHorizontalPanel origin:(0.0 @ 0.0) corner:(1.0 @ 0.3) in:panel.
@@ -1590,7 +1606,7 @@
self setupTabSpec.
self readChangesFileInBackground:true.
self setChangeList.
- changeListView action:[:lineNr | self changeSelection:lineNr].
+ changeListView action:[:lineNrOrCollection | self changeSelection:lineNrOrCollection].
Processor addTimedBlock:checkBlock afterSeconds:5.
"Created: 24.7.1997 / 18:06:12 / cg"
@@ -2064,35 +2080,37 @@
|rangeEnd rangeStart firstDeleted|
changeListView selection size <= 5 ifTrue:[
- self withSelectedChangesReverseDo:[:changeNr |
- self deleteChange:changeNr.
- self autoSelectOrEnd:changeNr
- ].
- ^ self
+ self withSelectedChangesReverseDo:[:changeNr |
+ self deleteChange:changeNr.
+ self autoSelectOrEnd:changeNr
+ ].
+ self showNumberOfChanges.
+ ^ self
].
self withSelectedChangesReverseDo:[:changeNr |
- rangeEnd isNil ifTrue:[
- rangeEnd := rangeStart := changeNr
- ] ifFalse:[
- (changeNr = (rangeEnd + 1)) ifTrue:[
- rangeEnd := changeNr
- ] ifFalse:[
- (changeNr = (rangeStart - 1)) ifTrue:[
- rangeStart := changeNr
- ] ifFalse:[
- self deleteChangesFrom:rangeStart to:rangeEnd.
- firstDeleted := (firstDeleted ? rangeStart) min:rangeStart.
- rangeStart := rangeEnd := nil.
- ].
- ].
- ].
+ rangeEnd isNil ifTrue:[
+ rangeEnd := rangeStart := changeNr
+ ] ifFalse:[
+ (changeNr = (rangeEnd + 1)) ifTrue:[
+ rangeEnd := changeNr
+ ] ifFalse:[
+ (changeNr = (rangeStart - 1)) ifTrue:[
+ rangeStart := changeNr
+ ] ifFalse:[
+ self deleteChangesFrom:rangeStart to:rangeEnd.
+ firstDeleted := (firstDeleted ? rangeStart) min:rangeStart.
+ rangeStart := rangeEnd := nil.
+ ].
+ ].
+ ].
].
rangeStart notNil ifTrue:[
- self deleteChangesFrom:rangeStart to:rangeEnd.
- firstDeleted := (firstDeleted ? rangeStart) min:rangeStart.
- ].
- self autoSelectOrEnd:firstDeleted
+ self deleteChangesFrom:rangeStart to:rangeEnd.
+ firstDeleted := (firstDeleted ? rangeStart) min:rangeStart.
+ ].
+ self autoSelectOrEnd:firstDeleted.
+ self showNumberOfChanges
!
doDeleteAllForNamespace
@@ -2134,16 +2152,21 @@
].
self setChangeList.
- self autoSelectOrEnd:lastChangeNr
+ self autoSelectOrEnd:lastChangeNr.
!
doDeleteAndSelectPrevious
"delete currently selected change(s)"
self withSelectedChangesReverseDo:[:changeNr |
- self deleteChange:changeNr.
- self autoSelectOrEnd:changeNr-1
- ]
+ self deleteChange:changeNr.
+ self autoSelectOrEnd:changeNr-1
+ ].
+
+ "/mh - don't we need a
+ "/ self setChangeList
+ "/ here?
+ self showNumberOfChanges
!
doDeleteClassAll
@@ -2154,36 +2177,36 @@
lastChangeNr := -1.
classNamesToDelete := Set new.
self withSelectedChangesDo:[:changeNr |
- |classNameToDelete|
-
- classNameToDelete := self classNameOfChange:changeNr.
- classNameToDelete notNil ifTrue:[
- classNamesToDelete add:classNameToDelete.
- ].
- lastChangeNr := lastChangeNr max:changeNr.
+ |classNameToDelete|
+
+ classNameToDelete := self classNameOfChange:changeNr.
+ classNameToDelete notNil ifTrue:[
+ classNamesToDelete add:classNameToDelete.
+ ].
+ lastChangeNr := lastChangeNr max:changeNr.
].
overAllNumDeletedBefore := 0.
changeListView setSelection:nil.
self withExecuteCursorDo:[
- classNamesToDelete do:[:classNameToDelete |
- |numDeletedBefore|
-
- self silentDeleteChangesFor:classNameToDelete
- from:lastChangeNr
- to:(self numberOfChanges).
- numDeletedBefore := self
- silentDeleteChangesFor:classNameToDelete
- from:1
- to:(lastChangeNr-1).
- lastChangeNr := lastChangeNr - numDeletedBefore.
- overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
- ].
+ classNamesToDelete do:[:classNameToDelete |
+ |numDeletedBefore|
+
+ self silentDeleteChangesFor:classNameToDelete
+ from:lastChangeNr
+ to:(self numberOfChanges).
+ numDeletedBefore := self
+ silentDeleteChangesFor:classNameToDelete
+ from:1
+ to:(lastChangeNr-1).
+ lastChangeNr := lastChangeNr - numDeletedBefore.
+ overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
+ ].
].
self setChangeList.
- self autoSelectOrEnd:lastChangeNr
+ self autoSelectOrEnd:lastChangeNr.
"Created: / 13.12.1995 / 16:07:14 / cg"
"Modified: / 28.1.1998 / 20:42:14 / cg"
@@ -2198,38 +2221,38 @@
lastChangeNr := -1.
classNamesToDelete := Set new.
self withSelectedChangesDo:[:changeNr |
- |classNameToDelete|
-
- classNameToDelete := self ownerClassNameOfChange:changeNr.
- classNameToDelete notNil ifTrue:[
- classNamesToDelete add:classNameToDelete.
- ].
- lastChangeNr := lastChangeNr max:changeNr.
+ |classNameToDelete|
+
+ classNameToDelete := self ownerClassNameOfChange:changeNr.
+ classNameToDelete notNil ifTrue:[
+ classNamesToDelete add:classNameToDelete.
+ ].
+ lastChangeNr := lastChangeNr max:changeNr.
].
overAllNumDeletedBefore := 0.
changeListView setSelection:nil.
self withExecuteCursorDo:[
- classNamesToDelete do:[:classNameToDelete |
- | changeNr numDeletedBefore|
-
- classNameToDelete notNil ifTrue:[
- changeListView setSelection:nil.
- self silentDeleteChangesForClassAndPrivateClasses:classNameToDelete
- from:lastChangeNr
- to:(self numberOfChanges).
- numDeletedBefore := self
- silentDeleteChangesForClassAndPrivateClasses:classNameToDelete
- from:1
- to:(lastChangeNr-1).
- lastChangeNr := lastChangeNr - numDeletedBefore.
- overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
- ]
- ]
+ classNamesToDelete do:[:classNameToDelete |
+ | changeNr numDeletedBefore|
+
+ classNameToDelete notNil ifTrue:[
+ changeListView setSelection:nil.
+ self silentDeleteChangesForClassAndPrivateClasses:classNameToDelete
+ from:lastChangeNr
+ to:(self numberOfChanges).
+ numDeletedBefore := self
+ silentDeleteChangesForClassAndPrivateClasses:classNameToDelete
+ from:1
+ to:(lastChangeNr-1).
+ lastChangeNr := lastChangeNr - numDeletedBefore.
+ overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
+ ]
+ ]
].
self setChangeList.
- self autoSelectOrEnd:lastChangeNr
+ self autoSelectOrEnd:lastChangeNr.
"Created: / 13.12.1995 / 16:07:14 / cg"
"Modified: / 28.1.1998 / 20:42:14 / cg"
@@ -3503,15 +3526,16 @@
!
setChangeList
- "extract type-information from changes and stuff into top selection
- view"
+ "update the selection-list;
+ called after the changeList has been modified"
|headerList|
headerList := changeInfoList collect:[:info | info headerLine].
changeListView setList:headerList expandTabs:false redraw:false.
changeListView invalidate.
-
+ self showNumberOfChanges.
+
"/ changeListView deselect.
"Modified: / 01-05-2016 / 19:27:35 / cg"
@@ -3534,6 +3558,10 @@
"Modified: / 29.4.1999 / 22:36:54 / cg"
!
+showNumberOfChanges
+ infoHolder value:(resources string:'%1 changes.' with:changeInfoList size).
+!
+
sourceOfChange:changeNr
|aStream sawExcla chunk|
@@ -4100,7 +4128,8 @@
!
selectorOfMethodChange:changeNr
- "return a method-changes selector, or nil if it's not a methodChange"
+ "return a method-changes selector,
+ or nil if it's not a methodChange"
|sel |
@@ -4298,17 +4327,13 @@
reader tabSpec:tabSpec.
reader inStream:inStream.
reader noColoring:(NoColoring == true).
+
reader readChangesFile.
editingClassSource := reader thisIsAClassSource.
changeInfoList := reader changeInfo.
-"/ changeChunks := reader changeChunks.
-"/ changeClassNames := reader changeClassNames.
-"/ changeHeaderLines := reader changeHeaderLines.
-"/ changePositions := reader changePositions.
-"/ changeTimeStamps := reader changeTimeStamps.
-"/ changeIsFollowupMethodChange := reader changeIsFollowupMethodChange.
-
+
+ self showNumberOfChanges.
anyChanges := false.
] ensure:[
inStream close.
@@ -5826,14 +5851,21 @@
].
self changeListSelectionHolder value:lineNumbers.
-
+
lineNr isNil ifTrue:[
codeView contents:nil.
codeView initializeDoITAction.
changeNrShown := nil.
+ infoHolder value:nil.
^ self
].
+ changeNrShown := lineNr.
+ self sensor
+ enqueueMessage:#updateSourceCodeAfterChangedSelection for:self arguments:nil;
+ enqueueMessage:#updateInfoAfterChangedSelection for:self arguments:nil.
+^ self.
+
"/ display the changes code
chunk := self sourceOfChange:lineNr.
chunk isNil ifTrue:[
@@ -6000,6 +6032,126 @@
self halt:'should not be here'
"Created: / 03-01-2012 / 15:26:36 / cg"
+!
+
+updateInfoAfterChangedSelection
+ "update the info label"
+
+ |selection lineNr className nClassChanges nMethodChanges uniqueSelectors
+ lastLineNr countAfterLast moreInfo|
+
+ selection := lineNr := changeListView selection.
+ selection isNumber ifFalse:[
+ lineNr := nil.
+ selection notEmptyOrNil ifTrue:[
+ lineNr := selection first
+ ].
+ ].
+
+ lineNr isNil ifTrue:[
+ infoHolder value:nil.
+ ^ self
+ ].
+
+ "/
+ "/ now, this info is computed so fast,
+ "/ we can do it each time the selection changes
+ "/ (can we?)
+ className := self realClassNameOfChange:lineNr.
+
+ nClassChanges := nMethodChanges := 0.
+ uniqueSelectors := Set new.
+ lastLineNr := nil.
+ countAfterLast := 0.
+
+ "/ count them all
+ 1 to:changeInfoList size do:[:i |
+ |sel|
+
+ (self realClassNameOfChange:i) = className ifTrue:[
+ lastLineNr := i.
+ i > lineNr ifTrue:[ countAfterLast := countAfterLast + 1 ].
+
+ nClassChanges := nClassChanges + 1.
+ (sel := self selectorOfMethodChange:i) notNil ifTrue:[
+ uniqueSelectors add:sel.
+ nMethodChanges := nMethodChanges + 1.
+ ].
+ ].
+ ].
+ lastLineNr == lineNr ifTrue:[
+ moreInfo := resources string:'. This is the last for this class.'.
+ ] ifFalse:[
+ countAfterLast > 0 ifTrue:[
+ moreInfo := resources string:'. %1 more for this class.' with:countAfterLast.
+ ].
+ ].
+
+ infoHolder value:(resources
+ string:'%1 changes. %2 for %3 (%4 methods / %5 selectors)%6'
+ with:(changeInfoList size)
+ with:nClassChanges
+ with:className
+ with:nMethodChanges
+ with:uniqueSelectors size
+ with:moreInfo).
+!
+
+updateSourceCodeAfterChangedSelection
+ "show a change in the codeView"
+
+ |selection lineNr chunk|
+
+ selection := lineNr := changeListView selection.
+ selection isNumber ifFalse:[
+ lineNr := nil.
+ selection notEmptyOrNil ifTrue:[
+ lineNr := selection first
+ ].
+ ].
+
+ lineNr isNil ifTrue:[
+ ^ self
+ ].
+
+ "/ display the changes code
+ chunk := self sourceOfChange:lineNr.
+ chunk isNil ifTrue:[
+ codeView initializeDoITAction.
+ ^ self
+ ].
+
+ codeView contents:chunk.
+ codeView acceptAction:[:theCode | self doApply "noChangesAllowed"].
+ codeView doItAction:[:theCode |
+ |clsName cls|
+
+ clsName := self classNameOfChange:lineNr.
+ clsName notNil ifTrue:[
+ clsName := clsName asSymbolIfInterned.
+ clsName notNil ifTrue:[
+ cls := Smalltalk at:clsName ifAbsent:nil.
+ ]
+ ].
+ Compiler
+ evaluate:theCode
+ in:nil
+ receiver:cls
+ notifying:self
+ logged:true
+ ifFail:nil
+ ].
+
+
+ changeNrShown := lineNr.
+
+ self showingDiffs value ifTrue:[
+ self withWaitCursorDo:[
+ AbortOperationRequest catch:[
+ self updateDiffViewFor:changeNrShown.
+ ]
+ ]
+ ].
! !
!ChangesBrowser::ChangeFileReader methodsFor:'accessing'!