home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Extras / Development / Example_Code_v37 / Libraries / Intuition / StrDemo / strgad.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-10-27  |  4.5 KB  |  181 lines

  1. /* strgad.c -- easy create/destroy of string gadgets    */
  2.  
  3. /*
  4. Copyright (c) 1989-1999 Amiga, Inc.
  5.  
  6. Executables based on this information may be used in software
  7. for Amiga computers. All other rights reserved.
  8. This information is provided "as is"; no warranties are made.
  9. All use is at your own risk, and no liability or responsibility
  10. is assumed.
  11. */
  12.  
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15. #include <intuition/intuition.h>
  16. #include <intuition/sghooks.h>
  17.  
  18. #include <clib/intuition_protos.h>
  19. #include <clib/graphics_protos.h>
  20. #include <clib/exec_protos.h>
  21.  
  22. #include <string.h>
  23. #include <stdlib.h>
  24.  
  25. #include "strgad.h"
  26.  
  27. /* getStringGadget()
  28.  *
  29.  * sets flags to some default values, override them after
  30.  * it is allocated.  Likewise LongInt: set it up after
  31.  * the fact.
  32.  */
  33.  
  34. struct SG {
  35.     struct Gadget        sg_Gadget;
  36.     struct StringInfo    sg_Info;
  37.     struct Border        sg_Border;
  38.     UWORD            sg_XY[ 10 ];
  39.     struct IntuiText    sg_IText;
  40. };
  41.  
  42. struct Gadget *getOneSG();
  43.  
  44. struct Gadget *
  45. getStringGadgets( sgs, num )
  46. struct SGSpec    *sgs;
  47. {
  48.     struct Gadget    *firstg;
  49.     struct Gadget    *sg;
  50.  
  51.     if ( num <= 0 ) return ( NULL );
  52.  
  53.     if ( ! (firstg = sg = getOneSG( sgs )) ) return ( NULL );
  54.  
  55.     while ( --num )
  56.     {
  57.     if ( !(sg->NextGadget = getOneSG( ++sgs )) )
  58.     {
  59.         freeStringGadgets( firstg, num );
  60.         return ( NULL );
  61.     }
  62.     sg = sg->NextGadget;
  63.     }
  64.     return ( firstg );
  65. }
  66.  
  67. /*
  68.  * stops at null terminator or NULL link
  69.  * can use -1 for num
  70.  * returns next gadget in chain
  71.  */
  72. struct Gadget *
  73. freeStringGadgets( sgadget, num )
  74. struct Gadget    *sgadget;
  75. {
  76.     int memsize;
  77.     struct Gadget *nextgadget;
  78.  
  79.     while ( sgadget && num-- )
  80.     {
  81.     memsize = sizeof ( struct SG );
  82.     memsize += 2 * (((struct StringInfo *) sgadget->SpecialInfo)->MaxChars);
  83.     nextgadget = sgadget->NextGadget;
  84.     FreeMem( sgadget, (LONG) memsize );
  85.     sgadget = nextgadget;
  86.     }
  87.     return ( sgadget );
  88. }
  89.  
  90. struct Gadget *
  91. getOneSG( sgs )
  92. struct SGSpec    *sgs;
  93. {
  94.     int        memsize;
  95.     CPTR    membase;
  96.     struct SG       *sg;
  97.     struct Gadget    *sgadget;
  98.     struct StringInfo   *sinfo;
  99.     WORD        *xyp;
  100.     int            txlength;
  101.  
  102.     /* figure out how much memory to allocate    */
  103.     memsize = sizeof ( struct SG );
  104.     memsize += 2 * (sgs->sgs_NumChars + 1);    /* for buffers    */
  105.  
  106.     /* try to get the memory    */
  107.     membase = (CPTR) AllocMem( (ULONG) memsize, (ULONG) MEMF_CLEAR );
  108.     if ( membase == NULL ) return ( NULL );
  109.  
  110.     /* hook together pieces of memory    */
  111.     sg = (struct SG *) membase;
  112.     membase += sizeof (struct SG);
  113.  
  114.     sg->sg_Info.Buffer = (UBYTE *) membase;
  115.     membase += sgs->sgs_NumChars + 1;
  116.     sg->sg_Info.UndoBuffer = (UBYTE *) membase;
  117.  
  118.     sgadget = &sg->sg_Gadget;
  119.     sgadget->SpecialInfo =  (APTR) &sg->sg_Info;
  120.     sinfo = &sg->sg_Info;
  121.     sgadget->GadgetRender = (APTR) &sg->sg_Border;
  122.     sgadget->GadgetText = &sg->sg_IText;
  123.  
  124.     /* initialize text        */
  125.     sg->sg_IText.FrontPen = 1;
  126.     sg->sg_IText.BackPen =  0;
  127.     sg->sg_IText.DrawMode = JAM2;
  128.     txlength = TextLength( sgs->sgs_RPort, sgs->sgs_Title,
  129.     (LONG) strlen( sgs->sgs_Title ) );
  130.     sg->sg_IText.LeftEdge = -TITLEGAP - txlength;
  131.     sg->sg_IText.TopEdge = 0;
  132.     sg->sg_IText.ITextFont = NULL;
  133.     sg->sg_IText.NextText = NULL;
  134.     sg->sg_IText.IText = (UBYTE *) sgs->sgs_Title;    /* note: no copy    */
  135.  
  136.     /* initialize border    */
  137.     sg->sg_Border.LeftEdge = sg->sg_Border.TopEdge = 0;
  138.     sg->sg_Border.FrontPen = 1; sg->sg_Border.BackPen = 0;
  139.     sg->sg_Border.DrawMode = JAM2;
  140.     sg->sg_Border.Count = 5;
  141.     sg->sg_Border.XY = (SHORT *) sg->sg_XY;
  142.     sg->sg_Border.NextBorder = NULL;
  143.  
  144.     /* initialize string info    */
  145.     sinfo->BufferPos = 0;
  146.     sinfo->MaxChars = sgs->sgs_NumChars + 1;
  147.     sinfo->DispPos = 0;
  148.  
  149.     /* initialize gadget    */
  150.     sgadget->NextGadget = NULL;
  151.     sgadget->LeftEdge = sgs->sgs_Left;
  152.     sgadget->TopEdge = sgs->sgs_Top;
  153.     sgadget->Width = sgs->sgs_Width;
  154.     sgadget->Height = sgs->sgs_TxHeight + 2;
  155.     sgadget->Flags = GADGHCOMP;
  156.     sgadget->Activation = RELVERIFY | sgs->sgs_StringActives;
  157.     sgadget->GadgetType = STRGADGET;
  158.     sgadget->GadgetID = sgs->sgs_ID;
  159.     sgadget->UserData = NULL;
  160.     {
  161.     UBYTE    *to;
  162.     UBYTE    *from;
  163.     to = sinfo->Buffer;
  164.     from = (UBYTE *) sgs->sgs_InitString;
  165.  
  166.     while (*to++ = *from++);
  167.     }
  168.     
  169.  
  170.     /* init border polyline    */
  171.     xyp = (WORD *) sg->sg_XY;
  172.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = -(1+BORDERGAP);
  173.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = sgadget->Height+BORDERGAP;
  174.     *xyp++ = -(1+BORDERGAP); *xyp++ = sgadget->Height+BORDERGAP;
  175.     *xyp++ = -(1+BORDERGAP); *xyp++ = -(1+BORDERGAP);
  176.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = -(1+BORDERGAP);
  177.  
  178.     return ( sgadget );
  179. }
  180.  
  181.