home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Games / Pentominoes 2.0 / Shell ƒ / button layer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-23  |  9.6 KB  |  326 lines  |  [TEXT/MMCC]

  1. #include "button layer.h"
  2. #include "text layer.h"
  3. #include <Icons.h>
  4.  
  5. static    RGBColor        gDkGray4={16384, 16384, 16384};
  6. static    RGBColor        gLtGray4={43691, 43691, 43691};
  7. static    RGBColor        gMediumGray4={32767, 32767, 32767};
  8. static    RGBColor        gMediumGray8={26214, 26214, 39322};
  9. static    RGBColor        gVeryLtGray8={60948, 60948, 60948};
  10. static    RGBColor        gLtGray8={52428, 52428, 52428};
  11. static    RGBColor        gLtBlue8={52428, 52428, 65535};
  12. static    RGBColor        gDkGray8={26214, 26214, 26214};
  13. static    RGBColor        gDkBlue8={39321, 39321, 52428};
  14.  
  15. static    RGBColor        gBlack={0, 0, 0};
  16. static    RGBColor        gWhite={65535, 65535, 65535};
  17.  
  18. #define TRIANGLE_SIZE    6
  19.  
  20. void Draw3DButton(Rect *buttonRect, unsigned char *theTitle,
  21.     Handle iconHandle, short buttonDepth, short buttonType)
  22. {
  23.     Rect            tempRect, defaultRect;
  24.     RGBColor        oldForeColor, oldBackColor;
  25.     short            theLineHeight;
  26.     Rect            iconRect;
  27.     Boolean            isDown, isDimmed;
  28.     
  29.     isDown=(buttonType & kButtonIsDown) ? TRUE : FALSE;
  30.     isDimmed=(buttonType & kButtonIsDimmed) ? TRUE : FALSE;
  31.     if (buttonType & kButtonUseDefaultFont)
  32.     {
  33.         theLineHeight=CalculateFontHeight(MyGetDefaultFont(), MyGetDefaultFontSize());
  34.         UseDefaultDrawingFont();
  35.     }
  36.     else
  37.     {
  38.         theLineHeight=CalculateFontHeight(geneva, 9);
  39.         SetTheDrawingFont(geneva, 9, 0, 0);
  40.     }
  41.     
  42.     TextMode(srcOr);
  43.     
  44.     if (iconHandle!=0L)
  45.     {
  46.         iconRect.left=(buttonRect->right-buttonRect->left)/2+buttonRect->left-8+
  47.             (isDown ? 1 : 0);
  48.         iconRect.right=iconRect.left+16;
  49.         iconRect.top=(buttonRect->bottom-buttonRect->top)/2+buttonRect->top-8+
  50.             (isDown ? 1 : 0)-((theTitle!=0L) ? 5 : 0);
  51.         iconRect.bottom=iconRect.top+16;
  52.     }
  53.     
  54.     if (buttonDepth>2)
  55.     {
  56.         GetForeColor(&oldForeColor);
  57.         GetBackColor(&oldBackColor);
  58.         RGBBackColor(&gWhite);
  59.         
  60.         if (buttonType & kButtonIsDimmed)
  61.             SetRect(&tempRect, buttonRect->left+1, buttonRect->top+1,
  62.                 buttonRect->right-1, buttonRect->bottom-1);
  63.         else
  64.             SetRect(&tempRect, buttonRect->left+2, buttonRect->top+2,
  65.                 buttonRect->right-2, buttonRect->bottom-2);
  66.         
  67.         if (buttonType & kRoundRectButton)
  68.         {
  69.             if (buttonType & kButtonIsDefault)
  70.             {
  71.                 defaultRect=*buttonRect;
  72.                 PenSize(3, 3);
  73.                 InsetRect(&defaultRect, -4, -4);
  74.                 FrameRoundRect(&defaultRect, 16, 16);
  75.                 PenNormal();
  76.             }
  77.             FrameRoundRect(buttonRect, 10, 10);
  78.             InsetRect(&tempRect, 1, 1);
  79.             RGBForeColor((buttonDepth==4) ? &gLtGray4 : &gLtGray8);
  80.             PaintRect(&tempRect);
  81.             if (buttonType & kButtonIsDimmed)
  82.             {
  83. // more here
  84.             }
  85.             else
  86.             {
  87.                 RGBForeColor(isDown ? ((buttonDepth==4) ? &gDkGray8 : &gMediumGray4) : &gWhite);
  88.                 MoveTo(buttonRect->left+1, buttonRect->top+3);
  89.                 LineTo(buttonRect->left+1, buttonRect->bottom-4);
  90.                 MoveTo(buttonRect->left+2, buttonRect->top+2);
  91.                 Line(0, 0);
  92.                 MoveTo(buttonRect->left+3, buttonRect->top+1);
  93.                 LineTo(buttonRect->right-4, buttonRect->top+1);
  94.                 RGBForeColor((buttonDepth==4) ? &gLtGray4 :
  95.                     isDown ? &gDkBlue8 : &gLtBlue8);
  96.                 MoveTo(buttonRect->right-4, buttonRect->top+2);
  97.                 LineTo(buttonRect->left+3, buttonRect->top+2);
  98.                 MoveTo(buttonRect->left+2, buttonRect->top+3);
  99.                 LineTo(buttonRect->left+2, buttonRect->bottom-4);
  100.                 RGBForeColor((buttonDepth==4) ? &gLtGray4 :
  101.                     isDown ? &gLtBlue8 : &gDkBlue8);
  102.                 MoveTo(buttonRect->right-3, buttonRect->top+2);
  103.                 LineTo(buttonRect->right-3, buttonRect->bottom-4);
  104.                 MoveTo(buttonRect->left+2, buttonRect->bottom-3);
  105.                 LineTo(buttonRect->right-4, buttonRect->bottom-3);
  106.                 RGBForeColor(isDown ? &gWhite : ((buttonDepth==4) ? &gMediumGray4 : &gDkGray8));
  107.                 MoveTo(buttonRect->right-2, buttonRect->top+3);
  108.                 LineTo(buttonRect->right-2, buttonRect->bottom-4);
  109.                 MoveTo(buttonRect->right-3, buttonRect->bottom-3);
  110.                 Line(0, 0);
  111.                 MoveTo(buttonRect->right-4, buttonRect->bottom-2);
  112.                 LineTo(buttonRect->left+3, buttonRect->bottom-2);
  113.             }
  114.         }
  115.         else if (buttonType & kRadioButton)
  116.         {
  117.             RGBForeColor((buttonDepth==4) ? &gLtGray4 : &gLtGray8);
  118.             PaintOval(&tempRect);
  119.             InsetRect(&tempRect, -1, -1);
  120.             RGBForeColor(&gBlack);
  121.             FrameOval(&tempRect);
  122.         }
  123.         else if (buttonType & kSquareButton)
  124.         {
  125.             RGBForeColor((buttonDepth==4) ? &gLtGray4 : &gLtGray8);
  126.             PaintRect(&tempRect);
  127.             if (buttonType & kButtonIsDimmed)
  128.             {
  129.                 RGBForeColor((buttonDepth==4) ? &gMediumGray4 : &gVeryLtGray8);
  130.                 MoveTo(buttonRect->left, buttonRect->top);
  131.                 LineTo(buttonRect->right-1, buttonRect->top);
  132.                 LineTo(buttonRect->right-1, buttonRect->bottom-1);
  133.                 LineTo(buttonRect->left, buttonRect->bottom-1);
  134.                 LineTo(buttonRect->left, buttonRect->top);
  135.             }
  136.             else
  137.             {
  138.                 RGBForeColor(isDown ? ((buttonDepth==4) ? &gDkGray4 : &gMediumGray8) :
  139.                     ((buttonDepth==4) ? &gWhite : &gVeryLtGray8));
  140.                 MoveTo(buttonRect->left, buttonRect->top);
  141.                 LineTo(buttonRect->right-2, buttonRect->top);
  142.                 MoveTo(buttonRect->left, buttonRect->top+1);
  143.                 LineTo(buttonRect->right-3, buttonRect->top+1);
  144.                 MoveTo(buttonRect->left, buttonRect->top+2);
  145.                 LineTo(buttonRect->left, buttonRect->bottom-1);
  146.                 MoveTo(buttonRect->left+1, buttonRect->top+2);
  147.                 LineTo(buttonRect->left+1, buttonRect->bottom-2);
  148.                 
  149.                 RGBForeColor(isDown ? ((buttonDepth==4) ? &gWhite : &gVeryLtGray8) :
  150.                     ((buttonDepth==4) ? &gDkGray4 : &gMediumGray8));
  151.                 MoveTo(buttonRect->right-1, buttonRect->top);
  152.                 LineTo(buttonRect->right-1, buttonRect->bottom-1);
  153.                 MoveTo(buttonRect->right-2, buttonRect->top+1);
  154.                 LineTo(buttonRect->right-2, buttonRect->bottom-1);
  155.                 MoveTo(buttonRect->left+2, buttonRect->bottom-2);
  156.                 LineTo(buttonRect->right-1, buttonRect->bottom-2);
  157.                 MoveTo(buttonRect->left+1, buttonRect->bottom-1);
  158.                 LineTo(buttonRect->right-1, buttonRect->bottom-1);
  159.             }
  160.         }
  161.     }
  162.     else
  163.     {
  164.         if (buttonType & kRoundRectButton)
  165.         {
  166.             EraseRect(buttonRect);
  167.             if (buttonType & kButtonIsDefault)
  168.             {
  169.                 defaultRect=*buttonRect;
  170.                 PenSize(3, 3);
  171.                 InsetRect(&defaultRect, -4, -4);
  172.                 FrameRoundRect(&defaultRect, 16, 16);
  173.                 PenNormal();
  174.             }
  175.             FrameRoundRect(buttonRect, 10, 10);
  176.             if (isDown)
  177.             {
  178.                 MoveTo(buttonRect->left+1, buttonRect->top+3);
  179.                 LineTo(buttonRect->left+1, buttonRect->bottom-4);
  180.                 MoveTo(buttonRect->left+2, buttonRect->top+2);
  181.                 Line(0, 0);
  182.                 MoveTo(buttonRect->left+3, buttonRect->top+1);
  183.                 LineTo(buttonRect->right-4, buttonRect->top+1);
  184.             }
  185.             else
  186.             {
  187.                 MoveTo(buttonRect->right-2, buttonRect->top+3);
  188.                 LineTo(buttonRect->right-2, buttonRect->bottom-4);
  189.                 MoveTo(buttonRect->right-3, buttonRect->bottom-3);
  190.                 Line(0, 0);
  191.                 MoveTo(buttonRect->right-4, buttonRect->bottom-2);
  192.                 LineTo(buttonRect->left+3, buttonRect->bottom-2);
  193.             }
  194.         }
  195.         else if (buttonType & kRadioButton)
  196.         {
  197.             SetRect(&tempRect, buttonRect->left+1, buttonRect->top+1,
  198.                 buttonRect->right-1, buttonRect->bottom-1);
  199.             EraseRect(buttonRect);
  200.             FrameOval(&tempRect);
  201.         }
  202.         else if (buttonType & kSquareButton)
  203.         {
  204.             EraseRect(buttonRect);
  205.             if (buttonType & kButtonIsDimmed)
  206.                 PenPat(&qd.gray);
  207.             FrameRect(buttonRect);
  208.             PenNormal();
  209.             if ((buttonType & kButtonIsDimmed)==0)    /* not dimmed */
  210.             {
  211.                 if (isDown==0)    /* not down */
  212.                 {
  213.                     MoveTo(buttonRect->left+2, buttonRect->bottom-2);
  214.                     LineTo(buttonRect->right-2, buttonRect->bottom-2);
  215.                     LineTo(buttonRect->right-2, buttonRect->top+2);
  216.                 }
  217.                 else
  218.                 {
  219.                     MoveTo(buttonRect->left+1, buttonRect->bottom-3);
  220.                     LineTo(buttonRect->left+1, buttonRect->top+1);
  221.                     LineTo(buttonRect->right-3, buttonRect->top+1);
  222.                 }
  223.             }
  224.         }
  225.     }
  226.     
  227.     if (theTitle!=0L)
  228.     {
  229.         short            textX, textY;
  230.         
  231.         textX=buttonRect->left+(buttonRect->right-buttonRect->left)/2-
  232.             (StringWidth(theTitle)/2)+(isDown ? 1 : 0)+((buttonType & kButtonUseDefaultFont) ? 0 : 1);
  233.         textY=((iconHandle!=0L) ?
  234.             buttonRect->bottom-6 : buttonRect->top+
  235.             (buttonRect->bottom-buttonRect->top)/2+(theLineHeight/2)-2-
  236.             ((buttonType & kButtonUseDefaultFont) ? 2 : 0)+
  237.             (isDown ? 1 : 0));
  238.         if ((buttonDepth>2) && ((buttonType & kButtonIsDimmed)==0))
  239.         {
  240.             MoveTo(textX+1, textY+1);
  241.             RGBForeColor((buttonDepth==4) ? &gWhite : &gVeryLtGray8);
  242.             DrawString(theTitle);
  243.         }
  244.         if ((buttonDepth>2) && (buttonType & kButtonIsDimmed))
  245.             ForeColor(whiteColor);
  246.         else
  247.             ForeColor(blackColor);
  248.         MoveTo(textX, textY);
  249.         DrawString(theTitle);
  250.         ForeColor(blackColor);
  251.     }
  252.     
  253.     if (iconHandle!=0L)
  254.     {
  255.         PlotIconSuite(&iconRect, atAbsoluteCenter, isDimmed ? ttDisabled : ttNone, iconHandle);
  256.     }
  257.     
  258.     if (buttonType & kButtonIsPopup)
  259.     {
  260.         RgnHandle        triangleRgn;
  261.         
  262.         triangleRgn=NewRgn();
  263.         OpenRgn();
  264.             MoveTo(buttonRect->right-6+(isDown ? 1 : 0), buttonRect->top+5+(isDown ? 1 : 0));
  265.             Line(-TRIANGLE_SIZE, TRIANGLE_SIZE);
  266.             Line(-TRIANGLE_SIZE, -TRIANGLE_SIZE);
  267.             Line(TRIANGLE_SIZE*2, 0);
  268.         CloseRgn(triangleRgn);
  269.         FillRgn(triangleRgn, &qd.black);
  270.         DisposeRgn(triangleRgn);
  271.     }
  272.     
  273.     if (buttonDepth>2)
  274.     {
  275.         RGBForeColor(&oldForeColor);
  276.         RGBBackColor(&oldBackColor);    
  277.     }
  278.     
  279.     UseDefaultDrawingFont();
  280. }
  281.  
  282. Boolean Track3DButton(Rect *buttonRect, unsigned char *theTitle,
  283.     Handle iconHandle, short buttonDepth, short buttonType)
  284. {
  285.     Point            mouseLoc;
  286.     Boolean            buttonIsDown;
  287.     
  288.     buttonIsDown=FALSE;
  289.     while (StillDown())
  290.     {
  291.         GetMouse(&mouseLoc);
  292.         if (PtInRect(mouseLoc, buttonRect))
  293.         {
  294.             if (!buttonIsDown)
  295.             {
  296.                 buttonIsDown=TRUE;
  297.                 Draw3DButton(buttonRect, theTitle, iconHandle, buttonDepth, buttonType+kButtonIsDown);
  298.             }
  299.         }
  300.         else
  301.         {
  302.             if (buttonIsDown)
  303.             {
  304.                 buttonIsDown=FALSE;
  305.                 Draw3DButton(buttonRect, theTitle, iconHandle, buttonDepth, buttonType);
  306.             }
  307.         }
  308.     }
  309.     
  310.     if (buttonIsDown)
  311.         Draw3DButton(buttonRect, theTitle, iconHandle, buttonDepth, buttonType);
  312.     
  313.     return buttonIsDown;
  314. }
  315.  
  316. void Hit3DButton(Rect *buttonRect, unsigned char *theTitle,
  317.     Handle iconHandle, short buttonDepth, short buttonType)
  318. {
  319.     long            dummy;
  320.     
  321.     Draw3DButton(buttonRect, theTitle, iconHandle, buttonDepth, buttonType+kButtonIsDown);
  322.     Delay(8, &dummy);
  323.     Draw3DButton(buttonRect, theTitle, iconHandle, buttonDepth, buttonType);
  324. }
  325.  
  326.