#ifndef __INC_POS_PINTUI_GCLASS_H
#define __INC_POS_PINTUI_GCLASS_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>GClass.h<<   01 Mar 1997    14:53:21 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PINTUI_ICLASS_H
#include <pIntui/IClass.h>
#endif


/*----------------------------------
-----------------------------------*/
struct pOS_GadgetMethod
{
  ULONG  imth_Method; /* (enum pOS_IntuiClassMethods) und (pOS_GadgetClassMethods) */

  union {
    UBYTE imth_Reserved[32];   /* 24 Bytes used, 8 Bytes reserved */

    struct { /* ICLMTH_New */
            ULONG                imnw_Pad;
      const struct pOS_TagItem  *imnw_Tags;
    } imth_New;

    /* ICLMTH_Dispose */

    struct { /* ICLMTH_Set */
      const struct pOS_IClassInfo *imst_Info; /* NULL => without refresh */
      const struct pOS_TagItem    *imst_Tags;
    } imth_Set;

    struct { /* ICLMTH_Notify */
      const struct pOS_IClassInfo *imny_Info;
      const struct pOS_TagItem    *imny_Tags;
            ULONG                  imny_Flags;
    } imth_Notify;

    struct { /* ICLMTH_Update */
      const struct pOS_IClassInfo *imud_Info;
      const struct pOS_TagItem    *imud_Tags;
            ULONG                  imud_Flags;
    } imth_Update;

    struct { /* ICLMTH_Get */
            ULONG    imgt_ID;
            ULONG   *imgt_Variable;
    } imth_Get;

/********************************************/

    struct { /* GCLMTH_HitTest */
      const struct pOS_IClassInfo *imht_Info;
            ULONG                  imht_Pad;      /* damit Mouse mit GoActive... übereinstimmt */
      const struct pOS_Point      *imht_RMouse;   /* relativ zum Gadget */
      const struct pOS_Point      *imht_AMouse;   /* absolut */
            struct pOS_Gadget     *imht_HitGadget;
            ULONG                  imht_Result;   /* => Returncode von pOS_DoIMethodA()
                                                  ** wird von pOS_GadgetHitTest gesetzt
                                                  */
    } imth_HitTest;


    struct { /* GCLMTH_Render */
      const struct pOS_IClassInfo *imre_Info;
            ULONG                  imre_Type;     /* (enum pOS_GadgetClassRender) */
            ULONG                  imre_NewTick;  /* wird bei GCLMTHRE_TickFrame verwendet */
            ULONG                  imre_OldTick;  /* Anzahl der IntuiTicks*100 => 1/1000 sec. */
    } imth_Render;


    struct { /* GCLMTH_GoActive */
      const struct pOS_IClassInfo *imac_Info;
      const struct pOS_InputEvent *imac_IE;     /* NULL => imac_RMouse/imac_AMouse sind nicht gültig */
      const struct pOS_Point      *imac_RMouse;
      const struct pOS_Point      *imac_AMouse;
            ULONG                  imac_ResCode;  /* => im_Code  */
            struct pOS_Gadget     *imac_NextActGad; /* zu aktivierendes Gadget */
    } imth_GoActive;


    struct { /* GCLMTH_HandleInput */
      const struct pOS_IClassInfo *imhi_Info;
      const struct pOS_InputEvent *imhi_IE;
      const struct pOS_Point      *imhi_RMouse;
      const struct pOS_Point      *imhi_AMouse;
            ULONG                  imhi_ResCode;  /* => im_Code  */
            struct pOS_Gadget     *imhi_NextActGad;
    } imth_HandleInput;


    struct { /* GCLMTH_GoInactive */
      const struct pOS_IClassInfo *imia_Info;
            UBYTE                  imia_Pad[12];
            ULONG                  imia_ResCode;  /* => im_Code  */
    } imth_GoInactive;


    struct { /* GCLMTH_Abort */
      const struct pOS_IClassInfo *imab_Info;
            UBYTE                  imab_Pad[12];
            ULONG                  imab_ResCode;  /* => im_Code  */
            struct pOS_Gadget     *imab_NextActGad;
    } imth_Abort;


    struct { /* GCLMTH_Add */
      const struct pOS_IClassInfo *imad_Info;
    } imth_Add;


    struct { /* GCLMTH_Rem */
      const struct pOS_IClassInfo *imrm_Info;
    } imth_Rem;


    struct { /* GCLMTH_Layout */
      const struct pOS_IClassInfo   *imly_Info;
            ULONG                    imly_Flags;   /* (enum pOS_GadgetLayoutFlags) */
      const struct pOS_IBox         *imly_IBox;
            struct pOS_LayoutDamage *imly_LD;
    } imth_Layout;


