home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / c / precg105.lha / source / cyclegadget.c < prev    next >
C/C++ Source or Header  |  1993-03-04  |  9KB  |  366 lines

  1. #include <stdio.h>
  2. #include "CycleGadget.h"
  3. #include "CycleGadgetClass.h"
  4. #include "BoolGadgetClass.h"
  5. #include "precognition.h"
  6. #include "minmax.h"
  7. #include "AmigaMem.h"
  8. #include <proto/exec.h>
  9. #include <proto/graphics.h>
  10. #include <proto/intuition.h>
  11.  
  12.  
  13. void CycleGadget_CleanUp( CycleGadget *self )
  14. {
  15.    Afree( self->bg.BoxBorder->BottomRight.NextBorder );
  16.    self->bg.BoxBorder->BottomRight.NextBorder = NULL; 
  17.    StringList_CleanUp( &self->sl );
  18. }
  19.  
  20.  
  21. Point CycleGadget_AskSize( CycleGadget *self,
  22.                             PIXELS       Width,
  23.                             PIXELS       Height )
  24. {
  25.    Point size;
  26.  
  27.    size.y = 14;
  28.    size.x = MAX( Width, 32 );
  29.  
  30.    return size;
  31. }
  32.  
  33.  
  34.  
  35. USHORT CycleGadget_ClaimEvent( CycleGadget   *self,
  36.                                IntuiMessage  *event )
  37. {
  38.    USHORT response = 0;
  39.  
  40.    switch (event->Class)
  41.    {
  42.       case REFRESHWINDOW:
  43.          response = RESPONDED;
  44.          break;
  45.  
  46.       case GADGETUP:
  47.          if (event->IAddress == (void*) &self->bg.g)
  48.          {
  49.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  50.          }
  51.          break;
  52.  
  53.    }
  54.  
  55.    return response;
  56. }
  57.  
  58.  
  59. LONG CycleGadget_Value( CycleGadget *self )
  60. {
  61.    return (LONG) self->bg.state;
  62. }
  63.  
  64. LONG CycleGadget_SetValue( CycleGadget *self,
  65.                            LONG         selection )
  66. {
  67.    USHORT s;
  68.  
  69.    s = MIN( selection, self->sl.nEntries );
  70.    s = MAX( s, 0 );
  71.  
  72.    self->bg.state = s;
  73.  
  74.    Forbid();
  75.    self->Format.IText = self->sl.Entries[s];
  76.    Permit();
  77.  
  78.    return (LONG) s;
  79. }
  80.  
  81. #ifdef BUILDER
  82.  
  83. LONG CycleGadget_SV_NoRangeCheck( CycleGadget *self,
  84.                                   LONG         selection )
  85. {
  86.    USHORT s;
  87.  
  88.    self->bg.state = s;
  89.  
  90.    return (LONG) s;
  91. }
  92. #endif
  93.  
  94.  
  95. void CycleGadget_Render( CycleGadget *self,
  96.                          RastPort    *RPort )
  97. {
  98.    PIXELS xmin, xmax, ymin, ymax;
  99.  
  100.    xmin = self->bg.Location.x + 2;
  101.    ymin = self->bg.Location.y + 2;
  102.    xmax = xmin + self->bg.Size.x - 4;
  103.    ymax = ymin + self->bg.Size.y - 4;
  104.    SetAPen( RPort, self->bg.Pens.BackPen );
  105.    SetDrMd( RPort, JAM1 );
  106.    RectFill( RPort, xmin, ymin, xmax, ymax );
  107.    SetAPen( RPort, self->bg.Pens.FrontPen );
  108.    PrintIText( RPort,  &self->Format, self->bg.Location.x, self->bg.Location.y );
  109.    
  110.    EmbossedGadget_Render( &self->bg, RPort );
  111. }
  112.  
  113. void CycleGadget_Refresh( CycleGadget *self )
  114. {
  115.    pcgWindow *window;
  116.    RastPort  *rport;
  117.    Point loc;
  118.  
  119.    if (window = InteractorWindow(self))
  120.    {
  121.       EmbossedGadget_Refresh(self);
  122.       rport = RPort( window );
  123.       loc   = Location(self);
  124.       PrintIText( rport, &self->Format, loc.x, loc.y );
  125.    }
  126. }
  127.  
  128.  
  129. USHORT CycleGadget_Respond( CycleGadget  *self,
  130.                             IntuiMessage *event )
  131. {
  132.    USHORT     response = 0;
  133.    Window    *window;
  134.    USHORT     selection;
  135.  
  136.    switch (event->Class)
  137.    {
  138.       case REFRESHWINDOW:
  139.          response = RESPONDED;
  140.          break;
  141.  
  142.       case GADGETUP:
  143.          if (event->IAddress == (void*) &self->bg.g)
  144.          {
  145.             window = event->IDCMPWindow;
  146.  
  147.             selection = self->bg.state + 1;
  148.  
  149.             if (selection == self->sl.nEntries)
  150.                selection = 0;
  151.  
  152.             SetValue( self, selection );
  153.             Render( self, window->RPort );
  154.  
  155.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  156.          }
  157.          break;
  158.  
  159.    }
  160.  
  161.    return response;
  162. }
  163.  
  164.  
  165. #ifdef BUILDER
  166. #include "BuilderMethods.h"
  167. #include "GraphicObject_Builder.h"
  168. #include "CycleGadget_builder.h"
  169. #include "CycleGadget_coder.h"
  170. #include "CycleGadgetIO.h"
  171. #include <string.h>
  172.  
  173.  
  174. CycleGadget *CycleGadget_New( CycleGadget *self )
  175. {
  176.    CycleGadget *cycle = NULL;
  177.    USHORT i;
  178.  
  179.  
  180.    char **choices;
  181.    
  182.    if (cycle = (CycleGadget *) Amalloc(sizeof(CycleGadget)))
  183.    {
  184.       if (self)
  185.       {
  186.          StringList *sl; 
  187.     
  188.          sl = &(self->sl);
  189.        
  190.          choices = (char**) Acalloc( sizeof(char*), sl->nEntries+1 );
  191.  
  192.          for (i=0; i<sl->nEntries; i++)
  193.          {
  194.             choices[i] = sl->Entries[i];
  195.          }
  196.          
  197.          choices[sl->nEntries] = NULL;
  198.  
  199.          CycleGadget_Init(  cycle,
  200.                             self->bg.Location.x, self->bg.Location.y,
  201.                             self->bg.Size.x,     self->bg.Pens,
  202.                             Title(self),         choices );
  203.          Afree(choices);
  204.       }
  205.       else
  206.       {
  207.          CycleGadget_Init( cycle, 0, 0, 64, StandardPens(), NULL, NULL );
  208.       }
  209.  
  210.       GiveItAName( cycle );
  211.    }
  212.  
  213.    return cycle;
  214. }
  215.  
  216.  
  217. struct BuilderMethods CycleGadget_bm;
  218.  
  219. #endif
  220.  
  221.  
  222. BOOL CycleGadget_elaborated = FALSE;
  223.  
  224. struct ValuatorClass CycleGadget_Class;
  225.  
  226. void CycleGadgetClass_Init( struct ValuatorClass *class )
  227. {
  228.    BoolGadgetClass_Init( class );
  229.    class->isa         = BoolGadgetClass();
  230.    class->ClassName   = "CycleGadget";
  231.  
  232. /* -------- Commented-out methods are inherited ----------------*/
  233.    class->CleanUp     = CycleGadget_CleanUp;
  234.    class->AskSize     = CycleGadget_AskSize;
  235.    class->SizeFlags   = GraphicObject_SizeFlagsX;
  236.    class->Render      = CycleGadget_Render;
  237.    class->Refresh     = CycleGadget_Refresh;
  238.    class->ClaimEvent  = CycleGadget_ClaimEvent;
  239.    class->Respond     = CycleGadget_Respond;
  240.    class->Value       = CycleGadget_Value;
  241.    class->SetValue    = CycleGadget_SetValue;
  242. /*   class->SetTitle    = EmbossedGadget_SetTitle;*/
  243.  
  244. #ifdef BUILDER
  245.    go_InitBuilderMethods( &CycleGadget_bm );
  246.    class->BuilderMethods = &CycleGadget_bm;
  247.    CycleGadget_bm.New       = CycleGadget_New;
  248.    CycleGadget_bm.PropEdit  = CycleGadget_PropEdit;
  249.    CycleGadget_bm.WriteCode = CycleGadget_WriteCode;
  250.    CycleGadget_bm.WriteIFF  = WriteCycleGadgetChunk;
  251.    CycleGadget_bm.ReadIFF   = ReadCycleGadgetChunk;
  252. #endif
  253.  
  254. }
  255.  
  256.  
  257. struct ValuatorClass *CycleGadgetClass( void )
  258. {
  259.    if (! CycleGadget_elaborated)
  260.    {
  261.       CycleGadgetClass_Init( &CycleGadget_Class );
  262.       CycleGadget_elaborated = TRUE;
  263.    }
  264.  
  265.    return &CycleGadget_Class;
  266. }
  267.  
  268.  
  269. WORD Cycle_BrightLinePoints[] = { 15,1, 15,12 };
  270. WORD Cycle_DarkLinePoints[]   = { 14,1, 14,12 };
  271. WORD Cycle_ArrowPoints[] =
  272.   { 10,3, 10, 7, 12,5, 7,5, 9,7, 9,2,  5,2,
  273.      4,3,  4,10,  5,3, 5,11, 9,11, 9,10, 10,10 };
  274.  
  275.  
  276. typedef struct CycleBorder
  277.    {
  278.       Border BrightLine;
  279.       Border DarkLine;
  280.       Border Arrow;
  281.    } CycleBorder;
  282.  
  283.  
  284. CycleBorder *CycleBorder_New( pcg_3DPens Pens )
  285. {
  286.    CycleBorder *border;
  287.  
  288.    border = (CycleBorder *) Acalloc( 1, sizeof(CycleBorder) );
  289.    border->BrightLine.LeftEdge   = 0;
  290.    border->BrightLine.TopEdge    = 0;
  291.    border->BrightLine.FrontPen   = Pens.BrightPen;
  292.    border->BrightLine.BackPen    = Pens.BackPen;
  293.    border->BrightLine.DrawMode   = JAM1;
  294.    border->BrightLine.Count      = 2;
  295.    border->BrightLine.XY         = Cycle_BrightLinePoints;
  296.    border->BrightLine.NextBorder = &border->DarkLine;
  297.  
  298.    border->DarkLine.LeftEdge   = 0;
  299.    border->DarkLine.TopEdge    = 0;
  300.    border->DarkLine.FrontPen   = Pens.DarkPen;
  301.    border->DarkLine.BackPen    = Pens.BackPen;
  302.    border->DarkLine.DrawMode   = JAM1;
  303.    border->DarkLine.Count      = 2;
  304.    border->DarkLine.XY         = Cycle_DarkLinePoints;
  305.    border->DarkLine.NextBorder = &border->Arrow;
  306.  
  307.    border->Arrow.LeftEdge   = 0;
  308.    border->Arrow.TopEdge    = 0;
  309.    border->Arrow.FrontPen   = Pens.FrontPen;
  310.    border->Arrow.BackPen    = Pens.BackPen;
  311.    border->Arrow.DrawMode   = JAM1;
  312.    border->Arrow.Count      = 14;
  313.    border->Arrow.XY         = Cycle_ArrowPoints;
  314.    border->Arrow.NextBorder = NULL;
  315.  
  316.    return border;
  317. }
  318.  
  319. void CycleGadget_Init( CycleGadget  *self,
  320.                        PIXELS        LeftEdge,
  321.                        PIXELS        TopEdge,
  322.                        PIXELS        Width,
  323.                        pcg_3DPens    Pens,
  324.                        char         *label,
  325.                        char        **Choices )
  326. {
  327.    Point     size;
  328.    AlignInfo ainfo;
  329.  
  330.    self->bg.isa  = CycleGadgetClass();
  331.    size          = AskSize( self, Width, 0 );
  332.  
  333.    BoolGadget_Init( &self->bg, LeftEdge, TopEdge, size.x, size.y,
  334.                         Pens, NULL );
  335.  
  336.    ainfo = TextAlignment(self);
  337.    SetTextAlignment( self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
  338.       ainfo.Xpad, ainfo.Ypad );
  339.  
  340.  
  341.    self->bg.isa     = CycleGadgetClass();
  342.    self->bg.g.Flags = GADGHCOMP;
  343.    self->bg.BoxBorder->BottomRight.NextBorder =
  344.       (Border *) CycleBorder_New(Pens);
  345.  
  346.  
  347.    StringList_Init( &self->sl, FALSE );
  348.  
  349.    self->bg.state               = 0;
  350.    self->bg.LabelText.NextText  = &self->Format;
  351.  
  352.    self->Format.FrontPen  = Pens.FrontPen;
  353.    self->Format.BackPen   = Pens.BackPen;
  354.    self->Format.DrawMode  = JAM1;
  355.    self->Format.LeftEdge  = 20;
  356.    self->Format.TopEdge   = 3;
  357.    self->Format.ITextFont = &pcg_Topaz80;
  358.    self->Format.IText     = (Choices ? Choices[0] : NULL);
  359.    self->Format.NextText  = NULL;
  360.  
  361.    if (Choices)
  362.       StringList_AddStrings( &self->sl, Choices, 0 );
  363.   
  364.    SetTitle( self, label );
  365. }
  366.