#UI_ENHANCEMENT by cg
authorClaus Gittinger <cg@exept.de>
Fri, 06 May 2016 15:02:17 +0200
changeset 16467 c4582914a4be
parent 16466 59b8495a1650
child 16468 3df3e4d3ea9d
#UI_ENHANCEMENT by cg class: ChangesBrowser usability: info line added: #showNumberOfChanges #updateInfoAfterChangedSelection #updateSourceCodeAfterChangedSelection comment/format in:5 methods changed:6 methods
ChangesBrowser.st
--- 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'!