    struct { /* GCLMTH_GetIBox */
      const struct pOS_DrawInfo  *imgb_DrawInfo;
            struct pOS_RastPort  *imgb_RastPort;
            struct pOS_IBox      *imgb_MinIBox;
            struct pOS_IBox      *imgb_MaxIBox;
    } imth_GetIBox;


    struct { /* GCLMTH_Help */
      const struct pOS_IClassInfo *imhp_Info;
            CHAR                  *imhp_String;
      const struct pOS_Point      *imhp_RMouse;
      const struct pOS_Point      *imhp_AMouse;
            UWORD                  imhp_StringSize;
            UWORD                  imhp_Level;      /* 0,1,2... */
    } imth_Help;


    struct { /* GCLMTH_Msg */
      const struct pOS_IClassInfo   *immg_Info;
            struct pOS_IntuiMessage *immg_Msg;
    } imth_Msg;


    struct { /* GCLMTH_WinBorder */
      const struct pOS_IClassInfo   *imwb_Info;
            struct pOS_Region       *imwb_Region;
    } imth_WBor;


    struct { /* GCLMTH_BeginDrag */
      const struct pOS_IClassInfo   *imbd_Info;
      const struct pOS_InputEvent   *imbd_IE;
      const struct pOS_Point        *imbd_RMouse;
      const struct pOS_Point        *imbd_AMouse;
            struct pOS_Drag         *imbd_Result; /* wird vom Handler erzeugt und
                                                  ** in GCLMTH_EndDrag gelöscht.
                                                  */
            struct pOS_Point        *imbd_Offset; /* PixelOffset, default={0,0} */
    } imth_BDrag;


    struct { /* GCLMTH_EndDrag */
            UBYTE             imed_Pad[16];
            struct pOS_Drag  *imed_Drag;
    } imth_EDrag;


    struct { /* GCLMTH_DropTest */
      const struct pOS_IClassInfo *imdt_Info;
            ULONG                  imdt_Pad;
      const struct pOS_Point      *imdt_RMouse;   /* relativ zum Gadget */
      const struct pOS_Point      *imdt_AMouse;   /* absolut */
            struct pOS_Gadget     *imdt_HitGadget;
            ULONG                  imdt_Result;  /* => Returncode von pOS_DoIMethodA()
                                                 ** wird von pOS_GadgetDropTest gesetzt
                                                 ** siehe GCLMTHR_DropHit */
    } imth_DropTest;



    struct { /* GCLMTH_ActiveDrop */
      const struct pOS_IClassInfo *imda_Info;
      const struct pOS_InputEvent *imda_IE;
      const struct pOS_Point      *imda_RMouse;
      const struct pOS_Point      *imda_AMouse;
            struct pOS_DragList   *imda_DragList;
    } imth_ActiveDrop;


    struct { /* GCLMTH_HandleDrop */
      const struct pOS_IClassInfo *imhd_Info;
      const struct pOS_InputEvent *imhd_IE;
      const struct pOS_Point      *imhd_RMouse;
      const struct pOS_Point      *imhd_AMouse;
            struct pOS_DragList   *imhd_DragList;
    } imth_HandleDrop;


    struct { /* GCLMTH_InactiveDrop */
      const struct pOS_IClassInfo *imid_Info;
            UBYTE                  imid_Pad[12];
            struct pOS_DragList   *imid_DragList;
    } imth_InactiveDrop;


    struct { /* GCLMTH_AbortDrop */
      const struct pOS_IClassInfo *imbb_Info;
            UBYTE                  imbb_Pad[12];
            struct pOS_DragList   *imbb_DragList;
    } imth_AbortDrop;


    struct { /* GCLMTH_GetQuickDropObject */
      const    struct pOS_IEDragDrop *imgqo_IEDD;
               UBYTE                  imgqo_Pad[12];
      __ARID__ struct pOS_DataType   *imgqo_Result;
    } imth_GetQObj;


    struct { /* GCLMTH_GetDropObject */
      const    struct pOS_IEDragDrop *imgo_IEDD;
               UBYTE                  imgo_Pad[12];
      __ARID__ struct pOS_DataType   *imgo_Result;
    } imth_GetObj;


    struct { /* GCLMTH_SetDropObject */
      const struct pOS_IClassInfo *imso_Info;    /* NULL => without refresh */
      const struct pOS_InputEvent *imso_IE;      /* NULL => ignore */
      const struct pOS_IEDragDrop *imso_IEDD;
            UBYTE                  imso_Pad[4];
      const struct pOS_DataType   *imso_Object;
    } imth_SetObj;


