hslider.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/hslider.h>
  41. #include <mui/displaylist.h>
  42. #include <mui/uicolor.h>
  43. extern HSlider *locatedhs;
  44. int gethstrough(muiObject *obj)
  45. {
  46.     return obj->xmax - obj->xmin - 2*ARROWHEIGHT;
  47. }
  48. void sethscenter(muiObject *obj, int scenter)
  49. {
  50.     HSlider *hs = (HSlider *)obj->object;
  51.     if ((scenter - hs->shalf) < (obj->xmin+ARROWHEIGHT))
  52.         hs->scenter = gethstrough(obj)/2 + obj->xmin+ARROWHEIGHT;
  53.     else
  54.         hs->scenter = scenter;
  55. }
  56. void muiSetHSArrowDelta(muiObject *obj, int newd)
  57. {
  58.     HSlider *hs = (HSlider *)obj->object;
  59.     hs->arrowdelta = newd;
  60. }
  61. HSlider *newhs(muiObject *obj, int xmin, int xmax, int scenter, int shalf)
  62. {
  63.     HSlider *hs;
  64.     hs = (HSlider *)malloc(sizeof(HSlider));
  65.     obj->object = (HSlider *)hs;
  66.     if (shalf == 0) {
  67. hs->shalf = 0;
  68.     } else if (shalf < MINSHALF) 
  69. hs->shalf = MINSHALF;
  70.     else
  71. hs->shalf = shalf;
  72.     if ((xmax - xmin + 1) <= (2*ARROWHEIGHT+2*MINSHALF))
  73.      hs->thumb = 0;
  74.     else
  75.      hs->thumb = 1;
  76.     sethscenter(obj, scenter);
  77.     hs->oldpos = hs->scenter;
  78.     muiSetHSArrowDelta(obj, 1);
  79.     return hs;
  80. }
  81. void freehs(HSlider *hs)
  82. {
  83.     if (hs) {
  84. free(hs);
  85.     }
  86. }
  87. void drawhsarrows(muiObject *obj)
  88. {
  89.     int ymin = obj->ymin, ymax = obj->ymin+ARROWHEIGHT,
  90. xmin = obj->xmin, xmax = obj->xmax;
  91.     if (!muiGetVisible(obj))
  92.         return;
  93.     /* Draw the arrows: */
  94.     /* down arrow */
  95.     uiDkGray();
  96.      uirecti(xmin,ymin,xmin+20,ymax);
  97.     if (muiGetVisible(obj)) {
  98.         if (obj->locate == SCROLLDOWN) {
  99.          if (obj->select == SCROLLDOWN) {
  100.              drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiMmGray,uiWhite);
  101.              drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiLtGray,uiWhite);
  102.     } else {
  103.              drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiWhite,uiMmGray);
  104.              drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiWhite,uiLtGray);
  105.     }
  106.          uiVyLtGray();
  107.          uirectfi(xmin+3,ymin+3,xmin+17,ymax-3);
  108.         } else {
  109.          if (obj->select == SCROLLDOWN) {
  110.              drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiMmGray,uiVyLtGray);
  111.              drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiMmGray,uiVyLtGray);
  112.     } else {
  113.              drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiWhite,uiMmGray);
  114.              drawedges(xmin+2,xmin+18,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  115.     }
  116.          uiLtGray();
  117.          uirectfi(xmin+3,ymin+3,xmin+17,ymax-3);
  118.         }
  119.     } else {
  120.         drawedges(xmin+1,xmin+19,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  121.      uiLtGray();
  122.             uirectfi(xmin+2,ymin+2,xmin+18,ymax-2);
  123.     }
  124.     /* arrow XXX probably wrong for hsliders XXX */
  125.     if (muiGetEnable(obj))
  126.         uiDkGray();
  127.     else
  128.         uiMmGray();
  129.     uimove2i(xmin+14, ymin+5);
  130.     uidraw2i(xmin+14, ymin+14);
  131.     uiendline();
  132.     uirectfi(xmin+13,ymin+6,xmin+12,ymin+13);
  133.     uirectfi(xmin+11,ymin+7,xmin+10,ymin+12);
  134.     uirectfi(xmin+8,ymin+8,xmin+9,ymin+11);
  135.     uirectfi(xmin+6,ymin+9,xmin+7,ymin+10);
  136.    
  137.     /* up arrow */
  138.     uiDkGray();
  139.      uirecti(xmax-20,ymin,xmax,ymax);
  140.     if (muiGetEnable(obj)) {
  141.         if (obj->locate == SCROLLUP) {
  142.          if (obj->select == SCROLLUP) {
  143.              drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiMmGray,uiWhite);
  144.              drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiLtGray,uiWhite);
  145.     } else {
  146.              drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiWhite,uiMmGray);
  147.              drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiWhite,uiLtGray);
  148.     }
  149.          uiVyLtGray();
  150.          uirectfi(xmax-17,ymin+3,xmax-3,ymax-3);
  151.         } else {
  152.          if (obj->select == SCROLLUP) {
  153.              drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiMmGray,uiVyLtGray);
  154.              drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiMmGray,uiVyLtGray);
  155.     } else {
  156.              drawedges(xmax-19,xmax-1,ymin+1,ymax-1,uiWhite,uiMmGray);
  157.              drawedges(xmax-18,xmax-2,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  158.     }
  159.          uiLtGray();
  160.          uirectfi(xmax-17,ymin+3,xmax-3,ymax-3);
  161.         }
  162.     } else {
  163. drawedges(xmin+1,xmax-1,ymin+1,ymax-1,uiVyLtGray,uiMmGray);
  164.      uiLtGray();
  165.     uirectfi(xmax-18,ymin+2,xmax-2,ymax-2);
  166.     }
  167.     /* arrow XXX probably wrong for hslider XXX */
  168.     if (muiGetEnable(obj))
  169.         uiDkGray();
  170.     else
  171.         uiMmGray();
  172.     uirectfi(xmax-6,ymin+9,xmax-7,ymin+10);
  173.     uirectfi(xmax-8,ymin+8,xmax-9,ymin+11);
  174.     uirectfi(xmax-10,ymin+7,xmax-11,ymin+12);
  175.     uirectfi(xmax-12,ymin+6,xmax-13,ymin+13);
  176.     uimove2i(xmax-14, ymin+5);
  177.     uidraw2i(xmax-14, ymin+14);
  178.     uiendline();
  179. }
  180. void drawhs(muiObject *obj)
  181. {
  182.     HSlider *hs = (HSlider *)obj->object;
  183.     int ymin = obj->ymin, xmax = obj->xmax-ARROWHEIGHT, 
  184. xmin = obj->xmin+ARROWHEIGHT;
  185.     int  ymax = ymin+SLIDERWIDTH;
  186.     int sxmin = hs->scenter - hs->shalf;
  187.     int sxmax = hs->scenter + hs->shalf;
  188.     int oldsxmin = hs->oldpos - hs->shalf;
  189.     int oldsxmax = hs->oldpos + hs->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 (hs->thumb) {
  203.         /* last thumb position */
  204.         if ((hs->oldpos != hs->scenter) && (obj->enable)) {
  205.          uiDkGray();
  206.         uimove2i(oldsxmax, ymax-2);
  207.         uidraw2i(oldsxmax, ymin+1);
  208. uiendline();
  209.     
  210.          uiMmGray();
  211.         uimove2i(oldsxmax, ymin+1);
  212.         uidraw2i(oldsxmin, ymin+1);
  213. uiendline();
  214.     
  215.          uiVyLtGray();
  216.         uimove2i(oldsxmin, ymin+2);
  217.         uidraw2i(oldsxmin, ymax-1);
  218. uiendline();
  219.     
  220.          uiLtGray();
  221.         uimove2i(oldsxmin, ymax-1);
  222.         uidraw2i(oldsxmax, ymax-1);
  223. uiendline();
  224.          uiVyLtGray();
  225.         uimove2i(--oldsxmax, ymax-2);
  226.         uidraw2i(++oldsxmin, ymax-2);
  227.         uidraw2i(oldsxmin, ymin+2);
  228. uiendline();
  229.     
  230.          uiVyDkGray();
  231.         uimove2i(oldsxmin, ymin+2);
  232.         uidraw2i(oldsxmax, ymin+2);
  233.         uidraw2i(oldsxmax, ymax-3);
  234. uiendline();
  235.     
  236.          uiDkGray();
  237.         uimove2i(--oldsxmax, ymin+3);
  238.         uidraw2i(oldsxmax, ymax-3);
  239. uiendline();
  240.     
  241.          uiLtGray();
  242.         uimove2i(oldsxmax, ymax-3);
  243.         uidraw2i(++oldsxmin, ymax-3);
  244.         uidraw2i(oldsxmin, ymin+3);
  245. uiendline();
  246.     
  247.          uiMmGray();
  248.         uirectfi(++oldsxmin, ymin+3, --oldsxmax, ymax-4);
  249.     
  250.         }
  251.         if (obj->enable) {
  252.          /* thumb */
  253.          uiDkGray();
  254.              uirecti(sxmin,ymin,sxmax,ymax);
  255.          if (obj->locate == THUMB) {
  256.      drawedges(sxmin+1,sxmax-1,ymin+1,ymax-1,uiWhite,uiDkGray);
  257.      drawedges(sxmin+2,sxmax-2,ymin+2,ymax-2,uiWhite,uiLtGray);
  258.      drawedges(sxmin+3,sxmax-3,ymin+3,ymax-3,uiWhite,uiLtGray);
  259.     
  260.      uiVyLtGray();
  261.          uirectfi(sxmin+4, ymin+4, sxmax-4, ymax-4);
  262.     
  263.      /* ridges on thumb */
  264.      uiDkGray();
  265.          uimove2i(hs->scenter, ymin+3);
  266.          uidraw2i(hs->scenter, ymax-3);
  267.     uiendline();
  268.          uimove2i(hs->scenter-4, ymin+3);
  269.          uidraw2i(hs->scenter-4, ymax-3);
  270.     uiendline();
  271.          uimove2i(hs->scenter+4, ymin+3);
  272.          uidraw2i(hs->scenter+4, ymax-3);
  273.     uiendline();
  274.    
  275.      uiWhite();
  276.     uirectfi(hs->scenter+1,ymin+3,hs->scenter+2,ymax-3);
  277.     uirectfi(hs->scenter+5,ymin+3,hs->scenter+6,ymax-3);
  278.     uirectfi(hs->scenter-2,ymin+3,hs->scenter-3,ymax-3);
  279.          } else {
  280.      drawedges(sxmin+1,sxmax-1,ymin+1,ymax-1,uiWhite,uiDkGray);
  281.      drawedges(sxmin+2,sxmax-2,ymin+2,ymax-2,uiVyLtGray,uiMmGray);
  282.      drawedges(sxmin+3,sxmax-3,ymin+3,ymax-3,uiVyLtGray,uiMmGray);
  283.    
  284.        uiLtGray();
  285.                uirectfi(sxmin+4, ymin+4, sxmax-4, ymax-4);
  286.     
  287.      /* ridges on thumb */
  288.      uiBlack();
  289.          uimove2i(hs->scenter, ymin+3);
  290.          uidraw2i(hs->scenter, ymax-3);
  291.     uiendline();
  292.          uimove2i(hs->scenter-4, ymin+3);
  293.          uidraw2i(hs->scenter-4, ymax-3);
  294.     uiendline();
  295.          uimove2i(hs->scenter+4, ymin+3);
  296.          uidraw2i(hs->scenter+4, ymax-3);
  297.     uiendline();
  298.      uiWhite();
  299.          uimove2i(hs->scenter+1, ymin+3);
  300.          uidraw2i(hs->scenter+1, ymax-3);
  301.     uiendline();
  302.          uimove2i(hs->scenter-3, ymin+3);
  303.          uidraw2i(hs->scenter-3, ymax-3);
  304.     uiendline();
  305.          uimove2i(hs->scenter+5, ymin+3);
  306.          uidraw2i(hs->scenter+5, ymax-3);
  307.     uiendline();
  308.          }
  309.      }
  310.     }
  311.     drawhsarrows(obj);
  312.     drawrestore();
  313. }
  314. enum muiReturnValue hshandler(muiObject *obj, int event, int value, int x, int y)
  315. {
  316.     int my = x;
  317.     static int mfudge=0;
  318.     static enum muiReturnValue retval = MUI_NO_ACTION;
  319.     HSlider *hs = (HSlider *)obj->object;
  320.     if (!muiGetEnable(obj) || !muiGetVisible(obj))
  321. return MUI_NO_ACTION;
  322.     switch (event) {
  323. case MUI_DEVICE_RELEASE:
  324.     if (value == 0) { 
  325. hs->oldpos = hs->scenter; 
  326. muiSetSelect(obj, 0);
  327. return MUI_SLIDER_RETURN; 
  328.     }
  329. case MUI_DEVICE_PRESS:
  330. case MUI_DEVICE_CLICK:
  331.     /* in the arrows */
  332.     if (my >= obj->xmin && my <= obj->xmax && 
  333.        (my < obj->xmin+ARROWHEIGHT || my > obj->xmax-ARROWHEIGHT)) {
  334. mfudge = -10000;
  335. if (my < obj->xmin+ARROWHEIGHT) { /* boink down */
  336.     my = hs->scenter - hs->arrowdelta;
  337.     retval = MUI_SLIDER_SCROLLDOWN;
  338. } else { /* boink up */
  339.     my = hs->scenter + hs->arrowdelta;
  340.     retval = MUI_SLIDER_SCROLLUP;
  341. }
  342. if (event == MUI_DEVICE_CLICK) {
  343.     muiSetSelect(obj, 0);
  344.     retval = MUI_SLIDER_RETURN;
  345. }
  346. if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  347.     my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  348. if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT) 
  349.     my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  350. hs->scenter = my; 
  351. break;
  352.     } else if (my >= obj->xmin && my <= obj->xmax)
  353.      retval = MUI_SLIDER_THUMB;
  354.     hs->oldpos = hs->scenter;
  355.     if (my >= hs->scenter-hs->shalf && my <= hs->scenter+hs->shalf)
  356. mfudge = hs->scenter - my;
  357.     else
  358. mfudge = 0;
  359.     break;
  360. case MUI_DEVICE_DOWN:
  361.     if (mfudge == -10000) { /* auto - repeat the arrow keys */
  362.                 if (retval == MUI_SLIDER_SCROLLDOWN) {
  363.                     my = hs->scenter - hs->arrowdelta;
  364.                     if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  365.                         my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  366.                 } else {
  367.                     my = hs->scenter + hs->arrowdelta;
  368.                     if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT)
  369.                         my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  370.                 }
  371.                 hs->scenter = my;
  372.                 break;
  373.     }
  374.     my = x+mfudge;
  375.     if (my - hs->shalf < obj->xmin+1+ARROWHEIGHT)
  376. my = obj->xmin+1+hs->shalf+ARROWHEIGHT;
  377.     if (my + hs->shalf > obj->xmax-1-ARROWHEIGHT) 
  378. my = obj->xmax-1-hs->shalf-ARROWHEIGHT;
  379.     /* adjust thumb */
  380.     hs->scenter = my; 
  381.     break;
  382.     }
  383.     y = y; /* for lint's sake */
  384.     return retval;
  385. }
  386. float muiGetHSVal(muiObject *obj)
  387. {
  388.     HSlider *hs = (HSlider *)obj->object;
  389.     return (hs->scenter-obj->xmin-1.0-hs->shalf-ARROWHEIGHT)/
  390. (obj->xmax - obj->xmin - 2.0*hs->shalf - 2.0-2*ARROWHEIGHT);
  391. }
  392. void sethshalf(muiObject *obj, int shalf)
  393. {
  394.     HSlider *hs = (HSlider *)obj->object;
  395.     hs->shalf = shalf;
  396.     if (hs->shalf==0)
  397. muiSetEnable(obj, 0);
  398.     else if (hs->shalf < MINSHALF) {
  399.         hs->shalf = MINSHALF;
  400. muiSetEnable(obj, 1);
  401.     } else if (2*hs->shalf >= gethstrough(obj)) {
  402.         hs->shalf = gethstrough(obj)/2;
  403. muiSetEnable(obj, 0);
  404.     }
  405. }
  406. void movehsval(muiObject *obj, float val)
  407. {
  408.     float f;
  409.     HSlider *hs = (HSlider *)obj->object;
  410.     if (val < 0.0) val = 0.0;
  411.     if (val > 1.0) val = 1.0;
  412.     f = val*(obj->xmax - obj->xmin - 2.0*hs->shalf - 2.0-2*ARROWHEIGHT);
  413.     hs->scenter = f + hs->shalf + obj->xmin + 1.0+ARROWHEIGHT;
  414.     if ((hs->scenter + hs->shalf) > (obj->xmax - ARROWHEIGHT))
  415.         hs->scenter = obj->xmax - ARROWHEIGHT - hs->shalf;
  416.     if ((hs->scenter - hs->shalf) < (obj->xmin+ ARROWHEIGHT))
  417.         hs->scenter = obj->xmin + ARROWHEIGHT + hs->shalf;
  418. }
  419. void muiSetHSValue(muiObject *obj, float val)
  420. {
  421.     HSlider *hs = (HSlider *)obj->object;
  422.     movehsval(obj, (float) val);
  423.     hs->oldpos = hs->scenter;
  424. }
  425. /* 
  426.  * visible is windowheight/dataheight
  427.  * top is top/dataheight
  428.  */
  429. void
  430. adjusthsthumb(muiObject *obj, double visible, double top)
  431. {
  432.     int size;
  433.     
  434.     if (visible >= 1.0) {
  435.     size = gethstrough(obj) + 1;
  436.     } else {
  437.     size = visible*gethstrough(obj);
  438.     }
  439.     muiSetEnable(obj, 1);
  440.     sethshalf(obj, size/2);
  441.     muiSetHSValue(obj, (float) (1.0 - top));
  442. }