Quick reference of some of the Object structures used by Precognition:

/* All 'objects' are derrived from this structrure, i.e. they have
** an 'isa' pointer as their first member.  The 'isa' pointer points
** to the 'PClass' structure for the object.
**
** NOTE: PObjects do NOT need to have an PObjectName associated with
** them.  This field is used by the Application builder to attach
** a variable name.
*/

typedef struct PObject
   {
      const PClass *isa;  /* Points to the objects 'PClass' structure. */
      char  *PObjectName; /* Used by interface builder. */
   } PObject;



typedef struct GraphicObject
   {
      const PClass   *isa;
      char    *PObjectName;
      void    *Next;        /* Points to next GraphicObject in chain. */
   } GraphicObject;


typedef struct Interactor
   {
      const PClass             *isa;
      char              *PObjectName;
      void              *Next;   /* Points to next Interactor in chain. */
      struct pcgWindow  *IaWindow; /* window where this interactor lives. */
      Point              Location;
      Point              Size;
   } Interactor;


  /*
   ** NOTE: Interactor & pcgWindow have circular dependencies.
   ** Each contain pointers to the other.
   */

   /*
   ** NOTE: Do *NOT* set these fields directly!  Instead, use the
   ** supplied methods 'SetInteractorWindow()', 'SetLocation()',
   ** 'SetSize()' etc.  There is more to setting the window/location/size
   ** of a interactor than simply assigning to these fields.
   */

typedef Interactor Valuator; /* same structure definition */

typedef struct pcgWindow
   {
      PClass                 *isa;
      char                  *PObjectName;
      void                  *Next;      /* Not used. */
      struct pcgWindow      *IaWindow;  /* not used. */
      Point                  Location;
      Point                  Size;
      struct NewWindow       NewWindow;
      struct Window         *Window;
      ULONG                  IDCMPFlags;
      struct Interactor     *FirstInteractor;
      struct GraphicObject  *FirstGraphic;
      struct MsgPort        *SharedUserPort;
      Menu                  *MenuStrip;
   } pcgWindow;

/*
   The field 'IDCMPFlags' maintains the current IDCMP values.  The field
   NewWindow.IDCMPFlags contains the bare minimum IDCMP values that the
   window must have.  (Other IDCMP flags are set automagically by adding
   Interactors to the window.

   NOTE: If SharedUserPort is not NULL, it is assumed to be a pointer to
   a valid MessagePort structure, and that the window is to use this
   MessagePort as its UserPort instead of creating its own.

   This is useful for having multiple windows sharing one MessagePort.
   (See the Amiga 1.3 RKMs:  Libraries and Devices, Chapter 7, page 171
   for more details on sharing UserPorts.
 */

