Merge jv
authorMerge Script
Tue, 17 May 2016 07:04:09 +0200
branchjv
changeset 16617 69e7de1ef22f
parent 16599 c8ee873681f8 (current diff)
parent 16616 b37a3fa57866 (diff)
child 16624 2315cabbf137
Merge
DebugView.st
FindFileApplication.st
InspectorView.st
ProcessMonitorV2.st
SystemBrowser.st
Tools__BreakpointService.st
Tools__CodeView2.st
Tools__CodeViewService.st
Tools__LintAnnotation.st
Tools__LintHighlighter.st
Tools__LintService.st
Tools__NewSystemBrowser.st
Tools__TextDiff3Tool.st
VersionDiffBrowser.st
ViewWithAcceptAndCancelBar.st
resources/de.rs
--- a/DebugView.st	Mon May 16 06:49:42 2016 +0200
+++ b/DebugView.st	Tue May 17 07:04:09 2016 +0200
@@ -1849,16 +1849,37 @@
                                     model:ignoreForEverHolder).
                 ].    
             ] do:[
-                |answer|
-
-                answer := Dialog 
-                            confirm:(self resources 
+                |answer canRemove labels actions|
+
+                "/ cannot remove halts or coded breakpoints.
+                canRemove := haltingMethod isMethodWithBreakpoints or:[ haltingMethod isBreakpointed ].
+                labels := #('Ignore' 'Remove Breakpoint' 'Debug' ).
+                actions := #(ignore remove debug).
+                canRemove ifFalse:[
+                    labels := #('Ignore' 'Debug' ).
+                    actions := #(ignore debug).
+                ].    
+
+                answer := OptionBox
+                            choose:(self resources 
                                         stringWithCRs:'%1\%2\\%3'
                                         with:whatError
                                         with:descr
                                         with:where)
-                            yesLabel:(resources string:'Debug')
-                            noLabel:(resources string:'Ignore').
+                            label:whatError 
+                            image:nil 
+                            labels:(resources array:labels)
+                            values:actions 
+                            default:#ignore 
+                            onCancel:#ignore.
+"/                answer := Dialog
+"/                            confirm:(self resources 
+"/                                        stringWithCRs:'%1\%2\\%3'
+"/                                        with:whatError
+"/                                        with:descr
+"/                                        with:where)
+"/                            yesLabel:(resources string:'Debug')
+"/                            noLabel:(resources string:'Ignore').
                 
                 (ignoreForSomeTimeHolder value or:[ignoreForEverHolder value]) ifTrue:[
                     self
@@ -1870,7 +1891,16 @@
                         orIfCalledFromMethod:nil.
                 ].
 
-                answer ifTrue:[
+                answer == #remove ifTrue:[
+                    haltingMethod isMethodWithBreakpoints ifTrue:[
+                        haltingMethod disableBreakpointInLine:lineNrOfHalt
+                    ] ifFalse:[
+                        haltingMethod isBreakpointed ifTrue:[
+                            haltingMethod clearBreakPoint
+                        ].    
+                    ].    
+                ].
+                answer ~~ #debug ifTrue:[
                     ex reject.
                 ]
             ]
--- a/FindFileApplication.st	Mon May 16 06:49:42 2016 +0200
+++ b/FindFileApplication.st	Tue May 17 07:04:09 2016 +0200
@@ -842,7 +842,7 @@
         Dialog warn:(resources string:'Missing directory name').
         ^ self.
     ].
