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

Now all you need to do is implement a dispatcher routine.  When the
dispatcher is in operation, Intuition passes method IDs to it.  The
dispatcher will either execute code corresponding to the a method ID (the
code is usually part of the dispatcher) or delegate processing the method
to the superclass (or it can do a little of both).

The following fragment provides an example of what a dispatcher for a
boopsi class looks like (Note that __saveds (Save DS) is used to insure
that register A4 is set up properly for indirect addressing with the SASC
compiler):


   ULONG __saveds dispatchmyTextLabel (Class *cl, Object *o, Msg msg)
   {
       struct localObjData *lod;
       Object *newobj;
       ULONG retval;

       switch (msg->MethodID)
       {
           /* Create a new object */
           case OM_NEW:
               /* Have our superclass create it.  DSM() passes on the
                * message to the superclass, where msg is the structure
                * containing the message specific parameters.
                */
               if (newobj = (Object *) DSM (cl, o, msg))
               {
                   /* Set the attributes */
                   setmyTextLabelAttrs(cl, newobj, (struct opSet *) msg);
               }

               retval = (ULONG) newobj;
               break;

           /* Obtain information on an attribute */
           case OM_GET:
               retval = getmyTextLabelAttrs (cl, o, (struct opGet *) msg);
               break;

           /* Set attributes */
           case OM_UPDATE:
           case OM_SET:
               /* Let the superclass set the attributes that it
                * knows about. */
               retval = DSM (cl, o, msg);

               /* Set the attributes that we care about */
               retval |= setmyTextLabelAttrs (cl, o, (struct opSet *) msg);
               break;

           /* Draw the various states that the image supports */
           case IM_DRAW:
           case IM_DRAWFRAME:
               retval = drawmyTextLabel (cl, o, (struct impDraw *) msg);
               break;

           /* Let the superclass handle everything else */
           default:
               retval = (ULONG) DSM (cl, o, msg);
               break;
       }

       return (retval);
   }