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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993-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 <mui/gizmo.h>
  38. #include <stdio.h>
  39. #include <GL/glut.h>
  40. #include <stdlib.h>
  41. extern int activemenu;
  42. extern int menuinuse;
  43. static muiObject *newmuiobj(void)
  44. {
  45.     muiObject *newobj = (muiObject *)malloc(sizeof(muiObject));
  46.     newobj->active = 0;
  47.     newobj->enable = 1;
  48.     newobj->select = 0;
  49.     newobj->locate = 0;
  50.     newobj->visible = 1;
  51.     newobj->callback = 0;
  52.     muiSetUIList(newobj, muiGetActiveUIList());
  53.     muiAddToUIList(muiGetActiveUIList(), newobj);
  54.     newobj->id = 0;
  55.     return newobj;
  56. }
  57. muiObject *muiNewPulldown(void)
  58. {
  59.     muiObject *newPD = newmuiobj();
  60.     newPD->type = MUI_PULLDOWN;
  61.     newPD->xmin = 0;
  62.     newPD->ymin = glutGet(GLUT_WINDOW_HEIGHT) - PULLDOWN_HEIGHT;
  63.     newPD->xmax = glutGet(GLUT_WINDOW_WIDTH);
  64.     newPD->ymax = glutGet(GLUT_WINDOW_HEIGHT);
  65.     newPD->object = (void *)newpd();
  66.     newPD->handler = pdhandler;
  67.     return newPD;
  68. }
  69. muiObject *muiNewButton(int xmin, int xmax, int ymin, int ymax)
  70. {
  71.     muiObject *newb = newmuiobj();
  72.     newb->type = MUI_BUTTON;
  73.     newb->xmin = xmin;
  74.     newb->ymin = ymin;
  75.     newb->xmax = xmax;
  76.     newb->ymax = ymax;
  77.     newb->object = (void *)newbut();
  78.     ((Button *)(newb->object))->object = newb;
  79.     newb->handler = buttonhandler;
  80.     return newb;
  81. }
  82. muiObject *muiNewRadioButton(int xmin, int ymin)
  83. {
  84.     muiObject *newb = newmuiobj();
  85.     newb->type = MUI_RADIOBUTTON;
  86.     newb->xmin = xmin;
  87.     newb->ymin = ymin;
  88.     newb->xmax = xmin+ RADIOWIDTH-1;
  89.     newb->ymax = ymin+RADIOHEIGHT-1;
  90.     newb->object = (void *)newradiobut();
  91.     ((Button *)(newb->object))->object = newb;
  92.     newb->handler = buttonhandler;
  93.     return newb;
  94. }
  95. muiObject *muiNewTinyRadioButton(int xmin, int ymin)
  96. {
  97.     muiObject *newb = newmuiobj();
  98.     newb->type = MUI_TINYRADIOBUTTON;
  99.     newb->xmin = xmin;
  100.     newb->ymin = ymin;
  101.     newb->xmax = xmin+ TINYRADIOWIDTH-1;
  102.     newb->ymax = ymin+ TINYRADIOHEIGHT-1;
  103.     newb->object = (void *)newradiobut();
  104.     ((Button *)(newb->object))->object = newb;
  105.     newb->handler = buttonhandler;
  106.     return newb;
  107. }
  108. muiObject *muiNewVSlider(int xmin, int ymin, int ymax, int scenter, int shalf)
  109. {
  110.     muiObject *newvsl = newmuiobj();
  111.     newvsl->type = MUI_VSLIDER;
  112.     newvsl->xmin = xmin;
  113.     newvsl->ymin = ymin;
  114.     newvsl->xmax = xmin+SLIDERWIDTH-1;
  115.     newvsl->ymax = ymax;
  116.     newvsl->object = (void *)newvs(newvsl, ymin, ymax, scenter, shalf);
  117.     newvsl->handler = vshandler;
  118.     return newvsl;
  119. }
  120. muiObject *muiNewHSlider(int xmin, int ymin, int xmax, int scenter, int shalf)
  121. {
  122.     muiObject *newhsl = newmuiobj();
  123.     newhsl->type = MUI_HSLIDER;
  124.     newhsl->xmin = xmin;
  125.     newhsl->ymin = ymin;
  126.     newhsl->xmax = xmax;
  127.     newhsl->ymax = ymin+SLIDERWIDTH-1;
  128.     newhsl->object = (void *)newhs(newhsl, xmin, xmax, scenter, shalf);
  129.     newhsl->handler = hshandler;
  130.     return newhsl;
  131. }
  132. muiObject *muiNewTextList(int xmin, int ymin, int xmax, int listheight)
  133. {
  134.     muiObject *newtlo = newmuiobj();
  135.     newtlo->type = MUI_TEXTLIST;
  136.     newtlo->xmin = xmin;
  137.     newtlo->ymin = ymin;
  138.     newtlo->xmax = xmax;
  139.     newtlo->object = (void *)newtl(newtlo, listheight);
  140.     newtlo->handler = tlhandler;
  141.     return newtlo;
  142. }
  143. muiObject *muiNewLabel(int xmin, int ymin, char *label)
  144. {
  145.     muiObject *newlbl = newmuiobj();
  146.     newlbl->type = MUI_LABEL;
  147.     newlbl->xmin = xmin;
  148.     newlbl->ymin = ymin;
  149.     /* XXX maximums */
  150.     newlbl->object = (void *)newlabel(label);
  151.     newlbl->handler = nullhandler;
  152.     return newlbl;
  153. }
  154. muiObject *muiNewBoldLabel(int xmin, int ymin, char *label)
  155. {
  156.     muiObject *newlbl = newmuiobj();
  157.     newlbl->type = MUI_BOLDLABEL;
  158.     newlbl->xmin = xmin;
  159.     newlbl->ymin = ymin;
  160.     /* XXX maximums */
  161.     newlbl->object = (void *)newlabel(label);
  162.     newlbl->handler = nullhandler;
  163.     return newlbl;
  164. }
  165. muiObject *muiNewTextbox(int xmin, int xmax, int ymin)
  166. {
  167.     muiObject *newtextbox = newmuiobj();
  168.     newtextbox->type = MUI_TEXTBOX;
  169.     newtextbox->xmin = xmin;
  170.     newtextbox->ymin = ymin;
  171.     newtextbox->xmax = xmax;
  172.     newtextbox->ymax = ymin + TEXTBOXHEIGHT - 1;
  173.     newtextbox->object = (void *)newtb(xmin, xmax);
  174.     newtextbox->handler = textboxhandler;
  175.     return newtextbox;
  176. }
  177. void muiGetObjectSize(muiObject *obj, int *xmin, int *ymin, int *xmax, int *ymax)
  178. {
  179.     *xmin = obj->xmin;
  180.     *xmax = obj->xmax;
  181.     *ymin = obj->ymin;
  182.     *ymax = obj->ymax;
  183. }
  184. void muiFreeObject(muiObject *obj)
  185. {
  186.     switch (obj->type) {
  187. case MUI_BUTTON:
  188. case MUI_RADIOBUTTON:
  189. case MUI_TINYRADIOBUTTON:
  190. case MUI_VSLIDER:
  191. case MUI_HSLIDER:
  192. case MUI_TEXTBOX:
  193. case MUI_TEXTLIST:
  194. case MUI_PULLDOWN:
  195.     free(obj->object);
  196.     break;
  197. case MUI_LABEL:
  198. case MUI_BOLDLABEL:
  199.     break;
  200.     }
  201.     free(obj);
  202. }
  203. void     muiSetID(muiObject *obj, int id)
  204. {
  205.     obj->id = id;
  206. }
  207. int muiGetID(muiObject *obj)
  208. {
  209.     return obj->id;
  210. }
  211. void muiSetCallback(muiObject *obj, void (*callback)(muiObject *, enum muiReturnValue))
  212. {
  213.     obj->callback = callback;
  214. }
  215. int muiInObject(muiObject *obj, int x, int y)
  216. {
  217.     if (obj->xmin <= x && x <= obj->xmax && obj->ymin <= y && y <= obj->ymax)
  218. return 1;
  219.     return 0;
  220. }
  221. int muiGetLocate(muiObject *obj)
  222. {
  223.     return obj->locate;
  224. }
  225. void muiSetLocate(muiObject *obj, int state)
  226. {
  227.     obj->locate = (short) state;
  228. }
  229. int muiGetSelect(muiObject *obj)
  230. {
  231.     return obj->select;
  232. }
  233. void muiSetUIList(muiObject *obj, int list)
  234. {
  235.     obj->uilist = list;
  236. }
  237. int muiGetUIList(muiObject *obj)
  238. {
  239.     return obj->uilist;
  240. }
  241. void muiSetSelect(muiObject *obj, int state)
  242. {
  243.     obj->select = (short) state;
  244. }
  245. int muiGetVisible(muiObject *obj)
  246. {
  247.     return obj->visible;
  248. }
  249. void muiSetVisible(muiObject *obj, int state)
  250. {
  251.     obj->visible = (short) state;
  252. }
  253. int muiGetActive(muiObject *obj)
  254. {
  255.     return obj->active;
  256. }
  257. void muiSetActive(muiObject *obj, int state)
  258. {
  259.     obj->active = (short) state;
  260. }
  261. int muiGetEnable(muiObject *obj)
  262. {
  263.     return obj->enable;
  264. }
  265. void muiSetEnable(muiObject *obj, int state)
  266. {
  267.     obj->enable = (short) state;
  268. }
  269. void muiDrawObject(muiObject *obj)
  270. {
  271.     switch (obj->type) {
  272. case MUI_BUTTON:
  273.     drawbut(obj);
  274.     break;
  275. case MUI_RADIOBUTTON:
  276.     drawradiobutton(obj);
  277.     break;
  278. case MUI_TINYRADIOBUTTON:
  279.     drawtinyradio(obj);
  280.     break;
  281. case MUI_LABEL:
  282.     drawlabel(obj);
  283.     break;
  284. case MUI_BOLDLABEL:
  285.     drawboldlabel(obj);
  286.     break;
  287. case MUI_TEXTBOX:
  288.     drawtb(obj);
  289.     break;
  290. case MUI_VSLIDER:
  291.     drawvs(obj);
  292.     break;
  293. case MUI_HSLIDER:
  294.     drawhs(obj);
  295.     break;
  296. case MUI_TEXTLIST:
  297.     drawtl(obj);
  298.     break;
  299. case MUI_PULLDOWN:
  300.     drawpulldown(obj);
  301.     break;
  302.     }
  303. }
  304. void muiError(char *s)
  305. {
  306.     fprintf(stderr, "%sn", s);
  307.     exit(0);
  308. }
  309. #define MAX_UI_LISTS 50
  310. static muiCons *muilist[MAX_UI_LISTS];
  311. static int muilistindex[MAX_UI_LISTS];
  312. void muiNewUIList(int listid)
  313. {
  314.     static int inited = 0;
  315.     int i;
  316.     if (inited == 0) {
  317. inited = 1;
  318. for (i = 1; i < MAX_UI_LISTS; i++)
  319.     muilistindex[i] = -1;
  320. muilistindex[0] = listid;
  321. muiSetActiveUIList(listid);
  322. return;
  323.     }
  324.     for (i = 0; i < MAX_UI_LISTS; i++)
  325. if (muilistindex[i] == -1) {
  326.     muilistindex[i] = listid;
  327.     muiSetActiveUIList(listid);
  328.     return;
  329. }
  330.     muiError("muiNewUIList: No more UI lists available");
  331. }
  332. int muiGetListId(int uilist)
  333. {
  334.     int i;
  335.     
  336.     for (i = 0; i < MAX_UI_LISTS; i++) {
  337. if (muilistindex[i] == uilist) return i;
  338.     }
  339.     muiError("muiAddToUIList: illegal UI list identifier");
  340.     return -1;
  341. }
  342. muiCons *muiGetListCons(int uilist)
  343. {
  344.     int i;
  345.     
  346.     for (i = 0; i < MAX_UI_LISTS; i++) {
  347. if (muilistindex[i] == uilist) return muilist[i];
  348.     }
  349.     muiError("muiGetListCons: illegal UI list identifier");
  350.     return (muiCons *)0;
  351. }
  352. void muiAddToUIList(int uilist, muiObject *obj)
  353. {
  354.     int i;
  355.     muiCons *mcons;
  356.     if (uilist == 0) {
  357. muiError("muiAddToUIList: no active UI list");
  358.     }
  359.     if ((i = muiGetListId(uilist)) == -1) return;
  360.     mcons = (muiCons *)malloc(sizeof(muiCons));
  361.     mcons->next = muilist[i];
  362.     muilist[i] = mcons;
  363.     mcons->object = obj;
  364. }
  365. static muiObject *muiFastHitInList(muiCons *mcons, int x, int y)
  366. {
  367.     while (mcons) {
  368. if (muiInObject(mcons->object, x, y))
  369.     switch (mcons->object->type) {
  370. case MUI_BUTTON:
  371. case MUI_TEXTBOX:
  372. case MUI_VSLIDER:
  373. case MUI_HSLIDER:
  374. case MUI_TEXTLIST:
  375. case MUI_RADIOBUTTON:
  376. case MUI_TINYRADIOBUTTON:
  377. case MUI_PULLDOWN:
  378.     return mcons->object;
  379. case MUI_LABEL:
  380. case MUI_BOLDLABEL:
  381.     return 0;
  382.     }
  383. mcons = mcons->next;
  384.     }
  385.     return (muiObject *)0; /* not found */
  386. }
  387. muiObject *muiHitInList(int uilist, int x, int y)
  388. {
  389.     muiCons *mcons;
  390.     
  391.     if ((mcons = muiGetListCons(uilist)) == (muiCons *)0) return (muiObject *)0;
  392.     return muiFastHitInList(mcons, x, y);
  393. }
  394. void muiDrawUIList(int uilist)
  395. {
  396.     muiCons *mcons;
  397.     if ((mcons = muiGetListCons(uilist)) == (muiCons *)0) return;
  398.     muiBackgroundClear();
  399.     while (mcons) {
  400. muiDrawObject(mcons->object);
  401. mcons = mcons->next;
  402.     }
  403. }
  404. static muiObject *SelectedObj, *LocatedObj;
  405. static muiCons *ActiveCons;
  406. static int ActiveUIList = 0;
  407. static muiObject *ActiveSlider = 0;
  408. void muiSetActiveUIList(int i)
  409. {
  410.     ActiveUIList = i;
  411. }
  412. int muiGetActiveUIList(void)
  413. {
  414.     return ActiveUIList;
  415. }
  416. static void muiInitInteraction(int uilist)
  417. {
  418.     muiCons *mcons;
  419.     muiObject *obj;
  420.     if ((mcons = muiGetListCons(uilist)) == (muiCons *)0) return;
  421.     SelectedObj = LocatedObj = (muiObject *)0;
  422.     ActiveCons = mcons;
  423.     ActiveUIList = uilist;
  424.     while (mcons) {
  425. obj = mcons->object;
  426. muiSetSelect(obj, 0);
  427. muiSetLocate(obj, 0);
  428. mcons = mcons->next;
  429.     }
  430. }
  431. static void (*noncallback)(int, int) = 0;
  432. static void nonmuicallback(int x, int y)
  433. {
  434.     if (noncallback == 0) return;
  435.     noncallback(x, y);
  436. }
  437. void muiSetNonMUIcallback(void (*nc)(int, int))
  438. {
  439.     noncallback = nc;
  440. }
  441. void muiHandleEvent(int event, int value, int x, int y)
  442. {
  443.     muiObject *obj;
  444.     static int lastactive = 0;
  445.     enum muiReturnValue retval;
  446.     if (ActiveUIList == 0) {
  447. muiError("muiHandleEvent: no active UI list");
  448.     }
  449.     if (lastactive != ActiveUIList) {
  450. muiInitInteraction(lastactive = ActiveUIList);
  451.     }
  452.     if ((event == MUI_KEYSTROKE)) {
  453. if (obj = muiGetActiveTB()) {
  454.     retval = (obj->handler)(obj, event, value, x, y);
  455.     if (retval && obj->callback)
  456. (obj->callback)(obj, retval);
  457.     return;
  458. }
  459. /* may have to add text editors, et cetera */
  460. return;
  461.     }
  462.     if (event == MUI_DEVICE_RELEASE && ActiveSlider) {
  463. retval = (ActiveSlider->handler)(ActiveSlider, event, value, x, y);
  464. if (retval && ActiveSlider->callback)
  465.     (ActiveSlider->callback)(ActiveSlider, retval);
  466. ActiveSlider = 0;
  467. return;
  468.     }
  469.     ActiveCons = muiGetListCons(ActiveUIList);
  470.     obj = muiFastHitInList(ActiveCons, x, y);
  471.     if (obj == 0 && event == MUI_DEVICE_PRESS) {
  472. nonmuicallback(x, y);
  473. return;
  474.     }
  475.     if (event == MUI_DEVICE_UP && (!menuinuse) && (activemenu != -1) && (obj == 0 || obj->type != MUI_PULLDOWN)) {
  476. activemenu = -1;
  477. glutDetachMenu(GLUT_LEFT_BUTTON);
  478.     }
  479.     if (obj && (obj->type == MUI_VSLIDER || obj->type == MUI_HSLIDER)
  480.     && event == MUI_DEVICE_PRESS)
  481.     ActiveSlider = obj;
  482.     if (obj == 0) {
  483. if (ActiveSlider) {
  484.     retval = (ActiveSlider->handler)(ActiveSlider, event, value, x, y);
  485.     if (retval && ActiveSlider->callback)
  486. (ActiveSlider->callback)(ActiveSlider, retval);
  487.     return;
  488. }
  489.         if (LocatedObj) {
  490.     muiSetLocate(LocatedObj, 0);
  491.     muiDrawObject(LocatedObj);
  492.     LocatedObj = 0;
  493. }
  494. if ((event == MUI_DEVICE_RELEASE) && SelectedObj) {
  495.     muiSetSelect(SelectedObj, 0);
  496.     muiSetLocate(SelectedObj, 0);
  497.     muiDrawObject(SelectedObj);
  498.     LocatedObj = SelectedObj = 0;
  499. }
  500. return;
  501.     }
  502.     retval = (obj->handler)(obj, event, value, x, y);
  503.     if (retval && obj->callback)
  504. (obj->callback)(obj, retval);
  505.     return;
  506. }
  507. /* ARGSUSED2 */
  508. enum muiReturnValue buttonhandler(muiObject *obj, int event, int value, int x, int y)
  509. {
  510.     if (!muiGetEnable(obj) || !muiGetVisible(obj)) return MUI_NO_ACTION;
  511.     switch (event) {
  512. case MUI_DEVICE_DOWN:
  513.     return MUI_NO_ACTION;
  514. case MUI_DEVICE_UP:
  515.     if (LocatedObj != obj) {
  516.         if (LocatedObj) {
  517.     muiSetLocate(LocatedObj, 0);
  518.     muiDrawObject(LocatedObj);
  519. }
  520. muiSetLocate(obj, 1);
  521. muiDrawObject(obj);
  522. LocatedObj = obj;
  523.     }
  524.     return MUI_NO_ACTION;
  525. case MUI_DEVICE_PRESS:
  526.     muiSetSelect(obj, 1);
  527.     muiSetLocate(obj, 1);
  528.     SelectedObj = LocatedObj = obj;
  529.     muiDrawObject(obj);
  530.     return MUI_NO_ACTION;
  531. case MUI_DEVICE_RELEASE:
  532.     if (SelectedObj != obj) {
  533. muiSetSelect(SelectedObj, 0);
  534. muiSetLocate(SelectedObj, 0);
  535. muiDrawObject(SelectedObj);
  536. muiSetLocate(obj, 1);
  537. LocatedObj = obj;
  538. muiDrawObject(obj);
  539. return MUI_NO_ACTION;
  540.     }
  541.     if (obj->type == MUI_RADIOBUTTON || obj->type == MUI_TINYRADIOBUTTON) {
  542. Button *b = (Button *)obj->object, *b1;
  543. if (b->link) {
  544.     muiSetActive(obj, 1);
  545.     b1 = b->link;
  546.     while (b1 != b) {
  547. muiSetActive(b1->object, 0);
  548. b1 = b1->link;
  549.     }
  550. } else {
  551.       muiSetActive(obj, ( muiGetActive(obj) ? 0 : 1 ) );
  552.    }
  553.     }
  554.     muiSetSelect(obj, 0);
  555.     muiDrawObject(obj);
  556.     return MUI_BUTTON_PRESS;
  557. case MUI_DEVICE_CLICK:
  558.     muiSetSelect(obj, 0);
  559.     muiSetLocate(obj, 1);
  560.     LocatedObj = obj;
  561.     muiDrawObject(obj);
  562.     return MUI_BUTTON_PRESS;
  563. case MUI_DEVICE_DOUBLE_CLICK:
  564.     muiSetSelect(obj, 0);
  565.     muiSetLocate(obj, 1);
  566.     LocatedObj = obj;
  567.     muiDrawObject(obj);
  568.     return MUI_BUTTON_PRESS; /* XXX this may not be right; */
  569. case MUI_KEYSTROKE:
  570.     return MUI_NO_ACTION;
  571. default:
  572.     muiError("buttonhandler: wacko event");
  573.     return MUI_NO_ACTION;
  574.     }
  575. }
  576. /* ARGSUSED */
  577. enum muiReturnValue nullhandler(muiObject *obj, int event, int value, int x, int y)
  578. {
  579.     return MUI_NO_ACTION;
  580. }