home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Programming / DOpus4-GPL / Library / borders.c < prev    next >
C/C++ Source or Header  |  2000-01-27  |  4KB  |  164 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  
  21. All users of Directory Opus 4 (including versions distributed
  22. under the GPL) are entitled to upgrade to the latest version of
  23. Directory Opus version 5 at a reduced price. Please see
  24. http://www.gpsoft.com.au for more information.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. #include "dopuslib.h"
  32.  
  33. void fill_out_border_data(short *,short *,int,int);
  34. void fill_out_border(struct Border *,int,int,short *,short *);
  35.  
  36. void __asm __saveds DoAddGadgetBorders(register __a0 struct DOpusRemember **key,
  37.     register __a1 struct Gadget *gadget,
  38.     register __d0 int count,
  39.     register __d1 int shine,
  40.     register __d2 int shadow)
  41. {
  42.     struct Border *selborder,*unselborder;
  43.     int width,height;
  44.  
  45.     width=gadget->Width;
  46.     height=gadget->Height;
  47.  
  48.     DoCreateGadgetBorders(key,
  49.         gadget->Width,gadget->Height,
  50.         &selborder,&unselborder,
  51.         0,
  52.         shine,shadow);
  53.  
  54.     while (gadget && count) {
  55.         if (gadget->Width==width && gadget->Height==height &&
  56.             (gadget->GadgetType==GTYP_BOOLGADGET || gadget->GadgetType>YP_SYSGADGET)) {
  57.             if (unselborder) {
  58.                 gadget->Flags|=GFLG_GADGHIMAGE;
  59.                 gadget->Flags&=~GFLG_GADGHCOMP;
  60.                 gadget->GadgetRender=unselborder;
  61.                 gadget->SelectRender=selborder;
  62.             }
  63.             else {
  64.                 gadget->Flags&=~GFLG_GADGHIMAGE;
  65.                 gadget->Flags|=GFLG_GADGHCOMP;
  66.                 gadget->GadgetRender=NULL;
  67.                 gadget->SelectRender=NULL;
  68.             }
  69.         }
  70.         gadget=gadget->NextGadget;
  71.         --count;
  72.     }
  73. }
  74.  
  75. void __asm __saveds DoCreateGadgetBorders(register __a0 struct DOpusRemember **key,
  76.     register __d0 int w,
  77.     register __d1 int h,
  78.     register __a1 struct Border **selborder,
  79.     register __a2 struct Border **unselborder,
  80.     register __d2 int dogear,
  81.     register __d3 int shine,
  82.     register __d4 int shadow)
  83. {
  84.     short *shine_data,*shadow_data;
  85.  
  86.     *selborder=NULL;
  87.     *unselborder=NULL;
  88.  
  89.     if ((shine_data=LAllocRemember(key,10*sizeof(short),MEMF_CLEAR)) &&
  90.         (shadow_data=LAllocRemember(key,10*sizeof(short),MEMF_CLEAR))) {
  91.  
  92.         fill_out_border_data(shine_data,shadow_data,w-1,h-1);
  93.         if (dogear) {
  94.             shine_data[0]=w-6;
  95.             shadow_data[5]=4;
  96.             shadow_data[7]=4;
  97.         }
  98.  
  99.         if ((*selborder=LAllocRemember(key,sizeof(struct Border)*2,MEMF_CLEAR)) &&
  100.             (*unselborder=LAllocRemember(key,sizeof(struct Border)*2,MEMF_CLEAR))) {
  101.  
  102.             fill_out_border(*selborder,shadow,shine,shine_data,shadow_data);
  103.             fill_out_border(*unselborder,shine,shadow,shine_data,shadow_data);
  104.         }
  105.     }
  106. }
  107.  
  108. void fill_out_border_data(shine,shadow,w,h)
  109. short *shine,*shadow;
  110. int w,h;
  111. {
  112.     shine[0]=w-1;     /* w-1,0  -> 0,0  -> 0,h  -> 1,h-1  -> 1,0 */
  113.     shine[5]=h;
  114.     shine[6]=1;
  115.     shine[7]=h-1;
  116.     shine[8]=1;
  117.  
  118.     shadow[0]=1;      /* 1,h  -> w,h  -> w,0  -> w-1,1  -> w-1,h */
  119.     shadow[1]=h;
  120.     shadow[2]=w;
  121.     shadow[3]=h;
  122.     shadow[4]=w;
  123.     shadow[6]=w-1;
  124.     shadow[7]=1;
  125.     shadow[8]=w-1;
  126.     shadow[9]=h;
  127. }
  128.  
  129. void fill_out_border(border,fpen,bpen,shine,shadow)
  130. struct Border *border;
  131. int fpen,bpen;
  132. short *shine,*shadow;
  133. {
  134.     border[0].FrontPen=fpen;
  135.     border[0].DrawMode=JAM1;
  136.     border[0].Count=5;
  137.     border[0].XY=shine;
  138.     border[0].NextBorder=&border[1];
  139.     border[1].FrontPen=bpen;
  140.     border[1].DrawMode=JAM1;
  141.     border[1].Count=5;
  142.     border[1].XY=shadow;
  143. }
  144.  
  145. void __asm __saveds DoSelectGadget(register __a0 struct Window *window,
  146.     register __a1 struct Gadget *gadget)
  147. {
  148.     if (gadget->GadgetRender && gadget->SelectRender && !(gadget->Flags&GFLG_GADGIMAGE)) {
  149.         DrawBorder(window->RPort,gadget->SelectRender,gadget->LeftEdge,gadget->TopEdge);
  150.         Delay(5);
  151.         DrawBorder(window->RPort,gadget->GadgetRender,gadget->LeftEdge,gadget->TopEdge);
  152.     }
  153.     else {
  154.         int old;
  155.  
  156.         old=window->RPort->DrawMode;
  157.         SetDrMd(window->RPort,COMPLEMENT);
  158.         HiliteGad(gadget,window->RPort);
  159.         Delay(5);
  160.         HiliteGad(gadget,window->RPort);
  161.         SetDrMd(window->RPort,old);
  162.     }
  163. }
  164.