home *** CD-ROM | disk | FTP | other *** search
/ MACD 4 / MACD4.iso / Emulatory / AROS / intuition / gadgetclass.c < prev    next >
Encoding:
C/C++ Source or Header  |  1978-03-06  |  9.3 KB  |  437 lines

  1. /* AROS gadgetclass implementation
  2.  * 10/25/96 caldi@usa.nai.net
  3.  */
  4.  
  5. #include <exec/types.h>
  6.  
  7. #include <dos/dos.h>
  8. #include <dos/dosextens.h>
  9.  
  10. #include <intuition/intuition.h>
  11. #include <intuition/intuitionbase.h>
  12. #include <intuition/classes.h>
  13. #include <intuition/classusr.h>
  14. #include <intuition/gadgetclass.h>
  15. #include <intuition/cghooks.h>
  16. #include <intuition/icclass.h>
  17.  
  18. #include <graphics/gfxbase.h>
  19. #include <graphics/gfxmacros.h>
  20.  
  21. #include <utility/tagitem.h>
  22. #include <utility/hooks.h>
  23.  
  24. #include <clib/macros.h>
  25.  
  26. #ifdef _SASC
  27. #include <proto/exec.h>
  28. #include <proto/intuition.h>
  29. #include <proto/graphics.h>
  30. #include <proto/utility.h>
  31. #elif __GNUC__
  32. #include <clib/exec_protos.h>
  33. #include <clib/intuition_protos.h>
  34. #include <clib/graphics_protos.h>
  35. #include <clib/utility_protos.h>
  36. #endif
  37.  
  38. #ifdef _AROS
  39. #include <aros/asmcall.h>
  40. #include <clib/alib_protos.h>
  41. #include "intuition_intern.h"
  42. #include "gadgets.h"
  43. #endif
  44.  
  45. /****************************************************************************/
  46.  
  47. /* Some handy transparent base class object casting defines.
  48.  */
  49. #define G(o)  ((struct Gadget *)o)
  50. #define EG(o) ((struct ExtGadget *)o)
  51. #define IM(o) ((struct Image *)o)
  52.  
  53. /****************************************************************************/
  54.  
  55. #undef IntuitionBase
  56. #define IntuitionBase     ((struct IntuitionBase *)(cl->cl_UserData))
  57.  
  58. /* set gadget attributes
  59.  */
  60. static ULONG set_gadgetclass(Class *cl, Object *o, struct opSet *msg)
  61. {
  62.     struct TagItem *tstate = msg->ops_AttrList;
  63.     struct TagItem *tag;
  64.     IPTR  tidata;
  65.     ULONG retval = 0UL; /* set to non-zero to signal visual changes */
  66.  
  67.     while ( (tag = NextTagItem(&tstate)) )
  68.     {
  69.     tidata = tag->ti_Data;
  70.  
  71.     switch(tag->ti_Tag)
  72.     {
  73.     case GA_Left:
  74.         EG(o)->LeftEdge = (WORD)tidata;
  75.         retval = 1UL;
  76.         break;
  77.  
  78.     case GA_Top:
  79.         EG(o)->TopEdge = (WORD)tidata;
  80.         retval = 1UL;
  81.         break;
  82.  
  83.     case GA_Width:
  84.         EG(o)->Width = (WORD)tidata;
  85.         retval = 1UL;
  86.         break;
  87.  
  88.     case GA_Height:
  89.         EG(o)->Height = (WORD)tidata;
  90.         retval = 1UL;
  91.         break;
  92.  
  93.     case GA_RelRight:
  94.         EG(o)->LeftEdge = (WORD)tidata;
  95.         EG(o)->Flags |= GFLG_RELRIGHT;
  96.         retval = 1UL;
  97.         break;
  98.  
  99.     case GA_RelBottom:
  100.         EG(o)->TopEdge = (WORD)tidata;
  101.         EG(o)->Flags |= GFLG_RELBOTTOM;
  102.         retval = 1UL;
  103.         break;
  104.  
  105.     case GA_RelWidth:
  106.         EG(o)->Width = (WORD)tidata;
  107.         EG(o)->Flags |= GFLG_RELWIDTH;
  108.         retval = 1UL;
  109.         break;
  110.  
  111.     case GA_RelHeight:
  112.         EG(o)->Height = (WORD)tidata;
  113.         EG(o)->Flags |= GFLG_RELHEIGHT;
  114.         retval = 1UL;
  115.         break;
  116.  
  117.     case GA_Previous:
  118.         if( (tidata != 0L) && (msg->MethodID == OM_NEW) )
  119.         {
  120.         ((struct ExtGadget *)tidata)->NextGadget = EG(o);
  121.         }
  122.         break;
  123.  
  124.     case GA_IntuiText:
  125.         EG(o)->GadgetText = (struct IntuiText *)tidata;
  126.         EG(o)->Flags &= ~GFLG_LABELMASK;
  127.         EG(o)->Flags |= GFLG_LABELITEXT;
  128.         retval = 1UL;
  129.         break;
  130.  
  131.     case GA_Text:
  132.         EG(o)->GadgetText = (struct IntuiText *)tidata;
  133.         EG(o)->Flags &= ~GFLG_LABELMASK;
  134.         EG(o)->Flags |= GFLG_LABELSTRING;
  135.         retval = 1UL;
  136.         break;
  137.  
  138.     case GA_LabelImage:
  139.         EG(o)->GadgetText = (struct IntuiText *)tidata;
  140.         EG(o)->Flags &= ~GFLG_LABELMASK;
  141.         EG(o)->Flags |= GFLG_LABELIMAGE;
  142.         retval = 1UL;
  143.         break;
  144.  
  145.     case GA_Image:
  146.         EG(o)->GadgetRender = (APTR)tidata;
  147.         EG(o)->Flags |= GFLG_GADGIMAGE;
  148.         retval = 1UL;
  149.         break;
  150.  
  151.     case GA_Border:
  152.         EG(o)->GadgetRender = (APTR)tidata;
  153.         EG(o)->Flags &= ~GFLG_GADGIMAGE;
  154.         retval = 1UL;
  155.         break;
  156.  
  157.     case GA_SelectRender:
  158.         EG(o)->SelectRender = (APTR)tidata;
  159.         EG(o)->Flags |= (GFLG_GADGIMAGE & GFLG_GADGHIMAGE);
  160.         retval = 1UL;
  161.         break;
  162.  
  163.     case GA_SpecialInfo:
  164.         EG(o)->SpecialInfo = (APTR)tidata;
  165.         break;
  166.  
  167.     case GA_GZZGadget:
  168.         if ( (BOOL)tidata != FALSE )
  169.         EG(o)->GadgetType |= GTYP_GZZGADGET;
  170.         else
  171.         EG(o)->GadgetType &= ~GTYP_GZZGADGET;
  172.         break;
  173.  
  174.     case GA_SysGadget:
  175.         if ( (BOOL)tidata != FALSE )
  176.         EG(o)->GadgetType |= GTYP_SYSGADGET;
  177.         else
  178.         EG(o)->GadgetType &= ~GTYP_SYSGADGET;
  179.         break;
  180.  
  181.     case GA_Disabled:
  182.         if ( (BOOL)tidata != FALSE )
  183.         EG(o)->Flags |= GFLG_SELECTED;
  184.         else
  185.         EG(o)->Flags &= ~GFLG_SELECTED;
  186.         retval = 1UL;
  187.         break;
  188.  
  189.     case GA_Selected:
  190.         if ( (BOOL)tidata != FALSE )
  191.         EG(o)->Flags |= GFLG_DISABLED;
  192.         else
  193.         EG(o)->Flags &= ~GFLG_DISABLED;
  194.         retval = 1UL;
  195.         break;
  196.  
  197.     case GA_EndGadget:
  198.         if ( (BOOL)tidata != FALSE )
  199.         EG(o)->Activation |= GACT_ENDGADGET;
  200.         else
  201.         EG(o)->Activation &= ~GACT_ENDGADGET;
  202.         break;
  203.  
  204.     case GA_Immediate:
  205.         if ( (BOOL)tidata != FALSE )
  206.         EG(o)->Activation |= GACT_IMMEDIATE;
  207.         else
  208.         EG(o)->Activation &= ~GACT_IMMEDIATE;
  209.         break;
  210.  
  211.     case GA_RelVerify:
  212.         if ( (BOOL)tidata != FALSE )
  213.         EG(o)->Activation |= GACT_RELVERIFY;
  214.         else
  215.         EG(o)->Activation &= ~GACT_RELVERIFY;
  216.         break;
  217.  
  218.     case GA_FollowMouse:
  219.         if ( (BOOL)tidata != FALSE )
  220.         EG(o)->Activation |= GACT_FOLLOWMOUSE;
  221.         else
  222.         EG(o)->Activation &= ~GACT_FOLLOWMOUSE;
  223.         break;
  224.  
  225.     case GA_RightBorder:
  226.         if ( (BOOL)tidata != FALSE )
  227.         EG(o)->Activation |= GACT_RIGHTBORDER;
  228.         else
  229.         EG(o)->Activation &= ~GACT_RIGHTBORDER;
  230.         break;
  231.  
  232.     case GA_LeftBorder:
  233.         if ( (BOOL)tidata != FALSE )
  234.         EG(o)->Activation |= GACT_LEFTBORDER;
  235.         else
  236.         EG(o)->Activation &= ~GACT_LEFTBORDER;
  237.         break;
  238.  
  239.     case GA_TopBorder:
  240.         if ( (BOOL)tidata != FALSE )
  241.         EG(o)->Activation |= GACT_TOPBORDER;
  242.         else
  243.         EG(o)->Activation &= ~GACT_TOPBORDER;
  244.         break;
  245.  
  246.     case GA_BottomBorder:
  247.         if ( (BOOL)tidata != FALSE )
  248.         EG(o)->Activation |= GACT_BOTTOMBORDER;
  249.         else
  250.         EG(o)->Activation &= ~GACT_BOTTOMBORDER;
  251.         break;
  252.  
  253.     case GA_Highlight:
  254.         EG(o)->Flags &= ~GFLG_GADGHIGHBITS;
  255.         EG(o)->Flags |= tidata;
  256.         break;
  257.  
  258.     case GA_SysGType:
  259.         EG(o)->GadgetType &= ~GTYP_SYSTYPEMASK;
  260.         EG(o)->GadgetType |= tidata;
  261.         break;
  262.  
  263.     case GA_ID:
  264.         EG(o)->GadgetID = tidata;
  265.         break;
  266.  
  267.     case GA_UserData:
  268.         EG(o)->UserData = (APTR)tidata;
  269.         break;
  270.     }
  271.     }
  272.  
  273.     return retval;
  274. }
  275.  
  276.  
  277. /* get gadget attributes - gadgetclass really has no gettable
  278.  * attributes, but we will implement some useful ones anyway. ;0
  279.  */
  280. static ULONG get_gadgetclass(Class *cl, Object *o, struct opGet *msg)
  281. {
  282.     ULONG retval = 1UL;
  283.  
  284.     switch (msg->opg_AttrID)
  285.     {
  286.     case GA_Left:
  287.     case GA_RelRight:
  288.     *msg->opg_Storage = (ULONG) EG(o)->LeftEdge;
  289.     break;
  290.  
  291.     case GA_Top:
  292.     case GA_RelBottom:
  293.     *msg->opg_Storage = (ULONG) EG(o)->TopEdge;
  294.     break;
  295.  
  296.     case GA_Width:
  297.     case GA_RelWidth:
  298.     *msg->opg_Storage = (ULONG) EG(o)->Width;
  299.     break;
  300.  
  301.     case GA_Height:
  302.     case GA_RelHeight:
  303.     *msg->opg_Storage = (ULONG) EG(o)->Height;
  304.     break;
  305.  
  306.     case GA_Selected:
  307.     *msg->opg_Storage = (ULONG)((BOOL)(EG(o)->Flags & GFLG_SELECTED));
  308.     break;
  309.  
  310.     case GA_Disabled:
  311.     *msg->opg_Storage = (ULONG)((BOOL)(EG(o)->Flags & GFLG_DISABLED));
  312.     break;
  313.  
  314.     default:
  315.     *msg->opg_Storage = (ULONG)NULL;
  316.     retval = 0UL;
  317.     break;
  318.     }
  319.  
  320.     return(retval);
  321. }
  322.  
  323. /* test if we should try to activate this gadget...
  324.  */
  325. static ULONG hittest_gadgetclass(Class *cl, Object *o, struct gpHitTest *gpht)
  326. {
  327.     struct IBox container;
  328.  
  329.     GetGadgetIBox(o, gpht->gpht_GInfo, &container);
  330.  
  331.     if ( (gpht->gpht_Mouse.X >= container.Left) &&
  332.      (gpht->gpht_Mouse.X <  container.Left + container.Width) &&
  333.      (gpht->gpht_Mouse.Y >= container.Top) &&
  334.      (gpht->gpht_Mouse.Y <  container.Top + container.Height)
  335.     )
  336.     {
  337.     return(GMR_GADGETHIT);
  338.     }
  339.  
  340.     return(0UL);
  341. }
  342.  
  343.  
  344. /* gadgetclass boopsi dispatcher
  345.  */
  346. AROS_UFH3(static IPTR, dispatch_gadgetclass,
  347.     AROS_UFHA(Class *,  cl,  A0),
  348.     AROS_UFHA(Object *, o,   A2),
  349.     AROS_UFHA(Msg,      msg, A1)
  350. )
  351. {
  352.     IPTR retval = 0UL;
  353.  
  354.     switch(msg->MethodID)
  355.     {
  356.     case GM_RENDER:
  357.     retval = 1UL;
  358.     break;
  359.  
  360.     case GM_LAYOUT:
  361.     case GM_DOMAIN:
  362.     case GM_GOACTIVE:
  363.     case GM_HANDLEINPUT:
  364.     case GM_GOINACTIVE:
  365.     /* our subclasses handle these methods */
  366.     break;
  367.  
  368.     case GM_HITTEST:
  369.     if( (G(o)->Flags & GFLG_DISABLED) == 0 )
  370.     {
  371.         retval = (IPTR)hittest_gadgetclass(cl, o, (struct gpHitTest *)msg);
  372.     }
  373.     break;
  374.  
  375.     case OM_NEW:
  376.     retval = DoSuperMethodA(cl, o, msg);
  377.  
  378.     if (retval)
  379.     {
  380.         /* set some defaults */
  381.         EG(retval)->NextGadget = NULL;
  382.         EG(retval)->LeftEdge   = 0;
  383.         EG(retval)->TopEdge    = 0;
  384.         EG(retval)->Width      = 6;
  385.         EG(retval)->Height     = 4;
  386.         EG(retval)->Flags      = GFLG_EXTENDED;
  387.         EG(retval)->MoreFlags  = 0UL;
  388.         EG(retval)->GadgetType = GTYP_CUSTOMGADGET;
  389.  
  390.         /* Handle our special tags - overrides defaults */
  391.         set_gadgetclass(cl, (Object*)retval, (struct opSet *)msg);
  392.     }
  393.     break;
  394.  
  395.     case OM_SET:
  396.     case OM_UPDATE:
  397.     retval = DoSuperMethodA(cl, o, msg);
  398.     retval += (IPTR)set_gadgetclass(cl, o, (struct opSet *)msg);
  399.     break;
  400.  
  401.     case OM_GET:
  402.     retval = (IPTR)get_gadgetclass(cl, o, (struct opGet *)msg);
  403.     break;
  404.  
  405.     default:
  406.     retval = DoSuperMethodA(cl, o, msg);
  407.     break;
  408.     } /* switch */
  409.  
  410.     return retval;
  411. }  /* dispatch_gadgetclass */
  412.  
  413.  
  414. #undef IntuitionBase
  415.  
  416. /****************************************************************************/
  417.  
  418. /* Initialize our image class. */
  419. struct IClass *InitGadgetClass (struct IntuitionBase * IntuitionBase)
  420. {
  421.     struct IClass *cl = NULL;
  422.  
  423.     /* This is the code to make the gadgetclass...
  424.      */
  425.     if ((cl = MakeClass(GADGETCLASS, ROOTCLASS, NULL, sizeof(struct ExtGadget), 0)))
  426.     {
  427.     cl->cl_Dispatcher.h_Entry    = (APTR)AROS_ASMFUNC_NAME(dispatch_gadgetclass);
  428.     cl->cl_Dispatcher.h_SubEntry = NULL;
  429.     cl->cl_UserData          = (IPTR)IntuitionBase;
  430.  
  431.     AddClass (cl);
  432.     }
  433.  
  434.     return (cl);
  435. }
  436.  
  437.