vslider.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:15k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1990,1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37. #include <GL/glut.h>
  38. #include <stdlib.h>
  39. #include <mui/gizmo.h>
  40. #include <mui/vslider.h>
  41. #include <mui/displaylist.h>
  42. #include <mui/uicolor.h>
  43. extern VSlider *locatedvs;
  44. int getvstrough(muiObject *obj)
  45. {
  46.     return obj->ymax - obj->ymin - 2*ARROWHEIGHT;
  47. }
  48. void setvscenter(muiObject *obj, int scenter)
  49. {
  50.     VSlider *vs = (VSlider *)obj->object;
  51.     if ((scenter - vs->shalf) < (obj->ymin+ARROWHEIGHT))
  52.         vs->scenter = getvstrough(obj)/2 + obj->ymin+ARROWHEIGHT;
  53.     else
  54.         vs->scenter = scenter;
  55. }
  56. void muiSetVSArrowDelta(muiObject *obj, int newd)
  57. {
  58.     VSlider *vs = (VSlider *)obj->object;
  59.     vs->arrowdelta = newd;
  60. }
  61. VSlider *newvs(muiObject *obj, int ymin, int ymax, int scenter, int shalf)
  62. {
  63.     VSlider *vs;
  64.     vs = (VSlider *)malloc(sizeof(VSlider));
  65.     obj->object = (VSlider *)vs;
  66.     if (shalf == 0) {
  67. vs->shalf = 0;
  68.     } else if (shalf < MINSHALF) 
  69. vs->shalf = MINSHALF;
  70.     else
  71. vs->shalf = shalf;
  72.     if ((ymax - ymin + 1) <= (2*ARROWHEIGHT+2*MINSHALF))
  73.      vs->thumb = 0;
  74.     else
  75.      vs->thumb = 1;
  76.     setvscenter(obj, scenter);
  77.     vs->oldpos = vs->scenter;
  78.     muiSetVSArrowDelta(obj, 1);
  79.     return vs;
  80. }
  81. void freevs(VSlider *vs)
  82. {
  83.     if (vs) {
  84. free(vs);
  85.     }
  86. }
  87. void drawvsarrows(muiObject *obj)
  88. {
  89.     int xmin = obj->xmin, xmax = obj->xmin+ARROWHEIGHT,
  90. ymin = obj->ymin, ymax = obj->ymax;
  91.     if (!muiGetVisible(obj))
  92.         return;
  93.     /* Draw the arrows: */
  94.     /* down arrow */
  95.     uiDkGray();
  96.     uirecti(xmin,ymin,xmax,ymin+20);
  97.     if (muiGetVisible(obj)) {
  98.         if (obj->locate == SCROLLDOWN) {
  99.          if (obj->select == SCROLLDOWN) {
  100.              drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiMmGray,uiWhite);
  101.              drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiLtGray,uiWhite);
  102.     } else {
  103.              drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiWhite,uiMmGray);
  104.              drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiWhite,uiLtGray);
  105.     }
  106.     uiVyLtGray();
  107.     uirectfi(xmin+3,ymin+3,xmax-3,ymin+17);
  108.         } else {
  109.          if (obj->select == SCROLLDOWN) {
  110.              drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiMmGray,uiVyLtGray);
  111.              drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiMmGray,uiVyLtGray);
  112.     } else {
  113.              drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiWhite,uiMmGray);
  114.              drawedges(xmin+2,xmax-2,ymin+2,ymin+18,uiVyLtGray,uiMmGray);
  115.     }
  116.     uiLtGray();
  117.     uirectfi(xmin+3,ymin+3,xmax-3,ymin+17);
  118.         }
  119.     } else {
  120.         drawedges(xmin+1,xmax-1,ymin+1,ymin+19,uiVyLtGray,uiMmGray);
  121. uiLtGray();
  122. uirectfi(xmin+2,ymin+2,xmax-2,ymin+18);
  123.     }
  124.     /* arrow */
  125.     if (muiGetEnable(obj))
  126. uiDkGray();
  127.     else
  128. uiMmGray();
  129.     uimove2i(xmin+5,ymin+14);
  130.     uidraw2i(xmin+14,ymin+14);
  131.     uiendline();
  132.     uirectfi(xmin+6,ymin+13,xmin+13,ymin+12);
  133.     uirectfi(xmin+7,ymin+11,xmin+12,ymin+10);
  134.     uirectfi(xmin+8,ymin+8,xmin+11,ymin+9);
  135.     uirectfi(xmin+9,ymin+6,xmin+10,ymin+7);
  136.    
  137.     /* up arrow */
  138.     uiDkGray();
  139.     uirecti(xmin,ymax-20,xmax,ymax);
  140.     if (muiGetEnable(obj)) {
  141.         if (obj->locate == SCROLLUP) {
  142.          if (obj->select == SCROLLUP) {
  143.              drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiMmGray,uiWhite);
  144.              drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiLtGray,uiWhite);
  145.     } else {
  146.              drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiWhite,uiMmGray);
  147.              drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiWhite,uiLtGray);
  148.     }
  149.     uiVyLtGray();
  150.     uirectfi(xmin+3,ymax-17,xmax-3,ymax-3);
  151.         } else {
  152.          if (obj->select == SCROLLUP) {
  153.              drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiMmGray,uiVyLtGray);
  154.              drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiMmGray,uiVyLtGray);
  155.     } else {
  156.              drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiWhite,uiMmGray);
  157.              drawedges(xmin+2,xmax-2,ymax-18,ymax-2,uiVyLtGray,uiMmGray);
  158.     }
  159.     uiLtGray();
  160.     uirectfi(xmin+3,ymax-17,xmax-3,ymax-3);
  161.         }
  162.     } else {
  163. drawedges(xmin+1,xmax-1,ymax-19,ymax-1,uiVyLtGray,uiMmGray);
  164. uiLtGray();
  165. uirectfi(xmin+2,ymax-18,xmax-2,ymax-2);
  166.     }
  167.     /* arrow */
  168.     if (muiGetEnable(obj))
  169.         uiDkGray();
  170.     else
  171.         uiMmGray();
  172.     uirectfi(xmin+9,ymax-6,xmin+10,ymax-7);
  173.     uirectfi(xmin+8,ymax-8,xmin+11,ymax-9);
  174.     uirectfi(xmin+7,ymax-10,xmin+12,ymax-11);
  175.     uirectfi(xmin+6,ymax-12,xmin+13,ymax-13);
  176.     uimove2i(xmin+5,ymax-14);
  177.     uidraw2i(xmin+14,ymax-14);
  178.     uiendline();
  179. }
  180. void drawvs(muiObject *obj)
  181. {
  182.     VSlider *vs = (VSlider *)obj->object;
  183.     int xmin = obj->xmin, ymax = obj->ymax-ARROWHEIGHT, 
  184. ymin = obj->ymin+ARROWHEIGHT;
  185.     int  xmax = xmin+SLIDERWIDTH;
  186.     int symin = vs->scenter - vs->shalf;
  187.     int symax = vs->scenter + vs->shalf;
  188.     int oldsymin = vs->oldpos - vs->shalf;
  189.     int oldsymax = vs->oldpos + vs->shalf;
  190.     drawsetup();
  191.     if (!muiGetVisible(obj)) {
  192. backgrounddraw(xmin,ymin,xmax,ymax);
  193.         drawrestore();
  194.         return;
  195.     }
  196.     /* trough */
  197.     uiDkGray();
  198.     uirecti(xmin, ymin, xmax, ymax);
  199.     drawedges(xmin+1,xmax-1,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  200.     uiLtGray();
  201.      uirectfi(xmin+2, ymin+2, xmax-2, ymax-2);
  202.     if (vs->thumb) {
  203.         /* last thumb position */
  204.         if ((vs->oldpos != vs->scenter) && (obj->enable)) {
  205.          uiDkGray();
  206.         uimove2i(xmax-2, oldsymax);
  207.         uidraw2i(xmin+1, oldsymax);
  208. uiendline();
  209.     
  210.          uiMmGray();
  211.         uimove2i(xmin+1, oldsymax);
  212.         uidraw2i(xmin+1, oldsymin);
  213. uiendline();
  214.     
  215.          uiVyLtGray();
  216.         uimove2i(xmin+2, oldsymin);
  217.         uidraw2i(xmax-1, oldsymin);
  218. uiendline();
  219.     
  220.          uiLtGray();
  221.         uimove2i(xmax-1, oldsymin);
  222.         uidraw2i(xmax-1, oldsymax);
  223. uiendline();
  224.          uiVyLtGray();
  225.         uimove2i(xmax-2, --oldsymax);
  226.         uidraw2i(xmax-2, ++oldsymin);
  227.         uidraw2i(xmin+2, oldsymin);
  228. uiendline();
  229.     
  230.          uiVyDkGray();
  231.         uimove2i(xmin+2, oldsymin);
  232.         uidraw2i(xmin+2, oldsymax);
  233.         uidraw2i(xmax-3, oldsymax);
  234. uiendline();
  235.     
  236.          uiDkGray();
  237.         uimove2i(xmin+3, --oldsymax);
  238.         uidraw2i(xmax-3, oldsymax);
  239. uiendline();
  240.     
  241.          uiLtGray();
  242.         uimove2i(xmax-3, oldsymax);
  243.         uidraw2i(xmax-3, ++oldsymin);
  244.         uidraw2i(xmin+3, oldsymin);
  245. uiendline();
  246.     
  247.          uiMmGray();
  248.         uirectfi(xmin+3, ++oldsymin, xmax-4, --oldsymax);
  249.     
  250.         }
  251.         if (obj->enable) {
  252.          /* thumb */
  253.          uiDkGray();
  254.              uirecti(xmin,symin,xmax,symax);
  255.     
  256.          if (obj->locate == THUMB) {
  257.      drawedges(xmin+1,xmax-1,symin+1,symax-1,uiWhite,uiDkGray);
  258.      drawedges(xmin+2,xmax-2,symin+2,symax-2,uiWhite,uiLtGray);
  259.      drawedges(xmin+3,xmax-3,symin+3,symax-3,uiWhite,uiLtGray);
  260.     
  261.      uiVyLtGray();
  262.          uirectfi(xmin+4, symin+4, xmax-4, symax-4);
  263.     
  264.      /* ridges on thumb */
  265.      uiDkGray();
  266.          uimove2i(xmin+3,vs->scenter);
  267.          uidraw2i(xmax-3,vs->scenter);
  268.     uiendline();
  269.          uimove2i(xmin+3,vs->scenter-4);
  270.          uidraw2i(xmax-3,vs->scenter-4);
  271.     uiendline();
  272.          uimove2i(xmin+3,vs->scenter+4);
  273.          uidraw2i(xmax-3,vs->scenter+4);
  274.     uiendline();
  275.    
  276.      uiWhite();
  277.     uirectfi(xmin+3,vs->scenter+1,xmax-3,vs->scenter+2);
  278.     uirectfi(xmin+3,vs->scenter+5,xmax-3,vs->scenter+6);
  279.     uirectfi(xmin+3,vs->scenter-2,xmax-3,vs->scenter-3);
  280.          } else {
  281.      drawedges(xmin+1,xmax-1,symin+1,symax-1,uiWhite,uiDkGray);
  282.      drawedges(xmin+2,xmax-2,symin+2,symax-2,uiVyLtGray,uiMmGray);
  283.      drawedges(xmin+3,xmax-3,symin+3,symax-3,uiVyLtGray,uiMmGray);
  284.    
  285.        uiLtGray();
  286.                uirectfi(xmin+4, symin+4, xmax-4, symax-4);
  287.     
  288.      /* ridges on thumb */
  289.      uiBlack();
  290.          uimove2i(xmin+3,vs->scenter);
  291.          uidraw2i(xmax-3,vs->scenter);
  292.     uiendline();
  293.          uimove2i(xmin+3,vs->scenter-4);
  294.          uidraw2i(xmax-3,vs->scenter-4);
  295.     uiendline();
  296.          uimove2i(xmin+3,vs->scenter+4);
  297.          uidraw2i(xmax-3,vs->scenter+4);
  298.     uiendline();
  299.      uiWhite();
  300.          uimove2i(xmin+3,vs->scenter+1);
  301.          uidraw2i(xmax-3,vs->scenter+1);
  302.     uiendline();
  303.          uimove2i(xmin+3,vs->scenter-3);
  304.          uidraw2i(xmax-3,vs->scenter-3);
  305.     uiendline();
  306.          uimove2i(xmin+3,vs->scenter+5);
  307.          uidraw2i(xmax-3,vs->scenter+5);
  308.     uiendline();
  309.          }
  310.      }
  311.     }
  312.     drawvsarrows(obj);
  313.     drawrestore();
  314. }
  315. enum muiReturnValue vshandler(muiObject *obj, int event, int value, int x, int y)
  316. {
  317.     int my = y;
  318.     static int mfudge=0;
  319.     static enum muiReturnValue retval = MUI_NO_ACTION;
  320.     VSlider *vs = (VSlider *)obj->object;
  321.     if (!muiGetEnable(obj) || !muiGetVisible(obj))
  322. return MUI_NO_ACTION;
  323.     switch (event) {
  324. case MUI_DEVICE_RELEASE:
  325.     if (value == 0) { 
  326. vs->oldpos = vs->scenter; 
  327. muiSetSelect(obj, 0);
  328. return MUI_SLIDER_RETURN; 
  329.     }
  330. case MUI_DEVICE_PRESS:
  331. case MUI_DEVICE_CLICK:
  332.     /* in the arrows */
  333.     if (my >= obj->ymin && my <= obj->ymax && 
  334.        (my < obj->ymin+ARROWHEIGHT || my > obj->ymax-ARROWHEIGHT)) {
  335. mfudge = -10000;
  336. if (my < obj->ymin+ARROWHEIGHT) { /* boink down */
  337.     my = vs->scenter - vs->arrowdelta;
  338.     retval = MUI_SLIDER_SCROLLDOWN;
  339. } else { /* boink up */
  340.     my = vs->scenter + vs->arrowdelta;
  341.     retval = MUI_SLIDER_SCROLLUP;
  342. }
  343. if (event == MUI_DEVICE_CLICK) {
  344.     muiSetSelect(obj, 0);
  345.     retval = MUI_SLIDER_RETURN;
  346. }
  347. if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  348.     my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  349. if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT) 
  350.     my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  351. vs->scenter = my; 
  352. break;
  353.     } else if (my >= obj->ymin && my <= obj->ymax)
  354.      retval = MUI_SLIDER_THUMB;
  355.     vs->oldpos = vs->scenter;
  356.     if (my >= vs->scenter-vs->shalf && my <= vs->scenter+vs->shalf)
  357. mfudge = vs->scenter - my;
  358.     else
  359. mfudge = 0;
  360.     break;
  361. case MUI_DEVICE_DOWN:
  362.     if (mfudge == -10000) { /* auto - repeat the arrow keys */
  363.                 if (retval == MUI_SLIDER_SCROLLDOWN) {
  364.                     my = vs->scenter - vs->arrowdelta;
  365.                     if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  366.                         my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  367.                 } else {
  368.                     my = vs->scenter + vs->arrowdelta;
  369.                     if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT)
  370.                         my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  371.                 }
  372.                 vs->scenter = my;
  373.                 break;
  374.     }
  375.     my = y+mfudge;
  376.     if (my - vs->shalf < obj->ymin+1+ARROWHEIGHT)
  377. my = obj->ymin+1+vs->shalf+ARROWHEIGHT;
  378.     if (my + vs->shalf > obj->ymax-1-ARROWHEIGHT) 
  379. my = obj->ymax-1-vs->shalf-ARROWHEIGHT;
  380.     /* adjust thumb */
  381.     vs->scenter = my; 
  382.     break;
  383.     }
  384.     x = x; /* for lint's sake */
  385.     return retval;
  386. }
  387. float muiGetVSVal(muiObject *obj)
  388. {
  389.     VSlider *vs = (VSlider *)obj->object;
  390.     return (vs->scenter-obj->ymin-1.0-vs->shalf-ARROWHEIGHT)/
  391. (obj->ymax - obj->ymin - 2.0*vs->shalf - 2.0-2*ARROWHEIGHT);
  392. }
  393. void setvshalf(muiObject *obj, int shalf)
  394. {
  395.     VSlider *vs = (VSlider *)obj->object;
  396.     vs->shalf = shalf;
  397.     if (vs->shalf==0)
  398. muiSetEnable(obj, 0);
  399.     else if (vs->shalf < MINSHALF) {
  400.         vs->shalf = MINSHALF;
  401. muiSetEnable(obj, 1);
  402.     } else if (2*vs->shalf >= getvstrough(obj)) {
  403.         vs->shalf = getvstrough(obj)/2;
  404. muiSetEnable(obj, 0);
  405.     }
  406. }
  407. void movevsval(muiObject *obj, float val)
  408. {
  409.     float f;
  410.     VSlider *vs = (VSlider *)obj->object;
  411.     if (val < 0.0) val = 0.0;
  412.     if (val > 1.0) val = 1.0;
  413.     f = val*(obj->ymax - obj->ymin - 2.0*vs->shalf - 2.0-2*ARROWHEIGHT);
  414.     vs->scenter = f + vs->shalf + obj->ymin + 1.0+ARROWHEIGHT;
  415.     if ((vs->scenter + vs->shalf) > (obj->ymax - ARROWHEIGHT))
  416.         vs->scenter = obj->ymax - ARROWHEIGHT - vs->shalf;
  417.     if ((vs->scenter - vs->shalf) < (obj->ymin+ ARROWHEIGHT))
  418.         vs->scenter = obj->ymin + ARROWHEIGHT + vs->shalf;
  419. }
  420. void muiSetVSValue(muiObject *obj, float val)
  421. {
  422.     VSlider *vs = (VSlider *)obj->object;
  423.     movevsval(obj, (float) val);
  424.     vs->oldpos = vs->scenter;
  425. }
  426. /* 
  427.  * visible is windowheight/dataheight
  428.  * top is top/dataheight
  429.  */
  430. void
  431. adjustvsthumb(muiObject *obj, double visible, double top)
  432. {
  433.     int size;
  434.     
  435.     if (visible >= 1.0) {
  436.     size = getvstrough(obj) + 1;
  437.     } else {
  438.     size = visible*getvstrough(obj);
  439.     }
  440.     muiSetEnable(obj, 1);
  441.     setvshalf(obj, size/2);
  442.     muiSetVSValue(obj, (float) (1.0 - top));
  443. }