home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Programming / Triton / Source / classes / cycle.c < prev    next >
C/C++ Source or Header  |  1998-05-23  |  8KB  |  252 lines

  1. /*
  2.  *  OpenTriton -- A free release of the triton.library source code
  3.  *  Copyright (C) 1993-1998  Stefan Zeiger
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  */
  20.  
  21.  
  22. /****** triton.library/class_Cycle ******
  23. *
  24. *   NAME    
  25. *    class_Cycle -- A GadTools cycle gadget
  26. *
  27. *   SUPERCLASS
  28. *    class_DisplayObject
  29. *
  30. *   SYNOPSIS
  31. *    TROB_Cycle
  32. *
  33. *   ATTRIBUTES
  34. *    <Default>        : STRPTR *entries    : Gadget etry labels
  35. *                       [create]
  36. *    TRAT_Value       : ULONG number
  37. *                       [create, set, get]
  38. *    TRAT_Flags       : ULONG flags (V2)
  39. *                       - TRCY_MX          : "Unfold" the cycle gadget to
  40. *                                            a mutually exclusive gadget.
  41. *                       - TRCY_RIGHTLABELS : Put the labels to the right
  42. *                                            side (TRCY_MX only).
  43. *                       [create]
  44. *
  45. *   NOTES
  46. *    Disabling TRCY_MX-style gadgets requires OS3.0 or better.
  47. *
  48. *   APPLICATION MESSAGES
  49. *    TRMS_NEWVALUE is sent when the selected entry has changed.
  50. *    trm_Data contains the ordinal number of the new entry.
  51. *
  52. ******/
  53.  
  54.  
  55. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. //////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58.  
  59. #define TR_THIS_IS_TRITON
  60.  
  61. #include <libraries/triton.h>
  62. #include <clib/triton_protos.h>
  63. #include "/internal.h"
  64. #include "cycle.def"
  65.  
  66.  
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. ////////////////////////////////////////////////////////////////////////////////////////////// Object data //
  69. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70.  
  71. #define OBJECT (&(object->DO.O))
  72. #define DISPLAYOBJECT (&(object->DO))
  73. #define CYCLE object
  74.  
  75.  
  76. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. ////////////////////////////////////////////////////////////////////////////////////////////////// Methods //
  78. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79.  
  80. TR_METHOD(Cycle,NEW,NewData)
  81. {
  82.   ULONG ntextwidth;
  83.  
  84.   if(!TRDP_DisplayObject_NEW(object,messageid,data,metaclass->trc_SuperClass)) return NULL;
  85.   data->project->trp_IDCMPFlags|=CYCLEIDCMP|MXIDCMP;
  86.   for(CYCLE->Number=0,CYCLE->TextWidth=0;;CYCLE->Number++)
  87.     {
  88.       if(CYCLE->Entries[CYCLE->Number]==NULL) break;
  89.       ntextwidth=TR_TextWidth(data->project,CYCLE->Entries[CYCLE->Number],TRTX_NOUNDERSCORE);
  90.       CYCLE->TextWidth=max(CYCLE->TextWidth,ntextwidth);
  91.     }
  92.  
  93.   if(CYCLE->Flags&TRCY_MX)
  94.     {
  95.       CYCLE->GT_Kind=MX_KIND;
  96.       CYCLE->GT_Labels=GTMX_Labels;
  97.       CYCLE->GT_Active=GTMX_Active;
  98.       CYCLE->GT_Spacing=GTMX_Spacing;
  99.       CYCLE->Spacing=(data->project->trp_PropFont->tf_YSize)/4;
  100.       DISPLAYOBJECT->MinWidth=CYCLE->TextWidth+8;
  101. #ifndef TR_OS39
  102.       if(TR_Global.trg_OSVersion>=39)
  103.         {
  104. #endif
  105.           DISPLAYOBJECT->MinWidth+=max(MX_WIDTH,(data->project->trp_PropFont->tf_YSize+1));
  106. #ifndef TR_OS39
  107.         }
  108.       else /* OS version < 39 */
  109.         {
  110.           DISPLAYOBJECT->MinWidth+=MX_WIDTH;
  111.         }
  112. #endif
  113.       DISPLAYOBJECT->MinHeight=
  114.     (CYCLE->Number*data->project->trp_PropFont->tf_YSize)
  115.     +((CYCLE->Number-1)*((data->project->trp_PropFont->tf_YSize)/4))
  116.     +((data->project->trp_PropFont->tf_YSize<9)?(9-data->project->trp_PropFont->tf_YSize):0);
  117.     }
  118.   else
  119.     {
  120.       CYCLE->GT_Kind=CYCLE_KIND;
  121.       CYCLE->GT_Labels=GTCY_Labels;
  122.       CYCLE->GT_Active=GTCY_Active;
  123.       CYCLE->GT_Spacing=TAG_IGNORE;
  124.       DISPLAYOBJECT->MinWidth=(data->project->trp_PropFont->tf_YSize*2)+24+CYCLE->TextWidth;
  125.       DISPLAYOBJECT->MinHeight=(data->project->trp_PropFont->tf_YSize)+6;
  126.       DISPLAYOBJECT->XResize=TRUE;
  127.     }
  128.  
  129.   return (ULONG)object;
  130. }
  131.  
  132.  
  133. TR_METHOD(Cycle,INSTALL,InstallData)
  134. {
  135.   struct TR_Project *project;
  136.  
  137.   TRDP_DisplayObject_INSTALL(object,messageid,data,metaclass->trc_SuperClass);
  138.   project=OBJECT->Project;
  139.   if(CYCLE->Flags&TRCY_RIGHTLABELS) project->trp_NewGadget->ng_Flags=PLACETEXT_RIGHT;
  140.   else project->trp_NewGadget->ng_Flags=PLACETEXT_LEFT;
  141.   if(DISPLAYOBJECT->PrivData=(ULONG)
  142.      TR_CreateGadgetTags(OBJECT->Project,
  143.              OBJECT,
  144.              CYCLE->GT_Kind,
  145.              DISPLAYOBJECT->Left+
  146.              ((CYCLE->Flags&TRCY_MX)?
  147.               ((CYCLE->Flags&TRCY_RIGHTLABELS)?0:(8+CYCLE->TextWidth)):0),
  148.              DISPLAYOBJECT->Top,
  149.              (CYCLE->Flags&TRCY_MX)?
  150.              max(MX_WIDTH,(project->trp_PropFont->tf_YSize+1)):(DISPLAYOBJECT->Width),
  151.              (CYCLE->Flags&TRCY_MX)?
  152.              (project->trp_PropFont->tf_YSize+1):(DISPLAYOBJECT->Height),
  153.              CYCLE->GT_Active,  CYCLE->Value,
  154.              CYCLE->GT_Labels,  (ULONG)(CYCLE->Entries),
  155.              CYCLE->GT_Spacing, CYCLE->Spacing,
  156.              GA_Disabled,           TR_DO_DISABLED,
  157.              (CYCLE->Flags&TRCY_MX)?GTMX_Scaled:TAG_IGNORE, TRUE,
  158.              TAG_END)) return 1L;
  159.   else return NULL;
  160. }
  161.  
  162.  
  163. TR_METHOD(Cycle,SETATTRIBUTE,SetAttributeData)
  164. {
  165.   switch(data->attribute)
  166.     {
  167.     case TRAT_Value:
  168.       if(CYCLE->Value!=data->value)
  169.     {
  170.       CYCLE->Value=data->value;
  171.       if(DISPLAYOBJECT->Installed)
  172.         GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,
  173.                   NULL,CYCLE->GT_Active,CYCLE->Value,
  174.                   GA_Disabled,TR_DO_DISABLED,TAG_END);
  175.     }
  176.       return 1;
  177.  
  178.     case 0:
  179.       CYCLE->Entries=(STRPTR *)(data->value);
  180.       return 1;
  181.  
  182.     case TRAT_Flags:
  183.       CYCLE->Flags=data->value;
  184.       return 1;
  185.  
  186.     default:
  187.       return TRDP_DisplayObject_SETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
  188.     }
  189. }
  190.  
  191.  
  192. TR_SIMPLEMETHOD(Cycle,GETATTRIBUTE)
  193. {
  194.   switch((ULONG)data)
  195.     {
  196.     case TRAT_Value:
  197.       return CYCLE->Value;
  198.     default:
  199.       return TRDP_DisplayObject_GETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
  200.     }
  201. }
  202.  
  203.  
  204. TR_SIMPLEMETHOD(Cycle,DISABLED_ENABLED)
  205. {
  206.   GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,NULL,
  207.             CYCLE->GT_Active,CYCLE->Value,
  208.             GA_Disabled,TR_DO_DISABLED,TAG_END);
  209.   return 1;
  210. }
  211.  
  212.  
  213. TR_METHOD(Cycle,KEYDOWN_REPEATEDKEYDOWN,EventData)
  214. {
  215.   struct TR_Message *m;
  216.  
  217.   CYCLE->Value+=CYCLE->Number;
  218.   if(data->imsg->Code) CYCLE->Value--; else CYCLE->Value++;
  219.   CYCLE->Value%=CYCLE->Number;
  220.  
  221.   if(m=TR_CreateMsg(Self.DO.O.Project->trp_App))
  222.     {
  223.       m->trm_ID=DISPLAYOBJECT->ID;
  224.       m->trm_Class=TRMS_NEWVALUE;
  225.       m->trm_Data=CYCLE->Value;
  226.     }
  227.   TR_SetAttribute(OBJECT->Project,DISPLAYOBJECT->ID,TRAT_Value,CYCLE->Value);
  228.  
  229.   return TR_DIRECTMETHODCALL(Cycle,DISABLED_ENABLED);
  230. }
  231.  
  232.  
  233. TR_METHOD(Cycle,EVENT,EventData)
  234. {
  235.   struct TR_Message *m;
  236.  
  237.   if((data->imsg->Class&(IDCMP_GADGETUP|IDCMP_GADGETDOWN))
  238.      &&(data->imsg->IAddress==(APTR)(DISPLAYOBJECT->PrivData)))
  239.     {
  240.       CYCLE->Value=data->imsg->Code;
  241.       if(m=TR_CreateMsg(Self.DO.O.Project->trp_App))
  242.     {
  243.       m->trm_ID=DISPLAYOBJECT->ID;
  244.       m->trm_Class=TRMS_NEWVALUE;
  245.       m->trm_Data=CYCLE->Value;
  246.     }
  247.       TR_SetAttribute(OBJECT->Project,DISPLAYOBJECT->ID,TRAT_Value,CYCLE->Value);
  248.       return 1L;
  249.     }
  250.   else return NULL;
  251. }
  252.