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