Tools__LintRuleSettingsApplication.st
branchjv
changeset 15566 184cea584be5
parent 12433 864df9509297
parent 15493 c622c88a464b
child 15629 1adff41f5fd0
--- a/Tools__LintRuleSettingsApplication.st	Sun Jan 12 23:30:25 2014 +0000
+++ b/Tools__LintRuleSettingsApplication.st	Wed Apr 01 10:38:01 2015 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2006 by eXept Software AG
               All Rights Reserved
@@ -14,7 +16,8 @@
 "{ NameSpace: Tools }"
 
 AbstractSettingsApplication subclass:#LintRuleSettingsApplication
-	instanceVariableNames:'rulesetList rulesetSelectionHolder hasSelectionHolder'
+	instanceVariableNames:'rulesetList rulesetSelectionHolder hasSelectionHolder
+		hasSelectionAndUserDefinedHolder smallSenseEnabledHolder'
 	classVariableNames:'LastFileName'
 	poolDictionaries:''
 	category:'Interface-Lint'
@@ -51,6 +54,50 @@
     "Modified: / 27-02-2013 / 22:37:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!LintRuleSettingsApplication class methodsFor:'help specs'!
+
+flyByHelpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:Tools::LintRuleSettingsApplication    
+    "
+
+    <resource: #help>
+
+    ^ super flyByHelpSpec addPairsFrom:#(
+
+#add
+'Create a new ruleset'
+
+#copy
+'Create a copy of the selected ruleset'
+
+#edit
+'Edit the selected ruleset'
+
+#export
+'Export the selected ruleset as a file'
+
+#import
+'Import a ruleset from a file'
+
+#remove
+'Remove the selected ruleset'
+
+#resetDefault
+'Recreate the default ruleset with all existing RBRules.\(Do this after new rules have been added or rule classes were modified)'
+
+#smallSenseEnabled
+'Enable SmallSense (incremental lint rule checking in the editor).\Sorry, but this will only affect new windows,\so you have to reopen the browsers.'
+
+)
+! !
+
 !LintRuleSettingsApplication class methodsFor:'interface opening'!
 
 open    
@@ -87,133 +134,184 @@
     <resource: #canvas>
 
     ^ 
