[Cuis-dev] Advanced: Dealing with optional Class uses.
ken.dickey at whidbey.com
ken.dickey at whidbey.com
Thu Jul 25 12:32:20 PDT 2024
Mark,
This is an advanced usage, but I thought to mention it because you will
sometimes load a package which references undefined classes.
E.g. when you `Feature require: 'UI-MetaProperties'.` you will see
Transcript entries like the following.
vvv===vvv
Package UI-DragAndDrop successfully installed
Undeclared: a Dictionary(#MetaProperty->nil
#MetaPropertyMultiSelect->nil)
^^^===^^^
This is a case of "forward reference" where one needs to break circular
Package dependencies.
In these cases, you should see some "guard code" as in the following.
VVV===VVV==UI-DragAndDrop.pck.st==V
!FontMorph methodsFor: 'dropping/grabbing' stamp: 'KenD 2/9/2022
06:50:39'!
dropAction: aDropTargetMorph
"Find accepting MetaProperties of target morph
and allow user to choose action."
| metaPropsForMyValue myValue choices selection |
(Smalltalk includesKey: #MetaProperty) ifFalse: [^nil ].
myValue := self valueWhenDropped.
metaPropsForMyValue :=
(MetaProperty metaPropsForMorph:
aDropTargetMorph targetMorph)
select: [ :metaProp | metaProp accepts: myValue ].
(metaPropsForMyValue size isZero) ifTrue: [^nil ].
choices := OrderedCollection with: #Cancel.
choices addAll: (metaPropsForMyValue keys).
"I am being carried by the hand. Disappear and let user make a
choice."
self delete.
selection := PopUpMenu withCaption: 'Choose setter'
chooseFrom: choices.
(selection = 1) ifFalse: [ "1 -> Cancel" | propName setterSym |
propName := choices at: selection.
setterSym := (propName , ':') asSymbol.
aDropTargetMorph targetMorph
perform: setterSym
with: myValue ;
triggerEvent: #propertyChanged.
].! !
^^^===^^^
In this case DragAndDrop code uses MetaProperties only if they are
loaded.
[NB: UI-MetaProperties requires UI-DragAndDrop].
So expect to see something like
(Smalltalk includesKey: #MetaProperty) ifFalse: [ ^nil ]. "guard"
If you see a dependency which is not handled this way, it is a sign that
someone forget to add a Feature/Package dependency to the package you
are loading. Easy to being up the Installed Packages browser and add,
then recheck.
Perhaps a mention if/when you describe making a package. Note:
https://github.com/Cuis-Smalltalk/Learning-Cuis/blob/master/SamplePackage1.md
Cheers,
-KenD
More information about the Cuis-dev
mailing list