home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / rom / intuition / boolgadgets.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  4KB  |  174 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: boolgadgets.c,v 1.3 1997/01/27 00:36:36 ldp Exp $
  4.  
  5.     Desc: Routines for BOOL Gadgets
  6.     Lang: english
  7. */
  8.  
  9. #include <proto/graphics.h>
  10. #include <proto/intuition.h>
  11. #include "intuition_intern.h"
  12. #include "gadgets.h"
  13.  
  14. void RefreshBoolGadget (struct Gadget * gadget, struct Window * window,
  15.         struct IntuitionBase * IntuitionBase)
  16. {
  17.     struct BBox bbox;
  18.  
  19.     APTR  render;
  20.     UBYTE DrawMode;
  21.     ULONG apen;
  22.  
  23. #define RENDERGADGET(win,gad,rend)              \
  24.     if (rend)                               \
  25.     {                    \
  26.         if (gad->Flags & GFLG_GADGIMAGE)    \
  27.         {                    \
  28.         DrawImage (win->RPort           \
  29.             , (struct Image *)rend      \
  30.             , bbox.Left         \
  31.             , bbox.Top            \
  32.         );                \
  33.         }                    \
  34.         else                \
  35.         {                    \
  36.         DrawBorder (win->RPort          \
  37.             , (struct Border *)rend     \
  38.             , bbox.Left         \
  39.             , bbox.Top            \
  40.         );                \
  41.         }                    \
  42.     }
  43. #define GETRENDER(gad)  (gad->Flags & GFLG_SELECTED) ? \
  44.                 gad->SelectRender : gad->GadgetRender;
  45.  
  46.  
  47.     CalcBBox (window, gadget, &bbox);
  48.  
  49.     if (bbox.Width <= 0 || bbox.Height <= 0)
  50.     return;
  51.  
  52.     apen = GetAPen (window->RPort);
  53.     DrawMode = GetDrMd (window->RPort);
  54.  
  55.     SetDrMd (window->RPort, JAM1);
  56.  
  57.     EraseRect (window->RPort
  58.     , bbox.Left
  59.     , bbox.Top
  60.     , bbox.Left + bbox.Width - 1
  61.     , bbox.Top + bbox.Height - 1
  62.     );
  63.  
  64.     switch (gadget->Flags & GFLG_GADGHIGHBITS)
  65.     {
  66.     case GFLG_GADGHIMAGE:
  67.     render = GETRENDER(gadget);
  68.     RENDERGADGET(window,gadget,render);
  69.     break;
  70.  
  71.     case GFLG_GADGHNONE:
  72.     render = gadget->GadgetRender;
  73.     RENDERGADGET(window,gadget,render);
  74.     break;
  75.  
  76.     } /* switch GadgetHighlightMethod */
  77.  
  78.     if (gadget->GadgetText)
  79.     {
  80.     switch (gadget->Flags & GFLG_LABELMASK)
  81.     {
  82.     case GFLG_LABELITEXT:
  83.         PrintIText (window->RPort
  84.         , gadget->GadgetText
  85.         , bbox.Left
  86.         , bbox.Top
  87.         );
  88.         break;
  89.  
  90.     case GFLG_LABELSTRING: {
  91.         STRPTR text = (STRPTR) gadget->GadgetText;
  92.         int len, labelwidth, labelheight;
  93.  
  94.         len = strlen (text);
  95.  
  96.         labelwidth = LabelWidth (window->RPort, text, len, IntuitionBase);
  97.         labelheight = window->RPort->Font->tf_YSize;
  98.  
  99.         SetAPen (window->RPort, 1);
  100.         SetDrMd (window->RPort, JAM1);
  101.  
  102.         Move (window->RPort
  103.         , bbox.Left + bbox.Width/2 - labelwidth/2
  104.         , bbox.Top + bbox.Height/2 - labelheight/2
  105.             + window->RPort->Font->tf_Baseline
  106.         );
  107.         RenderLabel (window->RPort, text, len, IntuitionBase);
  108.  
  109.         break; }
  110.  
  111.     case GFLG_LABELIMAGE:
  112.         DrawImage (window->RPort
  113.         , (struct Image *)gadget->GadgetText
  114.         , bbox.Left
  115.         , bbox.Top
  116.         );
  117.         break;
  118.     }
  119.     } /* GadgetText */
  120.  
  121.     switch (gadget->Flags & GFLG_GADGHIGHBITS)
  122.     {
  123.     case GFLG_GADGHCOMP:
  124.     render = gadget->GadgetRender;
  125.     RENDERGADGET(window,gadget,render);
  126.  
  127.     if (gadget->Flags & GFLG_SELECTED)
  128.     {
  129.         SetDrMd (window->RPort, COMPLEMENT);
  130.  
  131.         RectFill (window->RPort
  132.         , bbox.Left
  133.         , bbox.Top
  134.         , bbox.Left + bbox.Width - 1
  135.         , bbox.Top + bbox.Height - 1
  136.         );
  137.     }
  138.  
  139.     break;
  140.  
  141.     case GFLG_GADGHBOX:
  142.     render = gadget->GadgetRender;
  143.     RENDERGADGET(window,gadget,render);
  144.  
  145.     if (gadget->Flags & GFLG_SELECTED)
  146.     {
  147.         SetDrMd (window->RPort, COMPLEMENT);
  148.  
  149. #define BOXWIDTH 5
  150.         RectFill (window->RPort
  151.         , bbox.Left
  152.         , bbox.Top
  153.         , bbox.Left + bbox.Width - 1
  154.         , bbox.Top + bbox.Height - 1
  155.         );
  156.  
  157.         if (bbox.Width > 2*BOXWIDTH && bbox.Height > 2*BOXWIDTH)
  158.         {
  159.         RectFill (window->RPort
  160.             , bbox.Left + BOXWIDTH
  161.             , bbox.Top + BOXWIDTH
  162.             , bbox.Left + bbox.Width - BOXWIDTH - 1
  163.             , bbox.Top + bbox.Height - BOXWIDTH - 1
  164.         );
  165.         }
  166.     }
  167.  
  168.     break;
  169.     } /* Highlight after contents have been drawn */
  170.  
  171.     SetDrMd (window->RPort, DrawMode);
  172.     SetAPen (window->RPort, apen);
  173. } /* RefreshBoolGadget */
  174.