Here is a simple example of interface definition done with define-interface:
(define-interface demo ()
()
(:panes
(page-up push-button
:text "Page Up")
(page-down push-button
:text "Page Down")
(open-file push-button
:text "Open File"))
(:layouts
(row-of-buttons row-layout
'(page-up page-down open-file)))
(:default-initargs :title "Demo"))
An instance of this interface can be displayed as follows:
(display (make-instance 'demo))
At the moment the buttons do nothing, but they will eventually do the following:
Figure 11.1 A demonstration of a CAPI interface
Later on, we will specify callbacks for these buttons to provide this functionality.
The (:default-initargs :title "Demo")
part at the end is necessary to give the interface a title. If no title is given, the default name is "Untitled CAPI Interface".
Note: the define-interface form could be generated by the Interface Builder tool in the LispWorks IDE. See the LispWorks IDE User Guide for details. As the interface becomes more complex, you will find it more convenient to edit the definition by hand.
Examine the define-interface form to see how this interface was built. The first part of this form is shown below:
(define-interface demo ()
()
This part of the macro is identical to defclass
— you provide:
The interesting part of the define-interface form occurs after these defclass
-like preliminaries, where it lists the elements that define the interface's appearance. Here is the :panes
part of the definition:
(:panes
(page-up push-button
:text "Page Up")
(page-down push-button
:text "Page Down")
(open-file push-button
:text "Open File"))
Two arguments — the name and the class — are required to produce a pane. You can supply slot values as you would for any CLOS object.
The :panes
list specifies panes that are made when the interface is made. However it does not specify which panes are displayed: that is controlled dynamically by the interface's layout which may contain all, some or none of the panes in the :panes
list. The interface may also display other panes that are made explicitly, though this is less common.
Here is the :layouts
part of the definition:
(:layouts
(row-of-buttons row-layout
'(page-up page-down open-file)))
Three arguments — the name, the class, and any child layouts — are required to produce a layout. Notice how the children of the layout are specified by using their component names.
The interface information supplied in this section is a series of specifications for panes and layouts. It could also specify menus and a menu bar. In this case, three buttons are defined. The layout chosen is a row layout, which displays the buttons side by side at the top of the pane.
CAPI User Guide and Reference Manual (Windows version) - 3 Aug 2017