| Allegro CL version 8.2 Unrevised from 8.1 to 8.2. 8.1 version | ||||||||||
Arguments: class-name &rest properties
7.0 release note: the option called :editor-mode in
earlier releases is now called :editor-type.
Defines a set of properties for a class. A property is an attribute of an object that defines a high-level means of accessing the attribute value. Properties are largely used by the inspector for editing objects that have properties, though they are useful programmatically as well mostly because a property defines how to cause any appropriate side effects when the property value is modified. A property for a CLOS object is typically based on a slot of the object, but properties are generally independent of any internal representation and can be defined for any lisp type. Properties are defined with define-property. The various property initargs are described on that page.
As an example, below is a part of the defproperties expression for the
existing control class header-control. Here the properties
are defined with define-property. (To make a defproperties form less
verbose, each occurrence of the symbol define-property within the form may
be excluded if desired, as shown is the second form.)
(defproperties header-control (define-property available :type boolean :editor-type :toggle) (define-property header-width :type positive-integer :reader default-header-width :writer (setf default-header-width) :editor-type :short-expression) (define-property header-justification :type justification :editor-type :multiple-choice :reader default-header-justification :writer (setf default-header-justification) :choices cg::justification-values) (define-property button-style :type boolean :editor-type :toggle :remake t) (define-property on-range-change :type event-handler :editor-type :function) (define-property on-set-focus :type event-handler :editor-type :function) ) ;; Here is the shorter form with define-property left out: (defproperties header-control (available :type boolean :editor-type :toggle) (header-width :type positive-integer :reader default-header-width :writer (setf default-header-width) :editor-type :short-expression) (header-justification :type justification :editor-type :multiple-choice :reader default-header-justification :writer (setf default-header-justification) :choices cg::justification-values) (button-style :type boolean :editor-type :toggle :remake t) (on-range-change :type event-handler :editor-type :function) (on-set-focus :type event-handler :editor-type :function) )
Reader and writer examples. This includes examples of calls to defcomponent.
;; This example shows the typical case of defining properties
;; for a standard-class, where the accessor methods that
;; are automatically created for the size slot are also
;; used by default as the reader and writer of the associated
;; size property. This technique of sharing
;; the name is recommended wherever it is feasible.
(defcomponent foo ()
((size :initarg :size
:initform nil
:accessor size))
(:default-initargs
:size :big)
(:properties
(size
:help-string "How big it is."
:type (member :big :medium :little nil)
:editor-type :multiple-choice
:choices '(:big :medium :little))))
(setq f (make-instance 'foo :size :little))
(inspect f)
;; ------------------------------------------------------
;; This example defines a property that computes its
;; value each time it is read rather than reading a
;; cached value from a slot.
(defcomponent yellow-item-list (single-item-list)
()
(:default-initargs
:background-color yellow)
(:properties
(how-many
:read-only t)))
(defmethod how-many ((control yellow-item-list))
(length (range control)))
(setq c (make-instance 'yellow-item-list
:range '(a b c d)))
(inspect c)
;; -----------------------------------------------------------
;; This example does the same thing for an existing class, using
;; defproperties instead of defcomponent
(defproperties single-item-list
(define-property how-many
:read-only t))
(defmethod how-many ((control single-item-list))
(length (range control)))
(setq d (make-instance 'single-item-list
:range '(a b c d e)))
(inspect d)
;; -----------------------------------------------------------
;; This example demonstrates defining a property
;; on a non-standard class, using an arbitrary place
;; to hold the property values (since there is
;; no slot for the property).
(defproperties integer
(define-property roundness))
(defparameter *integer-roundness* (make-hash-table))
(defmethod roundness ((integer integer))
(gethash integer *integer-roundness* :unknown))
(defmethod (setf roundness)(value (integer integer))
(setf (gethash integer *integer-roundness*) value))
(setf (roundness 6) :quite)
(inspect 5)
(inspect 6)
If the inspector should treat some instances of a class differently than other instances, that can be achieved by adding methods to one or more of the following generic functions: property-reader, property-writer, property-type, property-editor-type, property-choices, property-help-string, property-remake, property-read-only, and property-hidden.
Copyright (c) 1998-2016, Franz Inc. Oakland, CA., USA. All rights reserved.
This page was not revised from the 8.1 page.
Created 2010.1.21.
| Allegro CL version 8.2 Unrevised from 8.1 to 8.2. 8.1 version | ||||||||||