-    dir includesMatchCharacters ifTrue:[
+    dir asString includesMatchCharacters ifTrue:[
         dirs := Filename filesMatchingGLOB:dir.
         dirs isEmpty ifTrue:[
             Dialog warn:(resources string:'No matching directory: ''%1''' with:dir allBold).
--- a/InspectorView.st	Mon May 16 06:49:42 2016 +0200
+++ b/InspectorView.st	Tue May 17 07:04:09 2016 +0200
@@ -2692,7 +2692,7 @@
 setSortOrderTo:aSymbol
     "aSymbol must be one of #alphabetical or #instvarOrder"
     
-    self assert:((aSymbol == SortOrderAlphabetical) | (aSymbol == SortOrderInstvarOrder)).
+    self assert:((aSymbol == SortOrderAlphabetical) or:[ aSymbol == SortOrderInstvarOrder ]).
     sortOrderHolder value:aSymbol.
 !
 
--- a/ProcessMonitorV2.st	Mon May 16 06:49:42 2016 +0200
+++ b/ProcessMonitorV2.st	Tue May 17 07:04:09 2016 +0200
@@ -18,19 +18,22 @@
 		hasSelectionHolder showProcessId showGroup showState showPrio
 		showUsedStack showTotalStack showCurrentSegment showSwitch
 		showWhere showInstrumentation showApplication showWindowTitle
-		currentSortOrder processTable showDead sortBlock
-		selectionRestartable updateListDelayTime updateContentsDelayTime
-		enableDecreaseListDelayTime enableDecreaseContentsDelayTime
-		enableIncreaseListDelayTime enableIncreaseContentsDelayTime
-		listUpdateDelay updateDelay updateBlock listUpdateBlock
-		updateProcess visibleBlock allowModifications tableMenu
+		currentSortOrder processTable showDeadHolder sortBlock
+		selectionRestartable updateListDelayTimeHolder
+		updateContentsDelayTimeHolder enableDecreaseListDelayTime
+		enableDecreaseContentsDelayTime enableIncreaseListDelayTime
+		enableIncreaseContentsDelayTime listUpdateDelay updateDelay
+		updateBlock listUpdateBlock updateProcess visibleBlock
+		allowModifications tableMenu
 		hasSelectionWithApplicationProcessHolder
 		hasSelectionAndProcessIsApplicationProcessHolder
 		hasSelectionWithStoppedProcessHolder
 		hasSelectionAndProcessIsStoppedHolder
 		hasSelectionWithGUIProcessHolder
 		hasSelectionWithDisabledInstrumentationHolder
-		hasSelectionWithEnabledInstrumentationHolder'
+		hasSelectionWithEnabledInstrumentationHolder interruptCountHolder
+		timerActionCountHolder lastInterruptCount lastTimerActionCount
+		lastUpdateTimestamp'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Monitors-ST/X'
@@ -240,6 +243,19 @@
 
 processCurrentSegment
 'The address range of the current stack segment'
+
+#interruptCount
+'Interrupts per second'
+
+#listUpdateInterval
+'Interval to update the list of processes'
+
+#timerActionCount
+'Timer actions per second'
+
+#updateInterval
+'Interval to update the status of processes'
+
 )
 
     "Modified: / 05-06-2007 / 18:35:47 / cg"
@@ -945,141 +961,181 @@
 
     <resource: #canvas>
 
-    ^
-     #(FullSpec
-	name: windowSpec
-	window:
-       (WindowSpec
-	  label: 'ProcessMonitor'
-	  name: 'ProcessMonitor'
-	  min: (Point 10 10)
-	  bounds: (Rectangle 0 0 791 358)
-	  menu: mainMenu
-	  icon: defaultIcon
-	)
-	component:
-       (SpecCollection
-	  collection: (
-	   (MenuPanelSpec
-	      name: 'ToolBar1'
-	      layout: (LayoutFrame 0 0.0 0 0 0 1.0 32 0)
-	      menu: toolBarMainMenu
-	      textDefault: true
-	    )
-	   (DataSetSpec
-	      name: 'ProcessTable'
-	      layout: (LayoutFrame 0 0.0 32 0.0 0 1.0 -23 1)
-	      model: selectedProcesses
-	      menu: tableMenu
-	      hasHorizontalScrollBar: true
-	      hasVerticalScrollBar: true
-	      dataList: processList
-	      useIndex: false
-	      doubleClickSelector: doubleClickedAt:
-	      columnHolder: tableColumns
-	      multipleSelectOk: true
-	      verticalSpacing: 0
-	      postBuildCallback: postBuildProcessTable:
-	    )
-	   (LabelSpec
-	      label: 'Update Contents Delay (s):'
-	      name: 'ContentsUpdateLabel'
-	      layout: (LayoutFrame -593 1 -20 1 -402 1 0 1)
-	      translateLabel: true
-	      adjust: right
-	    )
-	   (ViewSpec
-	      name: 'Box1'
-	      layout: (LayoutFrame -396 1 -22 1 -306 1 0 1)
-	      level: 0
-	      component:
-	     (SpecCollection
-		collection: (
-		 (ArrowButtonSpec
-		    name: 'ArrowButton3'
-		    layout: (LayoutFrame 68 0 0 0 89 0 20 0)
-		    model: increaseupdateContentsDelayTime
-		    enableChannel: enableIncreaseContentsDelayTime
-		    isTriggerOnDown: true
-		    autoRepeat: true
-		    actionValue: ''
-		    direction: up
-		  )
-		 (InputFieldSpec
-		    name: 'EntryField2'
-		    layout: (LayoutFrame 22 0 0 0 66 0 20 0)
-		    model: updateContentsDelayTime
-		    acceptOnReturn: true
-		    acceptOnTab: true
-		    acceptOnLostFocus: true
-		    acceptOnPointerLeave: false
-		  )
-		 (ArrowButtonSpec
-		    name: 'ArrowButton4'
-		    layout: (LayoutFrame 0 0 0 0 20 0 20 0)
-		    model: decreaseupdateContentsDelayTime
-		    enableChannel: enableDecreaseContentsDelayTime
-		    isTriggerOnDown: true
-		    autoRepeat: true
-		    actionValue: ''
-		    direction: down
-		  )
-		 )
-
-	      )
-	    )
-	   (LabelSpec
-	      label: 'Update List Delay (s):'
-	      name: 'ListUpdateLabel'
-	      layout: (LayoutFrame -301 1 -20 1 -110 1 0 1)
-	      translateLabel: true
-	      adjust: right
-	    )
-	   (ViewSpec
-	      name: 'Box2'
-	      layout: (LayoutFrame -103 1 -21 1 0 1 1 1)
-	      level: 0
-	      component:
-	     (SpecCollection
-		collection: (
-		 (ArrowButtonSpec
-		    name: 'ArrowButton5'
-		    layout: (LayoutFrame 68 0 0 0 89 0 20 0)
-		    model: increaseupdateListDelayTime
-		    enableChannel: enableIncreaseListDelayTime
-		    isTriggerOnDown: true
-		    autoRepeat: true
-		    actionValue: ''
-		    direction: up
-		  )
-		 (InputFieldSpec
-		    name: 'EntryField3'
-		    layout: (LayoutFrame 22 0 0 0 66 0 20 0)
-		    model: updateListDelayTime
-		    acceptOnReturn: true
-		    acceptOnTab: true
-		    acceptOnLostFocus: true
-		    acceptOnPointerLeave: false
-		  )
-		 (ArrowButtonSpec
-		    name: 'ArrowButton6'
-		    layout: (LayoutFrame 0 0 0 0 20 0 20 0)
-		    model: decreaseupdateListDelayTime
-		    enableChannel: enableDecreaseListDelayTime
-		    isTriggerOnDown: true
-		    autoRepeat: true
-		    actionValue: ''
-		    direction: down
-		  )
-		 )
-
-	      )
-	      keepSpaceForOSXResizeHandleH: true
-	    )
-	   )
-
-	)
-      )
+    ^ 
+    #(FullSpec
+       name: windowSpec
+       window: 
+      (WindowSpec
+         label: 'ProcessMonitor'
+         name: 'ProcessMonitor'
+         min: (Point 10 10)
+         bounds: (Rectangle 0 0 791 358)
+         menu: mainMenu
+         icon: defaultIcon
+       )
+       component: 
+      (SpecCollection
+         collection: (
+          (MenuPanelSpec
+             name: 'ToolBar1'
+             layout: (LayoutFrame 0 0.0 0 0 0 1.0 32 0)
+             menu: toolBarMainMenu
+             textDefault: true
+           )
+          (DataSetSpec
+             name: 'ProcessTable'
+             layout: (LayoutFrame 0 0.0 32 0.0 0 1.0 -25 1)
+             model: selectedProcesses
+             menu: tableMenu
+             hasHorizontalScrollBar: true
+             hasVerticalScrollBar: true
+             dataList: processList
+             useIndex: false
+             doubleClickSelector: doubleClickedAt:
+             columnHolder: tableColumns
+             multipleSelectOk: true
+             verticalSpacing: 0
+             postBuildCallback: postBuildProcessTable:
+           )
+          (LabelSpec
+             label: 'IRQ:'
+             name: 'Label1'
+             layout: (LayoutFrame 0 0 -24 1 50 0 0 1)
+             activeHelpKey: interruptCount
+             translateLabel: true
+             adjust: left
+           )
+          (LabelSpec
+             name: 'Label2'
+             layout: (LayoutFrame 50 0 -24 1 100 0 0 1)
+             activeHelpKey: interruptCount
+             translateLabel: true
+             labelChannel: interruptCountHolder
+             adjust: left
+           )
+          (LabelSpec
+             label: 'TMR:'
+             name: 'Label3'
+             layout: (LayoutFrame 100 0 -24 1 150 0 0 1)
+             activeHelpKey: timerActionCount
+             translateLabel: true
+             adjust: left
+           )
+          (LabelSpec
+             name: 'Label4'
+             layout: (LayoutFrame 150 0 -24 1 200 0 0 1)
+             activeHelpKey: timerActionCount
+             translateLabel: true
+             labelChannel: timerActionCountHolder
+             adjust: left
+           )
+          (LabelSpec
+             label: 'Update Interval (s):'
+             name: 'ContentsUpdateLabel'
+             layout: (LayoutFrame -593 1 -24 1 -402 1 0 1)
+             activeHelpKey: updateInterval
+             translateLabel: true
+             adjust: right
+           )
+          (ViewSpec
+             name: 'Box1'
+             layout: (LayoutFrame -396 1 -24 1 -306 1 0 1)
+             activeHelpKey: updateInterval
+             level: 0
+             component: 
+            (SpecCollection
+               collection: (
+                (ArrowButtonSpec
+                   name: 'ArrowButton3'
+                   layout: (LayoutFrame 68 0 0 0 89 0 20 0)
+                   translateLabel: true
+                   model: increaseupdateContentsDelayTime
+                   enableChannel: enableIncreaseContentsDelayTime
+                   isTriggerOnDown: true
+                   autoRepeat: true
+                   actionValue: ''
+                   direction: up
+                 )
+                (InputFieldSpec
+                   name: 'EntryField2'
+                   layout: (LayoutFrame 22 0 0 0 66 0 22 0)
+                   model: updateContentsDelayTimeHolder
+                   acceptOnReturn: true
+                   acceptOnTab: true
+                   acceptOnLostFocus: true
+                   acceptOnPointerLeave: false
+                 )
+                (ArrowButtonSpec
+                   name: 'ArrowButton4'
+                   layout: (LayoutFrame 0 0 0 0 20 0 20 0)
+                   translateLabel: true
+                   model: decreaseupdateContentsDelayTime
+                   enableChannel: enableDecreaseContentsDelayTime
+                   isTriggerOnDown: true
+                   autoRepeat: true
+                   actionValue: ''
+                   direction: down
+                 )
+                )
+              
+             )
+           )
+          (LabelSpec
+             label: 'Processlist:'
+             name: 'ListUpdateLabel'
+             layout: (LayoutFrame -301 1 -24 1 -110 1 0 1)
+             activeHelpKey: listUpdateInterval
+             translateLabel: true
+             adjust: right
+           )
+          (ViewSpec
+             name: 'Box2'
+             layout: (LayoutFrame -103 1 -24 1 -16 1 0 1)
+             activeHelpKey: listUpdateInterval
+             level: 0
+             component: 
+            (SpecCollection
+               collection: (
+                (ArrowButtonSpec
+                   name: 'ArrowButton5'
+                   layout: (LayoutFrame 68 0 0 0 89 0 20 0)
+                   translateLabel: true
+                   model: increaseupdateListDelayTime
+                   enableChannel: enableIncreaseListDelayTime
+                   isTriggerOnDown: true
+                   autoRepeat: true
+                   actionValue: ''
+                   direction: up
+                 )
+                (InputFieldSpec
+                   name: 'EntryField3'
+                   layout: (LayoutFrame 22 0 0 0 66 0 22 0)
+                   model: updateListDelayTimeHolder
+                   acceptOnReturn: true
+                   acceptOnTab: true
+                   acceptOnLostFocus: true
+                   acceptOnPointerLeave: false
+                 )
+                (ArrowButtonSpec
+                   name: 'ArrowButton6'
+                   layout: (LayoutFrame 0 0 0 0 20 0 20 0)
+                   translateLabel: true
+                   model: decreaseupdateListDelayTime
+                   enableChannel: enableDecreaseListDelayTime
+                   isTriggerOnDown: true
+                   autoRepeat: true
+                   actionValue: ''
+                   direction: down
+                 )
+                )
+              
+             )
+             keepSpaceForOSXResizeHandleH: true
+           )
+          )
+        
+       )
+     )
 ! !
 
 !ProcessMonitorV2 class methodsFor:'menu specs'!
@@ -1718,84 +1774,84 @@
 
     ^
      #(Menu
-	(
-	 (MenuItem
-	    label: 'Id'
-	    hideMenuOnActivated: false
-	    indication: showProcessId
-	  )
-	 (MenuItem
-	    label: 'Group'
-	    hideMenuOnActivated: false
-	    indication: showGroup
-	  )
-	 (MenuItem
-	    label: 'Instrumentation'
-	    hideMenuOnActivated: false
-	    indication: showInstrumentation
-	  )
-	 (MenuItem
-	    label: 'State'
-	    hideMenuOnActivated: false
-	    indication: showState
-	  )
-	 (MenuItem
-	    label: 'Prio'
-	    hideMenuOnActivated: false
-	    indication: showPrio
-	  )
-	 (MenuItem
-	    label: 'Used Stack'
-	    hideMenuOnActivated: false
-	    indication: showUsedStack
-	  )
-	 (MenuItem
-	    label: 'Total Stack'
-	    hideMenuOnActivated: false
-	    indication: showTotalStack
-	  )
-	 (MenuItem
-	    label: 'Current-Segment'
-	    hideMenuOnActivated: false
-	    indication: showCurrentSegment
-	  )
-	 (MenuItem
-	    label: 'Switch'
-	    hideMenuOnActivated: false
-	    indication: showSwitch
-	  )
-	 (MenuItem
-	    label: 'Where'
-	    hideMenuOnActivated: false
-	    indication: showWhere
-	  )
-	 (MenuItem
-	    label: 'Application'
-	    hideMenuOnActivated: false
-	    indication: showApplication
-	  )
-	 (MenuItem
-	    label: 'Window Title'
-	    hideMenuOnActivated: false
-	    indication: showWindowTitle
-	  )
-	 (MenuItem
-	    label: '-'
-	  )
-	 (MenuItem
-	    label: 'Show Dead Processes'
-	    indication: showDead
-	  )
-	 (MenuItem
-	    label: '-'
-	  )
-	 (MenuItem
-	    label: 'Update'
-	    itemValue: updateView
-	  )
-	 )
-	nil
-	nil
+        (
+         (MenuItem
+            label: 'Id'
+            hideMenuOnActivated: false
+            indication: showProcessId
+          )
+         (MenuItem
+            label: 'Group'
+            hideMenuOnActivated: false
+            indication: showGroup
+          )
+         (MenuItem
+            label: 'Instrumentation'
+            hideMenuOnActivated: false
+            indication: showInstrumentation
+          )
+         (MenuItem
+            label: 'State'
+            hideMenuOnActivated: false
+            indication: showState
+          )
+         (MenuItem
+            label: 'Prio'
+            hideMenuOnActivated: false
+            indication: showPrio
+          )
+         (MenuItem
+            label: 'Used Stack'
+            hideMenuOnActivated: false
+            indication: showUsedStack
+          )
+         (MenuItem
+            label: 'Total Stack'
+            hideMenuOnActivated: false
+            indication: showTotalStack
+          )
+         (MenuItem
+            label: 'Current-Segment'
+            hideMenuOnActivated: false
+            indication: showCurrentSegment
+          )
+         (MenuItem
+            label: 'Switch'
+            hideMenuOnActivated: false
+            indication: showSwitch
+          )
+         (MenuItem
+            label: 'Where'
+            hideMenuOnActivated: false
+            indication: showWhere
+          )
+         (MenuItem
+            label: 'Application'
+            hideMenuOnActivated: false
+            indication: showApplication
+          )
+         (MenuItem
+            label: 'Window Title'
+            hideMenuOnActivated: false
+            indication: showWindowTitle
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'Show Dead Processes'
+            indication: showDeadHolder
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'Update'
+            itemValue: updateView
+          )
+         )
+        nil
+        nil
       )
 ! !
 
