home *** CD-ROM | disk | FTP | other *** search
/ Executor 2.0 / executorv2.0.iso / pc / dos / extra / source / browser / browser.hqx / Browser / ibutton ƒ / ibutton.c next >
Encoding:
C/C++ Source or Header  |  1996-03-28  |  3.4 KB  |  164 lines

  1. #include "ibutton.h"
  2. #include <assert.h>
  3.  
  4. #include "ibutton.proto.h"
  5.  
  6. #define HACKY_COLOR_SAVE            \
  7.   {                                    \
  8.     RGBColor save_fore, save_back;    \
  9.                                     \
  10.     GetForeColor (&save_fore);        \
  11.     GetBackColor (&save_back);        \
  12.     ForeColor (blackColor);            \
  13.     BackColor (whiteColor);
  14.  
  15. #define HACKY_COLOR_RESTORE            \
  16.     RGBForeColor (&save_fore);        \
  17.     RGBBackColor (&save_back);        \
  18.   }
  19.  
  20. void
  21. mydrawcontrol (short varcode, ControlHandle c)
  22. {
  23.   Rect sr, dr, *rp;
  24.   Point loc;
  25.   int dsize, isize, cheight, cwidth;
  26.   Handle h;
  27.   BitMap sbm, mbm;
  28.   FontInfo fi;
  29.   PenState ps;
  30.   GrafPtr saveport;
  31.  
  32.   GetPort (&saveport);
  33.   SetPort ((*c)->contrlOwner);
  34.   
  35.   HACKY_COLOR_SAVE
  36.   rp = &(*c)->contrlRect;
  37.   FrameRect (rp);
  38.   InsetRect (rp, 1, 1);
  39.   cheight = rp->bottom - rp->top;
  40.   cwidth = rp->right - rp->left;
  41.  
  42.   EraseRect (rp);
  43.   if (varcode & ICONBIT)
  44.     {
  45.       if (cheight < 32 || cwidth < 32)
  46.     {
  47.       dsize = 16;
  48.       if (!(h = GetResource ('ics#', (*c)->contrlRfCon)))
  49.         {
  50.           h = GetResource ('ICN#', (*c)->contrlRfCon);
  51.           isize = 32;
  52.         }
  53.       else
  54.         isize = 16;
  55.     }
  56.       else
  57.     {
  58.       dsize = 32;
  59.       isize = 32;
  60.       h = GetResource ('ICN#', (*c)->contrlRfCon);
  61.     }
  62.       HLock (h);
  63.       sbm.baseAddr = *h;
  64.       sbm.rowBytes = isize / 8;
  65.       mbm.baseAddr = *h + isize * isize / 8;
  66.       mbm.rowBytes = isize / 8;
  67.       SetRect (&sr, 0, 0, isize, isize);
  68.       SetRect (&sbm.bounds, 0, 0, isize, isize);
  69.       SetRect (&mbm.bounds, 0, 0, isize, isize);
  70.       if (varcode & TEXTBIT)
  71.     loc.h = rp->left;
  72.       else
  73.     loc.h = rp->left + (cwidth - dsize) / 2;
  74.       loc.v = rp->top + (cheight - dsize) / 2;
  75.       SetRect (&dr, loc.h, loc.v, loc.h + dsize, loc.v + dsize);
  76.       CopyMask (&sbm, &mbm, &(*c)->contrlOwner->portBits, &sr, &sr, &dr);
  77.       HUnlock (h);
  78.       loc.h = dr.right;
  79.     }
  80.   else
  81.     loc.h = rp->left;
  82.  
  83.   if (varcode & TEXTBIT)
  84.     {
  85.       GetPenState (&ps);
  86.       TextSize (12);
  87.       if (StringWidth ((*c)->contrlTitle) > rp->right - loc.h)
  88.     TextSize (9);
  89.       GetFontInfo (&fi);
  90.       loc.v = rp->top + (cheight + fi.ascent - fi.descent) / 2;
  91.       MoveTo (loc.h, loc.v);
  92.       DrawString ((*c)->contrlTitle);
  93.       SetPenState (&ps);
  94.     }
  95.   if ((*c)->contrlHilite == inButton)
  96.     InvertRect (rp);
  97.   else if ((*c)->contrlHilite == 255)
  98.     FrameRect (rp);
  99.   InsetRect (rp, -1, -1);
  100.   HACKY_COLOR_RESTORE
  101.   SetPort (saveport);
  102. }
  103.  
  104. long
  105. mytest (long param, ControlHandle c)
  106. {
  107.   Point p;
  108.  
  109.   p.v = HiWord (param);
  110.   p.h = LoWord (param);
  111.   if ((*c)->contrlHilite != 255)
  112.     if (PtInRect (p, &(*c)->contrlRect))
  113.       return (long) inButton;
  114.   return 0L;
  115. }
  116.  
  117. void
  118. mycalc (RgnHandle rgn, ControlHandle c)
  119. {
  120.   RectRgn (rgn, &(*c)->contrlRect);
  121. }
  122.  
  123. pascal long
  124. main (short varcode, ControlHandle c, short message, long param)
  125. {
  126.   long retval;
  127.  
  128.   retval = 0;
  129.   switch (message)
  130.     {
  131.     case drawCntl:
  132. /* Ignore param, always draw the whole control */
  133.       mydrawcontrol (varcode, c);
  134.       break;
  135.     case testCntl:
  136.       retval = mytest (param, c);
  137.       break;
  138.     case calcCRgns:
  139. #ifdef LIVEDANGEROUSLY
  140.       if (param & 0x80000000)
  141.     param &= 0x00FFFFFF
  142. #endif /* LIVEDANGEROUSLY */
  143. /* FALL THROUGH --> */
  144.     case calcCntlRgn:
  145.     mycalc ((RgnHandle) param, c);
  146.       break;
  147.  
  148.     case initCntl:
  149.     case dispCntl:
  150.     case posCntl:
  151.     case thumbCntl:
  152.     case dragCntl:
  153.     case autoTrack:
  154.     case calcThumbRgn:
  155.       break;
  156.     default:
  157.       assert (0);
  158.       break;
  159.     }
  160.   return retval;
  161. }
  162.  
  163.  
  164.