    struct { /* GCLMTH_HelpTest */
      const struct pOS_IClassInfo *imhs_Info;
            ULONG                  imhs_Pad;
      const struct pOS_Point      *imhs_RMouse;   /* relativ zum Gadget */
      const struct pOS_Point      *imhs_AMouse;   /* absolut */
            struct pOS_Gadget     *imhs_HitGadget;
            ULONG                  imhs_Result;
    } imth_HelpTest;


    struct { /* GCLMTH_DragTest */
      const struct pOS_IClassInfo *imdt_Info;
            ULONG                  imdt_Pad;
      const struct pOS_Point      *imdt_RMouse;   /* relativ zum Gadget */
      const struct pOS_Point      *imdt_AMouse;   /* absolut */
            struct pOS_Gadget     *imdt_HitGadget;
            ULONG                  imdt_Result;
    } imth_DragTest;


    struct { /* GCLMTH_PopUp */
      const struct pOS_IClassInfo *impo_Info;
            SLONG                  impo_Mode;  /* 1==start, 0==end, -1==abort */
    } imth_PopUp;


  } imth_U;

};


enum pOS_GadgetClassRender /** imre_Type **/
{
  GCLMTHRE_Update=1,    /* 1 incremental update */
  GCLMTHRE_Redraw,      /*   redraw gadget  */
  GCLMTHRE_Toggle,      /*   toggle highlight */
  GCLMTHRE_TickFrame,   /*   next Frame# */
  GCLMTHRE_ToggleDrop,  /* 5 toggle drop-highlight */
  GCLMTHRE_ToggleFocus  /*   toggle focus-highlight */
};







enum pOS_GadgetClassResult      /* Return-Wert vom Gadget-Dispatcher */
{
  GCLMTHR_None=0,

  GCLMTHR_Activate=     0x0001, /* Zeigt an, daß das Gadget aktiv sein soll.
                                ** Wird bei GCLMTH_GoActive oder GCLMTH_HandleInput
                                ** das Bit gelöscht, wird pIntui keine Events ans
                                ** Gadget schicken.
                                */
  GCLMTHR_AbortIE=      0x0002, /* InputEvent wird nicht weitergereicht,
                                ** IE bleibt gültig. Dies hat zur Folge,
                                ** alle nachkommenden Handler diesen Event
                                ** nie bekommen.
                                */
  GCLMTHR_GadgetHit=    0x0004, /* wird in GCLMTH_HitTest zurückgegeben,
                                ** fall der Mausklick im Gadget liegt und weiter
                                ** bearbeitet werden soll. pIntui wird dann ein
                                ** GCLMTH_GoActive auslösen, auf das das Gadget
                                ** dann Aggieren kann.
                                */
  GCLMTHR_InputDone=    0x0004, /* InputHandle beenden.
                                ** Dieses Bit hat zur Folge, daß ein IECLASS_GADGETUP
                                ** Event ausgelöst wird. Bei einem GACT_RelVerify-Gadget
                                ** wird mittels GCLMTHR_Activate entschieden, ob ein
                                ** IECLASS_GADGETUP erzeugt wird. Ist GCLMTHR_Activate
                                ** nicht gesetzt, verliert das Gadget immer den
                                ** Eingabefocus (GACT_ActiveGadget wird gelöscht).
                                */
  GCLMTHR_DropHit=      0x0004, /* Wird in GCLMTH_DropTest zurückgegeben.
                                ** Das Gadget signalisiert hiermit, daß ein Drag-
                                ** Object abgelegt werden kann.
                                */
  GCLMTHR_DropDone=     0x0004, /* InputHandle beenden.
                                ** Der User hat das Drag-Objekt abgelegt.
                                */

  GCLMTHR_DragHit=      0x0008, /* wird in GCLMTH_DragTest zurückgegeben,
                                ** falls ein Drag möglich ist.
                                ** Ist das Bit gesetzt, so wird gegb. ein
                                ** GCLMTH_BeginDrag ausgelöst.
                                */
  GCLMTHR_HelpHit=      0x0004, /* wird in GCLMTH_HelpTest zurückgegeben */


  GCLMTHR_NextActive=   0x0010,
  GCLMTHR_PrevActive=   0x0020,

  GCLMTHR_DoWRefresh=   0x0040, /* Win-Refresh auslösen */
  GCLMTHR_DoGRefresh=   0x0080, /* Gadget-Refresh auslösen */
  GCLMTHR_UpdateGadget= 0x0100, /* Gadget wurde verändert (IECLASS_UPDATEGADGET) */
  GCLMTHR_GadgetAbort=  0x0200, /* */


/****** GCLMTH_Msg *****/
  GCLMTHR_NoneMsg = 0x00,       /* Msg wurde nicht bearbeitet */
  GCLMTHR_DoneMsg = 0x01,       /* Msg ist bearbeitet und darf nicht an andere
                                ** Gadgets weitergereicht werden.
                                */
  GCLMTHR_NoUsed  = 0x40,       /* Msg wurde vom Erzeugen-Gadget erkannt, konnte
                                ** aber nicht verwendet werden. Damit eine Msg nicht
                                ** an weitere Gadget zur Bearbeitung weitergereicht
                                ** wird, dient _NoUsed als Marke. (dient der verkürzten Suche)
                                */
  GCLMTHR_NewMsg  = 0x80        /* Msg erneut verschicken. Die Msg wurde modifiziert
                                ** und soll abermals als IDCMP-Message verschickt
                                ** werden.
                                */

};




