[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

by Peter Cherna


[Editor's note: This article assumes the reader is already familar with
several boopsi concepts.  For more information on boopsi, see the article
"Introduction to Boopsi" from the March/April 1991 issue of Amiga Mail.]

Although it is normally considered a "programming sin", in some cases it
is legal to directly manipulate some internal fields of certain boopsi
objects.  For compatibility reasons, a boopsi Image or Gadget object
contains an actual Image or Gadget structure.  To a large degree, a boopsi
Image or Gadget looks like a regular Image or Gadget.  Most fields in
these embedded Image and Gadget structures generally contain information
equivalent to the information in a conventional Image or Gadget (although
not always).  This means that many programs and routines that don't know
about boopsi can still make some use of boopsi Images and Gadgets.  These
objects are instances of the Transparent Base Classes, imageclass and
gadgetclass.

To change an attribute of a boopsi object, you normally invoke a set
method (OM_SET).  The Intuition functions SetAttrs() and SetGadgetAttrs()
invoke this method.  A boopsi class is informed of any attribute change at
that time, allowing it to react to this change.  The reaction can include
validation of the changed attribute, changing other attributes to match,
or informing other objects of the change.  That is the inherent advantage
of a function-access approach to changing attributes.

When using conventional Images and Gadgets, you generally modify the
structure's fields directly.  This operation is very fast.  For such
Images and Gadgets, there is no class that needs to know about the
changes, so there is no problem.  However, this is untrue of boopsi Images
and Gadgets.  Although directly modifying the boopsi object's internal
structure would provide a performance increase over using the boopsi
OM_SET mechanism, altering a boopsi object's internal structure directly
will not give the class the opportunity to react to any structure changes.
This violates the boopsi concept, and therefore cannot be done in general.
In order to provide a balance between the flexibility of function access
and the performance of direct access, the transparent base classes
imageclass and gadgetclass will not depend on being informed of changes to
certain fields in the internal Image and Gadget structures.  This means
that direct subclasses of imageclass or gadgetclass (for example,
frameiclass, sysiclass, propgclass, buttongclass, or any direct subclass
you create) are allowed to poke specific fields.  Indirect subclasses of
imageclass or gadgetclass (for example, subclasses of propgclass,
frameiclass, or other indirect subclasses you create) may not poke those
fields, since their parent classes may depend on hearing about changes to
these fields, which the SetAttrs() call (or similar function) provides.

For images, the following Image structure fields are the only fields that
may be poked by image classes whose immediate superclass is imageclass:

        LeftEdge
        TopEdge
        Width
        Height
        ImageData
        PlanePick
        PlaneOnOff

For gadgets, the following Gadget structure fields are the only fields
that may be poked by gadget classes whose immediate superclass is
gadgetclass:

        LeftEdge
        TopEdge
        Width
        Height
        Flags
        Activation
        GadgetType
        GadgetRender
        SelectRender
        GadgetText
        SpecialInfo

In all cases, the direct subclass must take care to maintain sensible
values for these fields.

Under no circumstances may an indirect subclass poke one of these fields,
even if the subclass knows the superclasses do not depend on notification
for this field.  This is the only way to preserve  the possibility for
future enhancements to that superclass.