--- 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 $'
! !