Extended Widgets : Tree widgets : Icon trees

Icon trees
In the following example, an icon tree is created that displays the Smalltalk class hierarchy. The defaultActionCallback is hooked to allow navigation through the tree.
Object subclass: #IconTreeExample
instanceVariableNames: 'icon'
classVariableNames: "
poolDictionaries: 'CwConstants EwConstants'
open
| shell iconTree |
shell := CwTopLevelShell
createApplicationShell: 'shell'
argBlock: [:w | w title: 'Icon Tree Example'].
iconTree := shell
createScrolledIconTree: 'iconTree'
argBlock: [:w | w
items: (Array with: Object)].
iconTree
addCallback: XmNvisualInfoCallback
receiver: self
selector: #visualInfo:clientData:callData:
clientData: nil;
addCallback: XmNchildrenCallback
receiver: self
selector: #children:clientData:callData:
clientData: nil;
addCallback: XmNdefaultActionCallback
receiver: self
selector: #defaultAction:clientData:callData:
clientData: nil.
"Note: The destroyCallback is not shown."
icon := shell screen
getIcon: 'default_xm_information' foregroundColor: CgRGBColor black.
iconTree manageChild.
shell realizeWidget.
children: widget clientData: clientData callData: callData
"Provide the children of the object contained in the callData."
callData children: callData item subclasses.
defaultAction: widget clientData: clientData callData: callData
"Toggle the expand and collapse state of the item in the callData."
widget
expandCollapsePos: callData itemPosition
notify: false
visualInfo: widget clientData: clientData callData: callData
"Provide the icon and label for the class contained in the callData.
Also check whether the item has children."
callData
icon: icon;
label: callData item name;
hasChildren: callData item subclasses notEmpty