One of the major uses the CAPI itself makes of pinboard-objects is to implement graph-panes. The graph-pane itself is a pinboard-layout and it is built using pinboard-objects for the nodes and edges. This is because each node (and sometimes each edge) of the graph needs to react individually to the user. For instance, when an event is received by the graph-pane, it is told which pinboard object was under the pointer at the time, and it can then use this information to change the selection.
Create the following graph-pane and notice that every node in the graph is made from an item-pinboard-object
as described in the previous section and that each edge is made from a line-pinboard-object
.
(defun node-children (node)
(when (< node 16)
(list (* node 2)
(1+ (* node 2)))))
(contain
(make-instance
'graph-pane
:roots '(1)
:children-function 'node-children)
:best-width 300 :best-height 400)
Figure 9.5 A graph pane with pinboard object nodes
As mentioned before, pinboard-layouts can just as easily display ordinary panes inside themselves, and so the graph-pane provides the ability to specify the class used to represent the nodes. As an example, here is a graph-pane with the nodes made from push-buttons.
(contain
(make-instance
'graph-pane
:roots '(1)
:children-function 'node-children
:node-pinboard-class 'push-button)
:best-width 300 :best-height 400)
Figure 9.6 A graph pane with push-button nodes