home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume17 / xtexcad1 / part04 < prev    next >
Encoding:
Text File  |  1992-04-20  |  50.5 KB  |  2,195 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  3. From: Fritz Haubensak <hsk@informatik.uni-wuerzburg.de>
  4. Subject: v17i068: TeXcad (X) version 1.2, Part04/10
  5. Message-ID: <1992Apr21.130913.2298@msi.com>
  6. Originator: dcmartin@fascet
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Nntp-Posting-Host: fascet
  9. Organization: Molecular Simulations, Inc.
  10. References: <csx-17i065-xtexcad-1.2@uunet.UU.NET>
  11. Date: Tue, 21 Apr 1992 13:09:13 GMT
  12. Approved: dcmartin@msi.com
  13. Lines: 2180
  14.  
  15. Submitted-by: Fritz Haubensak <hsk@informatik.uni-wuerzburg.de>
  16. Posting-number: Volume 17, Issue 68
  17. Archive-name: xtexcad-1.2/part04
  18.  
  19. # this is part.04 (part 4 of a multipart archive)
  20. # do not concatenate these parts, unpack them in order with /bin/sh
  21. # file graphics.c continued
  22. #
  23. if test ! -r _shar_seq_.tmp; then
  24.     echo 'Please unpack part 1 first!'
  25.     exit 1
  26. fi
  27. (read Scheck
  28.  if test "$Scheck" != 4; then
  29.     echo Please unpack part "$Scheck" next!
  30.     exit 1
  31.  else
  32.     exit 0
  33.  fi
  34. ) < _shar_seq_.tmp || exit 1
  35. if test ! -f _shar_wnt_.tmp; then
  36.     echo 'x - still skipping graphics.c'
  37. else
  38. echo 'x - continuing file graphics.c'
  39. sed 's/^X//' << 'SHAR_EOF' >> 'graphics.c' &&
  40. X        while (message_marker != message_curr)
  41. X        {
  42. X            a1 = message_marker->x;
  43. X            a2 = message_marker->y;
  44. X            real2zoomed(&a1, &a2);
  45. X            print_text_text_marker(message_marker->textpos,a1,a2,message_marker->text);
  46. X            message_marker = message_marker->next;
  47. X        }
  48. X        /* last */
  49. X        a1 = message_curr->x;
  50. X        a2 = message_curr->y;
  51. X        real2zoomed(&a1, &a2);
  52. X        print_text_text_marker(message_curr->textpos,a1,a2,message_curr->text);
  53. X    }    /* text */
  54. X    /* boxes */
  55. X    /* framed */
  56. X    if (framedBox_start != NULL)
  57. X    {    /* min. 1 entry */
  58. X        framedBox_marker = framedBox_start;
  59. X        while (framedBox_marker != framedBox_curr)
  60. X        {
  61. X            a1 = framedBox_marker->x;
  62. X            a2 = framedBox_marker->y;
  63. X            e1 = framedBox_marker->h;
  64. X            e2 = framedBox_marker->v;
  65. X            real2zoomed(&a1, &a2);
  66. X            real2zoomed(&e1, &e2);
  67. X            XDrawRectangle(disp, win, gc, (int) a1, (int) a2,
  68. X                       (unsigned int) ((int) (e1 - a1)),
  69. X                       (unsigned int) ((int) (e2 - a2)));
  70. X
  71. X            print_box_text(framedBox_marker->textpos,
  72. X                    a1, a2, e1, e2, framedBox_marker->text);
  73. X
  74. X            framedBox_marker = framedBox_marker->next;
  75. X        }
  76. X        /* last one */
  77. X        a1 = framedBox_curr->x;
  78. X        a2 = framedBox_curr->y;
  79. X        e1 = framedBox_curr->h;
  80. X        e2 = framedBox_curr->v;
  81. X        real2zoomed(&a1, &a2);
  82. X        real2zoomed(&e1, &e2);
  83. X        XDrawRectangle(disp, win, gc, (int) a1, (int) a2,
  84. X                   (unsigned int) ((int) (e1 - a1)),
  85. X                   (unsigned int) ((int) (e2 - a2)));
  86. X
  87. X        print_box_text(framedBox_curr->textpos,
  88. X                   a1, a2, e1, e2, framedBox_curr->text);
  89. X
  90. X    }    /* framed */
  91. X    /* dashed */
  92. X    if (dashedBox_start != NULL)
  93. X    {    /* min. 1 entry */
  94. X        XSetLineAttributes(disp, gc, 0, LineOnOffDash, CapButt, JoinMiter);
  95. X        dashedBox_marker = dashedBox_start;
  96. X        while (dashedBox_marker != dashedBox_curr)
  97. X        {
  98. X            a1 = dashedBox_marker->x;
  99. X            a2 = dashedBox_marker->y;
  100. X            e1 = dashedBox_marker->h;
  101. X            e2 = dashedBox_marker->v;
  102. X            real2zoomed(&a1, &a2);
  103. X            real2zoomed(&e1, &e2);
  104. X            XDrawRectangle(disp, win, gc, (int) a1, (int) a2,
  105. X                       (unsigned int) ((int) (e1 - a1)),
  106. X                       (unsigned int) ((int) (e2 - a2)));
  107. X
  108. X            print_box_text(dashedBox_marker->textpos,
  109. X                    a1, a2, e1, e2, dashedBox_marker->text);
  110. X
  111. X            dashedBox_marker = dashedBox_marker->next;
  112. X        }
  113. X        /* last one */
  114. X        a1 = dashedBox_curr->x;
  115. X        a2 = dashedBox_curr->y;
  116. X        e1 = dashedBox_curr->h;
  117. X        e2 = dashedBox_curr->v;
  118. X        real2zoomed(&a1, &a2);
  119. X        real2zoomed(&e1, &e2);
  120. X        XDrawRectangle(disp, win, gc, (int) a1, (int) a2,
  121. X                   (unsigned int) ((int) (e1 - a1)),
  122. X                   (unsigned int) ((int) (e2 - a2)));
  123. X
  124. X        print_box_text(dashedBox_curr->textpos,
  125. X                   a1, a2, e1, e2, dashedBox_curr->text);
  126. X
  127. X        XSetLineAttributes(disp, gc, 0, LineSolid, CapButt, JoinMiter);
  128. X
  129. X    }    /* dashed */
  130. X    /* filled */
  131. X    if (filledBox_start != NULL)
  132. X    {    /* min. 1 entry */
  133. X        filledBox_marker = filledBox_start;
  134. X        while (filledBox_marker != filledBox_curr)
  135. X        {
  136. X            a1 = filledBox_marker->x;
  137. X            a2 = filledBox_marker->y;
  138. X            e1 = filledBox_marker->h;
  139. X            e2 = filledBox_marker->v;
  140. X            real2zoomed(&a1, &a2);
  141. X            real2zoomed(&e1, &e2);
  142. X
  143. X            XFillRectangle(disp, win, gc, (int) a1, (int) a2,
  144. X            (unsigned int) (e1 - a1), (unsigned int) (e2 - a2));
  145. X
  146. X            filledBox_marker = filledBox_marker->next;
  147. X        }
  148. X        /* last one */
  149. X        a1 = filledBox_curr->x;
  150. X        a2 = filledBox_curr->y;
  151. X        e1 = filledBox_curr->h;
  152. X        e2 = filledBox_curr->v;
  153. X        real2zoomed(&a1, &a2);
  154. X        real2zoomed(&e1, &e2);
  155. X        XFillRectangle(disp, win, gc, (int) a1, (int) a2,
  156. X            (unsigned int) (e1 - a1), (unsigned int) (e2 - a2));
  157. X    }    /* filled */
  158. X    /* circle */
  159. X    /* normal */
  160. X    if (kreis_start != NULL)
  161. X    {    /* min. 1 entry */
  162. X        kreis_marker = kreis_start;
  163. X        while (kreis_marker != kreis_curr)
  164. X        {
  165. X            a1 = kreis_marker->x;
  166. X            a2 = kreis_marker->y;
  167. X            real2zoomed(&a1, &a2);
  168. X            r = (int) (10 * kreis_marker->radius);
  169. X            XDrawArc(disp, win, gc, (int) (a1) - r,
  170. X                 (int) (a2) - r,
  171. X                 (unsigned int) (r + r),
  172. X                 (unsigned int) (r + r),
  173. X                 0, 360 * 64);
  174. X            kreis_marker = kreis_marker->next;
  175. X        }
  176. X        /* last circle */
  177. X        a1 = kreis_curr->x;
  178. X        a2 = kreis_curr->y;
  179. X        real2zoomed(&a1, &a2);
  180. X        r = (int) (10 * kreis_curr->radius);
  181. X        XDrawArc(disp, win, gc, (int) (a1) - r,
  182. X             (int) (a2) - r,
  183. X             (unsigned int) (r + r),
  184. X             (unsigned int) (r + r),
  185. X             0, 360 * 64);
  186. X    }    /* normal circle */
  187. X    /* filled */
  188. X    if (disc_start != NULL)
  189. X    {    /* min. 1 entry */
  190. X        disc_marker = disc_start;
  191. X        while (disc_marker != disc_curr)
  192. X        {
  193. X            a1 = disc_marker->x;
  194. X            a2 = disc_marker->y;
  195. X            real2zoomed(&a1, &a2);
  196. X            r = (int) (10 * disc_marker->radius);
  197. X            XFillArc(disp, win, gc, (int) (a1) - r,
  198. X                 (int) (a2) - r,
  199. X                 (unsigned int) (r + r),
  200. X                 (unsigned int) (r + r),
  201. X                 0, 360 * 64);
  202. X            disc_marker = disc_marker->next;
  203. X        }
  204. X        /* last circle */
  205. X        a1 = disc_curr->x;
  206. X        a2 = disc_curr->y;
  207. X        real2zoomed(&a1, &a2);
  208. X        r = (int) (10 * disc_curr->radius);
  209. X        XFillArc(disp, win, gc, (int) (a1) - r,
  210. X             (int) (a2) - r,
  211. X             (unsigned int) (r + r),
  212. X             (unsigned int) (r + r),
  213. X             0, 360 * 64);
  214. X    }    /* filled circle */
  215. X    /* oval */
  216. X    if (oval_start != NULL)
  217. X    {    /* min. 1 entry */
  218. X        oval_marker = oval_start;
  219. X        while (oval_marker != oval_curr)
  220. X        {
  221. X            a1 = oval_marker->x;
  222. X            a2 = oval_marker->y;
  223. X            real2zoomed(&a1, &a2);
  224. X            e1 = oval_marker->h;
  225. X            e2 = oval_marker->v;
  226. X            real2zoomed(&e1, &e2);
  227. X            DrawOval((int) a1, (int) a2, (int) e1, (int) e2);
  228. X            oval_marker = oval_marker->next;
  229. X        }
  230. X        /* last circle */
  231. X        a1 = oval_curr->x;
  232. X        a2 = oval_curr->y;
  233. X        real2zoomed(&a1, &a2);
  234. X        e1 = oval_curr->h;
  235. X        e2 = oval_curr->v;
  236. X        real2zoomed(&e1, &e2);
  237. X        DrawOval((int) a1, (int) a2, (int) e1, (int) e2);
  238. X    }    /* oval circle */
  239. }/* proc */
  240. X
  241. X
  242. void
  243. DrawOval(int x, int y, int h, int v)
  244. {
  245. X    /* x,y refer to upper left corner of the rectangle */
  246. X
  247. X    Display        *disp = XtDisplay(pboard);
  248. X    Window          win = XtWindow(pboard);
  249. X    int             zoom;
  250. X    int             d1, d2;
  251. X    float           rad;
  252. X    d1 = h - x;
  253. X    d2 = v - y;
  254. X
  255. X    if (d1 < d2)
  256. X        rad = (float) d1 / (float) 2;
  257. X    else
  258. X        rad = (float) d2 / (float) 2;
  259. X
  260. X    if (zoomed == False)
  261. X    {
  262. X        zoom = 1;
  263. X        if (rad > 20.0)
  264. X            rad = 20.0;
  265. X    } else
  266. X    {
  267. X        zoom = 10;
  268. X        if (rad > 200.0)
  269. X            rad = 200.0;
  270. X    }
  271. X
  272. X
  273. X
  274. X    XDrawLine(disp, win, gc, x + (int) (rad), y, h - (int) (rad), y);
  275. X    XDrawLine(disp, win, gc, h, y + (int) (rad), h, v - (int) (rad));
  276. X    XDrawLine(disp, win, gc, h - (int) (rad), v, x + (int) (rad), v);
  277. X    XDrawLine(disp, win, gc, x, v - (int) (rad), x, y + (int) (rad));
  278. X
  279. X    XDrawArc(disp, win, gc, x, y, (int) (2 * rad), (int) (2 * rad), 90 * 64, 90 * 64);
  280. X    XDrawArc(disp, win, gc, h - (int) (2 * rad), y, (int) (2 * rad), (int) (2 * rad), 0, 90 * 64);
  281. X    XDrawArc(disp, win, gc, h - (int) (2 * rad), v - (int) (2 * rad), (int) (2 * rad), (int) (2 * rad), 0, -90 * 64);
  282. X    XDrawArc(disp, win, gc, x, v - (int) (2 * rad), (int) (2 * rad), (int) (2 * rad), 180 * 64, 90 * 64);
  283. X
  284. X
  285. }
  286. X
  287. X
  288. void
  289. print_text_text_marker(char *pos, float x, float y, char *txt)
  290. {
  291. X /* print the text and the marker of the text-input */
  292. X
  293. X    int xpos,ypos;
  294. X    int fnt_height=10;
  295. X    int fnt_width=8;
  296. X    Display *disp=XtDisplay(pboard);
  297. X    Window win=XtWindow(pboard);
  298. X    int lenn=strlen(txt)*fnt_width;
  299. X
  300. X
  301. X
  302. X
  303. X    switch(pos[0])
  304. X    {
  305. X    case 't':    if (pos[1]=='l') 
  306. X            {
  307. X                xpos=x;
  308. X                ypos=y+fnt_height;
  309. X            }
  310. X            else if (pos[1]=='r') 
  311. X            {
  312. X                xpos=x-lenn;
  313. X                ypos=y+fnt_height;
  314. X            }
  315. X            else
  316. X            {
  317. X                xpos=x-lenn/2;
  318. X                ypos=y+fnt_height;
  319. X            }
  320. X            draw_vector_marker(x,y-fnt_height,x,y);
  321. X            break;
  322. X
  323. X    case 'b':    if (pos[1]=='l') 
  324. X            {
  325. X                xpos=x;
  326. X                ypos=y;
  327. X            }
  328. X            else if (pos[1]=='r') 
  329. X            {
  330. X                xpos=x-lenn;
  331. X                ypos=y;
  332. X            }
  333. X            else
  334. X            {
  335. X                xpos=x-lenn/2;
  336. X                ypos=y;
  337. X            }
  338. X            draw_vector_marker(x,y+fnt_height,x,y);    
  339. X            break;
  340. X
  341. X    case 'l':    xpos=x;
  342. X            ypos=y+fnt_height/2;
  343. X            draw_vector_marker(x-fnt_width,y,x,y);
  344. X            break;
  345. X
  346. X    case 'r':    xpos=x-lenn;
  347. X            ypos=y+fnt_height/2;
  348. X            draw_vector_marker(x+fnt_width,y,x,y);
  349. X            break;
  350. X
  351. X    default:    xpos=x-lenn/2;
  352. X            ypos=y+fnt_height/2;
  353. X            draw_vector_marker(x,y+fnt_height,x,y);
  354. X            break;    
  355. X
  356. X    } /* switch */
  357. X
  358. X    XDrawString(disp,win,gc,xpos,ypos,txt,lenn/fnt_width);
  359. X                    
  360. }
  361. X
  362. void
  363. print_box_text(char *pos, float x, float y, float h, float v, char *txt)
  364. {
  365. X    /* displays the first letter of the box-text at */
  366. X    /* the corresponding position in the frame */
  367. X
  368. X    Display        *disp;
  369. X    Drawable        win;
  370. X    int             hor, ver,lenn;
  371. X    disp = XtDisplay(pboard);
  372. X    win = XtWindow(pboard);
  373. X
  374. X    switch (pos[0])
  375. X    {
  376. X    case 't':
  377. X        ver = (int) (y + 0.1 * (v - y));
  378. X        hor = (int) (x + 0.5 * (h - x));
  379. X        break;
  380. X
  381. X    case 'b':
  382. X        ver = (int) (v - 0.1 * (v - y));
  383. X        hor = (int) (x + 0.5 * (h - x));
  384. X        break;
  385. X
  386. X    case 'r':
  387. X        hor = (int) (h - 0.1 * (h - x));
  388. X        ver = (int) (v - 0.5 * (v - y));
  389. X        break;
  390. X
  391. X    case 'l':
  392. X        hor = (int) (x + 0.1 * (h - x));
  393. X        ver = (int) (v - 0.5 * (v - y));
  394. X        break;
  395. X
  396. X    case '\0':
  397. X        ver = (int) (y + (v - y) / 2);    /* center */
  398. X        hor = (int) (x + (h - x) / 2);
  399. X        break;
  400. X
  401. X    }    /* switch */
  402. X
  403. X
  404. X    switch (pos[1])
  405. X    {
  406. X    case 'r':
  407. X        hor = (int) (h - 0.1 * (h - x));
  408. X        break;
  409. X    case 'l':
  410. X        hor = (int) (x + 0.1 * (h - x));
  411. X        break;
  412. X    }    /* switch */
  413. X
  414. X
  415. X    if (zoomed==False) XDrawString(disp, win, gc, hor, ver, txt, 1);
  416. X        else
  417. X        {
  418. X            lenn=strlen(txt)*8; /* 8 Bit horizontal width */
  419. X            /* right adjustment ? */
  420. X            if ( (pos[0]=='r') || (pos[1]=='r') )
  421. X                XDrawString(disp, win, gc, hor-lenn, ver, txt, lenn/8);
  422. X            else 
  423. X                if ( (pos[0]=='l') || (pos[1]=='l') )
  424. X                 XDrawString(disp, win, gc, hor, ver, txt, lenn/8);
  425. X            else /* center text */
  426. X                XDrawString(disp, win, gc, hor-lenn/2, ver, txt, lenn/8);
  427. X
  428. X            /* show selection point */
  429. X            draw_vector_marker(hor,ver+20,hor,ver);
  430. X        }
  431. X            
  432. X            
  433. X
  434. }
  435. X
  436. X
  437. X
  438. X
  439. void
  440. init_prompt_text()
  441. {
  442. X    /* called once. builds the interface for text-queries */
  443. X
  444. X    Widget          container, txt, cancel, ok;
  445. X    XtTranslations  trans_table;
  446. X    char            temp_str[200] = "<KeyPress>Return: ok_text() \n\
  447. X            Ctrl<Key>J      : dummy() \n\
  448. X            Ctrl<Key>O      : dummy() \n\
  449. X            Ctrl<Key>M      : dummy()";
  450. X
  451. X    static XtActionsRec actions[150] = {{"dummy", dummy},
  452. X    {"ok_text", ok_text}};
  453. X
  454. X
  455. X
  456. X    
  457. X    input_up = XtCreatePopupShell("Text Input", transientShellWidgetClass, canvas, NULL,0);
  458. X
  459. X
  460. X    n=0;
  461. X    XtSetArg(args[n],XtNorientation,XtorientHorizontal);
  462. X    container = XtCreateManagedWidget("hi", boxWidgetClass, input_up, args, n);
  463. X
  464. X    n = 0;
  465. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  466. X    n++;
  467. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 520);
  468. X    n++;
  469. X    XtSetArg(args[n], XtNautoFill, False);
  470. X    n++;
  471. X    XtSetArg(args[n], XtNuseStringInPlace, True);
  472. X    n++;
  473. X    XtSetArg(args[n], XtNstring, textinput);
  474. X    n++;
  475. X    XtSetArg(args[n], XtNlength, XtNumber(textinput));
  476. X    n++;
  477. X    XtSetArg(args[n], XtNeditType, XawtextEdit);
  478. X    n++;
  479. X    XtSetArg(args[n], XtNresize, XawtextResizeWidth);
  480. X    n++;
  481. X    XtSetArg(args[n], XtNwrap, XawtextWrapWord);
  482. X    n++;
  483. X
  484. X    
  485. X
  486. X    txt = XtCreateManagedWidget("dialogue", asciiTextWidgetClass, container, args, n);
  487. X
  488. X    n = 0;
  489. X    XtSetArg(args[n], XtNheight, (XtArgVal) 30);
  490. X    n++;
  491. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 255);
  492. X    n++;
  493. X    XtSetArg(args[n], XtNlabel, "Cancel");
  494. X    n++;
  495. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  496. X    n++;
  497. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  498. X    n++;
  499. X
  500. X    
  501. X    cancel = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  502. X    XtAddCallback(cancel, XtNcallback, cancel_text, NULL);
  503. X
  504. X    n = 0;
  505. X    XtSetArg(args[n], XtNheight, (XtArgVal) 30);
  506. X    n++;
  507. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 255);
  508. X    n++;
  509. X    XtSetArg(args[n], XtNlabel, "Accept");
  510. X    n++;
  511. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  512. X    n++;
  513. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  514. X    n++;
  515. X
  516. X    
  517. X
  518. X    ok = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  519. X    XtAddCallback(ok, XtNcallback, ok_text, NULL);
  520. X
  521. X    XtAddActions(actions, XtNumber(actions));
  522. X    trans_table = XtParseTranslationTable(temp_str);
  523. X    XtOverrideTranslations(txt, trans_table);
  524. X
  525. }
  526. X
  527. void
  528. cancel_text()
  529. {
  530. X    transform(textinput);
  531. X    XtPopdown(input_up);
  532. }
  533. X
  534. void
  535. ok_text()
  536. {
  537. X    float           x, y;
  538. X    Display        *disp;
  539. X    Drawable        win;
  540. X    int        lenn=81;
  541. X
  542. X
  543. X    transform(textinput);
  544. X
  545. X    if (strlen(textinput) == 0)
  546. X    {    /* the input was zero-string */
  547. X        cancel_text();
  548. X        return;
  549. X    }
  550. X    disp = XtDisplay(pboard);
  551. X    win = XtWindow(pboard);
  552. X
  553. X    XtPopdown(input_up);
  554. X    /* insert text into list */
  555. X
  556. X    x = (float) n;
  557. X    y = (float) m;
  558. X    if (zoomed == True)
  559. X        zoomed2real(&x, &y);
  560. X    /* allocate memory */
  561. X    if (message_start == NULL)
  562. X    {    /* first entry */
  563. X        message_start = (struct fig5 *) malloc(sizeof(message));
  564. X        message_curr = message_start;
  565. X    } else
  566. X    {    /* insert at end */
  567. X        message_curr->next = (struct fig5 *) malloc(sizeof(message));
  568. X        message_curr = message_curr->next;
  569. X    }
  570. X    /* message_curr points to struct */
  571. X    /* save coordinates */
  572. X    message_curr->x = x;
  573. X    message_curr->y = y;
  574. X    /* save text-string */
  575. X    /* preserve a total string length of 80 Bytes */
  576. X    /* this is useful to edit the text */
  577. X    if (lenn<1+strlen(textinput)) lenn=1+strlen(textinput);
  578. X    message_curr->text = (char *) malloc(lenn);
  579. X    strcpy(message_curr->text, textinput);
  580. X    message_curr->next = NULL;
  581. X
  582. X    /* query the position */
  583. X
  584. X    /* initial values */
  585. X    txtpos[0] = '\0';
  586. X    txtpos[1] = '\0';
  587. X    query_text_adjustment();
  588. X
  589. X    if (txtpos[0] == '\0')    /* center */
  590. X    {
  591. X        txtpos[0] = 'c';
  592. X        txtpos[1] = 'c';
  593. X    }
  594. X    message_curr->textpos[0] = txtpos[0];
  595. X    message_curr->textpos[1] = txtpos[1];
  596. X
  597. X    /* refresh show the new object ! */
  598. }
  599. X
  600. X
  601. X
  602. void
  603. manage_text_input()
  604. {
  605. X    Position        x, y, x_rel, y_rel;
  606. X    int             h, v;
  607. X    unsigned int    mask;
  608. X
  609. X
  610. X    PointerPosition(&h, &v, &mask);
  611. X    /* button1 was pressed in pboard at x,y */
  612. X
  613. X    /* setting position of widget */
  614. X    n = 0;
  615. X    XtSetArg(args[n], XtNx, &x_rel);
  616. X    n++;
  617. X    XtSetArg(args[n], XtNy, &y_rel);
  618. X    n++;
  619. X    XtGetValues(canvas, args, n);    /* get the relative coordinates of
  620. X                     * widget: canvas */
  621. X    XtTranslateCoords(canvas, x_rel, y_rel, &x, &y);
  622. X    n = 0;
  623. X    XtSetArg(args[n], XtNx, x + cmd_btn_width + 2 * new_section);
  624. X    n++;
  625. X    XtSetArg(args[n], XtNy, y + 4 * cmd_btn_height);
  626. X    n++;
  627. X    XtSetValues(input_up, args, n);
  628. X    /* position set ! */
  629. X
  630. X    XtPopupSpringLoaded(input_up);
  631. X    n = h;
  632. X    m = v;
  633. X
  634. X
  635. }
  636. X
  637. X
  638. X
  639. void
  640. init_text_and_position()
  641. {
  642. X    /* called once. used to buid the interface for text-queries and */
  643. X    /* text-positions. used with dashed and framed boxes */
  644. X
  645. X    Widget          container, txt1, cancel, center, tl, tr, bl, br, b,
  646. X                    t, quit, lbl, r, l;
  647. X    XtTranslations  trans_table;
  648. X    char            temp_str[200] = "<KeyPress>Return: dummy() \n\
  649. X            Ctrl<Key>J      : dummy() \n\
  650. X            Ctrl<Key>O      : dummy() \n\
  651. X            Ctrl<Key>M      : dummy()";
  652. X
  653. X
  654. X    static XtActionsRec actions[150] = {{"dummy", dummy}};
  655. X
  656. X
  657. X
  658. X    
  659. X
  660. X    box_me_up = XtCreatePopupShell("Text Input", transientShellWidgetClass, canvas, NULL,0);
  661. X
  662. X
  663. X    container = XtCreateManagedWidget("hi", boxWidgetClass, box_me_up, NULL, 0);
  664. X
  665. X    n = 0;
  666. X    XtSetArg(args[n], XtNheight, (XtArgVal) 40);
  667. X    n++;
  668. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  669. X    n++;
  670. X    XtSetArg(args[n], XtNlabel, "Text Placement");
  671. X    n++;
  672. X    
  673. X    lbl = XtCreateManagedWidget("hi", labelWidgetClass, container, args, n);
  674. X
  675. X    n = 0;
  676. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  677. X    n++;
  678. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  679. X    n++;
  680. X    XtSetArg(args[n], XtNautoFill, False);
  681. X    n++;
  682. X    XtSetArg(args[n], XtNuseStringInPlace, True);
  683. X    n++;
  684. X    XtSetArg(args[n], XtNstring, boxinput);
  685. X    n++;
  686. X    XtSetArg(args[n], XtNlength, XtNumber(boxinput));
  687. X    n++;
  688. X    XtSetArg(args[n], XtNeditType, XawtextEdit);
  689. X    n++;
  690. X    XtSetArg(args[n], XtNresize, XawtextResizeWidth);
  691. X    n++;
  692. X    XtSetArg(args[n], XtNwrap, XawtextWrapWord);
  693. X    n++;
  694. X    
  695. X    txt1 = XtCreateManagedWidget("dialogue", asciiTextWidgetClass, container, args, n);
  696. X
  697. X    n = 0;
  698. X    XtSetArg(args[n], XtNlabel, "Position: CENTER");
  699. X    n++;
  700. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  701. X    n++;
  702. X    XtSetArg(args[n], XtNjustify, XtJustifyLeft);
  703. X    n++;
  704. X    
  705. X    txt2 = XtCreateManagedWidget("< position of text >", labelWidgetClass, container, args, n);
  706. X
  707. X
  708. X    n = 0;
  709. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  710. X    n++;
  711. X    XtSetArg(args[n], XtNlabel, "Style: NO SHADOW");
  712. X    n++;
  713. X    XtSetArg(args[n], XtNjustify, XtJustifyLeft);
  714. X    n++;
  715. X    
  716. X    txt3 = XtCreateManagedWidget("shadow", labelWidgetClass, container, args, n);
  717. X
  718. X    n = 0;
  719. X    XtSetArg(args[n], XtNbackground, XtDefaultForeground);
  720. X    n++;
  721. X    XtSetArg(args[n], XtNforeground, XtDefaultBackground);
  722. X    n++;
  723. X    XtSetArg(args[n], XtNheight, (XtArgVal) 7);
  724. X    n++;
  725. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  726. X    n++;
  727. X    
  728. X    XtCreateManagedWidget("", labelWidgetClass, container, args, n);
  729. X
  730. X
  731. X
  732. X    n = 0;
  733. X    XtSetArg(args[n], XtNheight, (XtArgVal) 25);
  734. X    n++;
  735. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  736. X    n++;
  737. X    XtSetArg(args[n], XtNlabel, "Center Top and Bottom");
  738. X    n++;
  739. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  740. X    n++;
  741. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  742. X    n++;
  743. X    
  744. X    center = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  745. X    XtAddCallback(center, XtNcallback, box_text, km);
  746. X
  747. X    n = 0;
  748. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  749. X    n++;
  750. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  751. X    n++;
  752. X    XtSetArg(args[n], XtNlabel, "Top Left");
  753. X    n++;
  754. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  755. X    n++;
  756. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  757. X    n++;
  758. X    
  759. X    tl = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  760. X    XtAddCallback(tl, XtNcallback, box_text, ka);
  761. X
  762. X    n = 0;
  763. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  764. X    n++;
  765. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 55);
  766. X    n++;
  767. X    XtSetArg(args[n], XtNlabel, "Top");
  768. X    n++;
  769. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  770. X    n++;
  771. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  772. X    n++;
  773. X    
  774. X    t = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  775. X    XtAddCallback(t, XtNcallback, box_text, ke);
  776. X
  777. X    n = 0;
  778. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  779. X    n++;
  780. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  781. X    n++;
  782. X    XtSetArg(args[n], XtNlabel, "Top Right");
  783. X    n++;
  784. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  785. X    n++;
  786. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  787. X    n++;
  788. X    
  789. X    tr = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  790. X    XtAddCallback(tr, XtNcallback, box_text, kb);
  791. X
  792. X    n = 0;
  793. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  794. X    n++;
  795. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  796. X    n++;
  797. X    XtSetArg(args[n], XtNlabel, "Left");
  798. X    n++;
  799. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  800. X    n++;
  801. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  802. X    n++;
  803. X    
  804. X    l = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  805. X    XtAddCallback(l, XtNcallback, box_text, kl);
  806. X
  807. X    n = 0;
  808. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  809. X    n++;
  810. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  811. X    n++;
  812. X    XtSetArg(args[n], XtNlabel, "Right");
  813. X    n++;
  814. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  815. X    n++;
  816. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  817. X    n++;
  818. X    
  819. X    r = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  820. X    XtAddCallback(r, XtNcallback, box_text, kr);
  821. X
  822. X    n = 0;
  823. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  824. X    n++;
  825. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  826. X    n++;
  827. X    XtSetArg(args[n], XtNlabel, "Bottom Left");
  828. X    n++;
  829. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  830. X    n++;
  831. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  832. X    n++;
  833. X    
  834. X    bl = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  835. X    XtAddCallback(bl, XtNcallback, box_text, kc);
  836. X
  837. X    n = 0;
  838. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  839. X    n++;
  840. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 55);
  841. X    n++;
  842. X    XtSetArg(args[n], XtNlabel, "Bottom");
  843. X    n++;
  844. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  845. X    n++;
  846. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  847. X    n++;
  848. X    
  849. X    b = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  850. X    XtAddCallback(b, XtNcallback, box_text, kf);
  851. X
  852. X    n = 0;
  853. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  854. X    n++;
  855. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  856. X    n++;
  857. X    XtSetArg(args[n], XtNlabel, "Bottom Right");
  858. X    n++;
  859. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  860. X    n++;
  861. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  862. X    n++;
  863. X    
  864. X    br = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  865. X    XtAddCallback(br, XtNcallback, box_text, kd);
  866. X
  867. X    n = 0;
  868. X    XtSetArg(args[n], XtNbackground, XtDefaultForeground);
  869. X    n++;
  870. X    XtSetArg(args[n], XtNforeground, XtDefaultBackground);
  871. X    n++;
  872. X    XtSetArg(args[n], XtNheight, (XtArgVal) 7);
  873. X    n++;
  874. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  875. X    n++;
  876. X    XtCreateManagedWidget("", labelWidgetClass, container, args, n);
  877. X
  878. X
  879. X    n = 0;
  880. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  881. X    n++;
  882. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 120);
  883. X    n++;
  884. X    XtSetArg(args[n], XtNlabel, "Filled shadow");
  885. X    n++;
  886. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  887. X    n++;
  888. X    
  889. X    XtAddCallback(XtCreateManagedWidget("hi", commandWidgetClass, container, args, n)
  890. X              ,XtNcallback, box_text, ff);
  891. X
  892. X    n = 0;
  893. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  894. X    n++;
  895. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 120);
  896. X    n++;
  897. X    XtSetArg(args[n], XtNlabel, "Framed shadow");
  898. X    n++;
  899. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  900. X    n++;
  901. X    
  902. X    XtAddCallback(XtCreateManagedWidget("hi", commandWidgetClass, container, args, n)
  903. X              ,XtNcallback, box_text, nn);
  904. X
  905. X    n = 0;
  906. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  907. X    n++;
  908. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  909. X    n++;
  910. X    XtSetArg(args[n], XtNlabel, "No shadow");
  911. X    n++;
  912. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  913. X    n++;
  914. X    
  915. X    XtAddCallback(XtCreateManagedWidget("hi", commandWidgetClass, container, args, n)
  916. X              ,XtNcallback, box_text, minus);
  917. X
  918. X
  919. X    n = 0;
  920. X    XtSetArg(args[n], XtNbackground, XtDefaultForeground);
  921. X    n++;
  922. X    XtSetArg(args[n], XtNforeground, XtDefaultBackground);
  923. X    n++;
  924. X    XtSetArg(args[n], XtNheight, (XtArgVal) 7);
  925. X    n++;
  926. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  927. X    n++;
  928. X    XtCreateManagedWidget("", labelWidgetClass, container, args, n);
  929. X
  930. X    n = 0;
  931. X    XtSetArg(args[n], XtNheight, (XtArgVal) 45);
  932. X    n++;
  933. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  934. X    n++;
  935. X    XtSetArg(args[n], XtNlabel, "Accept");
  936. X    n++;
  937. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  938. X    n++;
  939. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  940. X    n++;
  941. X    
  942. X    quit = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  943. X    XtAddCallback(quit, XtNcallback, box_text, kp);
  944. X
  945. X    n = 0;
  946. X    XtSetArg(args[n], XtNheight, (XtArgVal) 45);
  947. X    n++;
  948. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  949. X    n++;
  950. X    XtSetArg(args[n], XtNlabel, "Cancel");
  951. X    n++;
  952. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  953. X    n++;
  954. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  955. X    n++;
  956. X    
  957. X    cancel = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  958. X    XtAddCallback(cancel, XtNcallback, box_text, kq);
  959. X
  960. X    XtAddActions(actions, XtNumber(actions));
  961. X    trans_table = XtParseTranslationTable(temp_str);
  962. X    XtOverrideTranslations(txt1, trans_table);
  963. X    txtpos[0] = '\0';    /* default: center */
  964. X
  965. X
  966. }
  967. X
  968. X
  969. void
  970. box_text(Widget cmd, char id, caddr_t call_data)
  971. {
  972. X    /* store the text-position */
  973. X
  974. X    static char     s1[100], s2[100];
  975. X    strcpy(s1, "Position : ");
  976. X    strcpy(s2, "Style: ");
  977. X
  978. X
  979. X    switch (id)
  980. X    {
  981. X    case 'q':
  982. X        txtpos[0] = '?';
  983. X        XtPopdown(box_me_up);    /* cancel */
  984. X        visible = False;
  985. X        break;    /* cancel */
  986. X    case 'm':
  987. X        strcat(s1, "CENTER text");
  988. X        txtpos[0] = '\0';
  989. X        break;
  990. X    case 'a':
  991. X        strcat(s1, "TOP LEFT Placement");
  992. X        strcpy(txtpos, "tl");
  993. X        break;
  994. X    case 'b':
  995. X        strcat(s1, "TOP RIGHT Placement");
  996. X        strcpy(txtpos, "tr");
  997. X        break;
  998. X    case 'c':
  999. X        strcat(s1, "BOTTOM LEFT Placement");
  1000. X        strcpy(txtpos, "bl");
  1001. X        break;
  1002. X    case 'd':
  1003. X        strcat(s1, "BOTTOM RIGHT Placement");
  1004. X        strcpy(txtpos, "br");
  1005. X        break;
  1006. X    case 'e':
  1007. X        strcat(s1, "TOP Placement");
  1008. X        strcpy(txtpos, "t");
  1009. X        break;
  1010. X    case 'f':
  1011. X        strcat(s1, "BOTTOM Placement");
  1012. X        strcpy(txtpos, "b");
  1013. X        break;
  1014. X    case 'l':
  1015. X        strcat(s1, "LEFT Placement");
  1016. X        strcpy(txtpos, "l");
  1017. X        break;
  1018. X    case 'r':
  1019. X        strcat(s1, "RIGHT Placement");
  1020. X        strcpy(txtpos, "r");
  1021. X        break;
  1022. X    case 'p':
  1023. X        XtPopdown(box_me_up);
  1024. X        visible = False;
  1025. X        transform(boxinput);    /* remove special chars */
  1026. X        break;
  1027. X    default:
  1028. X        shadow = id;
  1029. X        if (shadow == '-')
  1030. X            strcat(s2, "NO SHADOW");
  1031. X        else if (shadow == 'N')
  1032. X            strcat(s2, "FRAMED SHADOW");
  1033. X        else
  1034. X            strcat(s2, "FILLED SHADOW");
  1035. X        break;
  1036. X    }    /* end of switch */
  1037. X
  1038. X    if ((id != 'q') && (id != 'p'))
  1039. X    {
  1040. X        if ((id != '-') && (id != 'N') && (id != 'F'))
  1041. X        {
  1042. X            XtSetArg(args[0], XtNlabel, s1);
  1043. X            XtSetValues(txt2, args, 1);
  1044. X        } else
  1045. X        {
  1046. X            XtSetArg(args[0], XtNlabel, s2);
  1047. X            XtSetValues(txt3, args, 1);
  1048. X        }
  1049. X    }
  1050. }
  1051. X
  1052. void
  1053. query_box_text_and_position()
  1054. {
  1055. X    /* called to enter the text and textposition */
  1056. X
  1057. X    Position        x, y, x_rel, y_rel;
  1058. X    int             h, v;
  1059. X    XtAppContext    app_context;    /* Applikationscontext */
  1060. X    XEvent          event;    /* Event */
  1061. X    unsigned int    mask;
  1062. X
  1063. X
  1064. X    PointerPosition(&h, &v, &mask);
  1065. X    /* setting position of widget */
  1066. X    n = 0;
  1067. X    XtSetArg(args[n], XtNx, &x_rel);
  1068. X    n++;
  1069. X    XtSetArg(args[n], XtNy, &y_rel);
  1070. X    n++;
  1071. X    XtGetValues(canvas, args, n);    /* get the relative coordinates of
  1072. X                     * widget: canvas */
  1073. X    XtTranslateCoords(canvas, x_rel, y_rel, &x, &y);
  1074. X    n = 0;
  1075. X    XtSetArg(args[n], XtNx, x + cmd_btn_width + 2 * new_section);
  1076. X    n++;
  1077. X    XtSetArg(args[n], XtNy, y + 4 * cmd_btn_height);
  1078. X    n++;
  1079. X    XtSetValues(box_me_up, args, n);
  1080. X    /* position set ! */
  1081. X
  1082. X
  1083. X    n = 0;
  1084. X    XtSetArg(args[n], XtNlabel, "Position : CENTER text");
  1085. X    n++;
  1086. X    XtSetValues(txt2, args, n);
  1087. X
  1088. X    txtpos[0] = '\0';
  1089. X
  1090. X    XtPopupSpringLoaded(box_me_up);
  1091. X
  1092. X
  1093. X    app_context = XtWidgetToApplicationContext(box_me_up);
  1094. X
  1095. X    visible = True;
  1096. X
  1097. X    while (visible)
  1098. X    {
  1099. X        XtAppNextEvent(app_context, &event);
  1100. X        XtDispatchEvent(&event);
  1101. X
  1102. X    }
  1103. X
  1104. X    transform(boxinput);
  1105. X
  1106. X
  1107. }
  1108. X
  1109. X
  1110. X
  1111. void
  1112. perform_erase()
  1113. {
  1114. X    /* erases all */
  1115. X
  1116. X    xur = 0.0;
  1117. X    yur = 0.0;
  1118. X
  1119. X
  1120. X    /* normal circle */
  1121. X    if (kreis_start != NULL)
  1122. X    {
  1123. X        do
  1124. X        {
  1125. X            kreis_marker = kreis_start;
  1126. X            kreis_start = kreis_marker->next;
  1127. X            free(kreis_marker);
  1128. X        } while (kreis_marker != kreis_curr);
  1129. X
  1130. X        kreis_start = NULL;
  1131. X        kreis_curr = NULL;
  1132. X    }
  1133. X    /* filled circle */
  1134. X    if (disc_start != NULL)
  1135. X    {
  1136. X        do
  1137. X        {
  1138. X            disc_marker = disc_start;
  1139. X            disc_start = disc_marker->next;
  1140. X            free(disc_marker);
  1141. X        } while (disc_marker != disc_curr);
  1142. X
  1143. X        disc_start = NULL;
  1144. X        disc_curr = NULL;
  1145. X    }
  1146. X    /* oval */
  1147. X    if (oval_start != NULL)
  1148. X    {
  1149. X        do
  1150. X        {
  1151. X            oval_marker = oval_start;
  1152. X            oval_start = oval_marker->next;
  1153. X            free(oval_marker);
  1154. X        } while (oval_marker != oval_curr);
  1155. X
  1156. X        oval_start = NULL;
  1157. X        oval_curr = NULL;
  1158. X    }
  1159. X    /* framedBox */
  1160. X    if (framedBox_start != NULL)
  1161. X    {
  1162. X        do
  1163. X        {
  1164. X            framedBox_marker = framedBox_start;
  1165. X            framedBox_start = framedBox_marker->next;
  1166. X            free(framedBox_marker);
  1167. X        } while (framedBox_marker != framedBox_curr);
  1168. X
  1169. X        framedBox_start = NULL;
  1170. X        framedBox_curr = NULL;
  1171. X    }
  1172. X    /* dashedBox */
  1173. X    if (dashedBox_start != NULL)
  1174. X    {
  1175. X        do
  1176. X        {
  1177. X            dashedBox_marker = dashedBox_start;
  1178. X            dashedBox_start = dashedBox_marker->next;
  1179. X            free(dashedBox_marker);
  1180. X        } while (dashedBox_marker != dashedBox_curr);
  1181. X
  1182. X        dashedBox_start = NULL;
  1183. X        dashedBox_curr = NULL;
  1184. X    }
  1185. X    /* filledBox */
  1186. X    if (filledBox_start != NULL)
  1187. X    {
  1188. X        do
  1189. X        {
  1190. X            filledBox_marker = filledBox_start;
  1191. X            filledBox_start = filledBox_marker->next;
  1192. X            free(filledBox_marker);
  1193. X        } while (filledBox_marker != filledBox_curr);
  1194. X
  1195. X        filledBox_start = NULL;
  1196. X        filledBox_curr = NULL;
  1197. X    }
  1198. X    /* line */
  1199. X    if (strich_start != NULL)
  1200. X    {
  1201. X        do
  1202. X        {
  1203. X            strich_marker = strich_start;
  1204. X            strich_start = strich_marker->next;
  1205. X            free(strich_marker);
  1206. X        } while (strich_marker != strich_curr);
  1207. X
  1208. X        strich_start = NULL;
  1209. X        strich_curr = NULL;
  1210. X    }
  1211. X    /* vector */
  1212. X    if (pfeil_start != NULL)
  1213. X    {
  1214. X        do
  1215. X        {
  1216. X            pfeil_marker = pfeil_start;
  1217. X            pfeil_start = pfeil_marker->next;
  1218. X            free(pfeil_marker);
  1219. X        } while (pfeil_marker != pfeil_curr);
  1220. X
  1221. X        pfeil_start = NULL;
  1222. X        pfeil_curr = NULL;
  1223. X    }
  1224. X    /* text */
  1225. X    if (message_start != NULL)
  1226. X    {
  1227. X        do
  1228. X        {
  1229. X            message_marker = message_start;
  1230. X            message_start = message_marker->next;
  1231. X            free(message_marker);
  1232. X        } while (message_marker != message_curr);
  1233. X
  1234. X        message_start = NULL;
  1235. X        message_curr = NULL;
  1236. X    }
  1237. X    /* bezier */
  1238. X    if (bezier_start != NULL)
  1239. X    {
  1240. X        do
  1241. X        {
  1242. X            bezier_marker = bezier_start;
  1243. X            bezier_start = bezier_marker->next;
  1244. X            free(bezier_marker);
  1245. X        } while (bezier_marker != bezier_curr);
  1246. X
  1247. X        bezier_start = NULL;
  1248. X        bezier_curr = NULL;
  1249. X    }
  1250. }
  1251. X
  1252. X
  1253. X
  1254. void
  1255. init_ask_erase()
  1256. {
  1257. X    /* initializes the 'are you sure ?' - widget */
  1258. X
  1259. X    Widget          container, c1, c2, lbl;
  1260. X    
  1261. X    
  1262. X    
  1263. X    
  1264. X    ask_up = XtCreatePopupShell("P A X", transientShellWidgetClass, canvas, NULL,0);
  1265. X
  1266. X
  1267. X    container = XtCreateManagedWidget("hi", boxWidgetClass, ask_up, NULL, 0);
  1268. X
  1269. X    n = 0;
  1270. X    XtSetArg(args[n], XtNheight, (XtArgVal) 40);
  1271. X    n++;
  1272. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 160);
  1273. X    n++;
  1274. X    XtSetArg(args[n], XtNlabel, "ARE YOU SURE ?");
  1275. X    n++;
  1276. X    
  1277. X    lbl = XtCreateManagedWidget("hi", labelWidgetClass, container, args, n);
  1278. X
  1279. X
  1280. X    n = 0;
  1281. X    XtSetArg(args[n], XtNheight, (XtArgVal) 25);
  1282. X    n++;
  1283. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 75);
  1284. X    n++;
  1285. X    XtSetArg(args[n], XtNlabel, "Accept");
  1286. X    n++;
  1287. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1288. X    n++;
  1289. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1290. X    n++;
  1291. X    
  1292. X    c1 = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1293. X    XtAddCallback(c1, XtNcallback, answer, kj);
  1294. X
  1295. X    n = 0;
  1296. X    XtSetArg(args[n], XtNheight, (XtArgVal) 25);
  1297. X    n++;
  1298. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 75);
  1299. X    n++;
  1300. X    XtSetArg(args[n], XtNlabel, "Cancel");
  1301. X    n++;
  1302. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1303. X    n++;
  1304. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1305. X    n++;
  1306. X    
  1307. X    c2 = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1308. X    XtAddCallback(c2, XtNcallback, answer, kn);
  1309. }
  1310. X
  1311. X
  1312. void
  1313. query_ask_erase()
  1314. {
  1315. X    int             h, v;
  1316. X    unsigned int    mask;
  1317. X    Position        x_rel, y_rel, x, y, xx, yy;
  1318. X    XtAppContext    app_context;    /* Applikationcontext */
  1319. X    XEvent          event;    /* Event */
  1320. X
  1321. X
  1322. X
  1323. X    txtpos[0] = '\0';
  1324. X
  1325. X    /* is there anything in the database ? */
  1326. X
  1327. X    if (
  1328. X        (message_start == NULL) && (strich_start == NULL) && 
  1329. X        (pfeil_start == NULL) && (framedBox_start == NULL) && 
  1330. X        (dashedBox_start == NULL) && (filledBox_start == NULL)
  1331. X        && (kreis_start == NULL) && (disc_start == NULL) && 
  1332. X        (oval_start == NULL) && (bezier_start == NULL)
  1333. X       )
  1334. X    {
  1335. X        /* database empty */
  1336. X        n = 0;
  1337. X        XtSetArg(args[n], XtNx, &x_rel);
  1338. X        n++;
  1339. X        XtSetArg(args[n], XtNy, &y_rel);
  1340. X        n++;
  1341. X        XtGetValues(pboard, args, n);
  1342. X        XtTranslateCoords(canvas, x_rel, y_rel, &xx, &yy);
  1343. X        n = 0;
  1344. X        XtSetArg(args[n], XtNx, 175 + xx);
  1345. X        n++;
  1346. X        XtSetArg(args[n], XtNy, 295 + yy);
  1347. X        n++;
  1348. X        XtSetValues(sign_up, args, n);
  1349. X        XtPopup(sign_up, XtGrabExclusive);
  1350. X        return;
  1351. X    }
  1352. X    PointerPosition(&h, &v, &mask);
  1353. X    /* setting position of widget */
  1354. X    n = 0;
  1355. X    XtSetArg(args[n], XtNx, &x_rel);
  1356. X    n++;
  1357. X    XtSetArg(args[n], XtNy, &y_rel);
  1358. X    n++;
  1359. X    XtGetValues(canvas, args, n);
  1360. X    XtTranslateCoords(canvas, x_rel, y_rel, &x, &y);
  1361. X    n = 0;
  1362. X    XtSetArg(args[n], XtNx, x + cmd_btn_width + 2 * new_section);
  1363. X    n++;
  1364. X    XtSetArg(args[n], XtNy, v);
  1365. X    n++;
  1366. X    XtSetValues(ask_up, args, n);
  1367. X    /* position set ! */
  1368. X
  1369. X
  1370. X    XtPopup(ask_up, XtGrabExclusive);
  1371. X
  1372. X
  1373. X    app_context = XtWidgetToApplicationContext(ask_up);
  1374. X
  1375. X    visible = True;
  1376. X
  1377. X    while (visible)
  1378. X    {
  1379. X        XtAppNextEvent(app_context, &event);
  1380. X        XtDispatchEvent(&event);
  1381. X
  1382. X    }
  1383. X
  1384. X
  1385. X
  1386. X
  1387. }
  1388. X
  1389. X
  1390. X
  1391. X
  1392. void
  1393. draw_the_shadow(void *object, char id)
  1394. {
  1395. X    /* shadows are drawn by the <refresh>-function */
  1396. X    struct fig2    *shade;
  1397. X    struct fig3    *frame;
  1398. X    struct fig4    *dash;
  1399. X    float           x, y, h, v;
  1400. X    float           ver, hor;
  1401. X    int        ext; /* width/height of shadow */
  1402. X    if (shadow == '-')
  1403. X        return;    /* no shadow */
  1404. X
  1405. X    if (id == 'N')
  1406. X    {
  1407. X        frame = (struct fig3 *) object;
  1408. X        x = frame->x;
  1409. X        y = frame->y;
  1410. X        h = frame->h;
  1411. X        v = frame->v;
  1412. X    } else
  1413. X    {
  1414. X        dash = (struct fig4 *) object;
  1415. X        x = dash->x;
  1416. X        y = dash->y;
  1417. X        h = dash->h;
  1418. X        v = dash->v;
  1419. X    }
  1420. X
  1421. X    norm_rectangle(&x, &y, &h, &v);
  1422. X    
  1423. X    hor=0.1*(h-x); /* h is always bigger than x; see norm_rectangle ! */
  1424. X    ver=0.1*(v-y); 
  1425. X    
  1426. X    ext=(hor<ver) ? hor : ver;
  1427. X    ext=(ext<10) ? ext : 10;
  1428. X    
  1429. X    hor=ext;
  1430. X    ver=ext;
  1431. X    
  1432. X    if (shadow == 'N')
  1433. X    {
  1434. X        /* get new memory for lines */
  1435. X        shade = (struct fig2 *) malloc(sizeof(strich));
  1436. X        shade->x = x + hor;
  1437. X        shade->y = v;
  1438. X        shade->h = x + hor;
  1439. X        shade->v = v + ver;
  1440. X        if (strich_curr != NULL)
  1441. X            strich_curr->next = shade;
  1442. X        shade->next = NULL;
  1443. X        strich_curr = shade;
  1444. X        if (strich_start == NULL)
  1445. X            strich_start = shade;
  1446. X        /* that was the first one */
  1447. X        shade = (struct fig2 *) malloc(sizeof(strich));
  1448. X        shade->x = x + hor;
  1449. X        shade->y = v + ver;
  1450. X        shade->h = h + hor;
  1451. X        shade->v = v + ver;
  1452. X        if (strich_curr != NULL)
  1453. X            strich_curr->next = shade;
  1454. X        shade->next = NULL;
  1455. X        strich_curr = shade;
  1456. X        /* now comes the 3rd one */
  1457. X        shade = (struct fig2 *) malloc(sizeof(strich));
  1458. X        shade->x = h + hor;
  1459. X        shade->y = v + ver;
  1460. X        shade->h = h + hor;
  1461. X        shade->v = y + ver;
  1462. X        if (strich_curr != NULL)
  1463. X            strich_curr->next = shade;
  1464. X        shade->next = NULL;
  1465. X        strich_curr = shade;
  1466. X        /* and finally... */
  1467. X        shade = (struct fig2 *) malloc(sizeof(strich));
  1468. X        shade->x = h + hor;
  1469. X        shade->y = y + ver;
  1470. X        shade->h = h;
  1471. X        shade->v = y + ver;
  1472. X        if (strich_curr != NULL)
  1473. X            strich_curr->next = shade;
  1474. X        shade->next = NULL;
  1475. X        strich_curr = shade;
  1476. X    } else
  1477. X    {
  1478. X        /* first fbox */
  1479. X        shade = (struct fig2 *) malloc(sizeof(filledBox));
  1480. X        shade->x = x + hor;
  1481. X        shade->y = v;
  1482. X        shade->h = h + hor;
  1483. X        shade->v = v + hor;
  1484. X        if (filledBox_curr != NULL)
  1485. X            filledBox_curr->next = shade;
  1486. X        shade->next = NULL;
  1487. X        filledBox_curr = shade;
  1488. X        if (filledBox_start == NULL)
  1489. X            filledBox_start = shade;
  1490. X        /* 2nd fbox */
  1491. X        shade = (struct fig2 *) malloc(sizeof(filledBox));
  1492. X        shade->x = h;
  1493. X        shade->y = y + hor;
  1494. X        shade->h = h + hor;
  1495. X        shade->v = v;
  1496. X        if (filledBox_curr != NULL)
  1497. X            filledBox_curr->next = shade;
  1498. X        shade->next = NULL;
  1499. X        filledBox_curr = shade;
  1500. X    }
  1501. X
  1502. }
  1503. X
  1504. X
  1505. X
  1506. X
  1507. X
  1508. void
  1509. init_text_adjustment()
  1510. {
  1511. X
  1512. X    Widget          container, center, tl, t, tr, l, r, bl, b, br,
  1513. X                    quit;
  1514. X
  1515. X    
  1516. X    pop_adjust_up = XtCreatePopupShell("Text Adjustment", transientShellWidgetClass, canvas, NULL,0);
  1517. X
  1518. X
  1519. X    container = XtCreateManagedWidget("hi", boxWidgetClass, pop_adjust_up, NULL, 0);
  1520. X
  1521. X    n = 0;
  1522. X    XtSetArg(args[n], XtNheight, (XtArgVal) 40);
  1523. X    n++;
  1524. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1525. X    n++;
  1526. X    XtSetArg(args[n], XtNlabel, "Text Adjustment");
  1527. X    n++;
  1528. X    
  1529. X    XtCreateManagedWidget("hi", labelWidgetClass, container, args, n);
  1530. X
  1531. X
  1532. X    n = 0;
  1533. X    XtSetArg(args[n], XtNlabel, "Position: CENTER");
  1534. X    n++;
  1535. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1536. X    n++;
  1537. X    XtSetArg(args[n], XtNjustify, XtJustifyLeft);
  1538. X    n++;
  1539. X    
  1540. X    adj_txt2 = XtCreateManagedWidget("< position of text >", labelWidgetClass, container, args, n);
  1541. X
  1542. X
  1543. X
  1544. X    n = 0;
  1545. X    XtSetArg(args[n], XtNbackground, XtDefaultForeground);
  1546. X    n++;
  1547. X    XtSetArg(args[n], XtNforeground, XtDefaultBackground);
  1548. X    n++;
  1549. X    XtSetArg(args[n], XtNheight, (XtArgVal) 7);
  1550. X    n++;
  1551. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1552. X    n++;
  1553. X    XtCreateManagedWidget("", labelWidgetClass, container, args, n);
  1554. X
  1555. X
  1556. X
  1557. X    n = 0;
  1558. X    XtSetArg(args[n], XtNheight, (XtArgVal) 25);
  1559. X    n++;
  1560. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1561. X    n++;
  1562. X    XtSetArg(args[n], XtNlabel, "Center text");
  1563. X    n++;
  1564. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1565. X    n++;
  1566. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1567. X    n++;
  1568. X    
  1569. X    center = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1570. X    XtAddCallback(center, XtNcallback, adjust_text, kz);
  1571. X
  1572. X    n = 0;
  1573. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1574. X    n++;
  1575. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  1576. X    n++;
  1577. X    XtSetArg(args[n], XtNlabel, "Top Left");
  1578. X    n++;
  1579. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1580. X    n++;
  1581. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1582. X    n++;
  1583. X    
  1584. X    tl = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1585. X    XtAddCallback(tl, XtNcallback, adjust_text, ka);
  1586. X
  1587. X    n = 0;
  1588. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1589. X    n++;
  1590. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 55);
  1591. X    n++;
  1592. X    XtSetArg(args[n], XtNlabel, "Top");
  1593. X    n++;
  1594. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1595. X    n++;
  1596. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1597. X    n++;
  1598. X    
  1599. X    t = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1600. X    XtAddCallback(t, XtNcallback, adjust_text, ke);
  1601. X
  1602. X    n = 0;
  1603. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1604. X    n++;
  1605. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  1606. X    n++;
  1607. X    XtSetArg(args[n], XtNlabel, "Top Right");
  1608. X    n++;
  1609. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1610. X    n++;
  1611. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1612. X    n++;
  1613. X    
  1614. X    tr = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1615. X    XtAddCallback(tr, XtNcallback, adjust_text, kb);
  1616. X
  1617. X    n = 0;
  1618. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1619. X    n++;
  1620. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  1621. X    n++;
  1622. X    XtSetArg(args[n], XtNlabel, "Left");
  1623. X    n++;
  1624. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1625. X    n++;
  1626. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1627. X    n++;
  1628. X    
  1629. X    l = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1630. X    XtAddCallback(l, XtNcallback, adjust_text, kl);
  1631. X
  1632. X    n = 0;
  1633. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1634. X    n++;
  1635. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 125);
  1636. X    n++;
  1637. X    XtSetArg(args[n], XtNlabel, "Right");
  1638. X    n++;
  1639. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1640. X    n++;
  1641. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1642. X    n++;
  1643. X    
  1644. X    r = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1645. X    XtAddCallback(r, XtNcallback, adjust_text, kr);
  1646. X
  1647. X    n = 0;
  1648. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1649. X    n++;
  1650. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  1651. X    n++;
  1652. X    XtSetArg(args[n], XtNlabel, "Bottom Left");
  1653. X    n++;
  1654. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1655. X    n++;
  1656. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1657. X    n++;
  1658. X    
  1659. X    bl = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1660. X    XtAddCallback(bl, XtNcallback, adjust_text, kc);
  1661. X
  1662. X    n = 0;
  1663. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1664. X    n++;
  1665. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 55);
  1666. X    n++;
  1667. X    XtSetArg(args[n], XtNlabel, "Bottom");
  1668. X    n++;
  1669. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1670. X    n++;
  1671. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1672. X    n++;
  1673. X    
  1674. X    b = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1675. X    XtAddCallback(b, XtNcallback, adjust_text, kf);
  1676. X
  1677. X    n = 0;
  1678. X    XtSetArg(args[n], XtNheight, (XtArgVal) 20);
  1679. X    n++;
  1680. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 95);
  1681. X    n++;
  1682. X    XtSetArg(args[n], XtNlabel, "Bottom Right");
  1683. X    n++;
  1684. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1685. X    n++;
  1686. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1687. X    n++;
  1688. X    
  1689. X    br = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1690. X    XtAddCallback(br, XtNcallback, adjust_text, kd);
  1691. X
  1692. X    n = 0;
  1693. X    XtSetArg(args[n], XtNbackground, XtDefaultForeground);
  1694. X    n++;
  1695. X    XtSetArg(args[n], XtNforeground, XtDefaultBackground);
  1696. X    n++;
  1697. X    XtSetArg(args[n], XtNheight, (XtArgVal) 7);
  1698. X    n++;
  1699. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1700. X    n++;
  1701. X    XtCreateManagedWidget("", labelWidgetClass, container, args, n);
  1702. X
  1703. X
  1704. X    n = 0;
  1705. X    XtSetArg(args[n], XtNheight, (XtArgVal) 45);
  1706. X    n++;
  1707. X    XtSetArg(args[n], XtNwidth, (XtArgVal) 260);
  1708. X    n++;
  1709. X    XtSetArg(args[n], XtNlabel, "Accept");
  1710. X    n++;
  1711. X    XtSetArg(args[n], XtNjustify, XtJustifyCenter);
  1712. X    n++;
  1713. X    XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);
  1714. X    n++;
  1715. X    
  1716. X    quit = XtCreateManagedWidget("hi", commandWidgetClass, container, args, n);
  1717. X    XtAddCallback(quit, XtNcallback, adjust_text, kp);
  1718. X
  1719. X
  1720. X    txtpos[0] = '\0';    /* default: center */
  1721. X
  1722. X
  1723. }
  1724. X
  1725. X
  1726. X
  1727. X
  1728. X
  1729. void
  1730. adjust_text(Widget cmd, char id, caddr_t call_data)
  1731. {
  1732. X    /* store the text-position */
  1733. X
  1734. X    static char     s1[100];
  1735. X    strcpy(s1, "Position : ");
  1736. X
  1737. X
  1738. X
  1739. X    switch (id)
  1740. X    {
  1741. X
  1742. X    case 'z':
  1743. X        strcat(s1, "CENTER");
  1744. X        txtpos[0] = '\0';
  1745. X        break;
  1746. X    case 'a':
  1747. X        strcat(s1, "TOP LEFT");
  1748. X        strcpy(txtpos, "tl");
  1749. X        break;
  1750. X    case 'b':
  1751. X        strcat(s1, "TOP RIGHT");
  1752. X        strcpy(txtpos, "tr");
  1753. X        break;
  1754. X    case 'c':
  1755. X        strcat(s1, "BOTTOM LEFT");
  1756. X        strcpy(txtpos, "bl");
  1757. X        break;
  1758. X    case 'd':
  1759. X        strcat(s1, "BOTTOM RIGHT");
  1760. X        strcpy(txtpos, "br");
  1761. X        break;
  1762. X    case 'e':
  1763. X        strcat(s1, "TOP");
  1764. X        strcpy(txtpos, "t");
  1765. X        break;
  1766. X    case 'f':
  1767. X        strcat(s1, "BOTTOM");
  1768. X        strcpy(txtpos, "b");
  1769. X        break;
  1770. X    case 'l':
  1771. X        strcat(s1, "LEFT");
  1772. X        strcpy(txtpos, "l");
  1773. X        break;
  1774. X    case 'r':
  1775. X        strcat(s1, "RIGHT");
  1776. X        strcpy(txtpos, "r");
  1777. X        break;
  1778. X    case 'p':
  1779. X        XtPopdown(pop_adjust_up);
  1780. X        visible = False;
  1781. X        transform(textinput);    /* remove special chars */
  1782. X        break;
  1783. X    default:
  1784. X        break;
  1785. X    }    /* end of switch */
  1786. X
  1787. X    if ((id != 'q') && (id != 'p'))
  1788. X    {
  1789. X        XtSetArg(args[0], XtNlabel, s1);
  1790. X        XtSetValues(adj_txt2, args, 1);
  1791. X    }
  1792. }
  1793. X
  1794. X
  1795. X
  1796. X
  1797. X
  1798. void
  1799. query_text_adjustment()
  1800. {
  1801. X
  1802. X    Position        x, y, x_rel, y_rel;
  1803. X    int             h, v;
  1804. X    XtAppContext    app_context;    /* Applikationscontext */
  1805. X    XEvent          event;    /* Event */
  1806. X    unsigned int    mask;
  1807. X
  1808. X
  1809. X    PointerPosition(&h, &v, &mask);
  1810. X    /* setting position of widget */
  1811. X    n = 0;
  1812. X    XtSetArg(args[n], XtNx, &x_rel);
  1813. X    n++;
  1814. X    XtSetArg(args[n], XtNy, &y_rel);
  1815. X    n++;
  1816. X    XtGetValues(canvas, args, n);    /* get the relative coordinates of
  1817. X                     * widget: canvas */
  1818. X    XtTranslateCoords(canvas, x_rel, y_rel, &x, &y);
  1819. X    n = 0;
  1820. X    XtSetArg(args[n], XtNx, x + cmd_btn_width + 2 * new_section);
  1821. X    n++;
  1822. X    XtSetArg(args[n], XtNy, y + 4 * cmd_btn_height);
  1823. X    n++;
  1824. X    XtSetValues(pop_adjust_up, args, n);
  1825. X    /* position set ! */
  1826. X
  1827. X
  1828. X    n = 0;
  1829. X    XtSetArg(args[n], XtNlabel, "Position : CENTER");
  1830. X    n++;
  1831. X    XtSetValues(adj_txt2, args, n);
  1832. X
  1833. X    txtpos[0] = '\0';
  1834. X
  1835. X    XtPopupSpringLoaded(pop_adjust_up);
  1836. X
  1837. X
  1838. X    app_context = XtWidgetToApplicationContext(pop_adjust_up);
  1839. X
  1840. X    visible = True;
  1841. X
  1842. X    while (visible)
  1843. X    {
  1844. X        XtAppNextEvent(app_context, &event);
  1845. X        XtDispatchEvent(&event);
  1846. X
  1847. X    }
  1848. X
  1849. X    transform(textinput);
  1850. X
  1851. X
  1852. }
  1853. X
  1854. int number_of_text()
  1855. {
  1856. X  int i;
  1857. X    /* compute number of text-entries */
  1858. X    i=1;
  1859. X    if (message_start==NULL) return 0;
  1860. X    if (message_start==message_curr) return 1;
  1861. X    message_marker=message_start;
  1862. X    do
  1863. X    {
  1864. X        i++;
  1865. X        if (message_marker!=message_curr) message_marker=message_marker->next;
  1866. X    } while (message_marker!=message_curr);
  1867. X
  1868. X    return i;
  1869. }
  1870. X
  1871. X
  1872. X
  1873. void textedit()
  1874. {
  1875. X  Widget perle;
  1876. X  Widget kiste,toggle,blabla;
  1877. X  Widget ok,del,more;
  1878. X  int i,lenn=81;
  1879. X  int anz_text;
  1880. X  XtTranslations  trans_table,trans_table2;
  1881. X  char          leave_str[100]="<LeaveNotify> : beende_textedit() correct_text_error()\n";
  1882. X  char          ok_str[100]="<ButtonRelease> : beende_textedit() correct_text_error()\n";
  1883. X  char          more_str[100]="<ButtonRelease>    : beende_textedit() textedit()\n";
  1884. X  char          del_str[100]="<ButtonRelease>    : delete_textedit() beende_textedit() textedit()\n";
  1885. X
  1886. X  char            temp_str2[100] = 
  1887. X            "<KeyPress>Return    : dummy() \n";
  1888. X  
  1889. X  static XtActionsRec actions[200] = {{"dummy", dummy},
  1890. X                      {"textedit", textedit},
  1891. X                      {"beende_textedit", beende_textedit},
  1892. X                      {"delete_textedit", delete_textedit},
  1893. X                      {"correct_text_error",correct_text_error}};
  1894. X  Position x_rel, y_rel, x, y;
  1895. X    
  1896. X
  1897. X    muschel=XtCreatePopupShell("Edit/Delete", transientShellWidgetClass, canvas, NULL, 0);
  1898. X
  1899. X    trans_table = XtParseTranslationTable(leave_str);
  1900. X    XtOverrideTranslations(muschel, trans_table);
  1901. X
  1902. X    perle=XtCreateManagedWidget("behaelter", boxWidgetClass, muschel, NULL, 0);
  1903. X    
  1904. X    n=0;
  1905. X    XtSetArg(args[n], XtNlabel,"Edit Normal Text");n++;
  1906. X    XtSetArg(args[n], XtNjustify,XtJustifyCenter);n++;
  1907. X    XtSetArg(args[n], XtNwidth,560);n++;
  1908. X    XtSetArg(args[n], XtNheight,40);n++;
  1909. X    
  1910. X    XtCreateManagedWidget("", labelWidgetClass, perle, args, n);
  1911. X
  1912. X
  1913. X    n=0;
  1914. X    XtSetArg(args[n], XtNlabel,"Accept");n++;
  1915. X    XtSetArg(args[n], XtNjustify,XtJustifyCenter);n++;
  1916. X    XtSetArg(args[n], XtNwidth,130);n++;
  1917. X    XtSetArg(args[n], XtNheight,40);n++;
  1918. X    XtSetArg(args[n], XtNshapeStyle,XmuShapeOval);n++;
  1919. X    
  1920. X    
  1921. X    ok=XtCreateManagedWidget("ok", commandWidgetClass, perle, args, n);
  1922. X    trans_table = XtParseTranslationTable(ok_str);
  1923. X    XtOverrideTranslations(ok, trans_table);
  1924. X
  1925. X
  1926. X    /* compute number of text-entries */
  1927. X    anz_text=number_of_text();
  1928. X
  1929. X    if (anz_text==0)
  1930. X    {
  1931. X        leave_pick("Sorry - No text available !\n");
  1932. X        return;
  1933. X    }    
  1934. X
  1935. X
  1936. X    if (anz_text>10)
  1937. X    {
  1938. X        n=0;
  1939. X        XtSetArg(args[n], XtNlabel,"More");n++;
  1940. X        XtSetArg(args[n], XtNjustify,XtJustifyCenter);n++;
  1941. X        XtSetArg(args[n], XtNwidth,130);n++;
  1942. X        XtSetArg(args[n], XtNheight,40);n++;
  1943. X        XtSetArg(args[n], XtNshapeStyle, XmuShapeOval);n++;
  1944. X        
  1945. X        more=XtCreateManagedWidget("more", commandWidgetClass, perle, args, n);
  1946. X        trans_table = XtParseTranslationTable(more_str);
  1947. X        XtOverrideTranslations(more, trans_table);
  1948. X    }
  1949. X
  1950. X
  1951. X    n=0;
  1952. X    XtSetArg(args[n], XtNlabel,"Delete");n++;
  1953. X    XtSetArg(args[n], XtNjustify,XtJustifyCenter);n++;
  1954. X    XtSetArg(args[n], XtNwidth,130);n++;
  1955. X    XtSetArg(args[n], XtNheight,40);n++;
  1956. X    XtSetArg(args[n], XtNshapeStyle,XmuShapeOval);n++;
  1957. X    
  1958. X    del=XtCreateManagedWidget("del", commandWidgetClass, perle, args, n);
  1959. X    trans_table = XtParseTranslationTable(del_str);
  1960. X    XtOverrideTranslations(del, trans_table);
  1961. X    
  1962. X    
  1963. X    if (ab>anz_text) ab=-9;
  1964. X    ab+=10; /* ab was initially -9 */
  1965. X    if (ab>anz_text) ab=1;
  1966. X
  1967. X    /* message_marker must point to the "ab"th text! */
  1968. X
  1969. X    message_marker=message_start;
  1970. X    for (i=2; i<=ab; i++) message_marker=message_marker->next;
  1971. X
  1972. X    for (i=ab; ( (i<=anz_text) && (i-ab<10) ); i++)
  1973. X    {
  1974. X        n=0;
  1975. X        XtSetArg(args[n],XtNorientation,XtorientHorizontal);n++;
  1976. X        XtSetArg(args[n],XtNborderWidth,0);n++;
  1977. X        kiste=XtCreateManagedWidget("drin", boxWidgetClass, perle, args, n);
  1978. X        n=0;
  1979. X        XtSetArg(args[n],XtNstate,False);n++;
  1980. X        XtSetArg(args[n],XtNheight,20);n++;
  1981. X        XtSetArg(args[n],XtNwidth,20);n++;
  1982. X        XtSetArg(args[n],XtNshapeStyle,XmuShapeOval);n++;
  1983. X        toggle=XtCreateManagedWidget("!", toggleWidgetClass, kiste, args, n);
  1984. X        n=0;
  1985. X        XtSetArg(args[n],XtNuseStringInPlace,True);n++;
  1986. X        XtSetArg(args[n],XtNstring,message_marker->text);n++;
  1987. X        XtSetArg(args[n],XtNwidth,500);n++;
  1988. X        if (lenn<1+strlen(message_marker->text)) lenn=1+strlen(message_marker->text);
  1989. X        XtSetArg(args[n],XtNlength,lenn);n++; 
  1990. X        /* warning, this is constant */
  1991. X    /* it is a fact, that each of these pointers point to a memory-location, which */
  1992. X    /* is at last exactly 80 Bytes big. */
  1993. X    /* Well, this is an arbitrary restriction */
  1994. X        XtSetArg(args[n],XtNeditType,XawtextEdit);n++;
  1995. X        
  1996. X        blabla=XtCreateManagedWidget("text", asciiTextWidgetClass, kiste, args, n);
  1997. X        XtAddActions(actions, XtNumber(actions));
  1998. X        trans_table2 = XtParseTranslationTable(temp_str2);
  1999. X        XtOverrideTranslations(blabla, trans_table2);
  2000. X
  2001. X        /* Store the pointers, used for a delete action */
  2002. X        mem[i-ab].tg=toggle;
  2003. X        mem[i-ab].obj=(struct fig5 *)message_marker;
  2004. X        mem[i-ab+1].tg=NULL;
  2005. X        mem[i-ab+1].obj=NULL;
  2006. X
  2007. X        message_marker=message_marker->next;
  2008. X        
  2009. X    }
  2010. X
  2011. X    XtAddActions(actions, XtNumber(actions));
  2012. X    
  2013. X    
  2014. X
  2015. X    /* setting position of widget */
  2016. X    n = 0;
  2017. X    XtSetArg(args[n], XtNx, &x_rel);
  2018. X    n++;
  2019. X    XtSetArg(args[n], XtNy, &y_rel);
  2020. X    n++;
  2021. X    XtGetValues(canvas, args, n);    /* get the relative coordinates of
  2022. X                     * widget: canvas */
  2023. X    XtTranslateCoords(canvas, x_rel, y_rel, &x, &y);
  2024. X    n = 0;
  2025. X    XtSetArg(args[n], XtNx, x + cmd_btn_width);
  2026. X    n++;
  2027. X    XtSetArg(args[n], XtNy, y + 2 * cmd_btn_height);
  2028. X    n++;
  2029. X    XtSetValues(muschel, args, n);
  2030. X    /* position set ! */
  2031. X
  2032. X
  2033. X    XtPopupSpringLoaded(muschel);
  2034. X
  2035. X    
  2036. }
  2037. X
  2038. void correct_text_error()
  2039. {
  2040. X
  2041. X    /* remove special chars from text */
  2042. X
  2043. X    message_marker=message_start;
  2044. X    if (message_marker==NULL) return;
  2045. X
  2046. X    while (message_marker!=NULL)
  2047. X    {
  2048. X        transform(message_marker->text);
  2049. X        message_marker=message_marker->next;
  2050. X    }
  2051. X    
  2052. X    ab=-9; /* for a new start */
  2053. X    
  2054. }
  2055. X        
  2056. void beende_textedit()    
  2057. {
  2058. X    XtPopdown(muschel);
  2059. X    XtDestroyWidget(muschel); /* and its children ! */
  2060. }    
  2061. X
  2062. X
  2063. X
  2064. void delete_textedit()
  2065. {
  2066. X    /* perform an erase on the selected (toggled) text */
  2067. X
  2068. X int i=0; /* counter */
  2069. X Boolean offon;
  2070. X struct fig5 * five;
  2071. X
  2072. X    while ( (mem[i].tg!=NULL) && (i<10) )
  2073. X    {
  2074. X        /* was the toggle active ? */
  2075. X        n=0;
  2076. X        XtSetArg(args[n],XtNstate,&offon);n++;
  2077. X        XtGetValues(mem[i].tg, args, n);
  2078. X
  2079. X        if (offon==True) /* it was selected - delete text ! */
  2080. X        {
  2081. X            message_marker = (struct fig5 *)mem[i].obj;
  2082. X            if (message_start == mem[i].obj)
  2083. X            {    /* first entry */
  2084. X                if (message_curr == message_start)
  2085. X                {    /* exactly 1 entry */
  2086. X
  2087. X                    message_start = NULL;
  2088. X                    message_curr = NULL;
  2089. X
  2090. X                } else
  2091. X                    message_start = message_start->next;
  2092. X
  2093. X                free(message_marker);
  2094. X            } else
  2095. X            {
  2096. X                message_marker = message_start;
  2097. X                do
  2098. X                {
  2099. X                    five = (struct fig5 *) message_marker;
  2100. X                    /* remember the last object */
  2101. X                    message_marker = message_marker->next;
  2102. X
  2103. X                } while (message_marker != mem[i].obj);
  2104. X                /* <message_marker> points to the desired object and */
  2105. X                /* <five> to the object before */
  2106. X
  2107. X                /* last entry ? */
  2108. X                if (message_marker == message_curr)
  2109. X                {
  2110. X                    message_marker = NULL;
  2111. X                    free(message_curr);
  2112. X                    message_curr = five;
  2113. X                    five->next=NULL;
  2114. X                } else
  2115. X                    /* no! the object was somewhere in the middle */
  2116. X                {
  2117. X                    five->next = message_marker->next;
  2118. X                    free(message_marker);
  2119. X                }
  2120. X            } /* else */
  2121. X        
  2122. X
  2123. X            
  2124. X        } /* if offon */
  2125. X
  2126. X        i++;
  2127. X
  2128. X    } /* while */
  2129. } /* proc */
  2130. X
  2131. X
  2132. X    
  2133. int sorry_msg()
  2134. {
  2135. X int i=-1;
  2136. X
  2137. X    if (
  2138. X        (pfeil_start==NULL) &&
  2139. X        (strich_start==NULL) &&
  2140. X        (framedBox_start==NULL) &&
  2141. X        (dashedBox_start==NULL) &&
  2142. X        (filledBox_start==NULL) &&
  2143. X        (kreis_start==NULL) &&
  2144. X        (disc_start==NULL) &&
  2145. X        (bezier_start==NULL) &&
  2146. X        (oval_start==NULL)
  2147. X       )
  2148. X        leave_pick("Sorry - No objects !\n");
  2149. X
  2150. X    else i=0;
  2151. X
  2152. X    return i;
  2153. X
  2154. }    
  2155. X
  2156. X
  2157. X
  2158. int fb_number_of_text()
  2159. {
  2160. X  int i;
  2161. X    /* compute number of text-entries */
  2162. X    i=1;
  2163. X    if (framedBox_start==NULL) return 0;
  2164. X    if (framedBox_start==framedBox_curr) return 1;
  2165. X    framedBox_marker=framedBox_start;
  2166. X    do
  2167. X    {
  2168. X        i++;
  2169. X        if (framedBox_marker!=framedBox_curr) framedBox_marker=framedBox_marker->next;
  2170. X    } while (framedBox_marker!=framedBox_curr);
  2171. X
  2172. X    return i;
  2173. }
  2174. X
  2175. X
  2176. X
  2177. void fb_textedit()
  2178. {
  2179. X  Widget perle;
  2180. X  Widget kiste,toggle,blabla;
  2181. X  Widget ok,del,more;
  2182. X  int i,lenn=81;
  2183. SHAR_EOF
  2184. true || echo 'restore of graphics.c failed'
  2185. fi
  2186. echo 'End of  part 4'
  2187. echo 'File graphics.c is continued in part 5'
  2188. echo 5 > _shar_seq_.tmp
  2189. exit 0
  2190. -- 
  2191. --
  2192. Molecular Simulations, Inc.            mail: dcmartin@msi.com
  2193. 796 N. Pastoria Avenue                uucp: uunet!dcmartin
  2194. Sunnyvale, California 94086            at&t: 408/522-9236
  2195.