The Object and Slots submenus allow you to perform the standard action commands on either the object being inspected, or the slot values selected in the main list. The commands available are largely identical in both menus, and so are described together in this section.
The standard action commands are available in both the Object and Slots menus, allowing you to perform a variety of operations on the current object or any items selected in the list. For full details of the standard action commands, see Performing operations on selected objects.
Consider the following example, where a closure is defined:
(let ((test-button (make-instance 'capi:button)))
(defun is-button-enabled ()
(capi:button-enabled test-button)))
This has defined the function is-button-enabled
, which is a closure over the variable test-button
, where the value of test-button
is an instance of the capi:button
class.
The Slots > Attributes submenu allows you to apply the standard action commands (described in Operations available) to the attributes rather than the values of those attributes.
For example, the Slots > Attributes > Inspect command causes the Inspector to view the attributes, rather than the values, of the selected slots. This is useful when inspecting hash tables or lists, since the attributes (keys) might be composite objects themselves.
The Slots > Trace submenu provides four commands. When inspecting a CLOS object, code which accesses the selected slot may be traced using these commands.
Break on Access
causes a break to the debugger if the slot is accessed for read or write, either by a defined accessor or by slot-value
.
Break on Read
causes a break to the debugger if the slot is accessed for read, either by a defined accessor or by slot-value
.
Break on Write
causes a break to the debugger if the slot is accessed for write, either by a defined accessor or by slot-value
.
Untrace turns off tracing on the selected slot.
The Object > Trace submenu provides the same four options, but these commands control the tracing of all the slots in the object.
As well as examining objects in the Inspector, you can destructively modify the contents of any composite object.
This sort of activity is particularly useful when debugging; you might inspect an object and see that it contains incorrect values. Using the options available you can modify the values in the slots, before continuing execution of a program.
Choose Slots > Set to change the value of any selected slots. A dialog appears into which you can type a new value for the items you have selected. Previously entered values are available via a dropdown in this dialog.
Choose Slots > Paste to paste the contents of the clipboard into the currently selected items.
This example takes you through the process of creating an object, examining its contents, and then modifying the object.
(setq button1 (make-instance 'capi:button))
button-enabled
to find out whether button1
is enabled.
(capi:button-enabled button1)
This returns t
. So we see buttons are enabled by default. The next step is to destructively modify button1
so that it is not enabled, but first we will make the Inspector display a little simpler.
CAPI
and click
OK
.
This changes the process package of the Inspector to the CAPI
package, and the package name disappears from all the slots listed. This makes the display a lot easier to read.
enabled
into the Filter box.Button objects have a large number of slots, and so it is easier to filter out the slots that you do not want to see than to search through the whole list. After applying the filter, only one slot is listed.
enabled
.
A dialog appears into which you can type a new value for the slot enabled
.
Figure 18.5 Entering a new slot value
nil
(or select it from the history) and click on
OK
.
The attributes and values area shows the new value of the enabled
slot.
Alt+P
or
History > Previous
.
(capi:button-enabled button1)
This now returns nil
, as expected.
The next part of this example shows you how you can modify the slots of an object by pasting in the contents of the clipboard. This example shows you how to modify the text
and font
of button1
.
Return
:
"Hello World!"
TEXT
slot of button1
in the Inspector."Hello World!"
string into the text
slot of button1
.
This sets the text
slot of button1
to the string.
Return
:(let ((font (capi:simple-pane-font button1)))
(if font
(gp:find-best-font
button1
(apply 'gp:make-font-description
(append (list :size 30)
(gp:font-description-attributes
(gp:font-description
(capi:simple-pane-font button1))))))
(gp:make-font-description :size 30)))
This form simply calculates a large font object suitable for the button object.
FONT
slot of button1
in the Inspector.font
slot of button1
.
This transfers the button object back into the Listener. As feedback, the string representation of the object is printed in the Listener above the current prompt. The object is automatically transferred to the *
variable so that it can be operated on.
(capi:contain *)
This displays a window containing the button object. Note that the text now reads "Hello World!", as you would expect, and that the font size is larger than the default size size for buttons. Note further that you cannot click on the button; it is not enabled. This is because you modified the setting of the enabled
slot in the earlier part of this example.
You can easily copy objects in the inspector, ready for pasting into other tools.
To copy the inspected object itself use Object > Copy
To copy a slot value use Slots > Copy .
To copy an attribute use Slots > Attributes > Copy .
Similarly you can use Object > Clip , Slots > Clip or Slots > Attributes > Clip to place the object itself, a slot value or an attribute on the Object Clipboard, so that you can conveniently retrieve them later. See The Object Clipboard for details.
LispWorks IDE User Guide (Macintosh version) - 13 Sep 2017