home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / agl103p.lha / src / agl / border.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-09  |  6.5 KB  |  312 lines

  1. /******************************************************************************
  2.  
  3. Copyright © 1994 Jason Weber
  4. All Rights Reserved
  5.  
  6. $Id: border.c,v 1.2.1.2 1994/12/09 05:29:56 jason Exp $
  7.  
  8. $Log: border.c,v $
  9.  * Revision 1.2.1.2  1994/12/09  05:29:56  jason
  10.  * border buttons with feedback
  11.  *
  12.  * Revision 1.2.1.1  1994/11/16  07:08:31  jason
  13.  * forced update
  14.  *
  15.  * Revision 1.2  1994/11/16  06:21:14  jason
  16.  * complete Motif style borders
  17.  *
  18.  * Revision 1.1  1994/10/28  04:14:08  jason
  19.  * Initial revision
  20.  *
  21.  
  22. ******************************************************************************/
  23.  
  24.  
  25. #ifndef NOT_EXTERN
  26. #include"agl.h"
  27. #endif
  28.  
  29.  
  30. /******************************************************************************
  31. void    drawborder(long id,long button)
  32.  
  33.     if id<0, draw all window borders
  34.  
  35.     button:
  36.         0 = none
  37.         1 = menu button pressed
  38.         2 = title pressed
  39.         3 = minimize pressed
  40.         4 = maximize pressed
  41.  
  42. ******************************************************************************/
  43. /*PROTOTYPE*/
  44. void drawborder(long id,long button)
  45.     {
  46.     long x,y,lenx,leny;
  47.     long w,h;
  48.     long ledge;
  49.     long wid,old_wid;
  50.     long m;
  51.     long a,b,c;
  52.     long midcolor;
  53.     long darkcolor=DARKGREY;
  54.     long start,end;
  55.  
  56.     old_wid=CurrentWid;
  57.  
  58.     if(id<0)
  59.         {
  60.         start=0;
  61.         end=MAX_WINDOWS;
  62.         }
  63.     else
  64.         {
  65.         start=id;
  66.         end=id+1;
  67.         }
  68.  
  69.     for(wid=start;wid<end;wid++)
  70.         if(GLWindow[wid] && Bordered[wid])
  71.             {
  72.             winset(wid);
  73.  
  74.             if(GLFocus==wid)
  75.                 midcolor=LAVENDER;
  76.             else
  77.                 midcolor=LIGHTGREY;
  78.  
  79.             w=BorderWidth;
  80.             h=BorderHeight;
  81.  
  82.             ledge= BorderWidth>5? 2: 1;
  83.  
  84.             get_dimensions(wid,TRUE,&x,&y,&lenx,&leny);
  85.  
  86.             deactivate_clipping(wid);
  87.  
  88.             /* clear title bar */
  89.             agl_box(wid,midcolor,midcolor,        w,w,lenx-w-1,w+h-1,TRUE,FALSE);
  90.  
  91. #if TRUE
  92.             /* title text */
  93.             agl_text(wid,BLACK,                    w+h+2,w+h-3,TitleList[wid]);
  94.  
  95.             /* title box */
  96.             agl_box(wid,WHITE,darkcolor,        w+h,w,lenx-w-2*h-1,w+h-2,FALSE,button==2);
  97.  
  98.             /* re-cover min/max area */
  99.             agl_box(wid,midcolor,midcolor,        lenx-w-2*h,w+1,lenx-w-1,w+h-2,TRUE,FALSE);
  100.  
  101.             /* options button box */
  102.             agl_box(wid,WHITE,darkcolor,        w,w,w+h-1,w+h-2,FALSE,button==1);
  103.  
  104.             /* minimize button box */
  105.             agl_box(wid,WHITE,darkcolor,        lenx-w-2*h,w,lenx-w-h-1,w+h-2,FALSE,button==3);
  106.  
  107.             /* maximize button box */
  108.             agl_box(wid,WHITE,darkcolor,        lenx-w-h,w,lenx-w-2,w+h-2,FALSE,button==4);
  109.  
  110. #else
  111.             agl_box(wid,WHITE,darkcolor,        w,w,lenx-w-1,w+h-1,FALSE,FALSE);
  112.  
  113.             /* title text */
  114.             agl_text(wid,BLACK,                    w+h+2,w+h-3,TitleList[wid]);
  115.  
  116.             /* re-cover min/max area */
  117.             agl_box(wid,midcolor,midcolor,        lenx-w-2*h-1,w+1,lenx-w-1,w+h-1,TRUE,FALSE);
  118.  
  119.             /* options button divider */
  120.             a=w+h-1;
  121.             b=w+1;
  122.             c=w+h-2;
  123.             line3d(wid,darkcolor,WHITE,            a,b,c,TRUE,FALSE);
  124.  
  125.             /* maximize button divider */
  126.             a=lenx-w-h-1;
  127.             line3d(wid,darkcolor,WHITE,            a,b,c,TRUE,FALSE);
  128.  
  129.             /* minimize button divider */
  130.             a=lenx-w-2*h-1;
  131.             line3d(wid,darkcolor,WHITE,            a,b,c,TRUE,FALSE);
  132. #endif
  133.  
  134.             /* options logo */
  135.             a=w+h/2+1;
  136.             b=w+h/2;
  137.             agl_box(wid,midcolor,BLACK,            a-2,b-1,a+2,b+1,FALSE,FALSE);
  138.             a--;
  139.             b--;
  140.             agl_box(wid,BLACK,BLACK,            a-2,b-1,a+2,b+1,FALSE,FALSE);
  141.  
  142.             /* maximize logo */
  143.             a=lenx-w-h/2-1;
  144.             b++;
  145.             agl_box(wid,midcolor,BLACK,            a-2,b-2,a+2,b+2,FALSE,FALSE);
  146.             a--;
  147.             b--;
  148.             agl_box(wid,BLACK,BLACK,            a-2,b-2,a+2,b+2,FALSE,FALSE);
  149.  
  150.             /* minimize logo */
  151.             a=lenx-w-h*3/2;
  152.             b++;
  153.             agl_box(wid,midcolor,BLACK,            a-1,b-1,a+1,b+1,FALSE,FALSE);
  154.             a--;
  155.             b--;
  156.             agl_box(wid,BLACK,BLACK,            a-1,b-1,a+1,b+1,FALSE,FALSE);
  157.  
  158.             /* edges */
  159.             for(m=0;m<ledge;m++)
  160.                 {
  161.                 agl_box(wid,WHITE,darkcolor,    m,m,lenx-1-m,leny-1-m,FALSE,FALSE);
  162.                 agl_box(wid,darkcolor,WHITE,    w-1-m,w-1-m,lenx-w+m,leny-w+m,FALSE,FALSE);
  163.                 }
  164.  
  165.             for(m=0;m<w-2*ledge;m++)
  166.                 agl_box(wid,midcolor,midcolor,    ledge+m,ledge+m,lenx-1-ledge-m,leny-1-ledge-m,
  167.                                                                                         FALSE,FALSE);
  168.  
  169.  
  170.             /* sizing dimples */
  171.             if(Sizeable[wid])
  172.                 {
  173.                 /* left */
  174.                 a=1;
  175.                 b=w-ledge-1;
  176.                 line3d(wid,darkcolor,WHITE,        a,w+h-1,        b,FALSE);
  177.                 line3d(wid,darkcolor,WHITE,        a,leny-w-h-1,    b,FALSE);
  178.  
  179.                 /* right */
  180.                 a=lenx-w+1;
  181.                 b=lenx-2;
  182.                 line3d(wid,darkcolor,WHITE,        a,w+h-1,        b,FALSE);
  183.                 line3d(wid,darkcolor,WHITE,        a,leny-w-h-1,    b,FALSE);
  184.  
  185.                 /* top */
  186.                 a=1;
  187.                 b=w-ledge-1;
  188.                 line3d(wid,darkcolor,WHITE,        w+h-1,a,        b,TRUE);
  189.                 line3d(wid,darkcolor,WHITE,        lenx-w-h-1,a,    b,TRUE);
  190.  
  191.                 /* bottom */
  192.                 a=leny-w+1;
  193.                 b=leny-2;
  194.                 line3d(wid,darkcolor,WHITE,        w+h-1,a,        b,TRUE);
  195.                 line3d(wid,darkcolor,WHITE,        lenx-w-h-1,a,    b,TRUE);
  196.                 }
  197.  
  198.             /* black title outline */
  199.             agl_box(wid,BLACK,BLACK,            w-1,w-1,lenx-w-1,w+h-1,FALSE,FALSE);
  200.  
  201.  
  202.             activate_clipping(wid);
  203.  
  204.             }
  205.  
  206.     winset(old_wid);
  207.     }
  208.  
  209.  
  210. /******************************************************************************
  211. void    line3d(long wid,long c1,long c2,long x1,long y1,long xy2,long vertical)
  212.  
  213.     horizontal or vertical line with 3D effect
  214.     from x1,y1 to x1,xy2 or xy2,y1
  215.  
  216.     c1 is the top/left color
  217.     c2 is the bottom/right color
  218.  
  219. ******************************************************************************/
  220. /*PROTOTYPE*/
  221. void line3d(long wid,long c1,long c2,long x1,long y1,long xy2,long vertical)
  222.     {
  223.     struct RastPort *rp;
  224.  
  225.     rp=GLWindow[wid]->RPort;
  226.  
  227.     /* top/left */
  228.     SetAPen(rp,c1);
  229.  
  230.     Move(rp,x1,y1);
  231.     if(vertical)
  232.         {
  233.         Draw(rp,x1,xy2);
  234.         x1++;
  235.         }
  236.     else
  237.         {
  238.         Draw(rp,xy2,y1);
  239.         y1++;
  240.         }
  241.  
  242.     /* bottom/right */
  243.     SetAPen(rp,c2);
  244.  
  245.     Move(rp,x1,y1);
  246.     if(vertical)
  247.         Draw(rp,x1,xy2);
  248.     else
  249.         Draw(rp,xy2,y1);
  250.     }
  251.  
  252.  
  253. /******************************************************************************
  254. void    agl_box(long wid,long c1,long c2,long x1,long y1,long x2,long y2,
  255.                                                         long fill,long inverse)
  256.  
  257.     for unfilled, c2 specifies different color for right and bottom
  258.  
  259.     inverse will reverse colors
  260.  
  261. ******************************************************************************/
  262. /*PROTOTYPE*/
  263. void agl_box(long wid,long c1,long c2,long x1,long y1,long x2,long y2,long fill,long inverse)
  264.     {
  265.     struct RastPort *rp;
  266.  
  267.     rp=GLWindow[wid]->RPort;
  268.  
  269.     if(inverse)
  270.         SetAPen(rp,c2);
  271.     else
  272.         SetAPen(rp,c1);
  273.  
  274.     if(fill)
  275.         RectFill(rp,x1,y1,x2,y2);
  276.     else
  277.         {
  278.         Move(rp,x2,y1);
  279.         Draw(rp,x1,y1);
  280.         Draw(rp,x1,y2);
  281.  
  282.         if(c1!=c2)
  283.             {
  284.             if(inverse)
  285.                 SetAPen(rp,c1);
  286.             else
  287.                 SetAPen(rp,c2);
  288.             }
  289.  
  290.         Draw(rp,x2,y2);
  291.         Draw(rp,x2,y1);
  292.         }
  293.     }
  294.  
  295.  
  296. /******************************************************************************
  297. void    agl_test(long wid,long c,long x,long y,char *string)
  298.  
  299. ******************************************************************************/
  300. /*PROTOTYPE*/
  301. void agl_text(long wid,long c,long x,long y,char *string)
  302.     {
  303.     struct RastPort *rp;
  304.  
  305.     rp=GLWindow[wid]->RPort;
  306.  
  307.     SetAPen(rp,c);
  308.  
  309.     Move(rp,x,y);
  310.     Text(rp,string,(ULONG)strlen(string));
  311.     }
  312.