#UI_ENHANCEMENT by cg cvs_MAIN
authorClaus Gittinger <cg@exept.de>
Thu, 05 May 2016 17:11:24 +0200
branchcvs_MAIN
changeset 946 78732f808882
parent 945 6bb44d076eff
child 948 195452ac2419
#UI_ENHANCEMENT by cg class: SmallSense::CriticsWindow changed: #generateHTMLForRule:on: avoid generating multiple rule-descriptions for the same rule.
SmallSense__CriticsWindow.st
--- a/SmallSense__CriticsWindow.st	Wed May 04 21:49:01 2016 +0200
+++ b/SmallSense__CriticsWindow.st	Thu May 05 17:11:24 2016 +0200
@@ -365,43 +365,81 @@
 !CriticsWindow methodsFor:'change & update'!
 
 generateHTMLForRule: rule on: stream
-    | fixes |    
-
-    rule isComposite ifTrue:[ 
-        rule flatten 
-            do:[:each | self generateHTMLForRule: each on: stream. ]
-            separatedBy:[ stream nextPutLine: '<hr>' ].
-        ^ self.
-    ].
-
-    stream 
-        nextPutAll: rule name; 
-        nextPutAll:'<P>';  
-        nextPutLine: rule rationale.
+    | flattenedRules collectedFixes putCollectedFixes
+      previousRuleClass |    
+        
+    rule isComposite ifTrue:[
+        flattenedRules := OrderedCollection new.
+        rule flatten do:[:each | flattenedRules add:each].
+        
+        "/ often, multiple instances of the same rule match in a line.
+        "/ avoid, generating long lists, which all look the same.
+        "/ so first, sort them by name.
+        flattenedRules sort:[:a :b | a name < b name].
+        "/ then in the code below, skip over repeated descriptions
+    ] ifFalse:[
+        flattenedRules := { rule }.
+    ].    
 
-    "/ Generate fixes...
-    rule fixes: fixer.
-    fixes := fixer fixesForRule: rule.
-    fixes isEmptyOrNil ifTrue:[ ^ self ].
+    putCollectedFixes := 
+        [
+            collectedFixes notEmptyOrNil ifTrue:[
+                stream nextPutAll: '<p>'.
+                collectedFixes size > 1 ifTrue:[
+                    stream nextPutAll: '<br>'.
+                    stream nextPutLine: 'Possible fixes:'.
+                ].
+                stream nextPutLine:'<ul indent="0">'.
+                collectedFixes withIndexDo:[:fix :index|
+                    stream
+                        nextPutAll:'<li><a action="doit: linkActionPerformer doQuickFix:';
+                        nextPutAll: index printString;
+                        nextPutAll:'">';
+                        nextPutAll: fix label;
+                        nextPutAll:'</a></li>'.
+                ].
+                stream nextPutLine:'</ul>'.
+            ].
+        ].
+        
+    previousRuleClass := nil.
+    collectedFixes := OrderedCollection new.
 
-    stream nextPutAll: '<p>'.
-    fixes size > 1 ifTrue:[
-        stream nextPutAll: '<br>'.
-        stream nextPutLine: 'Possible fixes:'.
+    flattenedRules 
+        do:[:eachRule |
+            |fixes|
+            
+            eachRule class == previousRuleClass ifFalse:[
+                collectedFixes notEmpty ifTrue:[
+                    putCollectedFixes value.
+                    collectedFixes := OrderedCollection new
+                ].
+                previousRuleClass notNil ifTrue:[
+                    stream nextPutLine: '<hr>'
+                ].    
+                stream 
+                    "/ nextPutAll:'<I>',eachRule class name,':</I><BR>'; 
+                    nextPutAll:'<B>',eachRule name,'</B>'; 
+                    nextPutAll:'<P>';  
+                    nextPutLine: eachRule rationale.
+            ].
+            
+            "/ Generate fixes...
+            eachRule fixes: fixer.
+            fixes := fixer fixesForRule: eachRule.
+            fixes notEmptyOrNil ifTrue:[
+                collectedFixes addAll:fixes.
+            ].
+            previousRuleClass := eachRule class.
+        ].
+    
+    collectedFixes notEmpty ifTrue:[
+        putCollectedFixes value.
     ].
-    stream nextPutLine:'<ul indent="0">'.
-    fixes withIndexDo:[:fix :index|
-        stream
-            nextPutAll:'<li><a action="doit: linkActionPerformer doQuickFix:';
-            nextPutAll: index printString;
-            nextPutAll:'">';
-            nextPutAll: fix label;
-            nextPutAll:'</a></li>'.
-    ].
-    stream nextPutLine:'</ul>'.
 
     "Created: / 15-12-2014 / 16:49:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 15-12-2014 / 18:17:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 1-5-2016  Claus Gittinger"
 !
 
 update:something with:aParameter from:changedObject