ChangesBrowser.st
branchjv
changeset 16570 dc5e958a20dc
parent 16408 bc62fb9a8df6
parent 16478 2c1df7d1c3ae
child 17132 17d361c666c2
--- a/ChangesBrowser.st	Fri May 06 06:55:08 2016 +0200
+++ b/ChangesBrowser.st	Mon May 09 21:47:57 2016 +0200
@@ -23,7 +23,7 @@
 		showingDiffs diffViewBox autoloadAsRequired
 		classesNotToBeAutoloaded encodingIfKnown
 		ignorePublicPrivateCategories changeListSelectionHolder
-		defaultApplicationForVAGEClasses'
+		defaultApplicationForVAGEClasses infoHolder'
 	classVariableNames:'CompressSnapshotInfo NoColoring ShowWarningDialogs
 		DefaultAutoCompare DefaultShowingDiffs LastEnforcedNameSpace
 		KeepEnforcedNameSpace'
@@ -211,34 +211,29 @@
         (
          (MenuItem
             label: 'File'
-            translateLabel: true
             submenu: 
            (Menu
               (
                (MenuItem
                   label: 'Compress'
                   itemValue: doCompress
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Compress for Class'
                   itemValue: doCompressClass
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Compress for Class && Selector'
                   itemValue: doCompressSelector
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
                   label: 'Compare and Compress'
                   itemValue: doCompareAndCompress
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
@@ -249,14 +244,12 @@
                   enabled: hasSingleSelection
                   label: 'Fileout && Delete all Changes for Class'
                   itemValue: doFileoutAndDeleteClassAll
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'CheckIn && Delete all Changes for Class'
                   itemValue: doCheckinAndDeleteClassAll
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
@@ -267,25 +260,21 @@
                   enabled: hasSelection
                   label: 'Save In...'
                   itemValue: doSave
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Save to End In...'
                   itemValue: doSaveRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Save for Class to End In...'
                   itemValue: doSaveClassRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Save all for Class In...'
                   itemValue: doSaveClassAll
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -293,13 +282,11 @@
                (MenuItem
                   label: 'Writeback ClassFile'
                   itemValue: doWriteBack
-                  translateLabel: true
                   isVisible: editingClassSource
                 )
                (MenuItem
                   label: 'Writeback ChangeFile'
                   itemValue: doWriteBack
-                  translateLabel: true
                   isVisible: notEditingClassSource
                 )
                (MenuItem
@@ -308,7 +295,6 @@
                (MenuItem
                   label: 'Update'
                   itemValue: doUpdate
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -316,7 +302,6 @@
                (MenuItem
                   label: 'Exit'
                   itemValue: menuExit
-                  translateLabel: true
                 )
                )
               nil
@@ -325,7 +310,6 @@
           )
          (MenuItem
             label: 'CHANGE'
-            translateLabel: true
             submenu: 
            (Menu
               (
@@ -333,43 +317,36 @@
                   enabled: hasSelection
                   label: 'Apply'
                   itemValue: doApply
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Apply to End'
                   itemValue: doApplyRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Apply from Begin'
                   itemValue: doApplyFromBeginning
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Apply for Class to End'
                   itemValue: doApplyClassRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Apply for Class from Begin'
                   itemValue: doApplyClassFromBeginning
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasNoSelection
                   label: 'Apply All'
                   itemValue: doApplyAll
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Apply to Conflict or End'
                   itemValue: doApplyToConflictOrEnd
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -378,64 +355,54 @@
                   enabled: hasSelection
                   label: 'Delete'
                   itemValue: doDelete
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Delete to End'
                   itemValue: doDeleteRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Delete from Begin'
                   itemValue: doDeleteFromBeginning
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Delete for Class to End'
                   itemValue: doDeleteClassRest
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSingleSelection
                   label: 'Delete for Class from Begin'
                   itemValue: doDeleteClassFromBeginning
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all for Class'
                   itemValue: doDeleteClassAll
-                  translateLabel: true
                   isVisible: hasNoMultiSelection
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all for Class && its Private Classes'
                   itemValue: doDeleteClassAndPrivateClassesAll
-                  translateLabel: true
                   isVisible: hasNoMultiSelection
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all for Namespace'
                   itemValue: doDeleteAllForNamespace
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all for Classes'
                   itemValue: doDeleteClassAll
-                  translateLabel: true
                   isVisible: hasMultiSelection
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all for Classes && their Private Classes'
                   itemValue: doDeleteClassAndPrivateClassesAll
-                  translateLabel: true
                   isVisible: hasMultiSelection
                 )
                (MenuItem
@@ -443,16 +410,26 @@
                 )
                (MenuItem
                   enabled: hasSelection
+                  label: 'Delete older Versions of Selected Method'
+                  itemValue: doDeleteClassSelectorOlder
+                  isVisible: hasNoMultiSelectionHolder
+                )
+               (MenuItem
+                  enabled: hasSelection
+                  label: 'Delete older Versions of all Selected Methods'
+                  itemValue: doDeleteClassSelectorOlder
+                  isVisible: hasMultiSelectionHolder
+                )
+               (MenuItem
+                  enabled: hasSelection
                   label: 'Delete all Versions of Selected Method'
                   itemValue: doDeleteClassSelectorAll
-                  translateLabel: true
                   isVisible: hasNoMultiSelectionHolder
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Delete all Versions of all Selected Methods'
                   itemValue: doDeleteClassSelectorAll
-                  translateLabel: true
                   isVisible: hasMultiSelectionHolder
                 )
                (MenuItem
@@ -462,7 +439,6 @@
                   enabled: hasSingleSelection
                   label: 'Compare with Current'
                   itemValue: doCompare
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -471,7 +447,6 @@
                   enabled: hasSelection
                   label: 'Make Change a Patch'
                   itemValue: doMakePatch
-                  translateLabel: true
                 )
                )
               nil
@@ -480,38 +455,32 @@
           )
          (MenuItem
             label: 'Search'
-            translateLabel: true
             submenu: 
            (Menu
               (
                (MenuItem
                   label: 'Class...'
                   itemValue: findClass
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'First for Class'
                   itemValue: findFirstForClass
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Previous for Class'
                   itemValue: findPreviousForClass
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Next for Class'
                   itemValue: findNextForClass
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Last for Class'
                   itemValue: findLastForClass
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -519,19 +488,16 @@
                (MenuItem
                   label: 'Selector...'
                   itemValue: findSelector
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Previous for Selector'
                   itemValue: findPreviousForSelector
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Next for Selector'
                   itemValue: findNextForSelector
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -539,19 +505,16 @@
                (MenuItem
                   label: 'String...'
                   itemValue: findString
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Previous with String'
                   itemValue: findPreviousForString
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Next with String'
                   itemValue: findNextForString
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -560,13 +523,11 @@
                   enabled: hasSelection
                   label: 'Previous Difference'
                   itemValue: findPreviousDifference
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Next Difference'
                   itemValue: findNextDifference
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -575,18 +536,15 @@
                   enabled: hasSelection
                   label: 'Previous Snapshot'
                   itemValue: findPreviousSnapshot
-                  translateLabel: true
                 )
                (MenuItem
                   enabled: hasSelection
                   label: 'Next Snapshot'
                   itemValue: findNextSnapshot
-                  translateLabel: true
                 )
                (MenuItem
                   label: 'Last Snapshot'
                   itemValue: findLastSnapshot
-                  translateLabel: true
                 )
                )
               nil
@@ -595,7 +553,6 @@
           )
          (MenuItem
             label: 'Browse'
-            translateLabel: true
             submenu: 
            (Menu
               (
@@ -603,7 +560,6 @@
                   enabled: hasSingleSelection
                   label: 'Class'
                   itemValue: doBrowse
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -611,12 +567,10 @@
                (MenuItem
                   label: 'Senders...'
                   itemValue: doBrowseSenders
-                  translateLabel: true
                 )
                (MenuItem
                   label: 'Implementors...'
                   itemValue: doBrowseImplementors
-                  translateLabel: true
                 )
                )
               nil
@@ -625,28 +579,23 @@
           )
          (MenuItem
             label: 'Settings'
-            translateLabel: true
             submenu: 
            (Menu
               (
                (MenuItem
                   label: 'Auto Compare'
-                  translateLabel: true
                   indication: autoCompare
                 )
                (MenuItem
                   label: 'Autoload As Required'
-                  translateLabel: true
                   indication: autoloadAsRequired
                 )
                (MenuItem
                   label: 'Show Diffs'
-                  translateLabel: true
                   indication: showingDiffs
                 )
                (MenuItem
                   label: 'Auto Update'
-                  translateLabel: true
                   indication: autoUpdate
                 )
                (MenuItem
@@ -654,14 +603,13 @@
                 )
                (MenuItem
                   label: 'Add to ChangeSet when Applying'
-                  translateLabel: true
                   indication: updateChangeSet
                 )
                (MenuItem
-                  label: 'Ignore public/private categories (Dolphin code)'
+                  label: 'Ignore Public/Private in Categories (Dolphin code)'
                   itemValue: ignorePublicPrivateCategories:
-                  translateLabel: true
                   indication: ignorePublicPrivateCategories
+                  isVisible: false
                 )
                (MenuItem
                   label: '-'
@@ -669,12 +617,10 @@
                (MenuItem
                   label: 'Apply into Package...'
                   itemValue: setEnforcedPackage
-                  translateLabel: true
                 )
                (MenuItem
                   label: 'Apply into NameSpace...'
                   itemValue: setEnforcedNameSpace
-                  translateLabel: true
                 )
                (MenuItem
                   label: '-'
@@ -682,7 +628,6 @@
                (MenuItem
                   label: 'Settings...'
                   itemValue: openSettingsDialog
-                  translateLabel: true
                 )
                )
               nil
@@ -691,7 +636,6 @@
           )
          (MenuItem
             label: 'MENU_Help'
-            translateLabel: true
             startGroup: conditionalRight
             submenu: 
            (Menu
@@ -699,7 +643,6 @@
                (MenuItem
                   label: 'ChangesBrowser Documentation'
                   itemValue: openHTMLDocument:
-                  translateLabel: true
                   argument: 'tools/cbrowser/TOP.html'
                 )
                (MenuItem
@@ -708,7 +651,6 @@
                (MenuItem
                   label: 'About ChangesBrowser...'
                   itemValue: openAboutThisApplication
-                  translateLabel: true
                 )
                )
               nil
@@ -719,8 +661,6 @@
         nil
         nil
       )
-
-    "Modified: / 25-12-2011 / 11:21:56 / cg"
 !
 
 toolbarMenuSpec
@@ -1415,7 +1355,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 +1419,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 +1546,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 +2020,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 +2092,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 +2117,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 +2161,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"
@@ -2328,6 +2291,54 @@
     "Modified: / 28.1.1998 / 20:42:14 / cg"
 !
 
+doDeleteClassSelectorOlder
+    "delete older changes with same class and selector as currently selected change(s)"
+
+    |classNameSelectorPairsToDelete upToPerClassAndSelector lastChangeNr overAllNumDeletedBefore|
+
+    lastChangeNr := -1.
+    classNameSelectorPairsToDelete := Set new.
+    upToPerClassAndSelector := Dictionary new.
+    
+    "/ collect what is to be deleted
+    self withSelectedChangesDo:[:changeNr |
+        |className selector|
+
+        className := self classNameOfChange:changeNr.
+        selector := self selectorOfMethodChange:changeNr.
+        selector notNil ifTrue:[
+            (className notNil and:[selector notNil]) ifTrue:[
+                classNameSelectorPairsToDelete add:(className -> selector).
+                upToPerClassAndSelector at:(className -> selector) put:changeNr.
+            ]
+        ].
+        lastChangeNr := lastChangeNr max:changeNr.
+    ].
+        
+    overAllNumDeletedBefore := 0.
+    changeListView setSelection:nil.
+
+    self withExecuteCursorDo:[
+        classNameSelectorPairsToDelete do:[:pair |
+            |numDeletedBefore className selector lastToDelete|
+
+            className := pair key.
+            selector  := pair value.
+            lastToDelete := (upToPerClassAndSelector at:pair) - 1.
+            
+            numDeletedBefore := self
+                                   silentDeleteChangesFor:className selector:selector
+                                   from:1
+                                   to:lastToDelete.
+            lastChangeNr := lastChangeNr - numDeletedBefore.
+            overAllNumDeletedBefore := overAllNumDeletedBefore + numDeletedBefore.
+        ].
+    ].
+
+    self setChangeList.
+    self autoSelectOrEnd:lastChangeNr
+!
+
 doDeleteFromBeginning
     "delete all changes from 1 to the current"
 
@@ -3503,15 +3514,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 +3546,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 +4116,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 +4315,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 +5839,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 +6020,151 @@
     self halt:'should not be here'
 
     "Created: / 03-01-2012 / 15:26:36 / cg"
+!
+
+updateInfoAfterChangedSelection
+    "update the info label"
+
+    |selection lineNr className nonMetaClassName metaClassName
+     nClassChanges nMethodChanges uniqueSelectors
+     lastLineNr firstLineNr countBeforeCurrent 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.
+    className isNil ifTrue:[
+        infoHolder value:nil.
+        ^ self
+    ].
+    
+    nonMetaClassName := (className endsWith:' class')
+                            ifTrue:[ className copyButLast:' class' size ]
+                            ifFalse:[ className ].
+    metaClassName := nonMetaClassName,' class'.
+                            
+    nClassChanges := nMethodChanges := 0.
+    uniqueSelectors := Set new.
+    lastLineNr := firstLineNr := nil.
+    countAfterLast := 0.
+    countBeforeCurrent := 0.
+    
+    "/ count them all
+    1 to:changeInfoList size do:[:i |
+        |sel nameOfChange|
+        
+        nameOfChange := self realClassNameOfChange:i.
+        ((nameOfChange = nonMetaClassName) or:[nameOfChange = metaClassName]) ifTrue:[
+            lastLineNr := i.
+            firstLineNr := firstLineNr ? i.
+            i > lineNr 
+                ifTrue:[ countAfterLast := countAfterLast + 1 ]
+                ifFalse:[
+                    i < lineNr ifTrue:[
+                        countBeforeCurrent := countBeforeCurrent + 1
+                    ]
+                ].    
+            nClassChanges := nClassChanges + 1.
+            (sel := self selectorOfMethodChange:i) notNil ifTrue:[
+                uniqueSelectors add:sel.
+                nMethodChanges := nMethodChanges + 1.
+            ].
+        ].    
+    ].
+    lastLineNr == lineNr ifTrue:[
+        firstLineNr == lineNr ifTrue:[
+            moreInfo := resources string:'. This is the only one for this class '.
+        ] ifFalse:[    
+            moreInfo := resources string:'. This is the last for this class '.
+        ]
+    ] ifFalse:[
+        firstLineNr == lineNr ifTrue:[
+            moreInfo := resources string:'. This is the first for this class'.
+        ].    
+        countAfterLast > 0 ifTrue:[
+            moreInfo := (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'!