@@ -2081,14 +2137,14 @@
 !
 
 decreaseupdateContentsDelayTime
-
-    self updateContentsDelayTime value:((self scaledUpdateContentsDelayTime - 0.1) asFixedPoint:1).
+    updateDelay := (self scaledUpdateContentsDelayTime - 0.1) asFixedPoint:1.
+    self updateContentsDelayTimeHolder value:updateDelay.
     self evaluateEnableInDecreaseButtons.
 !
 
 decreaseupdateListDelayTime
-
-    self updateListDelayTime value:((self scaledUpdateListDelayTime - 0.1) asFixedPoint:1).
+    listUpdateDelay := (self scaledUpdateListDelayTime - 0.1) asFixedPoint:1.
+    self updateListDelayTimeHolder value:listUpdateDelay.
     self evaluateEnableInDecreaseButtons.
 !
 
@@ -2099,13 +2155,15 @@
 !
 
 evaluateEnableInDecreaseButtons
-
-    | contDelaySmallerListDelay |
-
-    contDelaySmallerListDelay := (self scaledUpdateContentsDelayTime < (self scaledUpdateListDelayTime)).
-    self enableDecreaseContentsDelayTime value:((self scaledUpdateContentsDelayTime <= 0.5) not).
-    self enableDecreaseListDelayTime value:contDelaySmallerListDelay.
-    self enableIncreaseContentsDelayTime value:contDelaySmallerListDelay.
+    | contentsDelaySmallerThanListDelay |
+
+    updateDelay := self scaledUpdateContentsDelayTime.
+    listUpdateDelay := self scaledUpdateListDelayTime.
+    
+    contentsDelaySmallerThanListDelay := (updateDelay < listUpdateDelay).
+    self enableDecreaseContentsDelayTime value:(updateDelay > 0.5).
+    self enableDecreaseListDelayTime value:contentsDelaySmallerThanListDelay.
+    self enableIncreaseContentsDelayTime value:contentsDelaySmallerThanListDelay.
 !
 
 getProcessList
@@ -2114,24 +2172,24 @@
 
     |coll|
 
