sounds cool.
For me the most important aspect is that preferenceCollector (our
current preference class should be a removable layer on top
of the system that are declaring preference.
Is is correct that
PreferenceCollector whenChanged: #gradientButtonLook inClass:
PrefProvider notify: self using: #gradientButtonLookIsNow: .
means that PrefProvider will receive the message
gradientButtonLookIsNow:
This way we can push preference to the tools and thety do not have to
query the information in the Collector at run-time (hence we could
remove Preference and have a more OO design).
Sorry not to reply earlier (I was breaking yet another wall in our
"kitchen")
Stef
On Mar 1, 2009, at 10:05 AM, Alain Plantec wrote:
> Hi all,
>
> joined Zoo package is a attempt to translate in code what we
> discussed here before about preference refactoring.
>
> The framework is made of 3 classes: PreferenceCollector,
> PreferenceDefinition and PreferenceValue.
> In Zoo there are also 2 classes for testing: PrefProvider and
> PrefChangeListener.
> PrefProvider class declares some preferences and PrefChangeListener
> is here to test preference change notification.
>
> PrefChangeListener>>initialize
> super initialize.
> PreferenceCollector whenChanged: #gradientButtonLook inClass:
> PrefProvider notify: self using: #gradientButtonLookIsNow: .
> PreferenceCollector whenChanged: #gradientButtonLook inClass:
> PrefProvider notify: self using: #gradientLook:
>
> PrefChangeListener class>>test
> "self test"
> PrefChangeListener new inspect.
> PrefProvider gradientButtonLook: PrefProvider gradientButtonLook
> value not.
> PrefProvider gradientButtonLook: PrefProvider gradientButtonLook
> value not.
> PrefProvider gradientButtonLook: PrefProvider gradientButtonLook
> value not.
>
>
> From PreferenceCollector comment:
> --------------------------------------
> A PreferenceCollector automatically collects all preferences.
> A preference is represented by a PreferenceDefinition.
> All PreferenceDefinition are stored in the preferences instance
> variable.
>
> Instance Variables
> preferences: OrderedCollection of PreferenceDefinition
>
> preferences
> - contains all PreferenceDefinition which are automatically built
> from pragma found in preference getters
>
>
> ADDING A PREFERENCE
> PreferenceCollector makes use of the SystemChangeNotifier in order
> to automate the adding, the removing and the updating of preferences.
> See #PreferenceCollector>>event: to see how preferences update is
> implemented.
>
> Editing a new method with a preference pragma or inserting a
> preference pragma in an existing method are
> the two ways for preference definition adding.
> The only way to remove a preference definition is to remove the
> corresponding method.
>
> Example of a "blackAndWhite" preference.
> Methods below are defined by the preference provider
> APreferencePrivider class.
> Note that the value stored in BlackAndWhite class variable is an
> instance of PreferenceValue.
> In this example, the default value is directly given with the pragma:
> -------------
> APreferencePrivider class>>blackAndWhite
> <preference: 'Use black and white' type: #Boolean set:
> #blackAndWhite: defaultValue: false description: 'Use black and
> white'>
> ^ BlackAndWhite
> ifNil: [BlackAndWhite := PreferenceValue value: false
> location: self selector: #blackAndWhite]
>
> APreferencePrivider class>>blackAndWhite: aBoolean
> self blackAndWhite value: aBoolean
> -------------
>
> If a default value can't be specified in the pragma, another way
> consists in using a selector which
> represents the message to send to the class in order to get the
> default value:
>
> -------------
> APreferencePrivider class>>standardFont
> <preference: 'The default system font' type: #LogicalFont set:
> #standardFont: default: #defaultStandardFont description: 'The
> default system font'>
> ^ StandardFont
> ifNil: [StandardFont := PreferenceValue value: self
> defaultStandardFont location: self selector: #standardFont]
>
> APreferencePrivider class>>standardFont: aFont
> self standardFont value: aFont
> APreferencePrivider class>>defaultStandardFont
> ^ LogicalFont
> familyName: 'Arial'
> fallbackFamilyNames: nil
> pointSize: 12
> stretchValue: 5
> weightValue: 400
> slantValue: 0
> -------------
>
> LISTENING TO A PREFERENCE VALUE CHANGE
> Any object can register itself as a preference value change listener.
> See #PreferenceCollector class>>whenChanged: inClass:notify:using:.
>
> Each time a preference value is changed, #preference:
> inClass:changedWith: is sent to the PreferenceCollector class.
>
> Example of code a listener can implement in order to be notified
> each time a gradientButtonLook preference defined by a PrefProvider
> class is changed.
> In this example, the listener ask to be notified by a send of
> #gradientButtonLookIsNow: message.
> The argument given to gradientButtonLookIsNow: is the new preference
> value.
> -------------
> ....
> PreferenceCollector whenChanged: #gradientButtonLook inClass:
> PrefProvider notify: self using: #gradientButtonLookIsNow:.
> ....
> -------------
>
> What do you think ?
>
> cheers
> Alain
>
>
> <Zoo-alain_plantec.
> 10.mcz>_______________________________________________
> Pharo-project mailing list
> [email protected]
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project