home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Programming / Triton / Source / classes / scroller.c < prev    next >
C/C++ Source or Header  |  1998-05-23  |  8KB  |  260 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_Scroller ******
  23. *
  24. *   NAME    
  25. *    class_Scroller -- A GadTools scroller gadget
  26. *
  27. *   SUPERCLASS
  28. *    class_DisplayObject
  29. *
  30. *   SYNOPSIS
  31. *    TROB_Scroller
  32. *
  33. *   ATTRIBUTES
  34. *    <Default>        : ULONG flags
  35. *                       - TROF_HORIZ (default)
  36. *                       - TROF_VERT
  37. *                       [create]
  38. *    TRAT_Value       : WORD top
  39. *                       [create, set, get]
  40. *    TRSC_Total       : WORD total
  41. *                       [create, set, get]
  42. *    TRSC_Visible     : WORD visible
  43. *                       [create, set, get]
  44. *
  45. *   APPLICATION MESSAGES
  46. *    TRMS_NEWVALUE is sent when TRAT_Value changes. trm_Data contains
  47. *    the new value.
  48. *
  49. ******/
  50.  
  51.  
  52. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  53. //////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
  54. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55.  
  56. #define TR_THIS_IS_TRITON
  57.  
  58. #include <libraries/triton.h>
  59. #include <clib/triton_protos.h>
  60. #include "/internal.h"
  61. #include "scroller.def"
  62.  
  63.  
  64. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. ////////////////////////////////////////////////////////////////////////////////////////////// Object data //
  66. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67.  
  68. #define OBJECT (&(object->DO.O))
  69. #define DISPLAYOBJECT (&(object->DO))
  70. #define SCROLLER object
  71.  
  72.  
  73. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. ////////////////////////////////////////////////////////////////////////////////////////////////// Methods //
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76.  
  77. TR_METHOD(Scroller,NEW,NewData)
  78. {
  79.   if(!TRDP_DisplayObject_NEW(object,messageid,data,metaclass->trc_SuperClass)) return NULL;
  80.   data->project->trp_IDCMPFlags|=(SCROLLERIDCMP|ARROWIDCMP);
  81.  
  82.   DISPLAYOBJECT->MinHeight=max(CHECKBOX_HEIGHT,data->project->trp_TotalPropFontHeight);
  83.   DISPLAYOBJECT->MinWidth=DISPLAYOBJECT->MinHeight;
  84.   DISPLAYOBJECT->XResize=TRUE;
  85.   DISPLAYOBJECT->YResize=TRUE;
  86.  
  87.   if(SCROLLER->Flags&TROF_VERT)
  88.     {
  89.       DISPLAYOBJECT->MinHeight*=4;
  90.       DISPLAYOBJECT->MinHeight+=8;
  91.       DISPLAYOBJECT->MinWidth+=5;
  92.     }
  93.   else
  94.     {
  95.       DISPLAYOBJECT->MinWidth*=4;
  96.       DISPLAYOBJECT->MinWidth+=8;
  97.     }
  98.  
  99.   return (ULONG)object;
  100. }
  101.  
  102.  
  103. TR_METHOD(Scroller,INSTALL,InstallData)
  104. {
  105.   TRDP_DisplayObject_INSTALL(object,messageid,data,metaclass->trc_SuperClass);
  106.   TR_InternalAreaFill(OBJECT->Project,NULL,DISPLAYOBJECT->Left+2,DISPLAYOBJECT->Top+1,
  107.               DISPLAYOBJECT->Left+DISPLAYOBJECT->Width-3,
  108.               DISPLAYOBJECT->Top+DISPLAYOBJECT->Height-2,TRBF_NONE);
  109.   if(DISPLAYOBJECT->PrivData=(ULONG)
  110.      TR_CreateGadgetTags(OBJECT->Project, OBJECT, SCROLLER_KIND,
  111.              DISPLAYOBJECT->Left,
  112.              DISPLAYOBJECT->Top,
  113.              DISPLAYOBJECT->Width,
  114.              DISPLAYOBJECT->Height,
  115.              GTSC_Top,            SCROLLER->Value,
  116.              GTSC_Total,          SCROLLER->Total,
  117.              GTSC_Visible,        SCROLLER->Visible,
  118.              GTSC_Arrows,         (SCROLLER->Flags&TROF_VERT)?
  119.                                     (DISPLAYOBJECT->MinHeight/4):
  120.                                     (DISPLAYOBJECT->MinWidth/4),
  121.              PGA_Freedom,         (SCROLLER->Flags&TROF_VERT)?LORIENT_VERT:LORIENT_HORIZ,
  122.              GA_Disabled,         TR_DO_DISABLED,
  123.              TAG_END))
  124.     return 1L;
  125.   else
  126.     return NULL;
  127. }
  128.  
  129.  
  130. TR_METHOD(Scroller,SETATTRIBUTE,SetAttributeData)
  131. {
  132.   switch(data->attribute)
  133.     {
  134.     case TRAT_Value:
  135.       if(SCROLLER->Value!=data->value)
  136.     {
  137.       SCROLLER->Value=data->value;
  138.       if(DISPLAYOBJECT->Installed)
  139.         GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,
  140.                   NULL,GTSC_Top,SCROLLER->Value,
  141.                   GA_Disabled,TR_DO_DISABLED,GTSC_Total,SCROLLER->Total,
  142.                   GTSC_Visible,SCROLLER->Visible,TAG_END);
  143.     }
  144.       return 1;
  145.  
  146.     case TRSC_Total:
  147.       if(SCROLLER->Total!=data->value)
  148.     {
  149.       SCROLLER->Total=data->value;
  150.       if(DISPLAYOBJECT->Installed)
  151.         GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,
  152.                   NULL,GTSC_Top,SCROLLER->Value,
  153.                   GA_Disabled,TR_DO_DISABLED,GTSC_Total,SCROLLER->Total,
  154.                   GTSC_Visible,SCROLLER->Visible,TAG_END);
  155.     }
  156.       return 1L;
  157.  
  158.     case TRSC_Visible:
  159.       if(SCROLLER->Visible!=data->value)
  160.     {
  161.       SCROLLER->Visible=data->value;
  162.       if(DISPLAYOBJECT->Installed)
  163.         GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,
  164.                   OBJECT->Project->trp_Window,NULL,GTSC_Top,SCROLLER->Value,
  165.                   GA_Disabled,TR_DO_DISABLED,GTSC_Total,SCROLLER->Total,
  166.                   GTSC_Visible,SCROLLER->Visible,TAG_END);
  167.     }
  168.       return 1L;
  169.  
  170.     case 0:
  171.       SCROLLER->Flags=data->value;
  172.       return 1;
  173.  
  174.     default:
  175.       return TRDP_DisplayObject_SETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
  176.     }
  177. }
  178.  
  179.  
  180. TR_SIMPLEMETHOD(Scroller,GETATTRIBUTE)
  181. {
  182.   switch((ULONG)data)
  183.     {
  184.     case TRAT_Value:
  185.       return SCROLLER->Value;
  186.     case TRSC_Total:
  187.       return SCROLLER->Total;
  188.     case TRSC_Visible:
  189.       return SCROLLER->Visible;
  190.     default:
  191.       return TRDP_DisplayObject_GETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
  192.     }
  193. }
  194.  
  195.  
  196. TR_SIMPLEMETHOD(Scroller,DISABLED_ENABLED)
  197. {
  198.   GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,NULL,
  199.             GTSC_Top,SCROLLER->Value,GA_Disabled,TR_DO_DISABLED,
  200.             GTSC_Total,SCROLLER->Total,GTSC_Visible,SCROLLER->Visible,TAG_END);
  201.   return 1L;
  202. }
  203.  
  204.  
  205. TR_METHOD(Scroller,KEYDOWN_REPEATEDKEYDOWN,EventData)
  206. {
  207.   BOOL sendmsg=FALSE;
  208.   struct TR_Message *m;
  209.  
  210.   if(data->imsg->Code)
  211.     {
  212.       if((SCROLLER->Value)>0)
  213.         {
  214.           SCROLLER->Value--;
  215.           sendmsg=TRUE;
  216.         }
  217.     }
  218.   else
  219.     {
  220.       if( (SCROLLER->Value) < (SCROLLER->Total-SCROLLER->Visible) )
  221.     {
  222.       SCROLLER->Value++;
  223.       sendmsg=TRUE;
  224.     }
  225.     }
  226.  
  227.   if(sendmsg)
  228.     {
  229.       TR_SetAttribute(OBJECT->Project,DISPLAYOBJECT->ID,TRAT_Value,SCROLLER->Value);
  230.       if(m=TR_CreateMsg(Self.DO.O.Project->trp_App))
  231.     {
  232.       m->trm_ID=DISPLAYOBJECT->ID;
  233.       m->trm_Class=TRMS_NEWVALUE;
  234.       m->trm_Data=SCROLLER->Value;
  235.     }
  236.     }
  237.  
  238.   return TR_DIRECTMETHODCALL(Scroller,DISABLED_ENABLED);
  239. }
  240.  
  241.  
  242. TR_METHOD(Scroller,EVENT,EventData)
  243. {
  244.   struct TR_Message *m;
  245.  
  246.   if((data->imsg->Class==IDCMP_MOUSEMOVE)&&(data->imsg->IAddress==(APTR)(DISPLAYOBJECT->PrivData)))
  247.     {
  248.       SCROLLER->Value=data->imsg->Code;
  249.       if(m=TR_CreateMsg(Self.DO.O.Project->trp_App))
  250.     {
  251.       m->trm_ID=DISPLAYOBJECT->ID;
  252.       m->trm_Class=TRMS_NEWVALUE;
  253.       m->trm_Data=SCROLLER->Value;
  254.     }
  255.       TR_SetAttribute(OBJECT->Project,DISPLAYOBJECT->ID,TRAT_Value,SCROLLER->Value);
  256.       return 1L;
  257.     }
  258.   else return NULL;
  259. }
  260.