home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / gadgstuff.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  7KB  |  241 lines

  1. /*
  2.  *  FILE: gadgstuff.c
  3.  *  Support routines for dealing with gadgets.
  4.  *
  5.  *  Public Domain, but keep my name in it as the original author.
  6.  *  31-Aug-88    Jan Sven Trabandt   first release version
  7.  *  30-Sep-88    Jan Sven Trabandt   split from gadget.c (and improved)
  8.  *                    renamed clearGadget to clearGadgets
  9.  *  31-Oct-88    Jan Sven Trabandt   removed addGadgets, removeGadgets
  10.  *                      since system AddGList, RemoveGList exists
  11.  *                    changed order of clearGadgets parms to
  12.  *                      match RefreshGadgets more closely
  13.  *                    moved toggleBoolGadget from gadget.c
  14.  */
  15.  
  16.  
  17. #define I_AM_GADGSTUFF
  18. #include "gimmelib/gimmefuncs.h"
  19.  
  20.  
  21. short clearGadgets( gp, window, req, numgad )
  22.     struct Gadget    *gp;
  23.     struct Window    *window;
  24.     struct Requester    *req;
  25.     SHORT        numgad;
  26. {
  27.     register struct Image   *ip;
  28.     struct RastPort        *rp;
  29.     APTR            temp;
  30.     register SHORT        pick, onoff;    /* use as front/back as well */
  31.     SHORT            left, top;
  32.     SHORT            propborder;
  33.     struct Image        image;
  34.     struct IntuiText        itext;
  35.     BYTE            backpen;
  36.  
  37. #ifdef GIMME_WIMPY
  38.     if( !window ) {
  39.     return( -1 );
  40.     }
  41. #endif
  42.     rp = window->RPort;
  43.     if( gp && !(gp->GadgetType & REQGADGET) ) {
  44.     req = NULL;
  45.     }
  46.     if( req ) {
  47.     backpen = req->BackFill;
  48.     if( req->ReqLayer && req->ReqLayer->rp ) {
  49.         rp = req->ReqLayer->rp;
  50.     }
  51.     } else if( (backpen = window->RPort->BgPen) == -1 ) {
  52.     backpen = 0;
  53.     }
  54.     for( ; gp && numgad != 0; gp = gp->NextGadget, --numgad ) {
  55.     left = gp->LeftEdge;
  56.     if( gp->Flags & GRELRIGHT ) {
  57.         left += (req ? req->Width : window->Width) - 1;
  58.     }
  59.     top = gp->TopEdge;
  60.     if( gp->Flags & GRELBOTTOM ) {
  61.         top += (req ? req->Height : window->Height) - 1;
  62.     }
  63.     propborder = 0;
  64.     if( (gp->GadgetType & ~GADGETTYPE) == PROPGADGET ) {
  65.         if( !(((struct PropInfo *)gp->SpecialInfo)->Flags
  66.                         & PROPBORDERLESS) ) {
  67.         propborder = 1;
  68.         }
  69.     }
  70.     if( (gp->Flags & SELECTED) && (gp->Flags & GADGHIMAGE)
  71.         && gp->SelectRender ) {
  72.         (APTR) ip = gp->SelectRender;
  73.     } else {
  74.         (APTR) ip = gp->GadgetRender;
  75.     }
  76.     if( gp->Flags & GADGIMAGE ) {
  77.         while( ip ) {
  78.         if( propborder ) {
  79.             ip->LeftEdge += 4;
  80.             ip->TopEdge += 2;
  81.         }
  82.         pick = ip->PlanePick;
  83.         onoff = ip->PlaneOnOff;
  84.         ip->PlanePick = 0x0;
  85.         ip->PlaneOnOff = backpen;
  86.         temp = (APTR) ip->NextImage;
  87.         ip->NextImage = NULL;
  88.         DrawImage( rp, ip, (long) left, (long) top );
  89.         ip->NextImage = (struct Image *) temp;
  90.         ip->PlanePick = pick;
  91.         ip->PlaneOnOff = onoff;
  92.         if( propborder ) {
  93.             ip->LeftEdge -= 4;
  94.             ip->TopEdge -= 2;
  95.         }
  96.         ip = (struct Image *) temp;
  97.         } /* while */
  98.     } else {            /* else it's a border */
  99.         while( (struct Border *) ip ) {
  100.         if( propborder ) {
  101.             ((struct Border *)ip)->LeftEdge += 4;
  102.             ((struct Border *)ip)->TopEdge += 2;
  103.         }
  104.         pick = ((struct Border *)ip)->FrontPen;
  105.         onoff = ((struct Border *)ip)->BackPen;
  106.         ((struct Border *)ip)->FrontPen = backpen;
  107.         ((struct Border *)ip)->BackPen = backpen;
  108.         temp = (APTR) ((struct Border *)ip)->NextBorder;
  109.         ((struct Border *)ip)->NextBorder = NULL;
  110.         DrawBorder( rp, (struct Border *) ip, (long) left, (long) top );
  111.         ((struct Border *)ip)->NextBorder = (struct Border *) temp;
  112.         ((struct Border *)ip)->FrontPen = pick;
  113.         ((struct Border *)ip)->BackPen = onoff;
  114.         if( propborder ) {
  115.             ((struct Border *)ip)->LeftEdge -= 4;
  116.             ((struct Border *)ip)->TopEdge -= 2;
  117.         }
  118.         (struct Border *)ip = (struct Border *) temp;
  119.         } /* while */
  120.     }
  121.     (struct IntuiText *) ip = gp->GadgetText;
  122.     while( (struct IntuiText *) ip ) {
  123.         pick = ((struct IntuiText *)ip)->FrontPen;
  124.         onoff = ((struct IntuiText *)ip)->BackPen;
  125.         ((struct IntuiText *)ip)->FrontPen = backpen;
  126.         ((struct IntuiText *)ip)->BackPen = backpen;
  127.         temp = (APTR) ((struct IntuiText *)ip)->NextText;
  128.         ((struct IntuiText *)ip)->NextText = NULL;
  129.         PrintIText( rp, (struct IntuiText *) ip, (long) left, (long) top );
  130.         ((struct IntuiText *)ip)->NextText = (struct IntuiText *) temp;
  131.         ((struct IntuiText *)ip)->FrontPen = pick;
  132.         ((struct IntuiText *)ip)->BackPen = onoff;
  133.         (struct IntuiText *)ip = (struct IntuiText *) temp;
  134.     } /* while */
  135.         /* the actual strgadget string is rendered in the screen's font
  136.          * but initially using Screen->BarLayer->rp->Font
  137.          */
  138. /*****
  139.     if( (gp->GadgetType & ~GADGETTYPE) == STRGADGET ) {
  140.         sip = (struct StringInfo *) gp->SpecialInfo;
  141.         itext.BackPen = itext.FrontPen = backpen;
  142.         itext.DrawMode = JAM2;
  143.         itext.TopEdge = itext.LeftEdge = 0;
  144.         itext.ITextFont = window->WScreen->Font;
  145.         itext.IText = &sip->Buffer[sip->DispPos];
  146.         tempchar = itext.IText[sip->DispCount];
  147.         itext.IText[sip->DispCount] = '\0';
  148.         itext.NextText = NULL;
  149.         PrintIText( rp, &itext, (long) sip->CLeft, (long) sip->CTop );
  150.         itext.IText[sip->DispCount] = tempchar;
  151.     }
  152. *****/
  153.     if( (gp->GadgetType & ~GADGETTYPE) == PROPGADGET
  154.         || (gp->GadgetType & ~GADGETTYPE) == STRGADGET ) {
  155.         image.LeftEdge = 0;
  156.         image.TopEdge = 0;
  157.         image.Width = gp->Width;
  158.         if( gp->Flags & GRELWIDTH ) {
  159.         image.Width += req ? req->Width : window->Width;
  160.         }
  161.         image.Height = gp->Height;
  162.         if( gp->Flags & GRELHEIGHT ) {
  163.         image.Height += req ? req->Height : window->Height;
  164.         }
  165.         image.Depth = 0;
  166.         image.ImageData = NULL;
  167.         image.PlanePick = 0;
  168.         image.PlaneOnOff = backpen;
  169.         image.NextImage = NULL;
  170.         DrawImage( rp, &image, (long) left, (long) top );
  171.     }
  172.     } /* for */
  173.     return( 0 );
  174. } /* clearGadgets */
  175.  
  176.  
  177. short toggleBoolGadget( window, gp, req )
  178.     struct Window        *window;
  179.     register struct Gadget  *gp;
  180.     struct Requester        *req;
  181. {
  182.     APTR        temp;
  183.     USHORT        pos;
  184.     SHORT        pick, onoff;
  185.  
  186. #ifdef GIMME_WIMPY
  187.     if( !window || !gp ) {
  188.     return( -1 );
  189.     }
  190. #endif
  191.     if( (gp->GadgetType & ~GADGETTYPE) != BOOLGADGET ) {
  192.     return( 0 );
  193.     }
  194.     if( (pos = RemoveGadget(window, gp)) == (USHORT) -1 ) {
  195.     return( -1 );
  196.     }
  197.     gp->NextGadget = NULL;
  198.     if( gp->Flags & GADGIMAGE ) {
  199.     clearGadgets( gp, window, req, 1 );
  200.     temp = gp->GadgetRender;
  201.     gp->GadgetRender = gp->SelectRender;
  202.     gp->SelectRender = temp;
  203.     gp->Width = ((struct Image *)gp->GadgetRender)->Width;
  204.     gp->Height = ((struct Image *)gp->GadgetRender)->Height;
  205.     } else {
  206.     temp = (APTR) gp->GadgetText;
  207.     gp->GadgetText = (struct IntuiText *) gp->SelectRender;
  208.     gp->SelectRender = temp;
  209.     }
  210.     gp->Flags &= ~SELECTED;
  211.     AddGList( window, gp, (long) pos, 1L, req );
  212.     RefreshGList( gp, window, req, 1L );
  213.     return( 0 );
  214. } /* toggleBoolGadget */
  215.  
  216.  
  217. struct Gadget *findGadget( gp, id )
  218.     register struct Gadget  *gp;
  219.     USHORT  id;
  220. {
  221.     for( ; gp; gp = gp->NextGadget ) {
  222.     if( gp->GadgetID == id ) {
  223.         break;
  224.     }
  225.     } /* for */
  226.     return( gp );
  227. } /* findGadget */
  228.  
  229.  
  230. struct Gadget *findMyFirstGadget( gp, id )
  231.     register struct Gadget  *gp;
  232.     USHORT  id;
  233. {
  234.     for( ; gp; gp = gp->NextGadget ) {
  235.     if( gp->GadgetID > id ) {
  236.         break;
  237.     }
  238.     } /* for */
  239.     return( gp );
  240. } /* findMyFirstGadget */
  241.