-     #(FullSpec
-        name: windowSpec
-        window: 
-       (WindowSpec
-          label: 'Profiles'
-          name: 'Profiles'
-          min: (Point 10 10)
-          bounds: (Rectangle 0 0 782 552)
-        )
-        component: 
-       (SpecCollection
-          collection: (
-           (LabelSpec
-              label: 'Predefined SmallLint Rule Sets'
-              name: 'Label'
-              layout: (LayoutFrame 0 0 35 0 0 1 65 0)
-              translateLabel: true
-              adjust: left
-            )
-           (SelectionInListModelViewSpec
-              name: 'ProfileList'
-              layout: (LayoutFrame 0 0 65 0 -100 1 0 1)
-              enableChannel: svnEnabled
-              model: rulesetSelectionHolder
-              hasHorizontalScrollBar: true
-              hasVerticalScrollBar: true
-              listModel: rulesetList
-              useIndex: false
-              highlightMode: line
-              doubleClickSelector: doEdit
-            )
-           (VerticalPanelViewSpec
-              name: 'Buttons1'
-              layout: (LayoutFrame -95 1 65 0 0 1 0 0.7)
-              horizontalLayout: fit
-              verticalLayout: top
-              horizontalSpace: 5
-              verticalSpace: 3
-              component: 
-             (SpecCollection
-                collection: (
-                 (ActionButtonSpec
-                    label: 'Add'
-                    name: 'ButtonAdd'
-                    translateLabel: true
-                    model: doAdd
-                    extent: (Point 95 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Copy'
-                    name: 'ButtonCopy'
-                    translateLabel: true
-                    model: doCopy
-                    enableChannel: canCopyHolder
-                    extent: (Point 95 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Edit'
-                    name: 'ButtonEdit'
-                    translateLabel: true
-                    model: doEdit
-                    enableChannel: canEditHolder
-                    extent: (Point 95 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Remove'
-                    name: 'ButtonRemove'
-                    translateLabel: true
-                    model: doRemove
-                    enableChannel: canRemoveHolder
-                    extent: (Point 95 22)
-                  )
+    #(FullSpec
+       name: windowSpec
+       window: 
+      (WindowSpec
+         label: 'Lint Settings'
+         name: 'Lint Settings'
+         min: (Point 10 10)
+         bounds: (Rectangle 0 0 587 473)
+       )
+       component: 
+      (SpecCollection
+         collection: (
+          (VerticalPanelViewSpec
+             name: 'VerticalPanel1'
+             layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+             horizontalLayout: fit
+             verticalLayout: topFit
+             horizontalSpace: 3
+             verticalSpace: 3
+             component: 
+            (SpecCollection
+               collection: (
+                (CheckBoxSpec
+                   label: 'Enable Lintrule Checking in Codeview (Load SmallSense Package)'
+                   name: 'CheckBox1'
+                   activeHelpKey: smallSenseEnabled
+                   enableChannel: hasSmallSenseNotLoaded
+                   model: smallSenseEnabledHolder
+                   translateLabel: true
+                   useDefaultExtent: true
                  )
-               
-              )
-            )
-           (VerticalPanelViewSpec
-              name: 'Buttons2'
-              layout: (LayoutFrame -95 1 0 0.7 0 1 0 1)
-              horizontalLayout: fit
-              verticalLayout: bottom
-              horizontalSpace: 5
-              verticalSpace: 3
-              component: 
-             (SpecCollection
-                collection: (
-                 (ActionButtonSpec
-                    label: 'Export'
-                    name: 'Button2'
-                    translateLabel: true
-                    model: doExport
-                    enableChannel: canExportHolder
-                    extent: (Point 95 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Import'
-                    name: 'Button3'
-                    translateLabel: true
-                    model: doImport
-                    extent: (Point 95 22)
-                  )
+                (ViewSpec
+                   name: 'Box2'
+                   component: 
+                  (SpecCollection
+                     collection: (
+                      (LabelSpec
+                         label: 'Predefined SmallLint Rule Sets'
+                         name: 'Label'
+                         layout: (LayoutFrame 0 0 0 0 0 1 30 0)
+                         translateLabel: true
+                         adjust: left
+                       )
+                      (SelectionInListModelViewSpec
+                         name: 'ProfileList'
+                         layout: (LayoutFrame 0 0 30 0 -128 1 0 1)
+                         enableChannel: svnEnabled
+                         model: rulesetSelectionHolder
+                         hasHorizontalScrollBar: true
+                         hasVerticalScrollBar: true
+                         listModel: rulesetList
+                         useIndex: false
+                         highlightMode: line
+                         doubleClickSelector: doEdit
+                       )
+                      (VerticalPanelViewSpec
+                         name: 'Buttons1'
+                         layout: (LayoutFrame -128 1 30 0 0 1 -65 0.70000000000000018)
+                         horizontalLayout: fit
+                         verticalLayout: top
+                         horizontalSpace: 5
+                         verticalSpace: 3
+                         component: 
+                        (SpecCollection
+                           collection: (
+                            (ActionButtonSpec
+                               label: 'Edit'
+                               name: 'ButtonEdit'
+                               activeHelpKey: edit
+                               translateLabel: true
+                               model: doEdit
+                               enableChannel: canEditHolder
+                               extent: (Point 128 22)
+                             )
+                            (ActionButtonSpec
+                               label: 'Copy'
+                               name: 'ButtonCopy'
+                               activeHelpKey: copy
+                               translateLabel: true
+                               model: doCopy
+                               enableChannel: canCopyHolder
+                               extent: (Point 128 22)
+                             )
+                            (ActionButtonSpec
+                               label: 'New'
+                               name: 'ButtonAdd'
+                               activeHelpKey: add
+                               translateLabel: true
+                               model: doAdd
+                               extent: (Point 128 22)
+                             )
+                            (ActionButtonSpec
+                               label: 'Remove'
+                               name: 'ButtonRemove'
+                               activeHelpKey: remove
+                               translateLabel: true
+                               model: doRemove
+                               enableChannel: canRemoveHolder
+                               extent: (Point 128 22)
+                             )
+                            )
+                          
+                         )
+                       )
+                      (VerticalPanelViewSpec
+                         name: 'Buttons2'
+                         layout: (LayoutFrame -128 1 -64 0.70000000000000018 0 1 0 1)
+                         horizontalLayout: fit
+                         verticalLayout: bottom
+                         horizontalSpace: 5
+                         verticalSpace: 3
+                         component: 
+                        (SpecCollection
+                           collection: (
+                            (ActionButtonSpec
+                               label: 'Reset Default'
+                               name: 'Button4'
+                               activeHelpKey: resetDefault
+                               translateLabel: true
+                               model: doResetDefault
+                               extent: (Point 128 22)
+                             )
+                            (ViewSpec
+                               name: 'Box1'
+                               extent: (Point 128 30)
+                             )
+                            (ActionButtonSpec
+                               label: 'Export'
+                               name: 'Button2'
+                               activeHelpKey: export
+                               translateLabel: true
+                               model: doExport
+                               enableChannel: canExportHolder
+                               extent: (Point 128 22)
+                             )
+                            (ActionButtonSpec
+                               label: 'Import'
+                               name: 'Button3'
+                               activeHelpKey: import
+                               translateLabel: true
+                               model: doImport
+                               extent: (Point 128 22)
+                             )
+                            )
+                          
+                         )
+                       )
+                      )
+                    
+                   )
+                   extent: (Point 587 443)
                  )
-               
-              )
-            )
+                )
+              
+             )
            )
-         
-        )
-      )
-
-    "Modified: / 28-02-2013 / 10:03:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+          )
+        
+       )
+     )
 ! !
 
 !LintRuleSettingsApplication methodsFor:'accessing'!
 
 selection
 
-    ^self selectionHolder value
+    ^self rulesetSelectionHolder value
 
     "Created: / 25-08-2010 / 14:10:03 / Jan Vrany <enter your email here>"
+    "Modified: / 11-11-2014 / 15:11:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 selection: anObject
 
-    self selectionHolder value: anObject
+    self rulesetSelectionHolder value: anObject
 
     "Created: / 25-08-2010 / 14:09:40 / Jan Vrany <enter your email here>"
+    "Modified: / 11-11-2014 / 15:11:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !LintRuleSettingsApplication methodsFor:'actions'!
@@ -221,22 +319,29 @@
 doAdd
     <resource: #uiCallback>
 
-    self doAdd: RBCompositeLintRule new
+    | ruleset |
 
-    "Modified: / 27-02-2013 / 11:25:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    ruleset := RBCompositeLintRule new.
+    ruleset name: 'New Rule Set ' , (self rulesetList size + 1) printString.
+    self doAdd: ruleset
+
+    "Modified: / 14-10-2014 / 16:30:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doAdd: anRBCompositeLintRule
+    | dialog |
 
-    anRBCompositeLintRule name isNil ifTrue:[
-        anRBCompositeLintRule name: 'New Rule Set ' , (self rulesetList size + 1) printString
+    dialog := LintRuleEditDialog new.
+    dialog rule: anRBCompositeLintRule.
+    dialog open.
+    dialog accepted ifTrue:[ 
+        self rulesetList add: anRBCompositeLintRule.
+        self rulesetSelectionHolder value: anRBCompositeLintRule.
+        self updateModifiedChannel.
     ].
-    self rulesetList add: anRBCompositeLintRule.
-    self rulesetSelectionHolder value: anRBCompositeLintRule.
-    self updateModifiedChannel.
-    self doEdit.
 
     "Created: / 27-02-2013 / 11:25:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-10-2014 / 16:29:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doCopy
@@ -245,7 +350,7 @@
     | ruleset |
 
     ruleset := self rulesetSelectionHolder value deepCopy.
-    ruleset name: ruleset name , ' (copy)'.
+    ruleset name: ('Copy of ' , ruleset name).
     self doAdd:  ruleset
 
     "Modified: / 27-02-2013 / 11:30:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -254,14 +359,32 @@
 doEdit
     <resource: #uiCallback>
 
-    | rule |    
-    rule := self rulesetSelectionHolder value.
-    LintRuleEditDialog new
-        rule: rule;
-        open.
-    self updateModifiedChannel
+    self doEdit: self rulesetSelectionHolder value.
+
+    "Modified: / 14-10-2014 / 16:48:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doEdit: rule
+    | edited dialog |    
+
+    rule isBuiltin ifTrue:[ 
+        Dialog warn: (resources string: 'Cannot edit built-in rule sets').
+        ^ self
+    ].
 
-    "Modified: / 27-02-2013 / 11:57:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    dialog := LintRuleEditDialog new.
+    dialog nameEditableHolder value: false.
+    edited := rule deepCopy.
+    dialog rule: edited.
+    dialog open.
+    dialog accepted ifTrue:[ 
+        rule name: edited name.
+        rule rules: edited rules.
+        self updateModifiedChannel.
+    ].
+
+    "Created: / 14-10-2014 / 16:47:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 20-11-2014 / 01:59:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doExport
@@ -269,27 +392,23 @@
 
     | file |
 
+    DIalog warn: 'Not yet implemented'.
+    ^ self.
+
     file := Dialog requestFileName: (resources string: 'Select file') default: (LastFileName ? Filename currentDirectory / 'exported-ruleset.st').
     file isEmptyOrNil ifTrue:[ ^ self ].
 
     self shouldImplement
 
-    "Modified: / 27-02-2013 / 23:53:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-10-2014 / 16:33:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doImport
     <resource: #uiCallback>
 
-    "automatically generated by UIPainter..."
+    Dialog warn: 'Not yet implemented'
 
-    "*** the code below performs no action"
-    "*** (except for some feedback on the Transcript)"
-    "*** Please change as required and accept in the browser."
-    "*** (and replace this comment by something more useful ;-)"
-
-    "action to be defined here..."
-
-    Transcript showCR:self class name, ': action for doImport ...'.
+    "Modified: / 14-10-2014 / 16:33:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 doRemove
@@ -308,6 +427,12 @@
     self updateModifiedChannel
 
     "Modified: / 27-02-2013 / 11:57:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doResetDefault
+    <resource: #uiCallback>
+
+    RBBuiltinRuleSet flushBuiltinDefault.
 ! !
 
 !LintRuleSettingsApplication methodsFor:'aspects'!
@@ -319,9 +444,10 @@
 !
 
 canEditHolder
-    ^self hasSelectionHolder
+    ^self hasSelectionAndUserDefinedHolder
 
     "Created: / 27-02-2013 / 11:24:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 11-11-2014 / 15:12:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 canExportHolder
@@ -331,9 +457,23 @@
 !
 
 canRemoveHolder
-    ^self hasSelectionHolder
+    ^self hasSelectionAndUserDefinedHolder
 
     "Created: / 27-02-2013 / 11:24:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 11-11-2014 / 15:12:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+hasSelectionAndUserDefinedHolder
+
+
+    hasSelectionAndUserDefinedHolder isNil ifTrue:[
+        hasSelectionAndUserDefinedHolder := PluggableAdaptor on: self rulesetSelectionHolder
+            getter:[ :model | model value notNil and:[model value isBuiltin not ] ]
+
+    ].
+    ^ hasSelectionAndUserDefinedHolder
+
+    "Created: / 11-11-2014 / 15:11:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 hasSelectionHolder
@@ -365,6 +505,14 @@
         rulesetSelectionHolder := ValueHolder new.
     ].
     ^ rulesetSelectionHolder
+!
+
+smallSenseEnabledHolder
+    smallSenseEnabledHolder isNil ifTrue:[
+        smallSenseEnabledHolder := ValueHolder with:false.
+        smallSenseEnabledHolder onChangeSend:#updateModifiedChannel to:self
+    ].
+    ^ smallSenseEnabledHolder
 ! !
 
 !LintRuleSettingsApplication methodsFor:'protocol'!
@@ -372,27 +520,88 @@
 basicReadSettings
     "superclass AbstractSettingsApplication says that I am responsible to implement this method"
 
-    self rulesetList removeAll; addAll: RBCompositeLintRule rulesets
+    |rbCompositeLintRuleClass|
+
+    self smallSenseEnabledHolder 
+        value:((Smalltalk at:#'SmallSense::SmalltalkChecker') notNil
+               and:[ UserPreferences current perform:#smallSenseEnabled ifNotUnderstood:false]).
+
+    rbCompositeLintRuleClass := Smalltalk at:#'RBCompositeLintRule'.
 
-    "Modified: / 27-02-2013 / 11:15:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    rbCompositeLintRuleClass isNil ifTrue:[ 
+        "/ Not loaded?
+        [
+            Smalltalk loadPackage: #'stx:goodies/refactoryBrowser/lint'.
+        ] on: PackageLoadError do:[:ex | 
+            Dialog warn: (resources string: 'SmallLint package could not be loaded!!').
+            ^ self.
+        ].
+        rbCompositeLintRuleClass := Smalltalk at:#'RBCompositeLintRule'.
+    ].
+
+    rbCompositeLintRuleClass notNil ifTrue:[
+        self rulesetList 
+            removeAll; 
+            addAll: rbCompositeLintRuleClass rulesetsBuiltin;            
+            addAll: rbCompositeLintRuleClass rulesetsUserDefined deepCopy
+    ].
+
+    "Modified: / 11-11-2014 / 15:08:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 basicSaveSettings
-    "superclass AbstractSettingsApplication says that I am responsible to implement this method"
+    | oldRulesets newRulesets toRemove toAdd rbCompositeLintRuleClass|
+
+    self smallSenseEnabledHolder value ifTrue:[
+        UserPreferences current addPreloadedPackage:'stx:goodies/smallsense'
+    ] ifFalse:[
+        UserPreferences current removePreloadedPackage:'stx:goodies/smallsense'
+    ].
+    (Smalltalk at:#'SmallSense::SmalltalkChecker') notNil ifTrue:[
+        UserPreferences current 
+            perform:#smallSenseEnabled: with:(self smallSenseEnabledHolder value) ifNotUnderstood:[]
+    ].
+
+    rbCompositeLintRuleClass := Smalltalk at:#'RBCompositeLintRule'.
+
+    oldRulesets := rbCompositeLintRuleClass rulesetsUserDefined.
+    newRulesets := self rulesetList reject:[:e|e isBuiltin].
+
+    toAdd := OrderedCollection withAll: newRulesets.
+    toRemove := Set new.
+    rbCompositeLintRuleClass rulesetsUserDefined do:[:oldRuleset | 
+        | newRuleset |
 
-    RBCompositeLintRule rulesets: self rulesetList asOrderedCollection
+        newRuleset := newRulesets detect:[:each | each name = oldRuleset name ] ifNone: nil.
+        newRuleset isNil ifTrue:[ 
+            toRemove add: oldRuleset.
+        ] ifFalse:[ 
+            toAdd remove: newRuleset.
+            oldRuleset rules: newRuleset rules.
+        ].
+    ].
+    oldRulesets removeAll:toRemove.
+    oldRulesets addAll:toAdd.
+    rbCompositeLintRuleClass rulesetsUserDefined: oldRulesets.
 
-    "Modified: / 27-02-2013 / 11:16:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 24-11-2014 / 11:21:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+hasSmallSenseLoaded
+   ^ (Smalltalk at:#'SmallSense::SmalltalkChecker') notNil
+!
+
+hasSmallSenseNotLoaded
+   ^ self hasSmallSenseLoaded not
 !
 
 helpFilename
-    "subclasses must return the relative name of a helpFile
-     in the doc/online/<language>/help directory.
+    "subclasses must return either the relative name of a helpFile
+     in the doc/online/<language>/help directory,
+     or an absolute pathname (typically in their packageDirectory).
      Or nil, if no help is available."
 
-    ^ nil
-
-    "Modified: / 27-02-2013 / 11:16:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    ^ 'Launcher/lintRuleSettings.html'
 ! !
 
 !LintRuleSettingsApplication methodsFor:'queries'!
@@ -400,16 +609,51 @@
 hasUnsavedChanges
     "superclass AbstractSettingsApplication says that I am responsible to implement this method"
 
-    ^RBCompositeLintRule rulesets asArray ~= self rulesetList asArray
+    |defaultRules currentRules firstTry rbCompositeLintRuleClass|
+
+    self smallSenseEnabledHolder value ifTrue:[
+        UserPreferences current addPreloadedPackage:'stx:goodies/smallsense'
+    ].
+    (UserPreferences current perform:#smallSenseEnabled ifNotUnderstood:false)
+            ~= (self smallSenseEnabledHolder value) 
+    ifTrue:[
+        ^ true
+    ].
+    rbCompositeLintRuleClass := Smalltalk at:#'RBCompositeLintRule'.
+    rbCompositeLintRuleClass isNil ifTrue:[^ false].
+
+    firstTry := true.
+    SequenceableCollection missingClassInLiteralArrayErrorSignal handle:[:ex |
+        "/ maybe we have to load additional packages...
+        firstTry ifTrue:[
+            (Smalltalk isPackageLoaded:'stx:goodies/refactoryBrowser/lint/spelling') ifFalse:[
+                firstTry := false.
+                Smalltalk loadPackage:'stx:goodies/refactoryBrowser/lint/spelling'.
+                ex restart.
+            ].
+        ].
+        ex reject.
+    ] do:[
+        defaultRules := rbCompositeLintRuleClass rulesetsUserDefined copyAsOrderedCollection.
+        currentRules := self rulesetList copyAsOrderedCollection.
+        "/ I will always add the defaultRule
+        defaultRules removeAllFoundIn:rbCompositeLintRuleClass rulesetsBuiltin.
+        currentRules removeAllFoundIn:rbCompositeLintRuleClass rulesetsBuiltin.
+        ^ defaultRules ~= currentRules
+    ].
+    ^ false.
 
     "Modified: / 28-02-2013 / 10:03:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !LintRuleSettingsApplication class methodsFor:'documentation'!
 
-version_HG
+version
+    ^ '$Header: /cvs/stx/stx/libtool/Tools__LintRuleSettingsApplication.st,v 1.23 2015-03-02 10:20:20 cg Exp $'
+!
 
-    ^ '$Changeset: <not expanded> $'
+version_CVS
+    ^ '$Header: /cvs/stx/stx/libtool/Tools__LintRuleSettingsApplication.st,v 1.23 2015-03-02 10:20:20 cg Exp $'
 ! !