-    self showDead value ifTrue:[
-	coll := Process allSubInstances asOrderedCollection.
+    self showDeadHolder value ifTrue:[
+        coll := Process allSubInstances asOrderedCollection.
     ] ifFalse:[
-	coll := ProcessorScheduler knownProcesses asOrderedCollection.
-	coll add:Processor scheduler.
+        coll := ProcessorScheduler knownProcesses asOrderedCollection.
+        coll add:Processor scheduler.
     ].
     ^ coll
 !
 
 increaseupdateContentsDelayTime
-
-    self updateContentsDelayTime value:((self scaledUpdateContentsDelayTime + 0.1) asFixedPoint:1).
+    updateDelay := (self scaledUpdateContentsDelayTime + 0.1) asFixedPoint:1.
+    self updateContentsDelayTimeHolder value:updateDelay.
     self evaluateEnableInDecreaseButtons.
 !
 
 increaseupdateListDelayTime
-
-    self updateListDelayTime value:((self scaledUpdateListDelayTime + 0.1) asFixedPoint:1).
+    listUpdateDelay := (self scaledUpdateListDelayTime + 0.1) asFixedPoint:1.
+    self updateListDelayTimeHolder value:listUpdateDelay.
     self evaluateEnableInDecreaseButtons.
 !
 
@@ -2174,6 +2232,14 @@
     ^ currentSortOrder
 !
 
+interruptCountHolder
+
+    interruptCountHolder isNil ifTrue:[
+        interruptCountHolder := '-' asValue.
+    ].
+    ^ interruptCountHolder.
+!
+
 isNotTimeslicing
     ^ self isTimeslicing not
 
@@ -2196,31 +2262,33 @@
 
 scaledUpdateContentsDelayTime
 
-    ^ self updateContentsDelayTime value asFloat asFixedPoint:1.
+    ^ self updateContentsDelayTimeHolder value asFloat asFixedPoint:1.
 !
 
 scaledUpdateListDelayTime
 
-    ^ self updateListDelayTime value asFloat asFixedPoint:1.
+    ^ self updateListDelayTimeHolder value asFloat asFixedPoint:1.
 !
 
 selectedProcesses
 
     selectedProcesses isNil ifTrue:[
-	selectedProcesses := ValueHolder new.
-	selectedProcesses addDependent:self.
+        selectedProcesses := ValueHolder new.
+        selectedProcesses onChangeSend:#selectionChanged to:self.
+        "/ selectedProcesses addDependent:self.
     ].
     ^ selectedProcesses.
 !
 
-showDead
+showDeadHolder
     "return/create the 'showDead' value holder (automatically generated)"
 
-    showDead isNil ifTrue:[
-	showDead := false asValue.
-	showDead addDependent:self.
+    showDeadHolder isNil ifTrue:[
+        showDeadHolder := false asValue.
+        showDeadHolder onChangeSend:#updateList to:self.
+        "/ showDead addDependent:self.
     ].
-    ^ showDead
+    ^ showDeadHolder
 !
 
 sortBlock
@@ -2246,22 +2314,30 @@
     ^ tableColumns.
 !
 
-updateContentsDelayTime
-
-    updateContentsDelayTime isNil ifTrue:[
-	updateContentsDelayTime := updateDelay asValue.
-	updateContentsDelayTime onChangeSend:#evaluateEnableInDecreaseButtons to:self.
+timerActionCountHolder
+
+    timerActionCountHolder isNil ifTrue:[
+        timerActionCountHolder := '-' asValue.
     ].
-    ^ updateContentsDelayTime.
+    ^ timerActionCountHolder.
 !
 
-updateListDelayTime
-
-    updateListDelayTime isNil ifTrue:[
-	updateListDelayTime := listUpdateDelay asValue.
-	updateListDelayTime onChangeSend:#evaluateEnableInDecreaseButtons to:self.
+updateContentsDelayTimeHolder
+
+    updateContentsDelayTimeHolder isNil ifTrue:[
+        updateContentsDelayTimeHolder := updateDelay asValue.
+        updateContentsDelayTimeHolder onChangeSend:#evaluateEnableInDecreaseButtons to:self.
     ].
-    ^ updateListDelayTime.
+    ^ updateContentsDelayTimeHolder.
+!
+
+updateListDelayTimeHolder
+
+    updateListDelayTimeHolder isNil ifTrue:[
+        updateListDelayTimeHolder := listUpdateDelay asValue.
+        updateListDelayTimeHolder onChangeSend:#evaluateEnableInDecreaseButtons to:self.
+    ].
+    ^ updateListDelayTimeHolder.
 ! !
 
 !ProcessMonitorV2 methodsFor:'aspects-column'!
@@ -2578,17 +2654,9 @@
     "stub code automatically generated - please change as required"
 
     changedObject == builder window ifTrue:[
-	something == #visibility ifTrue:[
-	    self updateList.
-	].
-    ].
-    changedObject == self selectedProcesses ifTrue:[
-	self selectionChanged.
-	^ self
-    ].
-    changedObject == self showDead ifTrue:[
-	self updateList.
-	^ self
+        something == #visibility ifTrue:[
+            self updateList.
+        ].
     ].
     super update:something with:aParameter from:changedObject
 !
@@ -2710,14 +2778,14 @@
 
     showDetail := (Smalltalk at:#SystemDebugging ifAbsent:false).
     updateSema := Semaphore forMutualExclusion.
-    updateDelay := 0.5.
-    listUpdateDelay := 5.0.
+    updateDelay := 1.0 "0.5" asFixedPoint:1.     "/ seconds
+    listUpdateDelay := 5.0 asFixedPoint:1.
 
     "/ event mode is no longer used;
     "/ this event support may vanish
     Processor isPureEventDriven ifTrue:[
-	updateBlock := [self updateStatus:nil].
-	listUpdateBlock := [self updateList].
+        updateBlock := [self updateStatus:nil].
+        listUpdateBlock := [self updateList].
     ].
 
     "Modified: / 17-08-2011 / 11:39:13 / cg"
@@ -3426,9 +3494,9 @@
 
     wg := self windowGroupOfProcess:aProcess.
     wg notNil ifTrue:[
-	(topViews := wg topViews) notEmptyOrNil ifTrue:[
-	    ^ '"',topViews first label,'"'.
-	].
+        (topViews := wg topViews) notEmptyOrNil ifTrue:[
+            ^ '"',(topViews first label ? '<nil>'),'"'.
+        ].
     ].
     ^ ''.
 
@@ -3557,44 +3625,44 @@
 
 startUpdateProcess
     updateBlock notNil ifTrue:[
-	Processor addTimedBlock:updateBlock afterSeconds:self scaledUpdateContentsDelayTime.
-	Processor addTimedBlock:listUpdateBlock afterSeconds:self scaledUpdateListDelayTime.
+        Processor addTimedBlock:updateBlock afterSeconds:updateDelay.
+        Processor addTimedBlock:listUpdateBlock afterSeconds:listUpdateDelay.
     ] ifFalse:[
-	"after a restart, updateProcess is a dead process"
-	self assert:(updateProcess isNil or:[updateProcess isDead]).
-
-	updateProcess := [
-	    [
-		|id cnt myDelay|
-
-		myDelay := Delay forSeconds:self scaledUpdateContentsDelayTime.
-
-		"
-		 every updateDelay (0.5), we look which process runs;
-		 every half second, the status is updated.
-		 every listUpdateDelay (5s), the list of processes is
-		 built up again
-		"
-		[true] whileTrue:[
-		    myDelay delay:self scaledUpdateContentsDelayTime * 1000.
-		    ((self scaledUpdateListDelayTime // self scaledUpdateContentsDelayTime) max:2) - 1 timesRepeat:[
-			myDelay wait.
-			self updateStatus:nil.
-		    ].
-		    myDelay wait.
-		    self updateList.
-		]
-	    ] ifCurtailed:[
-		updateProcess := nil
-	    ]
-	]  forkAt:(Processor userSchedulingPriority + 1).
-	updateProcess name:'monitor [' ,
-			   Processor activeProcess id printString ,
-			   '] update'.
-	"
-	 raise my own priority
-	"
-	Processor activeProcess priority:(Processor userSchedulingPriority + 2)
+        "after a restart, updateProcess is a dead process"
+        self assert:(updateProcess isNil or:[updateProcess isDead]).
+
+        updateProcess := [
+            [
+                |id cnt myDelay|
+
+                myDelay := Delay forSeconds:updateDelay.
+
+                "
+                 every updateDelay (0.5), we look which process runs;
+                 every half second, the status is updated.
+                 every listUpdateDelay (5s), the list of processes is
+                 built up again
+                "
+                [true] whileTrue:[
+                    myDelay delay:updateDelay * 1000.
+                    ((listUpdateDelay // updateDelay) max:2) - 1 timesRepeat:[
+                        myDelay wait.
+                        self updateStatus:nil.
+                    ].
+                    myDelay wait.
+                    self updateList.
+                ]
+            ] ifCurtailed:[
+                updateProcess := nil
+            ]
+        ]  forkAt:(Processor userSchedulingPriority + 1).
+        updateProcess name:'monitor [' ,
+                           Processor activeProcess id printString ,
+                           '] update'.
+        "
+         raise my own priority
+        "
+        Processor activeProcess priority:(Processor userSchedulingPriority + 2)
     ].
 !
 
@@ -3736,114 +3804,159 @@
 !
 
 updateList
-
+    "recompute the list of processes"
+    
     |newList|
 
     processTable shown ifTrue:[
-	newList := self getProcessList.
-	visibleBlock notNil ifTrue:[
-	    newList := newList select:visibleBlock
-	].
-	self updateStatus:newList.
+        newList := self getProcessList.
+        visibleBlock notNil ifTrue:[
+            newList := newList select:visibleBlock
+        ].
+        self updateStatus:newList.
     ].
     updateBlock notNil ifTrue:[
-	Processor removeTimedBlock:listUpdateBlock.
-	Processor addTimedBlock:listUpdateBlock afterSeconds:self scaledUpdateListDelayTime.
+        Processor removeTimedBlock:listUpdateBlock.
+        Processor addTimedBlock:listUpdateBlock afterSeconds:listUpdateDelay
     ].
 !
 
 updateStatus:newProcessList
-
     |startTime endTime deltaT|
 
-
     startTime := Timestamp now.
     updateSema critical:[
-	self updateTable:newProcessList.
+        self updateTable:newProcessList.
     ].
 
     endTime := Timestamp now.
+
+    lastUpdateTimestamp notNil ifTrue:[
+        |timeDelta newInterruptCount newTimerActionCount n nPerSecond s|
+
+        timeDelta := (endTime - lastUpdateTimestamp) asMilliseconds / 1000.0.
+        
+        "/ update the interrupt counts
+        newInterruptCount := Processor interruptCounter.
+        newTimerActionCount := Processor timedActionCounter.
+        lastInterruptCount notNil ifTrue:[
+            "/ attention - these are modulu counters.
+            newInterruptCount >= lastInterruptCount ifTrue:[
+                n := newInterruptCount-lastInterruptCount.
+                n == 0 ifTrue:[
+                    "/ the common case
+                    s := '0'
+                ] ifFalse:[
+                    nPerSecond := n / timeDelta. 
+                    s := (nPerSecond asInteger "asFixedPoint:1") printString
+                ].    
+                self interruptCountHolder value:s
+            ].    
+        ].
+        lastTimerActionCount notNil ifTrue:[
+            "/ attention - these are modulu counters.
+            newTimerActionCount >= lastTimerActionCount ifTrue:[
+                n := newTimerActionCount-lastTimerActionCount.
+                n == 0 ifTrue:[
+                    "/ the common case
+                    s := '0'
+                ] ifFalse:[
+                    nPerSecond := n / timeDelta.
+                    s := (nPerSecond asInteger "asFixedPoint:1") printString
+                ].    
+                self timerActionCountHolder value:s
+            ].    
+        ].
+        
+        lastInterruptCount := newInterruptCount.
+        lastTimerActionCount := newTimerActionCount.
+    ].
+    lastUpdateTimestamp := endTime.
+    
+    "/ a check, in case the computation took longer than 20%
+    "/ of the delay time. Then increase the update interval.
+    "/ This is to avoid that the processMonitor creates too much overhead
+    "/ (in case we have many processes)
     deltaT := (endTime millisecondDeltaFrom:startTime) / 1000.0.
-"/    Transcript show:deltaT; show:' ' ; showCR:(self scaledUpdateContentsDelayTime / 10.0).
-    deltaT > (self scaledUpdateContentsDelayTime / 5) ifTrue:[
-	"/ the update took longer than 20% - make delay longer, to reduce cpu load.
-	self updateContentsDelayTime value:(self scaledUpdateContentsDelayTime * 2).
-	"/ Transcript show:'+++ '; showCR:self scaledUpdateContentsDelayTime.
-    ] ifFalse:[
-"/        self scaledUpdateContentsDelayTime > 0.5 ifTrue:[
-"/            deltaT < (self scaledUpdateContentsDelayTime / 20) ifTrue:[
-"/                "/ the update took less than 5% - make delay smaller for better animation.
-"/                self updateContentsDelayTime value:((self scaledUpdateContentsDelayTime / 2) max:0.5).
-"/                "/ Transcript show:'--- ';showCR:self scaledUpdateContentsDelayTime.
-"/            ].
-"/        ].
+    "/ Transcript show:deltaT; show:' ' ; showCR:(self scaledUpdateContentsDelayTime / 10.0).
+    deltaT > (updateDelay / 5) ifTrue:[
+        "/ the update took longer than 20% - make delay longer, to reduce cpu load.
+        updateDelay := updateDelay * 2.
+        self updateContentsDelayTimeHolder value:updateDelay.
+        "/ Transcript show:'+++ '; showCR:self scaledUpdateContentsDelayTime.
     ].
+    
     updateBlock notNil ifTrue:[
-	Processor removeTimedBlock:updateBlock.
-	Processor addTimedBlock:updateBlock afterSeconds:self scaledUpdateContentsDelayTime.
+        Processor removeTimedBlock:updateBlock.
+        Processor addTimedBlock:updateBlock afterSeconds:updateDelay.
     ]
 !
 
 updateTable:newProcessList
-    |oldSelection newList sel diff weakProcessList|
-
-    processTable shown ifTrue:[
-"/        Transcript showCR:('update the table', Timestamp now printString, 'with new list:', newProcessList notNil asString).
-	sel := self selectedProcesses value.
-	sel notNil ifTrue:[
-	    oldSelection := OrderedCollection new.
-	    sel do:[:proItem|
-		proItem processInstance notNil ifTrue:[
-		    oldSelection add:(proItem processInstance)
-		].
-	    ].
-	].
-"/            Transcript showCR:'oldSelection on catch in updateTable: ', (oldSelection isEmptyOrNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
-	newProcessList isNil ifTrue:[
-	    newList := OrderedCollection new.
-	    processList do:[:oldItem |
-		| newItem |
-		(self showDead value
-		 or:[oldItem processInstance notNil
-		     and:[oldItem processInstance isDead not]]) ifTrue:[
-		    newItem := oldItem copy.
-		    self fillItemInformationIn:newItem.
-		    newList add:newItem.
-		]
-	    ].
-	] ifFalse:[
-	    "/ remove dead processes if not shown
-	    newList := OrderedCollection new.
-	    weakProcessList := WeakArray withAll:newProcessList.
-	    weakProcessList keysAndValuesDo:[:indexInWeakArray :procOrNilOrZero |
-		"/ in a weakarray, dead entries are 0
-		(procOrNilOrZero notNil and:[procOrNilOrZero class ~~ SmallInteger]) ifTrue:[
-		    (procOrNilOrZero isDead not or:[self showDead value]) ifTrue:[
-			| processItem |
-			processItem := ProcessItem new.
-			self fillItemInformationIn:processItem with:procOrNilOrZero inArray:weakProcessList atIndex:indexInWeakArray.
-			newList add:processItem.
-		    ]
-		]
-	    ].
-	].
-	newList sort:self sortBlock.
-	newList doWithIndex:[:newItem :index|
-	    | oldItem |
-	    oldItem := processList at:index ifAbsent:nil.
-	    oldItem isNil ifTrue:[
-		processList add:newItem beforeIndex:index
-	    ] ifFalse:[
-		self updateChangedItem:oldItem newItem:newItem atIndex:index
-	    ]
-	].
-	diff := processList size - newList size.
-	diff > 0 ifTrue:[
-	    processList removeLast:diff
-	].
+    |oldSelection newList sel diff weakProcessList showDead|
+
+    processTable shown ifFalse:[^ self].
+
+    showDead := self showDeadHolder value.
+    
+    "/ Transcript showCR:('update the table', Timestamp now printString, 'with new list:', newProcessList notNil asString).
+    sel := self selectedProcesses value.
+    sel notNil ifTrue:[
+        oldSelection := OrderedCollection new.
+        sel do:[:proItem|
+            proItem processInstance notNil ifTrue:[
+                oldSelection add:(proItem processInstance)
+            ].
+        ].
+    ].
+    
+    newList := OrderedCollection new.
+
+    "/ Transcript showCR:'oldSelection on catch in updateTable: ', (oldSelection isEmptyOrNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
+    newProcessList isNil ifTrue:[
+        processList do:[:oldItem |
+            | newItem process|
+            (showDead
+             or:[ 
+                (process := oldItem processInstance) notNil
+                 and:[process isDead not]]
+            ) ifTrue:[
+                newItem := oldItem copy.
+                self fillItemInformationIn:newItem.
+                newList add:newItem.
+            ]
+        ].
+    ] ifFalse:[
+        "/ remove dead processes if not shown
+        weakProcessList := WeakArray withAll:newProcessList.
+        weakProcessList keysAndValuesDo:[:indexInWeakArray :procOrNilOrZero |
+            "/ in a weakarray, dead entries are 0
+            (procOrNilOrZero notNil and:[procOrNilOrZero class ~~ SmallInteger]) ifTrue:[
+                (procOrNilOrZero isDead not or:[showDead]) ifTrue:[
+                    | processItem |
+                    processItem := ProcessItem new.
+                    self fillItemInformationIn:processItem with:procOrNilOrZero inArray:weakProcessList atIndex:indexInWeakArray.
+                    newList add:processItem.
+                ]
+            ]
+        ].
+    ].
+    newList sort:self sortBlock.
+    newList doWithIndex:[:newItem :index|
+        | oldItem |
+        oldItem := processList at:index ifAbsent:nil.
+        oldItem isNil ifTrue:[
+            processList add:newItem beforeIndex:index
+        ] ifFalse:[
+            self updateChangedItem:oldItem newItem:newItem atIndex:index
+        ]
+    ].
+    diff := processList size - newList size.
+    diff > 0 ifTrue:[
+        processList removeLast:diff
+    ].
 "/            Transcript showCR:'oldSelection on set in updateTable: ', (oldSelection isEmptyOrNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
-	self changeSelectionToProcesses:oldSelection.
-    ].
+    self changeSelectionToProcesses:oldSelection.
 ! !
 
 !ProcessMonitorV2::ProcessItem methodsFor:'accessing'!
--- a/SystemBrowser.st	Mon May 16 06:49:42 2016 +0200
+++ b/SystemBrowser.st	Tue May 17 07:04:09 2016 +0200
@@ -5498,7 +5498,7 @@
                     "/ and used symbols/globals first...
                     allUsedSymbolsInLiteralArray := usedSymbols isEmptyOrNil or:[ literalsInMethod includesAll:usedSymbols ].
                     allUsedSymbolsInLiteralArray ifTrue:[
-                        "/ not true, but I am lazy: if ANY string is in match, ANY string must be in method
+                        "/ if ANY string is in match, ANY string must be in method (not true, but I am lazy)
                         "/ that does not work for stc compiled code, because it does not put strings into the literal array
                         isSTCCompiled := m byteCode isNil.
                         isSTCCompiled ifTrue:[
@@ -5510,44 +5510,42 @@
                         allStringsInLiteralArray ifTrue:[
                             allGlobalsReferenced := globalVariablesUsed conform:[:varNames | varNames contains:[:varName | m referencesGlobal:varName]].
                             allGlobalsReferenced ifTrue:[
-                                allMessagesSent := sentMessages isEmptyOrNil or:[ m messages includesAll:sentMessages ].
+                                allMessagesSent := sentMessages isEmptyOrNil 
+                                                   or:[ m messagesSent includesAll:sentMessages ].
                                 allMessagesSent ifTrue:[
-                                    allSent := sentMessages conform:[:sel | (m sends:sel)].
-                                    allSent ifTrue:[
-                                        src := m source.
-                                        src isNil ifTrue:[
-                                            ('Browser [info]: no source for ' , m printString) infoPrintCR.
-                                        ] ifFalse:[
-                                            isSTCCompiled ifTrue:[
-                                                usedStrings notEmptyOrNil ifTrue:[
-                                                    "/ now that we have the source, scan the source for the literal strings,
-                                                    "/ before doing a slow parse
-                                                    allStringsInLiteralArray := usedStrings conform:[:eachString | src includesString:eachString].
-                                                ]
-                                            ].
-                                            allStringsInLiteralArray ifTrue:[
-                                                (searcher canQuicklyReject:src) ifTrue:[
-                                                    "/ Transcript show:'qReject: '; showCR:m whoString.
-                                                ] ifFalse:[
-                                                    "/ the rest is done by the slower RB-match process...
-                                                    parseTree := 
-                                                        RBParser 
-                                                            parseSearchMethod:src 
-                                                            onError: [:str :pos | 
-                                                                "/ self halt.
-                                                                Transcript show:'Error during search in '; showCR:m. 
-                                                                Transcript showCR:str. 
-                                                                Transcript showCR:pos. 
-                                                                nil
-                                                            ].
-
-                                                    parseTree notNil ifTrue:[
-                                                        searcher executeTree:parseTree.
-                                                        "/ notice: searcher sets foundMatch !!
-                                                    ].
+                                    src := m source.
+                                    src isNil ifTrue:[
+                                        ('Browser [info]: no source for ' , m printString) infoPrintCR.
+                                    ] ifFalse:[
+                                        isSTCCompiled ifTrue:[
+                                            usedStrings notEmptyOrNil ifTrue:[
+                                                "/ now that we have the source, scan the source for the literal strings,
+                                                "/ before doing a slow parse
+                                                allStringsInLiteralArray := usedStrings conform:[:eachString | src includesString:eachString].
+                                            ]
+                                        ].
+                                        allStringsInLiteralArray ifTrue:[
+                                            (searcher canQuicklyReject:src) ifTrue:[
+                                                "/ Transcript show:'qReject: '; showCR:m whoString.
+                                            ] ifFalse:[
+                                                "/ the rest is done by the slower RB-match process...
+                                                parseTree := 
+                                                    RBParser 
+                                                        parseSearchMethod:src 
+                                                        onError: [:str :pos | 
+                                                            "/ self halt.
+                                                            Transcript show:'Error during search in '; showCR:m. 
+                                                            Transcript showCR:str. 
+                                                            Transcript showCR:pos. 
+                                                            nil
+                                                        ].
+
+                                                parseTree notNil ifTrue:[
+                                                    searcher executeTree:parseTree.
+                                                    "/ notice: searcher sets foundMatch !!
                                                 ].
                                             ].
-                                        ]
+                                        ].
                                     ]
                                 ]
                             ]
--- a/Tools__BreakpointService.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__BreakpointService.st	Tue May 17 07:04:09 2016 +0200
@@ -637,7 +637,8 @@
 
 !BreakpointService methodsFor:'redrawing'!
 
-drawLine:lineNo in:view atX:x y:y width:w height:h from:startCol to:endColOrNil with:fg and:bg
+drawLine:lineNo in:view atX:x y:yBaseline width:w height:hFont ascent:aFont
+    from:startCol to:endColOrNil with:fg and:bg
     "Called by both gutterView and textView (well, not yet) to
      allow services to draw custom things on text view.
      Ask JV what the args means if unsure (I'm lazy to document
@@ -645,8 +646,9 @@
 
     |mthd bpnt icon dx dy|
 
-    "/ these tests make the breakpointService unusable for other applications (which are not
-    "/ based on smalltalk methods). They are not really needed: if there is a breakpoint,
+    "/ these tests make the breakpointService unusable for other applications 
+    "/ (which are not based on smalltalk methods). 
+    "/ They are not really needed: if there is a breakpoint,
     "/ I can show it. Period.
 
     "/    (mthd := self fetchMethodHolder value) isNil ifTrue:[
@@ -669,11 +671,11 @@
             ^ self
         ].
         dx := ((w - icon width) / 2) rounded.
-        dy := ((h - icon height) / 2) rounded.
+        dy := ((hFont - icon height) / 2) rounded.
         icon
             displayOn:view
             x:x + dx
-            y:y - h + dy + 4. "TODO: Magic constant"
+            y:yBaseline - hFont + dy + 4. "TODO: Magic constant"
     ].
 
     "Created: / 17-06-2011 / 13:52:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
--- a/Tools__CodeView2.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__CodeView2.st	Tue May 17 07:04:09 2016 +0200
@@ -173,7 +173,7 @@
      #(Menu
               (
                (MenuItem
-                  label: 'Inspect '
+                  label: 'Inspect View'
                   itemValue: inspectView
                   translateLabel: true
                 )
@@ -182,11 +182,11 @@
                   itemValue: inspectSyntaxElements
                   translateLabel: true
                 )
-               (MenuItem
-                  label: 'Inspect Selected Selector'
-                  itemValue: inspectSelectedSelector
-                  translateLabel: true
-                )
+"/               (MenuItem
+"/                  label: 'Inspect Selected Selector'
+"/                  itemValue: inspectSelectedSelector
+"/                  translateLabel: true
+"/                )
                )
               nil
               nil
@@ -1057,7 +1057,7 @@
             each update:aspect with:param from:sender
         ]
     ].
-    self updateScrollersViewBackground.
+    "/ self updateScrollersViewBackground.
     
     super update:aspect with:param from:sender
 
@@ -1327,12 +1327,14 @@
 
 !CodeView2 methodsFor:'delegation-drawing'!
 
-drawLine:lineNo in: view atX:x y:y width: w height:h from:startCol to:endColOrNil with:fg and:bg
+drawLine:lineNo in: view atX:x y:yBaseline width: w height:hFont ascent:aFont
+    from:startCol to:endColOrNil with:fg and:bg
     "See the comment in
      CodeViewService>>drawLine:in:atX..."
 
     self servicesDo:[:each|
-        each drawLine:lineNo in: view atX:x y:y width: w height:h from:startCol to:endColOrNil with:fg and:bg
+        each drawLine:lineNo in:view atX:x y:yBaseline width:w height:hFont ascent:aFont
+             from:startCol to:endColOrNil with:fg and:bg
     ]
 
     "Created: / 17-06-2011 / 13:50:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -2199,6 +2201,18 @@
     ^ services detect:[:any| (any isKindOf: BreakpointService)] ifNone:nil
 !
 
+lintService
+    "prefers the smallsense-lint service over others"
+
+    ^ services 
+        detect:[:any| (any isKindOf:SmallSense::SmalltalkLintService)] 
+        ifNone:[
+            services 
+                detect:[:any| (any isLintService)] 
+                ifNone:nil
+        ]
+!
+
 registerService: aCodeViewService
 
     services add: aCodeViewService.
@@ -2293,18 +2307,19 @@
     overAllHeight = 0 ifTrue:[ ^ self ].
 
     annotations do:[:eachAnnotation |
-        |lineNr yThumb baseColor clr1 clr2|
+        |lineNr yThumb baseColor clr1 clr2 severity|
 
         (lineNr := eachAnnotation line) notNil ifTrue:[    
             yThumb := (aScroller height * (lineNr / overAllHeight)) rounded.
             (yThumb between:y-5 and:(y + h + 5)) ifTrue:[
-                eachAnnotation rule severity == #error ifTrue:[
+                severity := eachAnnotation rule severity.
+                severity == #error ifTrue:[
                     baseColor := Color red.
                 ] ifFalse:[
-                    eachAnnotation rule severity == #warning ifTrue:[
-                        baseColor := Color orange.
+                    severity == #warning ifTrue:[
+                        baseColor := Color yellow.
                     ] ifFalse:[
-                        baseColor := Color yellow.
+                        baseColor := Color blue.
                     ].    
                 ].    
                 clr1 := baseColor lightened lightened.
@@ -2951,8 +2966,9 @@
     "redraws specified line. Returns width of drawn object.
      Color of drawn objects should be taken from lineFont, lineColor"
 
-    |lineString yTop yBaseline fontAscent fontDescent
-     textW requiredW oldFont newFont oldColor newColor myFont textViewFont|
+    |lineString yTop yBaseline textViewFont fontAscent fontDescent
+     textW requiredW oldFont newFont oldColor newColor 
+     myFont myFontAscent myFontDescent|
 
     shown ifFalse:[ ^ self ]. "/ Do not bother if the view is not shown.
     textView isNil ifTrue:[^ self].     "/ happens when shown in UIPainter
@@ -2990,14 +3006,16 @@
 
     fontAscent := textViewFont ascentOn:device.
     fontDescent := textViewFont descentOn:device.
-
+    myFontAscent := myFont ascent.
+    myFontDescent := myFont descent.
+    
     yTop := (self yOfTextViewLine:line) ? 0.
     yBaseline := yTop + fontAscent.
 
     cleared ifFalse:[
-        self clearRectangleX:0 y:yBaseline - myFont ascent
-            width:width - 2
-            height:myFont ascent + myFont descent.
+        self clearRectangleX:0 y:yBaseline - myFontAscent
+             width:width - 2
+             height:myFontAscent + myFontDescent.
     ].
 
     "/ cg: this should be done differently: services know about the
@@ -3008,17 +3026,15 @@
         "Let services draw annotations and other stuff"
         codeView notNil ifTrue:[
             codeView
-                drawLine:line in: self
-                atX: self acceptCancelRight + 1 y:yBaseline width: widthAnnotations height:myFont height
-                from:nil to:nil with:self paint and: self backgroundColor.
+                drawLine:line in:self
+                atX:(self acceptCancelRight + 1) y:yBaseline 
+                width:widthAnnotations height:(myFont height) ascent:myFontAscent
+                from:nil to:nil with:(self paint) and:(self backgroundColor).
         ]
     ].
 
     showLineNumbers ifTrue:[
-        self
-            displayString:lineString
-            x:width - widthDiffInfo - textW
-            y:yBaseline.
+        self displayString:lineString x:(width - widthDiffInfo - textW) y:yBaseline.
         newFont notNil ifTrue:[
             self font:oldFont.
             self paint:oldColor
@@ -3031,9 +3047,9 @@
     "/ of accept/cancel bar !!
     cleared ifFalse:[
         "/ In that case it was cleared above.
-        self redrawAcceptCancelBarX:0 y:yBaseline - gc font ascent
-            width:width - 2
-           height:gc font ascent + gc font descent.
+        self redrawAcceptCancelBarX:0 y:(yBaseline - myFontAscent)
+             width:width - 2
+             height:(myFontAscent + myFontDescent).
     ].
     ^ requiredW.
 
--- a/Tools__CodeViewService.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__CodeViewService.st	Tue May 17 07:04:09 2016 +0200
@@ -414,20 +414,40 @@
 
 !CodeViewService methodsFor:'redrawing'!
 
-drawAnnotationIcon:icon atX:x y:y width:w height:h
+drawAnnotationIcon:icon atX:x y:y width:w height:h ascent:fontAscent
     |dy dx|
 
     dx := ((w - icon width) / 2) rounded.
     dy := ((h - icon height) / 2) rounded.
     icon 
         displayOn:gutterView
-        x:x + dx
+        x:x + dx + 2
         y:y - h + dy + 4.
 
     "Created: / 17-09-2013 / 15:40:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-drawLine:lineNo in: view atX:x y:y width: w height:h from:startCol to:endColOrNil with:fg and:bg
+drawAnnotationInLine:lineNo in:view atX:x y:yBaseline width:w height:hFont ascent:fontAscent
+                from:startCol to:endColOrNil with:fg and:bg
+    "common code"
+
+    | lang annotation icon severity |
+
+    annotation :=  self annotationAtLine: lineNo.
+    annotation notNil ifTrue:[
+        severity := annotation rule severity.
+        icon := (severity == #error)
+                     ifTrue:[ToolbarIconLibrary smalllintErrorIcon16x16]
+                     ifFalse:[
+                        (severity == #warning)
+                            ifTrue:[ ToolbarIconLibrary smalllintWarningIcon16x16]        
+                            ifFalse:[ ToolbarIconLibrary smalllintInformationIcon16x16]].        
+        self drawAnnotationIcon:icon atX:x y:yBaseline width:w height:hFont ascent:fontAscent.
+    ].
+!
+
+drawLine:lineNo in:view atX:x y:y width:w height:hFont ascent:fontAscent 
+    from:startCol to:endColOrNil with:fg and:bg
 
     "Called by both gutterView and textView (well, not yet) to
      allow services to draw custom things on text view.
--- a/Tools__LintAnnotation.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__LintAnnotation.st	Tue May 17 07:04:09 2016 +0200
@@ -78,6 +78,7 @@
     
     resources := self class classResources.
     rule isComposite ifTrue:[
+        "/ sigh - must collect here, because lint does not know about my resources.
         info := rule rules 
                     collect:[:each | 
                         (resources string:each infoInToolTip)
@@ -91,7 +92,7 @@
     ].
     info isEmptyOrNil ifTrue:[^ nil].
     ^ resources 
-            stringWithCRs:(('Lint says (click on icon for details):' withColor:#gray),'\%1') "/ 'Lint says: %1\Click for more info.' 
+            stringWithCRs:(('Lint says (click on icon for details):\' withColor:#gray),'\%1') "/ 'Lint says: %1\Click for more info.' 
             with:info.
 ! !
 
--- a/Tools__LintHighlighter.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__LintHighlighter.st	Tue May 17 07:04:09 2016 +0200
@@ -179,10 +179,10 @@
     "Modified: / 02-12-2014 / 11:29:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-formatMethod:mth source:source in:class using: preferences elementsInto: elements
+formatMethod:mth source:sourceString in:class using: preferences elementsInto: elements
 
     formattingMethod := true.
-    ^ self format: source in: class
+    ^ self format: sourceString in: class
 
     "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 02-12-2014 / 11:30:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -190,12 +190,12 @@
 
 !LintHighlighter methodsFor:'formatting-private'!
 
-format: text in: class
+format: sourceString in: class
 
     | tree t |
 
-    tree := RBParser parseMethod: text string onError:[:error :pos| ^ text ].
-    t := text asText.
+    tree := RBParser parseMethod: sourceString string onError:[:error :pos| ^ sourceString ].
+    t := sourceString asText.
     self format: t tree: tree in: class.
     ^t
 
--- a/Tools__LintService.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__LintService.st	Tue May 17 07:04:09 2016 +0200
@@ -63,6 +63,22 @@
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 "
+!
+
+documentation
+"
+    cg:
+    
+    This service framework is a bit confusing; there is so much code duplication.
+    The distinction between LintService and Smallsense::SmalltalkLintService is
+    unclear to me.
+    
+    If I understand this correctly, this is used to highlight the
+    output of the static analyzer (debug-button in browser), whereas Smallsense::SmalltalkLintService
+    displays the output from the just-in-time analysis in the codeview
+    Is this correct?
+    Why not merge those two - most of the functionality is the same.     
+"    
 ! !
 
 !LintService class methodsFor:'accessing'!
@@ -201,11 +217,13 @@
 
 update: aspect with: param from: sender
     aspect == #sizeOfView ifFalse:[
+    aspect == #pointerInView ifFalse:[
         sender == ruleHolderFromApp ifTrue:[
             self syntaxHighlight: true.
             ^ self.
         ]
     ].
+    ].
     super update: aspect with: param from: sender.
 
     "Created: / 05-08-2011 / 11:49:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -233,7 +251,8 @@
     service := self service: #'Tools::CodeHighlightingService'.
     service notNil ifTrue:[
         service processSafely: delayed
-    ]
+    ].
+    codeView updateScrollersViewBackground.
 
     "Created: / 05-08-2011 / 11:49:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 25-02-2014 / 19:57:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -241,24 +260,20 @@
 
 !LintService methodsFor:'redrawing'!
 
-drawLine:lineNo in:view atX:x y:y width:w height:h from:startCol to:endColOrNil with:fg and:bg 
+drawLine:lineNo in:view atX:x y:yBaseline width:w height:hFont ascent:aFont from:startCol to:endColOrNil with:fg and:bg 
     "Called by both gutterView and textView (well, not yet) to
      allow services to draw custom things on text view.
      Ask JV what the args means if unsure (I'm lazy to document
      them, now it is just an experiment...)"
 
-    | lang annotation |
-
-    ((lang := codeView language) isNil or:[lang isSmalltalk not]) ifTrue:[ ^ self ].
+    "/ cg: why only for smalltalk?
+    "/ if there are annotations, why not show it?
+    "/ | lang |
+    "/ ((lang := codeView language) isNil or:[lang isSmalltalk not]) ifTrue:[ ^ self ].
 
-    annotation :=  self annotationAtLine: lineNo.
-    annotation notNil ifTrue:[
-        self drawAnnotationIcon: (ToolbarIconLibrary smalllintWarning16x16)
-                atX: x y: y  width: w height: h.
-    ].
-
-    "Created: / 30-01-2012 / 15:11:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 07-08-2013 / 00:19:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    self drawAnnotationInLine:lineNo 
+         in:view atX:x y:yBaseline width:w height:hFont ascent:aFont 
+         from:startCol to:endColOrNil with:fg and:bg
 ! !
 
 !LintService methodsFor:'registering'!
--- a/Tools__NewSystemBrowser.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__NewSystemBrowser.st	Tue May 17 07:04:09 2016 +0200
@@ -1476,21 +1476,21 @@
                       (LinkButtonSpec
                          label: 'Info'
                          name: 'InfoLabel'
+                         activeHelpKey: infoLabelHelp
                          level: -1
                          translateLabel: true
                          labelChannel: infoLabelHolder
                          adjust: left
-                         activeHelpKey: infoLabelHelp
                        )
                       (HorizontalPanelViewSpec
                          name: 'PackageInfoPanel'
+                         activeHelpKey: packageInfoLabel
                          level: -1
                          horizontalLayout: rightSpaceFit
                          verticalLayout: fitSpace
                          horizontalSpace: 0
                          verticalSpace: 0
                          elementsChangeSize: true
-                         activeHelpKey: packageInfoLabel
                          component: 
                         (SpecCollection
                            collection: (
@@ -23897,7 +23897,7 @@
     self 
         explainInCode:(codeView contentsAsString string) 
         short:true 
-        withTimeout:true
+        withTimeout:false
 
     "Modified: / 05-09-2006 / 10:37:10 / cg"
 !
@@ -28695,17 +28695,18 @@
 smalllintRulesOrDefault
     "Return last run rules or default ruleset if no checks has been run so far"
 
-    (LastLintRulesHolder isNil or:[ LastLintRulesHolder value isNil ]) ifTrue:[
-        | default |
-
-        default := UserPreferences current smallLintRulesetDefault.
-        default notNil ifTrue:[
-            ^ default
-        ].
-        ^ RBBuiltinRuleSet rulesetBuiltinDefaultForSTX
-    ] ifFalse:[
-        ^ LastLintRulesHolder value
-    ].
+    |lastRules default|
+    
+    (LastLintRulesHolder notNil 
+    and:[ (lastRules := LastLintRulesHolder value) notNil ]) ifTrue:[
+        ^ lastRules
+    ].    
+
+    default := UserPreferences current smallLintRulesetDefault.
+    default notNil ifTrue:[
+        ^ default
+    ].
+    ^ RBBuiltinRuleSet rulesetBuiltinDefaultForSTX
 
     "Created: / 28-02-2013 / 22:42:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 16-10-2014 / 10:45:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -28717,7 +28718,9 @@
 
     smalllintRulesOrDefaultHolder isNil ifTrue:[
         LastLintRulesHolder isNil ifTrue:[ LastLintRulesHolder := ValueHolder new ].
-        smalllintRulesOrDefaultHolder := PluggableAdaptor on: LastLintRulesHolder getter: [:ignored | self smalllintRulesOrDefault ]
+        smalllintRulesOrDefaultHolder := PluggableAdaptor 
+                                            on: LastLintRulesHolder 
+                                            getter: [:ignored | self smalllintRulesOrDefault ]
     ].
     ^ smalllintRulesOrDefaultHolder
 
@@ -44835,7 +44838,15 @@
         Dialog warn:'Sorry - for now, non-ascii categories are not allowed (no 2-byte symbols).'.
         ^ self.
     ].
-
+    (NavigatorModel isPseudoCategory:newProtocol) ifTrue:[
+        (Dialog confirm:(resources 
+                            stringWithCRs:'"%1" is a special (reserved) name.\\Are you sure?.' 
+                            with:newProtocol))
+        ifFalse:[
+            ^ self.
+        ].
+    ].
+    
     self immediateUpdate value:true.
     self selectedClassesDo:[:cls |
         self methodCategoryListApp addAdditionalProtocol:newProtocol forClass:cls.
@@ -58451,42 +58462,50 @@
 explainInCode:code short:short withTimeout:withTimeout
     "explain the selection or, if there is none, the node under the cursor"
 
-    |explanation explainTookTooLong html|
-
-    explainTookTooLong := false.
+    |process explanation explainTookTooLong|
+
+    short ifFalse:[self halt].
+    "/ stop any previous explain activitiy
+    (process := explainProcess) notNil ifTrue:[
+        explainProcess := nil.
+        process terminate.
+    ].
+    (withTimeout and:[short not]) ifTrue:[self halt].
+    
+    "/ synchronous
     withTimeout ifTrue:[
+        explainTookTooLong := false.
+
         explanation :=
-            [ self explanationForCode:code short:short ]
-                    valueWithWatchDog:[explainTookTooLong := true]
-                    afterMilliseconds:400.
-    ] ifFalse:[
-        explanation := self explanationForCode:code short:short
-    ].
-
-    self activityNotification:nil.
-    explainTookTooLong ifTrue:[
-        self showInfo:'Explain took too long - cancelled.'.
-        ^ self.
-    ].
-
-    explanation notEmptyOrNil ifTrue:[
-        short ifTrue:[
-            self showInfo:explanation
-        ] ifFalse:[
-            explanation isArray ifTrue:[
-                html := explanation detect:[:entry | entry key == #html] ifNone:nil.
-                html notNil ifTrue:[
-                    "/ todo: need a stripped down viewer (small, popup, modal)
-                    HTMLDocumentView openFullOnText:(html value).
-                    ^ self.
-                ].
-                explanation := explanation first value.
-            ].
-            self information:explanation
-        ].
-        builder window flush
-    ].
-
+            [ 
+                self explanationForCode:code short:short 
+            ] valueWithWatchDog:[explainTookTooLong := true] afterMilliseconds:400.
+        self activityNotification:nil.
+        explainTookTooLong ifTrue:[
+            self showInfo:'Explain took too long - cancelled.'.
+            ^ self.
+        ].
+        self showExplanation:explanation short:short.
+        ^ self
+    ].
+
+    short ifFalse:[
+        explanation := self explanationForCode:code short:short.
+        self showExplanation:explanation short:short.
+        ^ false.
+    ].
+    
+    "/ aynchronous - start a process which shows it later
+    explainProcess := 
+        [
+            explanation := self explanationForCode:code short:true.
+            self 
+                enqueueMessage:#showExplanation:short:
+                for:self
+                arguments: { explanation . true }.
+        ] fork.    
+    
+    
     "Created: / 05-09-2006 / 10:37:04 / cg"
 !
 
@@ -58734,23 +58753,67 @@
 "/    ]
 !
 
+showExplanation:explanation short:short
+    "explain-msg arrived"
+
+    |html explanationString|
+
+    explanation isEmptyOrNil ifTrue:[^ self].
+    
+    short ifTrue:[
+        self showInfo:explanation.
+        ^ self.    
+    ] .
+
+    (explanationString := explanation) isArray ifTrue:[
+        html := explanation detect:[:entry | entry key == #html] ifNone:[nil].
+        html notNil ifTrue:[
+            "/ todo: need a stripped down viewer (small, popup, modal)
+            HTMLDocumentView openFullOnText:(html value).
+            ^ self.
+        ].
+        explanationString := explanationString first value.
+    ].
+    "/ paste into view
+    self information:explanationString.
+    builder window flush
+
+    "Created: / 05-09-2006 / 10:37:04 / cg"
+!
+
 showInfo:msg
     "if its a multiline message, only the first line is shown"
     
-    |messageShown|
+    |messageShown lbl doAnimate|
+    
+    lbl := self navigationState canvas builder componentAt:'InfoLabel'.
+    "/ Transcript showCR:lbl.
+    "/ Transcript showCR:msg.
+    lbl notNil ifTrue:[ lbl stopAnimation ].
+    doAnimate := false.
     
     self navigationState showingParseError:false.
     (messageShown := msg) notNil ifTrue:[
-        "/ ((msg?'') startsWith:'ChangesBrowser:') ifTrue:[self halt].
-        (messageShown includes:Character cr) ifTrue:[
-            messageShown := messageShown upTo:Character cr.
+        messageShown := msg asStringCollection "asStringWithoutFinalCR".
+        messageShown size == 1 ifTrue:[
+            messageShown := msg.
+        ] ifFalse:[
+            doAnimate := true.
+            "/ messageShown do:[:eachLine|
+            "/     Transcript show:' > '; showCR:eachLine; showCR:'"'.
+            "/].    
         ].    
     ].
     self infoLabelHolder value:messageShown.
 
+    doAnimate ifTrue:[
+        lbl notNil ifTrue:[ lbl startAnimation ].    
+    ].    
+
     "
      WindowGroup activeApplication showInfo: 'Hello'
-     WindowGroup activeApplication showInfo: ('Hello\World\Bla' withCRs)
+     WindowGroup activeApplication showInfo: ('Hello\World\Bla' withCRs) asStringCollection
+     WindowGroup activeApplication showInfo: #('Hello' 'World' 'Bla')
     "
 !
 
@@ -58885,7 +58948,7 @@
     "This does a class/selector name completion using
      standard DoWhatIMeanSupport"
 
-    | env firstLetter doMatch|
+    | env firstLetter doMatch classCompletion selectorCompletion|
     
     env := self theSingleSelectedNamespace ? #Smalltalk.
     env = NavigatorModel nameListEntryForALL ifTrue:[env := #Smalltalk].
@@ -58909,7 +58972,16 @@
     partialName = '*' ifTrue:[
         doMatch := false.
     ].    
-    ^ DoWhatIMeanSupport selectorCompletion: partialName inEnvironment: env match:doMatch
+    selectorCompletion := DoWhatIMeanSupport selectorCompletion: partialName inEnvironment: env match:doMatch.
+    selectorCompletion second isEmpty ifTrue:[ 
+        "/ no completion - try classnames;
+        "/ allows me to enter lower case classnames
+        classCompletion := DoWhatIMeanSupport classnameCompletion: partialName inEnvironment: env.
+        classCompletion second notEmpty ifTrue:[
+            ^ classCompletion
+        ].    
+    ].
+    ^ selectorCompletion
 ! !
 
 
@@ -62121,13 +62193,17 @@
 
     | codeView |
 
-    self setAcceptAction:[:theCode | self doAcceptMethod:theCode language: languageOrNil  ].
+    self setAcceptAction:
+        [:theCode | 
+            self doAcceptMethod:theCode language: languageOrNil  
+        ].
 
     (codeView := self codeView) notNil ifTrue:[
         codeView
-            explainAction:[:theCode :theSelection |
-                self explain:theSelection inCode:theCode
-            ].
+            explainAction:
+                [:theCode :theSelection |
+                    self explain:theSelection inCode:theCode
+                ].
         codeView isCodeView2 ifTrue:[
             languageOrNil notNil ifTrue:[
                 codeView languageHolder value: languageOrNil.
--- a/Tools__TextDiff3Tool.st	Mon May 16 06:49:42 2016 +0200
+++ b/Tools__TextDiff3Tool.st	Tue May 17 07:04:09 2016 +0200
@@ -1125,7 +1125,8 @@
 
 !TextDiff3Tool::MergeService methodsFor:'drawing'!
 
-drawLine:lineNo in:view atX:x y:y width:w height:h from:startCol to:endColOrNil with:fg and:bg 
+drawLine:lineNo in:view atX:x y:yBaseline width:w height:hFont ascent:aFont
+    from:startCol to:endColOrNil with:fg and:bg 
     "Called by both gutterView and textView (well, not yet) to
      allow services to draw custom things on text view.
      Ask JV what the args means if unsure (I'm lazy to document
@@ -1135,23 +1136,24 @@
 
     sectionInterval := self sectionInterval.
     view == gutterView ifFalse:[ ^ self ].
+    
     info := self infoAtLine: lineNo.
     info notNil ifTrue:[ 
         color := info color.
         color notNil ifTrue:[
-            view fillRectangleX: x y:y - h 
-                    width: 8 
-                    height:h + textView lineSpacing + 5"Magic constant to make it look nicer"
-                    color: color.
+            view fillRectangleX:x y:yBaseline - hFont 
+                 width:8 
+                 height:hFont + textView lineSpacing + 5"Magic constant to make it look nicer"
+                 color:color.
         ].
     ].
 
     (sectionInterval notNil and:[sectionInterval includes: lineNo]) ifTrue:[
-            "Drawing outside annotation area is not nice, but..."
-            view fillRectangleX:view width - 7 y:y - h 
-                width:4 
-                height:h + textView lineSpacing + 5"Magic constant to make it look nicer"
-                color: Color gray.
+        "Drawing outside annotation area is not nice, but..."
+        view fillRectangleX:view width - 7 y:yBaseline - hFont 
+             width:4 
+             height:hFont + textView lineSpacing + 5"Magic constant to make it look nicer"
+             color:(Color gray).
     ]
 
     "Created: / 19-03-2012 / 13:15:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
--- a/VersionDiffBrowser.st	Mon May 16 06:49:42 2016 +0200
+++ b/VersionDiffBrowser.st	Tue May 17 07:04:09 2016 +0200
@@ -2665,44 +2665,45 @@
     theClassChangeSet labelA:aLabelA.
     theClassChangeSet labelB:aLabelB.
 
-    aStream := '' writeStream.
-    Method flushSourceStreamCache.
-    classA fileOutOn:aStream withTimeStamp:false.
-    sourceA := aStream contents asString.
-
-    aStream := '' writeStream.
-    Method flushSourceStreamCache.
-    classB fileOutOn:aStream withTimeStamp:false.
-    sourceB := aStream contents asString.
-
-    theChangeSetA:=self changeSetForClass:classA andSource:sourceA.
-    theChangeSetB:=self changeSetForClass:classB andSource:sourceB.
-    theChangeSetA isNil
-        ifTrue: [theChangeSetA := ChangeSet new].
-    theChangeSetB isNil
-        ifTrue: [theChangeSetB := ChangeSet new].
+    theChangeSetA := ChangeSet forExistingClass:classA withExtensions:true withLooseMethods:true.
+    theChangeSetB := ChangeSet forExistingClass:classB withExtensions:true withLooseMethods:true.
+    
+"/    aStream := '' writeStream.
+"/    Method flushSourceStreamCache.
+"/    classA fileOutOn:aStream withTimeStamp:false.
+"/    sourceA := aStream contents asString.
+
+"/    aStream := '' writeStream.
+"/    Method flushSourceStreamCache.
+"/    classB fileOutOn:aStream withTimeStamp:false.
+"/    sourceB := aStream contents asString.
+
+"/    theChangeSetA:=self changeSetForClass:classA andSource:sourceA.
+"/    theChangeSetB:=self changeSetForClass:classB andSource:sourceB.
+"/    theChangeSetA isNil ifTrue: [theChangeSetA := ChangeSet new].
+"/    theChangeSetB isNil ifTrue: [theChangeSetB := ChangeSet new].
 
     "/ just in case (if comparing a class against another),
     "/ unify the classes of the changes (to avoid that all changes are detected as different)
 
-    theChangeSetB do:[:eachChange |
-        eachChange isMethodChange ifTrue:[
-            eachChange changeClass isMeta ifTrue:[
-                eachChange changeClass ~~ classA theMetaclass ifTrue:[
-                    eachChange changeClass:classA theMetaclass.
-                ]
-            ] ifFalse:[
-                eachChange changeClass ~~ classA theNonMetaclass ifTrue:[
-                    eachChange changeClass:classA theNonMetaclass.
-                ]
-            ].
-        ].
-    ].
+"/    theChangeSetB do:[:eachChange |
+"/        eachChange isMethodChange ifTrue:[
+"/            eachChange changeClass isMeta ifTrue:[
+"/                eachChange changeClass ~~ classA theMetaclass ifTrue:[
+"/                    eachChange changeClass:classA theMetaclass.
+"/                ]
+"/            ] ifFalse:[
+"/                eachChange changeClass ~~ classA theNonMetaclass ifTrue:[
+"/                    eachChange changeClass:classA theNonMetaclass.
+"/                ]
+"/            ].
+"/        ].
+"/    ].
     "/ remove all #initialize doIts
-    theChangeSetA := theChangeSetA select:[:eachChange | eachChange isDoIt not or:[eachChange isInitialize not]].
-    theChangeSetB := theChangeSetB select:[:eachChange | eachChange isDoIt not or:[eachChange isInitialize not]].
-
-    theClassChangeSet diffSet:(theChangeSetA diffSetsAgainst:theChangeSetB).
+    theChangeSetA := theChangeSetA reject:[:eachChange | eachChange isDoIt and:[eachChange isInitialize]].
+    theChangeSetB := theChangeSetB reject:[:eachChange | eachChange isDoIt and:[eachChange isInitialize]].
+
+    theClassChangeSet diffSet:(theChangeSetA diffSetsAgainst:theChangeSetB comparingDifferentClasses:true).
     ^ theClassChangeSet
 !
 
--- a/ViewWithAcceptAndCancelBar.st	Mon May 16 06:49:42 2016 +0200
+++ b/ViewWithAcceptAndCancelBar.st	Tue May 17 07:04:09 2016 +0200
@@ -260,7 +260,7 @@
 !ViewWithAcceptAndCancelBar::AcceptAndCancelBar methodsFor:'initialization'!
 
 initialize
-    |acceptColor cancelColor compareColor|
+    |acceptColor cancelColor compareColor order|
 
     super initialize.
 
@@ -272,6 +272,8 @@
     cancelColor := Color red.
     compareColor := Color yellow.
 
+    order := UserPreferences current acceptCancelBarOrder.
+    
     acceptButton := ButtonWithHelpText new.
     acceptButton origin:0.0 @ 0.0 corner:1.0@0.7.
     acceptButton backgroundColor:acceptColor.
@@ -281,7 +283,11 @@
     self add:acceptButton.
 
     cancelButton := ButtonWithHelpText new.
-    cancelButton origin:0.0 @ 0.7 corner:1.0@0.9.
+    order == #acceptCompareCancel ifTrue:[
+        cancelButton origin:0.0 @ 0.9 corner:1.0@1.0.
+    ] ifFalse:[
+        cancelButton origin:0.0 @ 0.7 corner:1.0@0.9.
+    ].
     cancelButton backgroundColor:cancelColor.
     cancelButton enteredBackgroundColor:cancelColor lightened.
     cancelButton activeBackgroundColor:cancelColor darkened.
@@ -289,7 +295,11 @@
     self add:cancelButton.
 
     compareButton := ButtonWithHelpText new.
-    compareButton origin:0.0 @ 0.9 corner:1.0@1.0.
+    order == #acceptCompareCancel ifTrue:[
+        compareButton origin:0.0 @ 0.7 corner:1.0@0.9.
+    ] ifFalse:[
+        compareButton origin:0.0 @ 0.9 corner:1.0@1.0.
+    ].
     compareButton backgroundColor:compareColor.
     compareButton enteredBackgroundColor:compareColor lightened lightened.
     compareButton activeBackgroundColor:compareColor darkened.
--- a/resources/de.rs	Mon May 16 06:49:42 2016 +0200
+++ b/resources/de.rs	Tue May 17 07:04:09 2016 +0200
@@ -1639,6 +1639,7 @@
 'Move to Inner Scope'                                                                                   'In inneren Block schieben'
 'Move to Namespace'                                                                                     'In Namensraum verschieben'
 'Multi-Setter Method'                                                                                   'Set-Methode für mehrere Variable'
+'Multi-Setter Instance Creation Method'                                                                 'Instanziierung für mehrere Variable'
 'Multitab Mode'                                                                                         'Multitab Modus'
 'Name of new NameSpace'                                                                                 'Name des neuen Namensraums'
 'Name of new class category:'                                                                           'Name der neuen Klassenkategorie:'
@@ -2404,6 +2405,7 @@
 'Sort by Line Number'                                                                                   'Sortieren nach Zeilennummer'
 'Sort by Linenumber'                                                                                    'Sortieren nach Zeilennummer'
 'Sort by Name'                                                                                          'Sortieren nach Name'
+'Group by Inheritance'                                                                                  'Gruppieren nach Vererbung'
 'Sort by Name (Ignore Leading Underscores and Case)'                                                    'Sortieren nach Name (führende Unterstriche und gross/klein ignorieren)'
 'Sort by Name (Ignore Leading Underscores)'                                                             'Sortieren nach Name (führende Unterstriche ignorieren)'
 'Sort by Name (ignore leading underscores and case)'                                                    'Sortieren nach Name (führende Unterstriche und gross/klein ignorieren)'