I am checking out on the basics of the PluggableTextMorph and PluggableListMorph .. and its cousins.
PluggableListMorph >>
changeModelSelection: anInteger
setIndexSelector ifNotNil:
[model perform: setIndexSelector with: anInteger].
here it is the responsibility of the model to send #changed: getIndexSelector. why..?
why not a simpler generic:
changeModelSelection: anInteger
setIndexSelector ifNotNil:
[model perform: setIndexSelector with: anInteger].
"sends the call to all dependents of the model implicitly"
model perform: #changed: with: getIndexSelector
thereof the models anywhere need not bother sending #changed: calls... !
similarly:
acceptTextInModel
.....
[^setTextSelector isNil or:
[setTextSelector numArgs = 2
ifTrue: [model perform: setTextSelector with: acceptedText with: self]
ifFalse: [model perform: setTextSelector with: acceptedText]]
] ensure: [unstyledAcceptText := nil].
model perform: #changed with: getTextSelector
We can avoid these in the methods if implemented across all Pluggable??Morphs
Workspace class>>
openContents: aString
^ self new
open;
contents: aString; "funny is this itself calls #changed:"
"changed: #contents;"
yourself
Makes common sense to me.. rather than expecting the model to explicity call #changed:..this "view" / widget knows its model and it implicitly invoking #changed: is cleaner abstraction, unless a use case exists which may break infrastructure/ whole base doing this..
This way all models associated with various Pluggable??Morphs will work perfectly fine on just a setter call without extra line being added everywhere in the application code, apps need to bother about changes to other symbol viz: updating a list selection index causes another widget to refresh its content..