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

 $AUT Holger Burkarth
 $DAT >>gadtools_protos.c<<   14 Mar 1997    10:18:54 - (C) ProDAD
*******************************************************************/
#pragma -

#define NOMYDEBUG

#ifndef  EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef  INTUITION_INTUITION_H
#include <intuition/intuition.h>
#endif
#ifndef  UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif
#ifndef  LIBRARIES_GADTOOLS_H
#include <libraries/gadtools.h>
#endif

#include <pIntui/Tags.h>
#include <pScreen/Screen.h>
#include <pProto/pExec2.h>
#include <pProto/pGfx2.h>
#include <pProto/pLayer2.h>
#include <pProto/pIntui2.h>
#include <pProto/pGadget2.h>
#include <pProto/pUtil2.h>



#ifdef __cplusplus
extern "C" {
#endif

/*----------------------------------
-----------------------------------*/
struct Gadget *CreateGadgetA(ULONG kind, struct Gadget *gad,struct NewGadget *ng,struct TagItem *taglist)
  {
    pOS_Gadget *Gadget=0;
    pOS_TagItem Tags1[]={
      ICLTAG_Left,     ng->ng_LeftEdge,           /* 0 */
      ICLTAG_Top,      ng->ng_TopEdge,            /* 1 */
      ICLTAG_Width,    ng->ng_Width,              /* 2 */
      ICLTAG_Height,   ng->ng_Height,             /* 3 */
      ICLTAG_DrawInfo, (ULONG)ng->ng_VisualInfo,
      ICLTAG_ID,       (ULONG)ng->ng_GadgetID,
      TAG_MORE,        (ULONG)taglist
    };


    switch(kind) {
      case BUTTON_KIND:
        Gadget=(pOS_Gadget*)pOS_NewIObject(NULL,"buttongad.class",0,
          IOBJTAG_String,   (ULONG)ng->ng_GadgetText,
          ICLTAG_RelVerify, TRUE,
          TAG_MORE, (ULONG)Tags1);
        break;

      case INTEGER_KIND:
      case STRING_KIND:
        if(Tags1[3].ti_Data==0) {
          struct pOS_DrawInfo *Dri=(struct pOS_DrawInfo*)ng->ng_VisualInfo;
          Tags1[3].ti_Data=Dri->dri_StdHeight+2;
        }
        Gadget=(pOS_Gadget*)pOS_NewIObject(NULL,"strgad.class",0,
          TAG_MORE, (ULONG)Tags1);
        break;
    }

    if(Gadget) gad->U.NextGadget=(APTR)Gadget;
    return((APTR)Gadget);
  }

struct Gadget *CreateGadget(ULONG kind,struct Gadget *gad,struct NewGadget *ng,Tag tag1,...)
  { return( CreateGadgetA(kind,gad,ng,(TagItem*)&tag1));}

void FreeGadgets( struct Gadget *gad )
  {
    struct Gadget *Next;
    for(; gad; gad=Next) {
      Next=gad->U.NextGadget;
      pOS_DisposeIObject(gad);
    }
  }

void GT_SetGadgetAttrsA(struct Gadget *gad,struct Window *win,struct Requester*,struct TagItem *taglist)
  { pOS_SetGadgetAttrsA((APTR)win,(APTR)gad,(APTR)taglist) }

void GT_SetGadgetAttrs(struct Gadget *gad,struct Window *win,struct Requester*,Tag tag1,...)
  { pOS_SetGadgetAttrsA((APTR)win,(APTR)gad,(APTR)&tag1) }

/*----------------------------------
-----------------------------------*/
struct Menu *CreateMenusA(struct NewMenu *newmenu,APTR dri,struct TagItem *taglist)
  {
    struct NewMenu *NM;
    for(NM=newmenu; NM->nm_Type; ++NM) {
      NM->nm_Tags=NULL;
      if(NM->nm_Label==(CHAR*)~0) {
        UBYTE Type =NM->nm_Type & ~(NM_MENUDISABLED | NM_ITEMDISABLED);
        UBYTE Flags=NM->nm_Type & (NM_MENUDISABLED | NM_ITEMDISABLED);
        if(Type==MENUTAGTYP_Item) NM->nm_Type=MENUTAGTYP_ItemBar;
        if(Type==MENUTAGTYP_Sub)  NM->nm_Type=MENUTAGTYP_SubBar;

        if(Flags & (NM_MENUDISABLED | NM_ITEMDISABLED))
            NM->nm_Flags |= MENUITF_Disabled;
      }
    }
    return((APTR)pOS_CreateMenuTagA((APTR)dri,(APTR)newmenu,0));
  }

struct Menu *CreateMenus(struct NewMenu *newmenu,APTR dri,Tag tag1, ... )
  { return( CreateMenusA(newmenu,dri,(struct TagItem*)&tag1));}

void FreeMenus( struct Menu *menu )
  { pOS_DeleteMenu((APTR)menu); }

BOOL LayoutMenusA( struct Menu *firstmenu, APTR vi, struct TagItem *taglist )
{ pOS_PreLayoutMenu((APTR)firstmenu,vi); return(TRUE);}

BOOL LayoutMenus( struct Menu *firstmenu, APTR vi, Tag tag1, ... )
  { return( LayoutMenusA(firstmenu,vi,(APTR)&tag1));}

struct IntuiMessage *GT_GetIMsg( struct MsgPort *iport )
  {
    return( (struct IntuiMessage*)pOS_GetMsg((APTR)iport));
  }

void GT_ReplyIMsg( struct IntuiMessage *imsg )
  {
    struct IntuiMessage *Msg=(struct IntuiMessage*)imsg;

    if(!(Msg->Class==IDCMP_NEWSIZE || Msg->Class==IDCMP_CHANGEWINDOW || Msg->Class==IDCMP_REFRESHWINDOW))
    {
      if(pOS_SysIMessage((struct pOS_IntuiMessage*)Msg)) Msg=NULL;
    }
    if(Msg) pOS_ReplyMsg((APTR)imsg);
  }

void GT_RefreshWindow( struct Window *win, struct Requester *req )
  { pOS_RefreshWindowFrame((APTR)win); }

void GT_BeginRefresh( struct Window *win )
  {
    pOS_BeginRefresh((APTR)win,NULL);
  }

void GT_EndRefresh(struct Window *win,long complete )
  {
    if(complete) pOS_RefreshGadgets((struct pOS_Window*)win,NULL,~0);
    pOS_EndRefresh((APTR)win,complete);
  }

struct Gadget *CreateContext(struct Gadget **glistptr)
{
  struct Gadget *Gad;
  Gad=(struct Gadget*)pOS_NewIObjectA(NULL,"gadget.class",0,NULL);
  *glistptr=Gad;
  return(Gad);
}

void DrawBevelBoxA(struct RastPort *rport,long left,long top,long width,long height,struct TagItem *taglist)
  {
    pOS_Rectangle Rect={left,top,left+width-1,top+height-1};
    struct pOS_DrawInfo* Dri=(struct pOS_DrawInfo*)pOS_FindTagData(GT_VisualInfo,(struct pOS_TagItem*)taglist,NULL);
    ULONG Type=pOS_FindTagData(GTBB_Recessed,(struct pOS_TagItem*)taglist,0);
    if(Type) Type=GADBORTYP_BevelDownBox;
    else     Type=GADBORTYP_BevelUpBox;

    pOS_DrawBorderBox((struct pOS_RastPort*)rport,Dri,Type,&Rect);
  }


void DrawBevelBox(struct RastPort *rport,long left,long top,long width,long height,Tag tag1,...)
  { DrawBevelBoxA(rport,left,top,width,height,(struct TagItem*)&tag1); }

APTR GetVisualInfoA( struct Screen *screen, struct TagItem *taglist )
  { return((APTR) ((pOS_Screen*)screen)->scr_DrawInfo );}

APTR GetVisualInfo( struct Screen *screen, Tag tag1, ... )
  { return((APTR) ((pOS_Screen*)screen)->scr_DrawInfo );}

void FreeVisualInfo( APTR vi )
  {}

LONG GT_GetGadgetAttrsA(struct Gadget *gad,struct Window *win,struct Requester*,struct TagItem *taglist)
  { return( pOS_GetGadgetAttrA((APTR)win,(APTR)gad,(APTR)taglist) ); }

LONG GT_GetGadgetAttrs(struct Gadget *gad,struct Window *win,struct Requester*,Tag tag1,...)
  { return( GT_GetGadgetAttrsA(gad,win,NULL,(struct TagItem*)&tag1));}










#ifdef __IGNORE_NOT_SUPPORTED__

BOOL LayoutMenuItemsA( struct MenuItem *firstitem, APTR vi,struct TagItem *taglist )
{return(0);}
BOOL LayoutMenuItems( struct MenuItem *firstitem, APTR vi, Tag tag1, ... )
{return(0);}
struct IntuiMessage *GT_FilterIMsg( struct IntuiMessage *imsg )
{return(0);}
struct IntuiMessage *GT_PostFilterIMsg( struct IntuiMessage *imsg )
{return(0);}

#endif  /** __IGNORE_NOT_SUPPORTED__ **/






#ifdef __cplusplus
}
#endif

#endif   /* CLIB_GADTOOLS_PROTOS_H */
