home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / SASC6571.LZX / extras / guiprof / SMbar.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-26  |  10.4 KB  |  319 lines

  1. #include <exec/memory.h>
  2. #include <exec/libraries.h>
  3. #include <exec/execbase.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/imageclass.h>
  6. #include <proto/intuition.h>
  7. #include <proto/exec.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <assert.h>
  11.  
  12. extern struct ExecBase *SysBase;
  13.  
  14. #include "SMbarpr.h"
  15.  
  16. #define CHAR_ROW_OFFSET 10
  17. #define CHAR_WIDTH       8
  18.  
  19. /****************************** VertScrollBar *******************************
  20. *                                                                           *
  21. *    VertScrollBar - Put A Scroll Bar On Right Window Edge                  *
  22. *                                                                           *
  23. *         *window     - pointer to window structure                         *
  24. *         *gadget     - pointer to proportional gadget structure            *
  25. *         *propinfo   - pointer to info structure for the proport. gadget   *
  26. *         *image      - pointer to proportional gadget image                *
  27. *          gadgetID   - ID number for proportional gadget                   *
  28. *         *TAgadget   - pointer to top arrow gadget structure               *
  29. *         *TAimage    - pointer to top arrow image structure                *
  30. *          TAgadgetID - ID number for top arrow gadget                      *
  31. *         *BAgadget   - pointer to bottom arrow gadget structure            *
  32. *         *BAimage    - pointer to bottom arrow image structure             *
  33. *          BAgadgetID - ID number for bottom arrow gadget                   *
  34. *                                                                           *
  35. ****************************************************************************/
  36. static const USHORT __chip _FRSTopShiftData[] =
  37.   {0x8008,0x8208,0x8708,0x8F88,0x9FC8,0x8708,0x8708,0x8708,0x8708,0x8008};
  38.  
  39. static const USHORT __chip _FRSBottomShiftData[] =
  40.   {0x8008,0x8708,0x8708,0x8708,0x8708,0x9FC8,0x8F88,0x8708,0x8208,0x8008};
  41.  
  42. static const struct PropInfo pi =
  43. {
  44.    AUTOKNOB | FREEVERT | PROPNEWLOOK,   /* Flags */
  45.    0, 0,            /* HorizPot, VertPot     */
  46.    0x2000, VBMAXPOS,/* HorizBody, VertBody   */
  47.    0, 0,            /* CWidth, CHeight       */
  48.    0, 0,            /* HPotRes, VPotRes      */
  49.    0, 0             /* LeftBorder, TopBorder */
  50. };
  51.  
  52. static const struct Gadget gi =
  53. {
  54.    NULL,                        /* NextGadget */
  55.    -15, CHAR_ROW_OFFSET,        /* LeftEdge, TopEdge */
  56.    CHAR_WIDTH + CHAR_WIDTH - 1, /* Width */
  57.    -CHAR_ROW_OFFSET-32,         /* Height */
  58.    GADGIMAGE  | 
  59.    GADGHNONE  | 
  60.    GRELRIGHT  | 
  61.    GRELHEIGHT | 
  62.    RIGHTBORDER,                 /* Flags */
  63.    GADGIMMEDIATE | 
  64.    FOLLOWMOUSE   |
  65.    RELVERIFY     | 
  66.    RIGHTBORDER,                 /* Activation */
  67.    PROPGADGET,                  /* GadgetType */
  68.    NULL,                        /* GadgetRender (set later) */
  69.    NULL,                        /* SelectRender */
  70.    NULL,                        /* GadgetText */
  71.    0,                           /* MutualExclude */
  72.    NULL,                        /* SpecialInfo (set later) */
  73.    0,                           /* GadgetID (set later) */
  74.    NULL                         /* UserData (set later) */
  75. };
  76.  
  77. static const struct Gadget ti =
  78. {
  79.    NULL,                        /* NextGadget */
  80.    -17, -31,                    /* LeftEdge, TopEdge */
  81.    CHAR_WIDTH + CHAR_WIDTH + 1, /* Width */
  82.    10,                          /* Height */
  83.    GADGIMAGE  | 
  84.    GRELRIGHT  | 
  85.    GRELBOTTOM,                  /* Flags */
  86.    GADGIMMEDIATE | 
  87.    RELVERIFY,                   /* Activation */
  88.    BOOLGADGET,                  /* GadgetType */
  89.    NULL,                        /* GadgetRender (set later) */
  90.    NULL,                        /* SelectRender */
  91.    NULL,                        /* GadgetText */
  92.    0,                           /* MutualExclude */
  93.    NULL,                        /* SpecialInfo (set later) */
  94.    0,                           /* GadgetID (set later) */
  95.    NULL                         /* UserData (set later) */
  96. };
  97.  
  98. static const struct Image tiim =
  99. {
  100.    0,    /* LeftEdge */
  101.    0,    /* TopEdge  */
  102.    10,   /* Width */
  103.    10,   /* Height */
  104.    1,    /* Depth */
  105.    NULL, /* ImageData */
  106.    1,    /* PlanePick */
  107.    0,    /* PlaneOnOff */
  108.    NULL  /* NextImage */
  109. };
  110.  
  111. static struct Image * getimage(int type, struct Window *w)
  112. {
  113.     struct DrawInfo *drinfo;
  114.     struct Image *image;
  115.  
  116.     if (SysBase->LibNode.lib_Version >= 36) 
  117.     {
  118.        drinfo = GetScreenDrawInfo( w->WScreen );
  119.  
  120.        image = (struct Image *) NewObject( NULL, "sysiclass",
  121.         SYSIA_Size,     0,              /* normal "medium-res" for now */
  122.         SYSIA_DrawInfo, drinfo,
  123.         SYSIA_Which,    type,
  124.         TAG_END );
  125.         
  126.         return image;
  127.      }
  128.      return NULL;
  129. }
  130.  
  131. struct VBar *VBInit(struct Window *window)
  132. {
  133.    struct VBar *vb;
  134.  
  135.    if(!(vb = (struct VBar *)AllocMem(sizeof(struct VBar), MEMF_CLEAR)))
  136.       return(NULL);
  137.  
  138.    memcpy(&vb->propinfo, &pi, sizeof(pi));
  139.    memcpy(&vb->g.gadget, &gi, sizeof(gi));
  140.  
  141.    vb->g.gadget.GadgetRender = (APTR)&vb->g.image;
  142.    vb->g.gadget.SpecialInfo = (APTR)&vb->propinfo;
  143.    vb->g.gadget.GadgetID = vb->g.gadgetID = VB_SLIDER;
  144.  
  145.    if(SysBase->LibNode.lib_Version < 36) 
  146.    {
  147.       vb->g.gadget.LeftEdge = -(CHAR_WIDTH + CHAR_WIDTH - 1);
  148.       vb->g.gadget.TopEdge = CHAR_ROW_OFFSET+10;
  149.       vb->g.gadget.Height = -CHAR_ROW_OFFSET - 30;
  150.    }
  151.    else
  152.    {
  153.       if(SysBase->LibNode.lib_Version >= 39)
  154.          vb->propinfo.Flags |= PROPBORDERLESS;
  155.       vb->g.gadget.TopEdge  =  window->BorderTop+1;
  156.       vb->g.gadget.Height   =  -window->BorderTop - 1 - 32;
  157.       if(window->BorderRight > 8)
  158.       {
  159.          vb->g.gadget.LeftEdge = -(window->BorderRight-5);
  160.          vb->g.gadget.Width    =  window->BorderRight-8;
  161.       }
  162.       else
  163.       {
  164.          vb->g.gadget.LeftEdge = -8;
  165.          vb->g.gadget.Width    =  6;
  166.       }
  167.    }
  168.  
  169.    AddGadget(window,&vb->g.gadget,-1);
  170.  
  171.    memcpy(&vb->ta.gadget, &ti, sizeof(ti));
  172.  
  173.    if ((vb->ta.gadget.GadgetRender = 
  174.             (APTR)getimage(UPIMAGE, window)) == NULL) 
  175.    {
  176.       memcpy(&vb->ta.image, &tiim, sizeof(tiim));
  177.       vb->ta.image.ImageData = (USHORT *)&_FRSTopShiftData;
  178.       vb->ta.gadget.GadgetRender = (APTR)&vb->ta.image; 
  179.       vb->ta.gadget.LeftEdge = -(CHAR_WIDTH + CHAR_WIDTH - 1);
  180.       vb->ta.gadget.TopEdge = CHAR_ROW_OFFSET;
  181.       vb->ta.gadget.Flags = GADGIMAGE | GRELRIGHT;
  182.       vb->ta.freeimage = 0;
  183.    } 
  184.    else
  185.    {
  186.       vb->ta.gadget.Flags |= GADGHIMAGE;
  187.       vb->ta.gadget.SelectRender = 
  188.           (APTR)getimage(UPIMAGE, window);
  189.       vb->ta.freeimage = 1;
  190.    }  
  191.  
  192.    vb->ta.gadget.GadgetID = VB_UP;
  193.    AddGadget(window,&vb->ta.gadget,-1);
  194.  
  195.    memcpy(&vb->ba.gadget, &ti, sizeof(ti));
  196.    vb->ba.gadget.TopEdge = -20;
  197.    vb->ba.gadget.Height = 11;
  198.  
  199.    if ((vb->ba.gadget.GadgetRender = 
  200.           (APTR)getimage(DOWNIMAGE, window)) == NULL)
  201.    {
  202.       memcpy(&vb->ba.image, &tiim, sizeof(tiim));
  203.       vb->ba.image.ImageData = (USHORT *)&_FRSBottomShiftData;
  204.       vb->ba.gadget.GadgetRender = (APTR)&vb->ba.image; 
  205.       vb->ba.gadget.LeftEdge = -(CHAR_WIDTH + CHAR_WIDTH - 1);
  206.       vb->ba.gadget.TopEdge = -19;
  207.       vb->ba.freeimage = 0;
  208.    }
  209.    else
  210.    {
  211.       vb->ba.gadget.Flags |= GADGHIMAGE;
  212.       vb->ba.gadget.SelectRender = 
  213.           (APTR)getimage(DOWNIMAGE, window);
  214.       vb->ba.freeimage = 1;
  215.    }  
  216.  
  217.    vb->ba.gadget.GadgetID = VB_DOWN;
  218.  
  219.    AddGadget(window,&vb->ba.gadget,-1);
  220.  
  221.    RefreshGadgets(&vb->g.gadget,window,NULL);
  222.  
  223.    vb->window = window;
  224.  
  225.    return(vb);
  226. }
  227.  
  228. /**************************** ReadVertScrollBar *****************************
  229. *                                                                           *
  230. *    ReadVertScrollBar - Get Position of Vertical Scroll Bar                *
  231. *                                                                           *
  232. *         *gadget  - pointer to proportional gadget structure               *
  233. *                                                                           *
  234. *         (result) - position of knob in the gadget container               *
  235. *                                                                           *
  236. ****************************************************************************/
  237. int VBRead(struct VBar *vb)
  238. {
  239.    return(vb ? vb->propinfo.VertPot : 0);
  240. }
  241.  
  242. /********************************* UpVertSB *********************************
  243. *                                                                           *
  244. *    UpVertSB - Update Vertical Scroll Bar                                  *
  245. *                                                                           *
  246. *         *window       - pointer to window structure                       *
  247. *         *gadget       - pointer to proportional gadget structure          *
  248. *          KnobSize     - ratio of knob width to container width            *
  249. *          KnobPosition - position of knob in container                     *
  250. *                                                                           *
  251. ****************************************************************************/
  252. int VBUpdate(struct VBar *vb, int KnobSize, int KnobPosition)
  253. {
  254.    int dorefresh = 0;
  255.  
  256.    assert(KnobSize <= VBMAXPOS);
  257.    assert(KnobSize >= 0);
  258.    assert(KnobPosition <= VBMAXPOS);
  259.    assert(KnobPosition >= 0);
  260.  
  261.    if(vb)
  262.    {
  263.       if (KnobSize >=0 && KnobSize<=VBMAXPOS && 
  264.           vb->propinfo.VertBody != KnobSize)
  265.       {
  266.          vb->propinfo.VertBody = KnobSize;
  267.          dorefresh = 1;
  268.       }
  269.  
  270.       if (KnobPosition>=0 && KnobPosition<=VBMAXPOS && 
  271.           vb->propinfo.VertPot != KnobPosition)
  272.       {
  273.          vb->propinfo.VertPot = KnobPosition;
  274.          dorefresh = 1;
  275.       }
  276.  
  277.       if(vb->window && dorefresh)
  278.          RefreshGadgets(&vb->g.gadget,vb->window,NULL);
  279.    }
  280.    return(0);
  281. }
  282.  
  283. void VBTerm(struct VBar *vb)
  284. {
  285.    if(vb)
  286.    {
  287.       if(vb->window)
  288.       {
  289.          RemoveGadget(vb->window, &vb->g.gadget);
  290.          RemoveGadget(vb->window, &vb->ta.gadget);
  291.          RemoveGadget(vb->window, &vb->ba.gadget);
  292.          vb->window = NULL;
  293.          if(vb->ta.freeimage)
  294.          {
  295.             DisposeObject(vb->ta.gadget.GadgetRender);
  296.             DisposeObject(vb->ta.gadget.SelectRender);
  297.          }
  298.          if(vb->ba.freeimage)
  299.          {
  300.             DisposeObject(vb->ba.gadget.GadgetRender);
  301.             DisposeObject(vb->ba.gadget.SelectRender);
  302.          }
  303.       }
  304.       FreeMem(vb, sizeof(*vb));
  305.    }
  306. }
  307.  
  308. int VBSelected(struct VBar *vb, int gadnum)
  309. {
  310.    switch(gadnum)
  311.    {
  312.       case VB_SLIDER: return(vb->g.gadget.Flags & SELECTED);
  313.       case VB_UP    : return(vb->ta.gadget.Flags & SELECTED);
  314.       case VB_DOWN  : return(vb->ba.gadget.Flags & SELECTED);
  315.    }
  316.    return(0);
  317. }
  318.  
  319.