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

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 <GL/glut.h>
  38. #include <mui/gizmo.h>
  39. #include <stdio.h>
  40. #include <string.h>
  41. #include <stdlib.h>
  42. #include <mui/uicolor.h>
  43. #include <mui/displaylist.h>
  44. /*  M E N U   B A R   F U N C T I O N S  */
  45. Pulldown *newpd(void)
  46. {
  47.     Pulldown *pd = (Pulldown *)malloc(sizeof(Pulldown));
  48.     pd->count = 0;
  49.     return pd;
  50. }
  51. void muiAddPulldownEntry(muiObject *obj, char *title, int menu, int ishelp)
  52. {
  53.     Pulldown *pd = (Pulldown *)obj->object;
  54.     int space = obj->xmax - obj->xmin - 66;
  55.     int i, delta;
  56.     if (ishelp) {
  57. strcpy(pd->helpmenu.title, title);
  58. pd->ishelp = 1;
  59. pd->helpmenu.xoffset = obj->xmax - 58;
  60. pd->helpmenu.menu = menu;
  61. return;
  62.     }
  63.     if (pd->count == 29) muiError("muiAddPulldownEntry: more than 29 entries");
  64.     strcpy(pd->menus[pd->count].title, title);
  65.     pd->menus[pd->count].menu = menu;
  66.     pd->count++;
  67.     /* now recalculate spacings */
  68.     if (space > 50*pd->count) {
  69. for (i = 0; i <= pd->count; i++)
  70.     pd->menus[i].xoffset = 8 + i*50;
  71.     } else {
  72. delta = space/pd->count;
  73. for (i = 0; i <= pd->count; i++)
  74.     pd->menus[i].xoffset = 8 + i*delta;
  75.     }
  76. }
  77. int activemenu = -1;
  78. extern int menuinuse;
  79. /* ARGSUSED2 */
  80. enum muiReturnValue  pdhandler(muiObject *obj, int event, int value, int x, int y)
  81. {
  82.     int i;
  83.     Pulldown *pd = (Pulldown *)obj->object;
  84.  
  85.     if( !muiGetEnable(obj) || !muiGetVisible(obj) ) return MUI_NO_ACTION;
  86.     
  87.     if (event == MUI_DEVICE_UP) {
  88. for (i = 0; i < pd->count; i++)
  89.     if (pd->menus[i].xoffset-8 < x && x < pd->menus[i+1].xoffset-8) {
  90. if (activemenu != pd->menus[i].menu && !menuinuse) {
  91.     glutSetMenu(activemenu = pd->menus[i].menu);
  92.     glutAttachMenu(GLUT_LEFT_BUTTON);
  93. }
  94. return MUI_NO_ACTION;
  95.     }
  96. if (pd->ishelp && (x > pd->helpmenu.xoffset-8)) {
  97.     if ((activemenu != pd->helpmenu.menu) && !menuinuse) {
  98. glutSetMenu(activemenu = pd->helpmenu.menu);
  99. glutAttachMenu(GLUT_LEFT_BUTTON);
  100.     }
  101.     return MUI_NO_ACTION;
  102. }
  103. if (activemenu && !menuinuse) {
  104.     glutDetachMenu(GLUT_LEFT_BUTTON);
  105.     activemenu = -1;
  106. }
  107.     }
  108.     return MUI_NO_ACTION;
  109. }
  110. void drawpulldown(muiObject *obj)
  111. {
  112.     int        i;
  113.     int        xmin, xmax, ymin, ymax;
  114.     if (!muiGetVisible(obj))
  115. return;
  116.     drawsetup();
  117.     xmin = obj->xmin;
  118.     ymin = obj->ymin;
  119.     xmax = obj->xmax;
  120.     ymax = obj->ymax;
  121.     drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiVyDkGray);
  122.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiDkGray);
  123.     drawedges(xmin++,xmax--,ymin++,ymax--,uiVyLtGray,uiMmGray);
  124.     drawedges(xmin++,xmax--,ymin++,ymax--,uiVyLtGray,uiMmGray);
  125.     uiLtGray();
  126.      uirectfi(xmin,ymin,xmax,ymax);
  127.     if (obj->object) {
  128.         Pulldown *pd = (Pulldown *)obj->object;
  129.      for (i = 0; i < pd->count; i++) {
  130.     if (muiGetEnable(obj)) uiBlack(); else uiDkGray();
  131.     uicmov2i(obj->xmin + pd->menus[i].xoffset, obj->ymin + 8);
  132.     uicharstr(pd->menus[i].title, UI_FONT_NORMAL);
  133.      }
  134. if (pd->ishelp) {
  135.     if(muiGetEnable(obj)) uiBlack(); else uiDkGray();
  136.     uicmov2i(obj->xmin + pd->helpmenu.xoffset, obj->ymin + 8);
  137.     uicharstr(pd->helpmenu.title, UI_FONT_NORMAL);
  138. }
  139.     }
  140.     drawrestore();
  141. }
  142. #ifdef NOTDEF
  143. /* static variables */
  144. static int offrightside;
  145. static PullDown *basepd;
  146. static int menubut;
  147. static int menuretval;
  148. static int inpdmode = 0;
  149. static int indopd = 0;
  150. static int savep;
  151. static short savedev[SAVELEN];
  152. static short saveval[SAVELEN];
  153. extern MenuBar *locatedmb;
  154. static short pdinit = 0;
  155. void movemenubar(muiObject *obj)
  156. {
  157.     int i, tx = MENUXENDGAP-9, totaltwidth = 0;
  158.     int xsize, ysize, width;
  159.     mb->xmin = mb->xorg;
  160.     mb->xmax = mb->xorg+xsize-1;
  161.     mb->ymin = mb->yorg+ysize-MENUBARHEIGHT;
  162.     mb->ymax = mb->yorg+ysize-1;
  163.     width = mb->xmax - mb->xmin + 1;
  164.     font(PULLDOWNFONT); /* for correct strwidths */
  165.     for (i = 0; i < mb->count; i++)
  166.         totaltwidth += strwidth(mb->pds[i]->title) + 2*MENUXENDGAP;
  167.     for (i = 0; i < mb->count; i++) {
  168. if (mb->pds[i]->title)
  169.     mb->pds[i]->twidth = strwidth(mb->pds[i]->title);
  170.         if ((mb->pds[i]->title) && (!strcmp(mb->pds[i]->title,"Help")))
  171.            mb->pds[i]->txorg = mb->xmax-MENUXENDGAP-mb->pds[i]->twidth-MENUXGAP;
  172.         else
  173.            mb->pds[i]->txorg = mb->xmin + tx;
  174.         mb->pds[i]->xorg = mb->pds[i]->txorg;
  175. mb->pds[i]->yorg = mb->ymin-TITLESEP;
  176. mb->pds[i]->orglocked = 1;
  177. mb->pds[i]->mb = mb;
  178. if (totaltwidth > width)
  179.             tx += (width-2*MENUXENDGAP)/mb->count-2;
  180.         else
  181.             tx += mb->pds[i]->twidth+24;
  182.     } 
  183. }
  184. MenuBar *newmenubar(void)
  185. {
  186.     MenuBar *mb;
  187.     mb = (MenuBar *)calloc(1,sizeof(MenuBar));
  188.     mb->count = 0;
  189.     mb->pds = 0;
  190.     mb->locate = -1;
  191.     mb->enable = 1;
  192.     mb->invisible = 0;
  193.     return mb;
  194. }
  195. /* ENABLE STATE FUNCTIONS FOR MENU BARS */
  196. void enablemb(MenuBar *mb)
  197. {
  198.     if (mb->enable)
  199. return;
  200.     mb->enable = 1;
  201. }
  202. void disablemb(MenuBar *mb)
  203. {
  204.     if (!mb->enable)
  205. return;
  206.     mb->enable = 0;
  207. }
  208. short getenablemb(MenuBar *mb)
  209. {
  210.     return mb->enable;
  211. }
  212. /* LOCATE STATE FUNCTIONS FOR MENU BARS */
  213. short gethighlightmb(MenuBar *mb)
  214. {
  215.     return mb->locate;
  216. }
  217. void highlightmb(MenuBar *mb, int pdnum)
  218. {
  219.     short oldpdnum = mb->locate;
  220.     if (mb->locate == pdnum)
  221. return;
  222.     mb->locate = pdnum;
  223.     locatedmb = mb;
  224.     if (!mb->invisible) {
  225. if (pdnum != -1)
  226.     drawmenubartext(mb,pdnum);
  227. if (oldpdnum != -1)
  228.     drawmenubartext(mb,oldpdnum);
  229.     }
  230. }
  231. void unhighlightmb(MenuBar *mb)
  232. {
  233.     short oldpdnum = mb->locate;
  234.     if (mb->locate == -1)
  235. return;
  236.     mb->locate = -1;
  237.     if (locatedmb == mb)
  238. locatedmb = 0;
  239.     if (!mb->invisible)
  240. if (oldpdnum != -1)
  241.     drawmenubartext(mb,oldpdnum);
  242. }
  243. /* VISIBLE STATE FUNCTIONS */
  244. void    makevisiblemb(MenuBar *mb)
  245. {
  246.     if (!mb->invisible)
  247. return;
  248.     mb->invisible = 0;
  249. }
  250. void    makeinvisiblemb(MenuBar *mb)
  251. {
  252.     if (mb->invisible)
  253. return;
  254.     mb->invisible = 1;
  255. }
  256. short   getvisiblemb(MenuBar *mb)
  257. {
  258.     return 1-mb->invisible;
  259. }
  260. void loadmenubar(MenuBar *mb, int menucount, PullDown **pdarray)
  261. {
  262.     int i;
  263.     drawsetup();
  264.     mb->count = menucount;
  265.     mb->pds = (PullDown **)calloc(menucount,sizeof(PullDown));
  266.     mb->locate = -1;
  267.     mb->enable = 1;
  268.     mb->invisible = 0;
  269.     for (i = 0; i < mb->count; i++){
  270. mb->pds[i] = pdarray[i];
  271.     }
  272.     movemenubar(mb);
  273.     drawrestore();
  274. }
  275. void addtomenubar(MenuBar *mb, PullDown *pd)
  276. {
  277.     PullDown  **pds;
  278.     int  i;
  279.     mb->count++;
  280.     pds = (PullDown **)calloc(mb->count,sizeof(PullDown));
  281.     for (i = 0; i < mb->count-1; i++){
  282. pds[i] = mb->pds[i];
  283.     }
  284.     pds[i] = pd;
  285.  
  286.     free(mb->pds);
  287.     mb->pds = pds;
  288. }
  289. void addtopd(PullDown *pd, MenuItem *mi)
  290. {
  291.     MenuItem *m, *tail;
  292.     tail = pd->entries;
  293.     if (tail) {
  294.      while (tail->next)
  295.          tail = tail->next;
  296. tail->next = mi;
  297.     } else
  298. tail = pd->entries = mi;
  299.     m = pd->entries;
  300.     while (m) {
  301.      pd->nentries++;
  302.      m->no = pd->nentries;
  303.         m = m->next;
  304.     }
  305.     fixuppd(pd);
  306. }
  307. void removefrommenubar(MenuBar *mb, PullDown *pd)
  308. {
  309.     PullDown    **pds;
  310.     int        i, j;
  311.     mb->count--;
  312.     pds = (PullDown **)calloc(mb->count,sizeof(PullDown));
  313.     for (i = 0,j = 0; i <= mb->count; i++) {
  314. if (mb->pds[i] != pd) {
  315.     pds[j] = mb->pds[i];
  316.     j++;
  317. }
  318.     }
  319.     free(mb->pds);
  320.     mb->pds = pds;
  321. }
  322. void movemenubar(MenuBar *mb)
  323. {
  324.     int i, tx = MENUXENDGAP-9, totaltwidth = 0;
  325.     int xsize, ysize, width;
  326.     getorigin(&mb->xorg, &mb->yorg);
  327.     getsize(&xsize, &ysize);
  328.     mb->xmin = mb->xorg;
  329.     mb->xmax = mb->xorg+xsize-1;
  330.     mb->ymin = mb->yorg+ysize-MENUBARHEIGHT;
  331.     mb->ymax = mb->yorg+ysize-1;
  332.     width = mb->xmax - mb->xmin + 1;
  333.     font(PULLDOWNFONT); /* for correct strwidths */
  334.     for (i = 0; i < mb->count; i++)
  335.         totaltwidth += strwidth(mb->pds[i]->title) + 2*MENUXENDGAP;
  336.     for (i = 0; i < mb->count; i++) {
  337. if (mb->pds[i]->title)
  338.     mb->pds[i]->twidth = strwidth(mb->pds[i]->title);
  339.         if ((mb->pds[i]->title) && (!strcmp(mb->pds[i]->title,"Help")))
  340.            mb->pds[i]->txorg = mb->xmax-MENUXENDGAP-mb->pds[i]->twidth-MENUXGAP;
  341.         else
  342.            mb->pds[i]->txorg = mb->xmin + tx;
  343.         mb->pds[i]->xorg = mb->pds[i]->txorg;
  344. mb->pds[i]->yorg = mb->ymin-TITLESEP;
  345. mb->pds[i]->orglocked = 1;
  346. mb->pds[i]->mb = mb;
  347. if (totaltwidth > width)
  348.             tx += (width-2*MENUXENDGAP)/mb->count-2;
  349.         else
  350.             tx += mb->pds[i]->twidth+24;
  351.     } 
  352. }
  353. int inmenubar(MenuBar *mb, int mx, int my) /* Window coordinates */
  354. {
  355.     int i;
  356.     
  357.     if (!getenablemb(mb))
  358. return -1;
  359.     if (getdrawmode() == NORMALDRAW) {
  360. mx += mb->xorg;
  361. my += mb->yorg;
  362.     }
  363.     if (mb->xmin <= mx && mx <= mb->xmax && 
  364. mb->ymin+2 <= my && my <= mb->ymax-2) /* +-2 for locate highlight*/
  365.        for (i = 0; i < mb->count; i++) {
  366.             if ((mx >= mb->pds[i]->txorg) &&
  367.                 (mx <= mb->pds[i]->txorg+mb->pds[i]->twidth+MENUXGAP*2))
  368. return i;
  369. }
  370.     return -1;
  371. }
  372. short locatemenubar(MenuBar *mb, int mx, int my) /* window coordinates */
  373. {
  374.     int highlight = gethighlightmb(mb);
  375.     int inmb  = inmenubar(mb,mx,my);
  376.     if (!getenablemb(mb) || !getvisiblemb(mb) || (highlight == inmb))
  377.         return 0;
  378.     if (inmb != -1) {
  379. unlocateall();
  380.         highlightmb(mb,inmb);
  381. return 1;
  382.     } else {
  383. unhighlightmb(mb);
  384. return 0;
  385.     }
  386. }
  387. /* DRAWING MENUBAR FUNCTIONS */
  388. void drawmenubarnow(MenuBar *mb)
  389. {
  390.     uifrontbuffer(1);
  391.     drawmenubar(mb);
  392.     uifrontbuffer(0);
  393. }
  394. #endif /* NOTDEF */