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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1992, 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.  /* jot text editor source code. */
  38.  /*     Tom Davis  */
  39.  /*  February 7, 1992  */
  40. #include <GL/glut.h>
  41. #include <mui/gizmo.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include <mui/uicolor.h>
  45. #include <mui/displaylist.h>
  46. #define BUTTONUP        0
  47. #define BUTTONDOWN      1
  48. #define BUTTONCLICK     2
  49. #define BUTTONDOUBLE    3
  50. void drawtb(muiObject *);
  51. int  definescaledfont = 0;
  52. char *tmpfilename;
  53. /*   NEW BUTTON PROCEDURES */
  54. int strwidth(char *s)
  55. {
  56.     int len = 0;
  57.     while (*s) {
  58. len += glutBitmapWidth(GLUT_BITMAP_HELVETICA_12, *s++);
  59.     }
  60.     return len;
  61. }
  62. Button *newbut(void)
  63. {
  64.     Button *b;
  65.     b = newbed();
  66.     b->type = BUTTON;
  67.     b->link = 0;
  68.     return b;
  69. }
  70. Button *newradiobut(void)
  71. {
  72.     Button *b;
  73.     b = newbed();
  74.     b->type = RADIOBUTTON;
  75.     b->link = 0;
  76.     return b;
  77. }
  78. Button *newbed(void)
  79. {
  80.     Button *b;
  81.     b = (Button *)malloc(sizeof(Button));
  82.     b->str[0] = 0;
  83.     b->type = BED;
  84.     return b;
  85. }
  86. void muiLoadButton(muiObject *b, char *s)
  87. {
  88.     int temp;
  89.     Button *but = (Button *)b->object;
  90.     strcpy(but->str, s);
  91.     switch (but->type) {
  92. case PUSHBUTTON:
  93.     temp = b->xmin + strwidth(but->str) + 20;
  94.     if (temp > b->xmax)
  95. b->xmax = temp;
  96.     break;
  97. default:
  98.     break;
  99.     }
  100. }
  101. void drawbuttonbackground(muiObject *b)
  102. {
  103.     int xmin = b->xmin, xmax = b->xmax, ymin = b->ymin, ymax = b->ymax;
  104.     if (b->locate) {
  105. if (b->select) {
  106.     drawedges(xmin++,xmax--,ymin++,ymax--,uiVyDkGray,uiWhite);
  107.     drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiWhite);
  108.     drawedges(xmin++,xmax--,ymin++,ymax--,uiLtGray,uiBlack);
  109.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiLtGray);
  110.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiVyLtGray);
  111. } else {
  112.     drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiVyDkGray);
  113.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiDkGray);
  114.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiLtGray);
  115.     drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiLtGray);
  116. }
  117.     } else {
  118. drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiVyDkGray);
  119. drawedges(xmin++,xmax--,ymin++,ymax--,uiWhite,uiDkGray);
  120. drawedges(xmin++,xmax--,ymin++,ymax--,uiVyLtGray,uiMmGray);
  121. drawedges(xmin++,xmax--,ymin++,ymax--,uiVyLtGray,uiMmGray);
  122.     }
  123.     (b->locate)?uiVyLtGray():uiLtGray();
  124.     uirectfi(xmin,ymin,xmax+1,ymax+1);
  125. }
  126. void drawpushbut(muiObject *b)
  127. {
  128.     Button *but = (Button *)b->object;
  129.     drawbuttonbackground(b);
  130.     uiBlack();
  131.     uicmov2i(b->xmin+ (b->xmax - b->xmin - strwidth(but->str))/2 + 1, b->ymin+9);
  132.     uicharstr(but->str, UI_FONT_NORMAL);
  133. }
  134. void drawbut(muiObject *b)
  135. {
  136.     switch(b->type) {
  137. case BUTTON:
  138. case PUSHBUTTON:
  139. drawpushbut(b);
  140. break;
  141. case BED:
  142. break;
  143. default:
  144. drawpushbut(b);
  145. break;
  146.     }
  147. }
  148. void muiChangeLabel(muiObject *obj, char *s)
  149. {
  150.     Label *l;
  151.     
  152.     if (obj->type != MUI_LABEL && obj->type != MUI_BOLDLABEL)
  153. muiError("muiChangeLabel: not a label");
  154.     l = (Label *)obj->object;
  155.     strncpy(l->str, s, LABELSTRLEN);
  156.     l->str[LABELSTRLEN] = 0;
  157.     return;
  158. }
  159. Label *newlabel(char *s)
  160. {
  161.     Label *l = (Label *)malloc(sizeof(Label));
  162.     strncpy(l->str, s, LABELSTRLEN);
  163.     l->str[LABELSTRLEN] = 0;
  164.     return l;
  165. }
  166. TextBox *activetb = 0;
  167. TextBox *newtb(int xmin, int xmax)
  168. {
  169.     TextBox *tb;
  170.     static int inited = 0;
  171.     if (!inited) {
  172. inited = 1;
  173.     }
  174.     tb = (TextBox *)malloc(sizeof(TextBox));
  175.     tb->charWidth = (xmax - xmin - 9)/FONTWIDTH;
  176.     tb->tp1 = tb->tp2 = 0;
  177.     *tb->str = 0;
  178.     *tb->label = 0;
  179.     return tb;
  180. }
  181. char *muiGetTBString(muiObject *obj)
  182. {
  183.     TextBox *tb = (TextBox *)obj->object;
  184.     return tb->str;
  185. }
  186. void muiClearTBString(muiObject *obj)
  187. {
  188.     TextBox *tb = (TextBox *)obj->object;
  189.     *tb->str = 0;
  190.     tb->tp1 = tb->tp2 = 0;
  191. }
  192. void loadtb(TextBox *tb, char *s)
  193. {
  194.     if (s == 0)
  195. *tb->str = 0;
  196.     else
  197. strcpy(tb->str, s);
  198.     tb->tp1 = tb->tp2 = (int) strlen(s);
  199. }
  200. void muiSetTBString(muiObject *obj, char *s)
  201. {
  202.     TextBox *tb = (TextBox *)obj->object;
  203.     loadtb(tb, s);
  204. }
  205. void backspacetb(TextBox *tb)
  206. {
  207.     char *s1, *s2, *stemp;
  208.     if ((tb->tp1 == tb->tp2) && tb->tp1 > 0) {
  209. s1 = &tb->str[tb->tp1-1];
  210. while (*s1) {
  211.     *s1 = *(s1+1);
  212.     s1++;
  213. }
  214. tb->tp1--; tb->tp2--;
  215. return;
  216.     }
  217.     s1 = &tb->str[tb->tp1];
  218.     s2 = &tb->str[tb->tp2];
  219.     if (s1 > s2) { stemp = s1; s1 = s2; s2 = stemp; }
  220.     stemp = s1;
  221.     while (*s2) {*s1++ = *s2++;}
  222.     *s1 = 0;
  223.     tb->tp1 = tb->tp2 = (int) (stemp - tb->str);
  224. }
  225. void inserttbchar(TextBox *tb, char c)
  226. {
  227.     char *s1, *s2;
  228.     int len;
  229.     if (tb->tp1 != tb->tp2) backspacetb(tb);
  230.     len = (int) strlen(tb->str);
  231.     if (len == TBSTRLEN) return;
  232.     s1 = &tb->str[tb->tp1];
  233.     s2 = &tb->str[len+1];
  234.     while (s2 != s1) {
  235. *s2 = *(s2 - 1);
  236. s2--;
  237.     }
  238.     *s1 = c;
  239.     tb->tp1++; tb->tp2++;
  240. }
  241. int findtp(muiObject *obj, int x)
  242. {
  243.     TextBox *tb = (TextBox *)obj->object;
  244.     int tp, sl = (int) strlen(tb->str);
  245.     tp = (x - obj->xmin)/FONTWIDTH;
  246.     if (tp < 0) tp = 0;
  247.     if (tp > tb->charWidth) tp = tb->charWidth;
  248.     if (tp > sl) tp = sl;
  249.     return tp;
  250. }
  251. void drawtbcontents(muiObject *obj)
  252. {
  253.     int xmin = obj->xmin, ymin = obj->ymin; 
  254.     int ymax = ymin+TEXTBOXHEIGHT;
  255.     int s1, s2;
  256.     char str[160], *s;
  257.     TextBox *tb = (TextBox *)obj->object;
  258.     strncpy(str, tb->str, (unsigned int)tb->charWidth);
  259.     for (s = str; *s; s++)
  260.         if (*s < ' ' || *s >= '177') *s = '*';
  261.     str[tb->charWidth] = 0;
  262.     s1 = tb->tp1; s2 = tb->tp2;
  263.     if (s1 > tb->charWidth) s1 = tb->charWidth;
  264.     if (s2 > tb->charWidth) s2 = tb->charWidth;
  265.     /* selected area */
  266.     if (obj->active && (s1 != s2)) { 
  267. uiVyLtGray();
  268. uirectfi(xmin+6+FONTWIDTH*s1, ymin+7, xmin+6+FONTWIDTH*s2, ymax-6);
  269.     }
  270.     /* contents of text box */
  271.     if (muiGetEnable(obj)) uiBlack(); else uiDkGray();
  272.     uicmov2i(xmin+6, ymin+9);
  273.     uicharstr(str, UI_FONT_FIXED_PITCH);
  274.     /* Blue bar */
  275.     if ((obj->active == 0) || (obj->enable == 0) || (s1 != s2)) return;
  276.     uiBlue();
  277.     uimove2i(xmin+4+FONTWIDTH*s1, ymin+7); uidraw2i(xmin+4+FONTWIDTH*s1, ymax-6); uiendline();
  278.     uimove2i(xmin+5+FONTWIDTH*s1, ymin+7); uidraw2i(xmin+5+FONTWIDTH*s1, ymax-6); uiendline();
  279. }
  280. void drawtb(muiObject *tb)
  281. {
  282.     int xmin = tb->xmin, xmax = tb->xmax, ymin = tb->ymin;
  283.     int  ymax = ymin+TEXTBOXHEIGHT;
  284.     if(!muiGetVisible(tb)) return;
  285.     
  286.     if( muiGetEnable(tb) ) {
  287. drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiWhite);
  288. drawedges(xmin++,xmax--,ymin++,ymax--,uiBlack,uiVyLtGray);
  289. drawedges(xmin++,xmax--,ymin++,ymax--,uiLtGray,uiDkGray);
  290. drawedges(xmin++,xmax--,ymin++,ymax--,uiTerraCotta,uiTerraCotta);
  291. uiTerraCotta();
  292.     }
  293.     else {
  294. drawedges(xmin++,xmax--,ymin++,ymax--,uiDkGray,uiWhite);
  295. drawedges(xmin++,xmax--,ymin++,ymax--,uiMmGray,uiVyLtGray);
  296. drawedges(xmin++,xmax--,ymin++,ymax--,uiLtGray,uiDkGray);
  297. drawedges(xmin++,xmax--,ymin++,ymax--,uiLtGray,uiDkGray);
  298. uiLtGray();
  299.     }
  300.     uirectfi(xmin, ymin, xmax+1, ymax+1);
  301.     drawtbcontents(tb);
  302. }
  303. void muiActivateTB(muiObject *obj)
  304. {
  305.     muiCons *mcons;
  306.     if ((mcons = muiGetListCons(muiGetUIList(obj))) == (muiCons *)0) return;   
  307.     muiSetActive(obj, 1);
  308.     while (mcons) {
  309. if (mcons->object != obj && mcons->object->type == MUI_TEXTBOX)
  310.     muiSetActive(mcons->object, 0);
  311. mcons = mcons->next;
  312.     }
  313. }
  314. muiObject *muiGetActiveTB(void)
  315. {
  316.     muiCons *mcons;
  317.     int list = muiGetActiveUIList();
  318.     if (list == 0) return 0;
  319.     if ((mcons = muiGetListCons(list)) == (muiCons *)0) return 0;
  320.     while (mcons) {
  321. if (mcons->object->type == MUI_TEXTBOX && muiGetActive(mcons->object))
  322.     return mcons->object;
  323. mcons = mcons->next;
  324.     }
  325.     return 0;
  326. }
  327. enum muiReturnValue textboxhandler(muiObject *obj, int event, int value, int x, int y)
  328. {
  329.     int tp;
  330.     TextBox *tb = (TextBox *)obj->object;
  331.     if( !muiGetEnable(obj) || !muiGetVisible(obj) ) return MUI_NO_ACTION;
  332.     
  333.     switch (event) {
  334. case MUI_DEVICE_DOWN:
  335.     tp = findtp(obj, x);
  336.     tb->tp2 = tp;
  337.     break;
  338. case MUI_DEVICE_UP:
  339.     break;
  340. case MUI_DEVICE_PRESS:
  341.     muiActivateTB(obj);
  342.     tp = findtp(obj, x);
  343.     tb->tp1 = tb->tp2 = tp;
  344.     break;
  345. case MUI_DEVICE_RELEASE:
  346.     break;
  347. case MUI_DEVICE_CLICK:
  348. case MUI_DEVICE_DOUBLE_CLICK:
  349.     muiActivateTB(obj);
  350.     tp = findtp(obj, x);
  351.     tb->tp1 = tb->tp2 = tp;
  352.     break;
  353. case MUI_KEYSTROKE:
  354.     if (value == 'n' || value == 'r') /* carriage return */
  355. return MUI_TEXTBOX_RETURN;
  356.     if (value == '25') { muiClearTBString(obj); }
  357.     else if (value == 'b') { backspacetb((TextBox *)obj->object); }
  358.     else inserttbchar((TextBox *)obj->object, (char)value);
  359.     break;
  360.     }
  361.     x = y;  /* for lint's sake */
  362.     return MUI_NO_ACTION;
  363. }
  364. void helpdrawlabel(char *s, int x, int y)
  365. {
  366.     uiBlack();
  367.      uicmov2i(x, y);
  368.      uicharstr(s, UI_FONT_NORMAL);
  369. }
  370. void helpdrawboldlabel(char *s, int x, int y)
  371. {
  372.     uiBlack(); /* XXX Hack! -- no bold font in GLUT */
  373.      uicmov2i(x, y);
  374.      uicharstr(s, UI_FONT_NORMAL);
  375.      uicmov2i(x+1, y);
  376.      uicharstr(s, UI_FONT_NORMAL);
  377. }
  378. void drawlabel(muiObject *lab)
  379. {
  380.     Label *l = (Label *)lab->object;
  381.     if(!muiGetVisible(lab)) return;
  382.     if(muiGetEnable(lab)) uiBlack(); else uiDkGray();
  383.     uicmov2i(lab->xmin, lab->ymin);
  384.     uicharstr(l->str, UI_FONT_NORMAL);
  385. }
  386. void drawboldlabel(muiObject *lab)
  387. {
  388.     Label *l = (Label *)lab->object;
  389.     if(!muiGetVisible(lab)) return;
  390.     if(muiGetEnable(lab)) uiBlack(); else uiDkGray();
  391.     uicmov2i(lab->xmin, lab->ymin);     /* XXX Hack! -- no bold font in GLUT */
  392.     uicharstr(l->str, UI_FONT_NORMAL);
  393.     uicmov2i(lab->xmin+1, lab->ymin);
  394.     uicharstr(l->str, UI_FONT_NORMAL);
  395. }