enum pOS_GadgetClassMethods
{
  GCLMTH_Dummy=  0x01,

  GCLMTH_HitTest,       /* Prüft, ob ein Gadgetklick im Gadget liegt */
  GCLMTH_Render,        /* Gadget zeichnen (je noch Modus) */
  GCLMTH_GoActive,      /* Gadget bekommt den Eingabefokus */
  GCLMTH_HandleInput,   /*5 Gadget bekommt einen Inputevent */
  GCLMTH_GoInactive,    /* Dem Gadget wird der Eingabefokus entzogen. */
  GCLMTH_Help,          /* Help-String wird erstellt */
  GCLMTH_Abort,         /* Der User hat die rechte Maustaste gerückt.
                        ** Aktuell laufende Gadget-Aktion abbrechnen.
                        ** Das Gadget verliert den Eingabefokus.
                        */
  GCLMTH_Add,           /* Gadget wird einem Window zugeordnet =>
                        ** Info->ici_Window ist gültig gesetzt.
                        ** siehe GFLG_UseMthAddRem
                        */
  GCLMTH_Rem,           /*10 Gadget wird aus dem Window entfernt */
  GCLMTH_Layout,        /* Gadgets werden vom System-Layouter ausgerichtet.
                        ** Alle Members der Gadget-Group werden immer über
                        ** GCLMTH_Layout ausgerichtet.
                        ** siehe GFLG_UseMthLayout
                        */
  GCLMTH_GetIBox,       /* Ermittlung der Größe vom Gadget */
  GCLMTH_Msg,           /* Zweite Ebene der Nachrichtenauswertung.
                        ** Mittels pOS_SysIMessage() gelangen IDCMPs
                        ** zu den Gadgets
                        */
  GCLMTH_WinBorder,     /* Border-Gadgets aus dem Border herausschneiden. */
  GCLMTH_BeginDrag,     /*15 Das Gadget wird aufgefordert ein Drag-Objekt bereit-
                        ** zustellen.
                        */
  GCLMTH_EndDrag,       /* Drag-Objekt löschen */
  GCLMTH_DropTest,      /* Es wird geprüft, ob ein Drag-Objekt abgelegt (drop)
                        ** werden kann.
                        */
  GCLMTH_ActiveDrop,    /* Im Gadget kann ein Objekt abgelegt werden. */
  GCLMTH_HandleDrop,    /* War das Gadget mit GCLMTH_ActiveDrop einverstanden,
                        ** so werden alle InputEvents im Drop-Vorgang ans Gadget
                        ** weitergegeben.
                        */
  GCLMTH_InactiveDrop,  /* Das Gadget muß ab jetzt nicht mehr aus Drop achten. */
  GCLMTH_AbortDrop,     /* Drop-Vorgang wurde abgebrochen => rechte Maustaste */
  GCLMTH_GetQuickDropObject,/* DataType-Objekt aus input.task erzeugen
                        (kann verweigert werden)
                        */
  GCLMTH_GetDropObject, /* DataType-Objekt aus dem Anwerder-Prozeß heraus erzeugen. */

  GCLMTH_SetDropObject, /* Return von GCLMTHR_InputDone bedeutet, Drop hat
                        ** funktioniert.
                        */
  GCLMTH_HelpTest,      /* Prüft, ob die Maus im Gadget liegt, um ein Bubble zu erzeugen */
  GCLMTH_DragTest,      /* */
  GCLMTH_PopUp
};



enum pOS_GadgetLayoutFlags
{
  GCLMTHLYF_ReSize   = 0x0001, /* Window-Resize */
  GCLMTHLYF_AddGList = 0x0002, /* pOS_AddGadget() or pOS_AddGadgets() */

  GCLMTHLYF_Mask     = 0x000f, /* Work-Type-Mask */

  GCLMTHLYF_LD       = 0x0100, /* perform imly_LD (zuvor wird pOS_LockLayerInfo() aufgerufen)*/
  GCLMTHLYF_SizeAbort= 0x0200  /* Bearbeitung wird beim ReSize sofort abgebrochen */
};

#endif
