home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume16 / xfig-2.1.3 / part01 next >
Internet Message Format  |  1992-02-04  |  56KB

  1. Path: uunet!wupost!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  2. From: envbvs@bea.lbl.gov (Brian V. Smith)
  3. Newsgroups: comp.sources.x
  4. Subject: v16i006: Xfig 2.1.3, Part01/25
  5. Message-ID: <csx-16i006-xfig-2.1.3@uunet.UU.NET>
  6. Date: 4 Feb 92 14:56:18 GMT
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Organization: Molecular Simulations, Inc.
  9. Lines: 1892
  10. Approved: dcmartin@msi.com
  11. Originator: dcmartin@fascet
  12.  
  13. Submitted-by: envbvs@bea.lbl.gov (Brian V. Smith)
  14. Posting-number: Volume 16, Issue 6
  15. Archive-name: xfig-2.1.3/part01
  16.  
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # If this archive is complete, you will see the following message at the end:
  22. #        "End of archive 1 (of 25)."
  23. # Contents:  README Doc Examples d_spline.c w_indpanel.c
  24. # Wrapped by dcmartin@fascet on Tue Feb  4 06:42:26 1992
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'README' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'README'\"
  28. else
  29. echo shar: Extracting \"'README'\" \(4044 characters\)
  30. sed "s/^X//" >'README' <<'END_OF_FILE'
  31. X===============================================================
  32. XXFIG - Facility for Interactive Generation of figures under X11
  33. X===============================================================
  34. X
  35. X
  36. XXfig is a menu-driven tool that allows the user to draw and manipulate objects
  37. Xinteractively in an X window.  The resulting pictures can be saved, printed
  38. Xon postscript printers or converted to a variety of other formats (e.g. to
  39. Xallow inclusion in LaTeX documents).
  40. X
  41. XThis file contains some notes about installing xfig, the directory
  42. X'Examples' contains some example figures and the 'Doc' directory contains
  43. Xsome further documentation including the manual in troff -man format.
  44. X
  45. XPlease report any bugs, fixes, contributions, etc. to:
  46. X
  47. XBrian V. Smith (bvsmith@lbl.gov)
  48. X
  49. X
  50. X===================
  51. XINSTALLATION NOTES:
  52. X===================
  53. X
  54. X1. Edit the Imakefile if you need to customize it (see following notes)
  55. X2. Type "make Makefile" or "xmkmf" if you have xmkmf
  56. X3. Type "make install"
  57. X4. Type "make install.man"
  58. X5. Add the resources from Fig.ad to /usr/lib/.../app-defaults/Fig that you
  59. X    wish to use
  60. X6. For X11R5 color implementations, copy the Fig-color.ad to 
  61. X    /usr/lib/.../app-defaults and specify "*customization: -color" in your 
  62. X    .Xdefaults file.
  63. X    NOTE: this only works under X11R5.
  64. X
  65. XThe SMOOTHMOTION option toggles between two methods for tracking the
  66. Xcursor.  The first way (SMOOTHMOTION) just uses the (x,y) information given
  67. Xin the X pointer motion event.  If your display server doesn't implement
  68. Xmotion compression this is very slow for large movements of the mouse
  69. Xpointer because X sends back lots of small movement events, each of which
  70. Xcauses the rubberband box to be erased and redrawn.  The alternative
  71. Xway (not SMOOTHMOTION) queries the position of the X cursor whenever
  72. Xa motion event is received and if you make a large movement and then
  73. Xstop actually turns out to involve less work even though the XQueryPointer
  74. Xcall is quite slow.
  75. XThe SMOOTHMOTION method is also automatically used for OpenWindows (when the
  76. X-DOPENWIN flag is used).
  77. X
  78. X-----------------
  79. XOpenWindows users
  80. X-----------------
  81. X
  82. XOpenwindows has scalable fonts so xfig must be compiled with the -DOPENWIN
  83. Xflag in order to handle this.  Also, there is a difference in the way the
  84. Xpointer position is queried for OpenWindows.  See the SMOOTHMOTION description.
  85. X
  86. XThere is also a bug in OpenWindows 2.0 which relates to pixmaps in widgets.
  87. XYou must compile xfig with the -DOPENWIN_BUG option for this problem.
  88. X
  89. X----------------------
  90. XPrinting your figures:
  91. X----------------------
  92. X
  93. XThe program to translate your figure into one of many printer languages
  94. X(Postscript, LaTex, etc) is called fig2dev and is part of the TransFig
  95. Xpackage by Micah Beck.
  96. XIt is available from export.lcs.mit.edu in /contrib/transfig.tar.Z or
  97. Xftp.cs.cornell.edu in the directory /pub/fig.
  98. XSee the man pages for more information.
  99. X
  100. X----------------------------------------------
  101. XPossible problems encountered installing xfig:
  102. X----------------------------------------------
  103. X
  104. XPROBLEM:
  105. X    The window oscillates and fights with the window manager when
  106. X    I click on a mode button or try to resize the xfig window.
  107. X
  108. XPOSSIBLE CAUSE AND SOLUTION:
  109. X     Perhaps the following resource has been set
  110. X         *allowShellResize: true
  111. X    because another program requires it to be true.
  112. X    Change the resource to be specific to the programs which need it.
  113. X
  114. XPROBLEM:
  115. X    Openwindows sometimes loses track of xfig's icon.
  116. X
  117. XPOSSIBLE CAUSE AND SOLUTION:
  118. X    Cause unknown, here is a temporary kludge. Place the line:
  119. X        Fig*iconPixmap:               ..../your_lib_area/fig.icon.X
  120. X    in your .Xdefaults file and copy fig.icon.X into your lib area.
  121. X
  122. XPROBLEM:
  123. X    I can't seem to get a single xfig binary to work under both
  124. X    openwindows and standard X.
  125. X
  126. XPOSSIBLE CAUSE AND SOLUTION:
  127. X    You can compile xfig so that it knows about openwindows fonts
  128. X    but then it won't work under standard X.  If you want a single
  129. X    binary, compile with -DOPENWIN_BUG but not -DOPENWIN.  This
  130. X    will work on both systems but you won't be able to access the
  131. X    openwindows fonts.
  132. X
  133. END_OF_FILE
  134. if test 4044 -ne `wc -c <'README'`; then
  135.     echo shar: \"'README'\" unpacked with wrong size!
  136. fi
  137. # end of 'README'
  138. fi
  139. if test ! -d 'Doc' ; then
  140.     echo shar: Creating directory \"'Doc'\"
  141.     mkdir 'Doc'
  142. fi
  143. if test ! -d 'Examples' ; then
  144.     echo shar: Creating directory \"'Examples'\"
  145.     mkdir 'Examples'
  146. fi
  147. if test -f 'd_spline.c' -a "${1}" != "-c" ; then 
  148.   echo shar: Will not clobber existing file \"'d_spline.c'\"
  149. else
  150. echo shar: Extracting \"'d_spline.c'\" \(3522 characters\)
  151. sed "s/^X//" >'d_spline.c' <<'END_OF_FILE'
  152. X/*
  153. X * FIG : Facility for Interactive Generation of figures
  154. X * Copyright (c) 1985 by Supoj Sutanthavibul
  155. X *
  156. X * "Permission to use, copy, modify, distribute, and sell this software and its
  157. X * documentation for any purpose is hereby granted without fee, provided that
  158. X * the above copyright notice appear in all copies and that both that
  159. X * copyright notice and this permission notice appear in supporting
  160. X * documentation, and that the name of M.I.T. not be used in advertising or
  161. X * publicity pertaining to distribution of the software without specific,
  162. X * written prior permission.  M.I.T. makes no representations about the
  163. X * suitability of this software for any purpose.  It is provided "as is"
  164. X * without express or implied warranty."
  165. X *
  166. X */
  167. X
  168. X#include "fig.h"
  169. X#include "resources.h"
  170. X#include "mode.h"
  171. X#include "object.h"
  172. X#include "paintop.h"
  173. X#include "u_create.h"
  174. X#include "u_elastic.h"
  175. X#include "u_list.h"
  176. X#include "w_canvas.h"
  177. X#include "w_mousefun.h"
  178. X
  179. Xstatic int    create_splineobject();
  180. Xstatic int    init_spline_drawing();
  181. X
  182. Xspline_drawing_selected()
  183. X{
  184. X    set_mousefun("first point", "", "");
  185. X    canvas_kbd_proc = null_proc;
  186. X    canvas_locmove_proc = null_proc;
  187. X    canvas_leftbut_proc = init_spline_drawing;
  188. X    canvas_middlebut_proc = null_proc;
  189. X    canvas_rightbut_proc = null_proc;
  190. X    set_cursor(arrow_cursor);
  191. X    reset_action_on();
  192. X}
  193. X
  194. Xstatic
  195. Xinit_spline_drawing(x, y)
  196. X    int            x, y;
  197. X{
  198. X    if (cur_mode == F_CLOSED_SPLINE) {
  199. X    min_num_points = 3;
  200. X    init_trace_drawing(x, y);
  201. X    canvas_middlebut_save = create_splineobject;
  202. X    } else {
  203. X    min_num_points = 2;
  204. X    init_trace_drawing(x, y);
  205. X    canvas_middlebut_proc = create_splineobject;
  206. X    }
  207. X    return_proc = spline_drawing_selected;
  208. X}
  209. X
  210. Xstatic
  211. Xcreate_splineobject(x, y)
  212. X    int            x, y;
  213. X{
  214. X    F_spline       *spline;
  215. X
  216. X    if (x != fix_x || y != fix_y || num_point < min_num_points) {
  217. X    if (manhattan_mode || mountain_mode)
  218. X        get_direction(x, y);
  219. X    else if (latexline_mode || latexarrow_mode)
  220. X        get_latexpoint(x, y);
  221. X    else
  222. X        get_intermediatepoint(x, y);
  223. X    }
  224. X    elastic_line();
  225. X    if ((spline = create_spline()) == NULL)
  226. X    return;
  227. X
  228. X    spline->style = cur_linestyle;
  229. X    spline->thickness = cur_linewidth;
  230. X    spline->style_val = cur_styleval * (cur_linewidth + 1) / 2;
  231. X    spline->color = cur_color;
  232. X    spline->depth = 0;
  233. X    spline->pen = 0;
  234. X    spline->fill_style = cur_fillstyle;
  235. X    /*
  236. X     * The current fill style is saved in all spline objects (but support for
  237. X     * filling may not be available in all fig2dev languages).
  238. X     */
  239. X    spline->points = first_point;
  240. X    spline->controls = NULL;
  241. X    spline->next = NULL;
  242. X    /* initialise for no arrows - updated below if necessary */
  243. X    spline->for_arrow = NULL;
  244. X    spline->back_arrow = NULL;
  245. X    cur_x = cur_y = fix_x = fix_y = 0;    /* used in elastic_moveline */
  246. X    elastic_moveline(spline->points);    /* erase control vector */
  247. X    if (cur_mode == F_CLOSED_SPLINE) {
  248. X    spline->type = T_CLOSED_NORMAL;
  249. X    num_point++;
  250. X    append_point(first_point->x, first_point->y, &cur_point);
  251. X    draw_closed_spline(spline, PAINT);
  252. X    } else {            /* It must be F_SPLINE */
  253. X    if (autoforwardarrow_mode)
  254. X        spline->for_arrow = forward_arrow();
  255. X    if (autobackwardarrow_mode)
  256. X        spline->back_arrow = backward_arrow();
  257. X    spline->type = T_OPEN_NORMAL;
  258. X    draw_open_spline(spline, PAINT);
  259. X    }
  260. X    if (appres.DEBUG) {
  261. X    int        xmin, ymin, xmax, ymax;
  262. X
  263. X    spline_bound(spline, &xmin, &ymin, &xmax, &ymax);
  264. X    elastic_box(xmin, ymin, xmax, ymax);
  265. X    }
  266. X    add_spline(spline);
  267. X    spline_drawing_selected();
  268. X    draw_mousefun_canvas();
  269. X}
  270. END_OF_FILE
  271. if test 3522 -ne `wc -c <'d_spline.c'`; then
  272.     echo shar: \"'d_spline.c'\" unpacked with wrong size!
  273. fi
  274. # end of 'd_spline.c'
  275. fi
  276. if test -f 'w_indpanel.c' -a "${1}" != "-c" ; then 
  277.   echo shar: Will not clobber existing file \"'w_indpanel.c'\"
  278. else
  279. echo shar: Extracting \"'w_indpanel.c'\" \(43799 characters\)
  280. sed "s/^X//" >'w_indpanel.c' <<'END_OF_FILE'
  281. X/*
  282. X * FIG : Facility for Interactive Generation of figures
  283. X * Copyright (c) 1985 by Supoj Sutanthavibul
  284. X *
  285. X * "Permission to use, copy, modify, distribute, and sell this software and its
  286. X * documentation for any purpose is hereby granted without fee, provided that
  287. X * the above copyright notice appear in all copies and that both that
  288. X * copyright notice and this permission notice appear in supporting
  289. X * documentation, and that the name of M.I.T. not be used in advertising or
  290. X * publicity pertaining to distribution of the software without specific,
  291. X * written prior permission.  M.I.T. makes no representations about the
  292. X * suitability of this software for any purpose.  It is provided "as is"
  293. X * without express or implied warranty."
  294. X *
  295. X */
  296. X
  297. X#include "fig.h"
  298. X#include "resources.h"
  299. X#include "object.h"
  300. X#include "mode.h"
  301. X#include "paintop.h"
  302. X#include "u_fonts.h"
  303. X#include "w_drawprim.h"
  304. X#include "w_icons.h"
  305. X#include "w_indpanel.h"
  306. X#include "w_mousefun.h"
  307. X#include "w_setup.h"
  308. X#include "w_util.h"
  309. X#include "w_zoom.h"
  310. X
  311. Xextern Pixmap    psfont_menu_bitmaps[], latexfont_menu_bitmaps[];
  312. Xextern struct _fstruct ps_fontinfo[], latex_fontinfo[];
  313. Xextern char    *panel_get_value();
  314. Xextern int    show_zoom();
  315. X
  316. X/**************        local variables and routines   **************/
  317. X
  318. Xstatic int    cur_anglegeom = L_UNCONSTRAINED;
  319. Xstatic int    cur_indmask = I_MIN1;
  320. X
  321. Xstatic String    set_translations = 
  322. X    "<Key>Return: SetValue()";
  323. Xstatic void    nval_panel_set();
  324. Xstatic XtActionsRec set_actions[] =
  325. X{
  326. X    {"SetValue", (XtActionProc) nval_panel_set},
  327. X};
  328. X
  329. XDeclareStaticArgs(15);
  330. X
  331. X/* declarations for choice buttons */
  332. Xstatic int    inc_choice(), dec_choice();
  333. Xstatic int    show_valign(), show_halign(), show_textjust();
  334. Xstatic int    show_arrowmode(), show_linestyle(), show_anglegeom();
  335. Xstatic int    show_pointposn(), show_gridmode(), show_linkmode();
  336. X
  337. X/* declarations for value buttons */
  338. Xstatic int    show_linewidth(), inc_linewidth(), dec_linewidth();
  339. Xstatic int    show_boxradius(), inc_boxradius(), dec_boxradius();
  340. Xstatic int    show_fillstyle(), darken_fill(), lighten_fill();
  341. Xstatic int    show_color(), next_color(), prev_color();
  342. Xstatic int    show_font(), inc_font(), dec_font();
  343. Xstatic int    show_fontsize(), inc_fontsize(), dec_fontsize();
  344. Xstatic int    show_textstep(), inc_textstep(), dec_textstep();
  345. Xstatic int    inc_zoom(), dec_zoom();
  346. Xstatic int    show_rotnangle(), inc_rotnangle(), dec_rotnangle();
  347. Xstatic int    show_numsides(), inc_numsides(), dec_numsides();
  348. X
  349. Xstatic int    popup_fonts();
  350. X
  351. Xstatic char    indbuf[5];
  352. Xstatic int    old_zoomscale = -1;
  353. Xstatic int    old_rotnangle = -1;
  354. X
  355. X#define        DEF_IND_SW_HT        32
  356. X#define        DEF_IND_SW_WD        64
  357. X#define        FONT_IND_SW_WD        (40+PS_FONTPANE_WD)
  358. X#define        NARROW_IND_SW_WD    56
  359. X#define        WIDE_IND_SW_WD        76
  360. X
  361. X/* indicator switch definitions */
  362. X
  363. Xstatic choice_info anglegeom_choices[] = {
  364. X    {L_UNCONSTRAINED, &unconstrained_ic,},
  365. X    {L_LATEXLINE, &latexline_ic,},
  366. X    {L_LATEXARROW, &latexarrow_ic,},
  367. X    {L_MOUNTHATTAN, &mounthattan_ic,},
  368. X    {L_MANHATTAN, &manhattan_ic,},
  369. X    {L_MOUNTAIN, &mountain_ic,},
  370. X};
  371. X
  372. X#define NUM_ANGLEGEOM_CHOICES (sizeof(anglegeom_choices)/sizeof(choice_info))
  373. X
  374. Xstatic choice_info valign_choices[] = {
  375. X    {NONE, &none_ic,},
  376. X    {TOP, &valignt_ic,},
  377. X    {CENTER, &valignc_ic,},
  378. X    {BOTTOM, &valignb_ic,},
  379. X};
  380. X
  381. X#define NUM_VALIGN_CHOICES (sizeof(valign_choices)/sizeof(choice_info))
  382. X
  383. Xstatic choice_info halign_choices[] = {
  384. X    {NONE, &none_ic,},
  385. X    {LEFT, &halignl_ic,},
  386. X    {CENTER, &halignc_ic,},
  387. X    {RIGHT, &halignr_ic,},
  388. X};
  389. X
  390. X#define NUM_HALIGN_CHOICES (sizeof(halign_choices)/sizeof(choice_info))
  391. X
  392. Xstatic choice_info gridmode_choices[] = {
  393. X    {GRID_0, &none_ic,},
  394. X    {GRID_1, &grid1_ic,},
  395. X    {GRID_2, &grid2_ic,},
  396. X};
  397. X
  398. X#define NUM_GRIDMODE_CHOICES (sizeof(gridmode_choices)/sizeof(choice_info))
  399. X
  400. Xstatic choice_info pointposn_choices[] = {
  401. X    {P_ANY, &any_ic,},
  402. X    {P_MAGNET, &fine_grid_ic,},
  403. X    {P_GRID1, &grid1_ic,},
  404. X    {P_GRID2, &grid2_ic,},
  405. X};
  406. X
  407. X#define NUM_POINTPOSN_CHOICES (sizeof(pointposn_choices)/sizeof(choice_info))
  408. X
  409. Xstatic choice_info arrowmode_choices[] = {
  410. X    {L_NOARROWS, &noarrows_ic,},
  411. X    {L_FARROWS, &farrows_ic,},
  412. X    {L_FBARROWS, &fbarrows_ic,},
  413. X    {L_BARROWS, &barrows_ic,},
  414. X};
  415. X
  416. X#define NUM_ARROWMODE_CHOICES (sizeof(arrowmode_choices)/sizeof(choice_info))
  417. X
  418. Xstatic choice_info textjust_choices[] = {
  419. X    {T_LEFT_JUSTIFIED, &textL_ic,},
  420. X    {T_CENTER_JUSTIFIED, &textC_ic,},
  421. X    {T_RIGHT_JUSTIFIED, &textR_ic,},
  422. X};
  423. X
  424. X#define NUM_TEXTJUST_CHOICES (sizeof(textjust_choices)/sizeof(choice_info))
  425. X
  426. Xstatic choice_info linestyle_choices[] = {
  427. X    {SOLID_LINE, &solidline_ic,},
  428. X    {DASH_LINE, &dashline_ic,},
  429. X    {DOTTED_LINE, &dottedline_ic,},
  430. X};
  431. X
  432. X#define NUM_LINESTYLE_CHOICES (sizeof(linestyle_choices)/sizeof(choice_info))
  433. X
  434. Xstatic choice_info linkmode_choices[] = {
  435. X    {SMART_OFF, &smartoff_ic,},
  436. X    {SMART_MOVE, &smartmove_ic,},
  437. X    {SMART_SLIDE, &smartslide_ic,},
  438. X};
  439. X
  440. X#define NUM_LINKMODE_CHOICES (sizeof(linkmode_choices)/sizeof(choice_info))
  441. X
  442. Xchoice_info    fillstyle_choices[NUMFILLPATS + 1];
  443. X
  444. Xchoice_info    color_choices[NUMCOLORS + 1];
  445. Xstatic ind_sw_info *fill_style_sw;
  446. X
  447. X#define I_CHOICE    0
  448. X#define I_IVAL        1
  449. X#define I_FVAL        2
  450. X
  451. X#define        inc_action(z)    (z->inc_func)(z)
  452. X#define        dec_action(z)    (z->dec_func)(z)
  453. X#define        show_action(z)    (z->show_func)(z)
  454. X
  455. Xind_sw_info    ind_switches[] = {
  456. X    {I_IVAL, I_ZOOM, "Zoom", "Scale", NARROW_IND_SW_WD,
  457. X    &zoomscale, NULL, inc_zoom, dec_zoom, show_zoom,},
  458. X    {I_CHOICE, I_GRIDMODE, "Grid", "Mode", DEF_IND_SW_WD,
  459. X    &cur_gridmode, NULL, inc_choice, dec_choice, show_gridmode,
  460. X    gridmode_choices, NUM_GRIDMODE_CHOICES, NUM_GRIDMODE_CHOICES,},
  461. X    {I_CHOICE, I_POINTPOSN, "Point", "Posn", DEF_IND_SW_WD,
  462. X    &cur_pointposn, NULL, inc_choice, dec_choice, show_pointposn,
  463. X    pointposn_choices, NUM_POINTPOSN_CHOICES, NUM_POINTPOSN_CHOICES,},
  464. X    {I_IVAL, I_ROTNANGLE, "Rotn", "Angle", NARROW_IND_SW_WD,
  465. X    &cur_rotnangle, NULL, inc_rotnangle, dec_rotnangle, show_rotnangle,},
  466. X    {I_IVAL, I_NUMSIDES, "Num", "Sides", NARROW_IND_SW_WD,
  467. X    &cur_numsides, NULL, inc_numsides, dec_numsides, show_numsides,},
  468. X    {I_CHOICE, I_VALIGN, "Vert", "Align", DEF_IND_SW_WD,
  469. X    &cur_valign, NULL, inc_choice, dec_choice, show_valign,
  470. X    valign_choices, NUM_VALIGN_CHOICES, NUM_VALIGN_CHOICES,},
  471. X    {I_CHOICE, I_HALIGN, "Horiz", "Align", DEF_IND_SW_WD,
  472. X    &cur_halign, NULL, inc_choice, dec_choice, show_halign,
  473. X    halign_choices, NUM_HALIGN_CHOICES, NUM_HALIGN_CHOICES,},
  474. X    {I_CHOICE, I_ANGLEGEOM, "Angle", "Geom", DEF_IND_SW_WD,
  475. X    &cur_anglegeom, NULL, inc_choice, dec_choice, show_anglegeom,
  476. X    anglegeom_choices, NUM_ANGLEGEOM_CHOICES, NUM_ANGLEGEOM_CHOICES / 2,},
  477. X    {I_CHOICE, I_FILLSTYLE, "Fill", "Style", DEF_IND_SW_WD,
  478. X    &cur_fillstyle, NULL, darken_fill, lighten_fill, show_fillstyle,
  479. X    fillstyle_choices, NUMFILLPATS + 1, (NUMFILLPATS + 1) / 2},
  480. X    {I_CHOICE, I_COLOR, "Color", "", WIDE_IND_SW_WD,
  481. X    (int *) &cur_color, NULL, next_color, prev_color, show_color,
  482. X    color_choices, NUMCOLORS + 1, (NUMCOLORS + 1) / 2},
  483. X    {I_CHOICE, I_LINKMODE, "Smart", "Links", DEF_IND_SW_WD,
  484. X    &cur_linkmode, NULL, inc_choice, dec_choice, show_linkmode,
  485. X    linkmode_choices, NUM_LINKMODE_CHOICES, NUM_LINKMODE_CHOICES},
  486. X    {I_IVAL, I_LINEWIDTH, "Line", "Width", NARROW_IND_SW_WD,
  487. X    &cur_linewidth, NULL, inc_linewidth, dec_linewidth, show_linewidth,},
  488. X    {I_CHOICE, I_LINESTYLE, "Line", "Style", DEF_IND_SW_WD,
  489. X    &cur_linestyle, NULL, inc_choice, dec_choice, show_linestyle,
  490. X    linestyle_choices, NUM_LINESTYLE_CHOICES, NUM_LINESTYLE_CHOICES,},
  491. X    {I_IVAL, I_BOXRADIUS, "Box", "Curve", DEF_IND_SW_WD,
  492. X    &cur_boxradius, NULL, inc_boxradius, dec_boxradius, show_boxradius,},
  493. X    {I_CHOICE, I_ARROWMODE, "Arrow", "Mode", DEF_IND_SW_WD,
  494. X    &cur_arrowmode, NULL, inc_choice, dec_choice, show_arrowmode,
  495. X    arrowmode_choices, NUM_ARROWMODE_CHOICES, NUM_ARROWMODE_CHOICES,},
  496. X    {I_CHOICE, I_TEXTJUST, "Text", "Just", DEF_IND_SW_WD,
  497. X    &cur_textjust, NULL, inc_choice, dec_choice, show_textjust,
  498. X    textjust_choices, NUM_TEXTJUST_CHOICES, NUM_TEXTJUST_CHOICES,},
  499. X    {I_IVAL, I_FONTSIZE, "Text", "Size", NARROW_IND_SW_WD,
  500. X    &cur_fontsize, NULL, inc_fontsize, dec_fontsize, show_fontsize,},
  501. X    {I_FVAL, I_TEXTSTEP, "Text", "Step", NARROW_IND_SW_WD,
  502. X    NULL, &cur_textstep, inc_textstep, dec_textstep, show_textstep,},
  503. X    {I_IVAL, I_FONT, "Text", "Font", FONT_IND_SW_WD,
  504. X    &cur_ps_font, NULL, inc_font, dec_font, show_font,},
  505. X};
  506. X
  507. X#define        NUM_IND_SW    (sizeof(ind_switches) / sizeof(ind_sw_info))
  508. X
  509. Xstatic Arg    button_args[] =
  510. X{
  511. X     /* 0 */ {XtNlabel, (XtArgVal) "        "},
  512. X     /* 1 */ {XtNwidth, (XtArgVal) 0},
  513. X     /* 2 */ {XtNheight, (XtArgVal) 0},
  514. X     /* 3 */ {XtNresizable, (XtArgVal) False},
  515. X     /* 4 */ {XtNborderWidth, (XtArgVal) 0},
  516. X     /* 5 */ {XtNresize, (XtArgVal) False},    /* keeps buttons from being
  517. X                         * resized when there are not
  518. X                         * a multiple of three of
  519. X                         * them */
  520. X     /* 6 */ {XtNbackgroundPixmap, (XtArgVal) NULL},
  521. X};
  522. X
  523. X/* button selection event handler */
  524. Xstatic void    sel_ind_but();
  525. X
  526. Xstatic XtActionsRec ind_actions[] =
  527. X{
  528. X    {"EnterIndSw", (XtActionProc) draw_mousefun_ind},
  529. X    {"LeaveIndSw", (XtActionProc) clear_mousefun},
  530. X};
  531. X
  532. Xstatic String    ind_translations =
  533. X"<EnterWindow>:EnterIndSw()highlight()\n\
  534. X    <LeaveWindow>:LeaveIndSw()unhighlight()\n";
  535. X
  536. Xinit_ind_panel(tool)
  537. X    TOOL        tool;
  538. X{
  539. X    register int    i;
  540. X    register ind_sw_info *sw;
  541. X
  542. X    /* does he want to always see ALL of the indicator buttons? */
  543. X    if (appres.ShowAllButtons) {
  544. X    cur_indmask = I_ALL;    /* yes */
  545. X    i = DEF_IND_SW_HT * 2;    /* two rows high when showing all buttons */
  546. X    } else
  547. X    i = DEF_IND_SW_HT;
  548. X
  549. X    FirstArg(XtNwidth, INDPANEL_WD);
  550. X    NextArg(XtNheight, i);
  551. X    NextArg(XtNhSpace, INTERNAL_BW);
  552. X    NextArg(XtNvSpace, INTERNAL_BW);
  553. X    NextArg(XtNresizable, False);
  554. X    NextArg(XtNfromVert, canvas_sw);
  555. X    NextArg(XtNvertDistance, -INTERNAL_BW);
  556. X    NextArg(XtNtop, XtChainBottom);
  557. X    NextArg(XtNbottom, XtChainBottom);
  558. X    NextArg(XtNleft, XtChainLeft);
  559. X    NextArg(XtNright, XtChainLeft);
  560. X    NextArg(XtNborderWidth, 0);
  561. X    if (appres.ShowAllButtons) {
  562. X    NextArg(XtNorientation, XtorientVertical);    /* use two rows */
  563. X    } else {
  564. X    NextArg(XtNorientation, XtorientHorizontal);    /* expand horizontally */
  565. X    }
  566. X    NextArg(XtNmappedWhenManaged, False);
  567. X
  568. X    ind_panel = XtCreateWidget("ind_panel", boxWidgetClass, tool,
  569. X                   Args, ArgCount);
  570. X
  571. X    XtAppAddActions(tool_app, ind_actions, XtNumber(ind_actions));
  572. X
  573. X    for (i = 0; i < NUM_IND_SW; ++i) {
  574. X    sw = &ind_switches[i];
  575. X
  576. X    button_args[1].value = sw->sw_width;
  577. X    button_args[2].value = DEF_IND_SW_HT;
  578. X    sw->widget = XtCreateWidget("button", commandWidgetClass,
  579. X                 ind_panel, button_args, XtNumber(button_args));
  580. X    if (sw->func & cur_indmask)
  581. X        XtManageChild(sw->widget);
  582. X
  583. X    /* allow left & right buttons */
  584. X    /* (callbacks pass same data for ANY button) */
  585. X    XtAddEventHandler(sw->widget, ButtonReleaseMask, (Boolean) 0,
  586. X              sel_ind_but, (caddr_t) sw);
  587. X    XtOverrideTranslations(sw->widget,
  588. X                   XtParseTranslationTable(ind_translations));
  589. X    }
  590. X}
  591. X
  592. Xsetup_ind_panel()
  593. X{
  594. X    register int    i;
  595. X    register ind_sw_info *isw;
  596. X    register Display *d = tool_d;
  597. X    register Screen *s = tool_s;
  598. X    register Pixmap p;
  599. X
  600. X    /* get the foreground and background from the indicator widget */
  601. X    /* and create a gc with those values */
  602. X    ind_button_gc = XCreateGC(tool_d, XtWindow(ind_panel), (unsigned long) 0, NULL);
  603. X    FirstArg(XtNforeground, &ind_but_fg);
  604. X    NextArg(XtNbackground, &ind_but_bg);
  605. X    GetValues(ind_switches[0].widget);
  606. X    XSetBackground(tool_d, ind_button_gc, ind_but_bg);
  607. X    XSetForeground(tool_d, ind_button_gc, ind_but_fg);
  608. X    XSetFont(tool_d, ind_button_gc, button_font->fid);
  609. X
  610. X    /* also create gc with fore=background for blanking areas */
  611. X    ind_blank_gc = XCreateGC(tool_d, XtWindow(ind_panel), (unsigned long) 0, NULL);
  612. X    XSetBackground(tool_d, ind_blank_gc, ind_but_bg);
  613. X    XSetForeground(tool_d, ind_blank_gc, ind_but_bg);
  614. X
  615. X    /* create a gc for the color 'palette' */
  616. X    color_gc = XCreateGC(tool_d, XtWindow(ind_panel), (unsigned long) 0, NULL);
  617. X
  618. X    /* initialize the fill style gc and pixmaps */
  619. X    init_fill_pm();
  620. X    init_fill_gc();
  621. X
  622. X    FirstArg(XtNbackgroundPixmap, fillstyle_choices[NUMFILLPATS].blackPM);
  623. X    SetValues(ind_panel);
  624. X
  625. X    for (i = 0; i < NUM_IND_SW; ++i) {
  626. X    isw = &ind_switches[i];
  627. X    if (ind_switches[i].func == I_FILLSTYLE)
  628. X        fill_style_sw = isw;
  629. X
  630. X    p = XCreatePixmap(d, XtWindow(isw->widget), isw->sw_width,
  631. X              DEF_IND_SW_HT, DefaultDepthOfScreen(s));
  632. X    XFillRectangle(d, p, ind_blank_gc, 0, 0,
  633. X               isw->sw_width, DEF_IND_SW_HT);
  634. X    XDrawImageString(d, p, ind_button_gc, 3, 12, isw->line1, strlen(isw->line1));
  635. X    XDrawImageString(d, p, ind_button_gc, 3, 25, isw->line2, strlen(isw->line2));
  636. X
  637. X    isw->normalPM = button_args[6].value = (XtArgVal) p;
  638. X    XtSetValues(isw->widget, &button_args[6], 1);
  639. X    }
  640. X
  641. X    XDefineCursor(d, XtWindow(ind_panel), arrow_cursor);
  642. X    update_current_settings();
  643. X
  644. X    FirstArg(XtNmappedWhenManaged, True);
  645. X    SetValues(ind_panel);
  646. X}
  647. X
  648. Xupdate_indpanel(mask)
  649. X    int            mask;
  650. X{
  651. X    register int    i;
  652. X    register ind_sw_info *isw;
  653. X
  654. X    /* only update current mask if user wants to see relevant ind buttons */
  655. X    if (appres.ShowAllButtons)
  656. X    return;
  657. X
  658. X    cur_indmask = mask;
  659. X    XtUnmanageChild(ind_panel);
  660. X    for (isw = ind_switches, i = 0; i < NUM_IND_SW; isw++, i++) {
  661. X    if (isw->func & cur_indmask) {
  662. X        XtManageChild(isw->widget);
  663. X    } else {
  664. X        XtUnmanageChild(isw->widget);
  665. X    }
  666. X    }
  667. X    XtManageChild(ind_panel);
  668. X}
  669. X
  670. X/* come here when a button is pressed in the indicator panel */
  671. X
  672. Xstatic void
  673. Xsel_ind_but(widget, isw, event)
  674. X    Widget        widget;
  675. X    ind_sw_info       *isw;
  676. X    XButtonEvent   *event;
  677. X{
  678. X    if (event->button == Button3) {    /* right button */
  679. X    inc_action(isw);
  680. X    } else if (event->button == Button2) {    /* middle button */
  681. X    dec_action(isw);
  682. X    } else {            /* left button */
  683. X    if (isw->func == I_FONT)
  684. X        popup_fonts(isw);
  685. X    else if (isw->type == I_IVAL || isw->type == I_FVAL)
  686. X        popup_nval_panel(isw);
  687. X    else if (isw->type == I_CHOICE)
  688. X        popup_choice_panel(isw);
  689. X    }
  690. X}
  691. X
  692. Xstatic
  693. Xupdate_string_pixmap(isw, buf, xpos)
  694. X    ind_sw_info       *isw;
  695. X    char       *buf;
  696. X    int            xpos;
  697. X{
  698. X    XDrawImageString(tool_d, isw->normalPM, ind_button_gc,
  699. X             xpos, 18, buf, strlen(buf));
  700. X    /*
  701. X     * Fool the toolkit by changing the background pixmap to 0 then giving it
  702. X     * the modified one again.    Otherwise, it sees that the pixmap ID is not
  703. X     * changed and doesn't actually draw it into the widget window
  704. X     */
  705. X    button_args[6].value = 0;
  706. X    XtSetValues(isw->widget, &button_args[6], 1);
  707. X
  708. X    /* put the pixmap in the widget background */
  709. X    button_args[6].value = isw->normalPM;
  710. X    XtSetValues(isw->widget, &button_args[6], 1);
  711. X}
  712. X
  713. Xstatic
  714. Xupdate_choice_pixmap(isw, mode)
  715. X    ind_sw_info       *isw;
  716. X    int            mode;
  717. X{
  718. X    choice_info       *tmp_choice;
  719. X    int            i;
  720. X    register Pixmap p;
  721. X
  722. X    /* put the pixmap in the widget background */
  723. X    p = isw->normalPM;
  724. X    tmp_choice = isw->choices;
  725. X    for (i = mode; i > 0; i--, tmp_choice++);
  726. X    XPutImage(tool_d, p, ind_button_gc, tmp_choice->icon, 0, 0, 32, 0, 32, 32);
  727. X    /*
  728. X     * Fool the toolkit by changing the background pixmap to 0 then giving it
  729. X     * the modified one again.    Otherwise, it sees that the pixmap ID is not
  730. X     * changed and doesn't actually draw it into the widget window
  731. X     */
  732. X    button_args[6].value = 0;
  733. X    XtSetValues(isw->widget, &button_args[6], 1);
  734. X    button_args[6].value = p;
  735. X    XtSetValues(isw->widget, &button_args[6], 1);
  736. X}
  737. X
  738. X/********************************************************
  739. X
  740. X    auxiliary functions
  741. X
  742. X********************************************************/
  743. X
  744. Xstatic Widget    choice_popup;
  745. Xstatic ind_sw_info *choice_i;
  746. Xstatic Widget    nval_popup, form, cancel, set, beside, below, newvalue,
  747. X        label;
  748. Xstatic Widget    dash_length, dot_gap;
  749. Xstatic ind_sw_info *nval_i;
  750. X
  751. X
  752. Xstatic void
  753. Xchoice_panel_dismiss()
  754. X{
  755. X    XtDestroyWidget(choice_popup);
  756. X    XtSetSensitive(choice_i->widget, True);
  757. X}
  758. X
  759. Xstatic void
  760. Xchoice_panel_cancel(w, ev)
  761. X    Widget        w;
  762. X    XButtonEvent   *ev;
  763. X{
  764. X    choice_panel_dismiss();
  765. X}
  766. X
  767. Xstatic void
  768. Xchoice_panel_set(w, sel_choice, ev)
  769. X    Widget        w;
  770. X    choice_info       *sel_choice;
  771. X    XButtonEvent   *ev;
  772. X{
  773. X    (*choice_i->i_varadr) = sel_choice->value;
  774. X    show_action(choice_i);
  775. X
  776. X    /* auxiliary info */
  777. X    switch (choice_i->func) {
  778. X    case I_LINESTYLE:
  779. X    /* dash length */
  780. X    cur_dashlength = (float) atof(panel_get_value(dash_length));
  781. X    if (cur_dashlength <= 0.0)
  782. X        cur_dashlength = DEF_DASHLENGTH;
  783. X    /* dot gap */
  784. X    cur_dotgap = (float) atof(panel_get_value(dot_gap));
  785. X    if (cur_dotgap <= 0.0)
  786. X        cur_dotgap = DEF_DOTGAP;
  787. X    break;
  788. X    }
  789. X
  790. X    choice_panel_dismiss();
  791. X}
  792. X
  793. Xpopup_choice_panel(isw)
  794. X    ind_sw_info       *isw;
  795. X{
  796. X    Position        x_val, y_val;
  797. X    Dimension        width, height;
  798. X    char        buf[32];
  799. X    choice_info       *tmp_choice;
  800. X    Pixmap        p;
  801. X    Pixel        form_fg;
  802. X    register int    i;
  803. X
  804. X    choice_i = isw;
  805. X    XtSetSensitive(choice_i->widget, False);
  806. X
  807. X    FirstArg(XtNwidth, &width);
  808. X    NextArg(XtNheight, &height);
  809. X    GetValues(tool);
  810. X    /* position the popup 1/3 in from left and 2/3 down from top */
  811. X    XtTranslateCoords(tool, (Position) (width / 3), (Position) (2 * height / 3),
  812. X              &x_val, &y_val);
  813. X
  814. X    FirstArg(XtNx, x_val);
  815. X    NextArg(XtNy, y_val);
  816. X    NextArg(XtNresize, False);
  817. X    NextArg(XtNresizable, False);
  818. X    NextArg(XtNtitle, "Xfig: Set indicator panel");
  819. X
  820. X    choice_popup = XtCreatePopupShell("xfig_set_indicator_panel",
  821. X                      transientShellWidgetClass, tool,
  822. X                      Args, ArgCount);
  823. X
  824. X    form = XtCreateManagedWidget("form", formWidgetClass, choice_popup, NULL, 0);
  825. X
  826. X    FirstArg(XtNborderWidth, 0);
  827. X    sprintf(buf, "%s %s", isw->line1, isw->line2);
  828. X    label = XtCreateManagedWidget(buf, labelWidgetClass, form, Args, ArgCount);
  829. X
  830. X    FirstArg(XtNlabel, "cancel");
  831. X    NextArg(XtNfromVert, label);
  832. X    NextArg(XtNresize, False);
  833. X    NextArg(XtNresizable, False);
  834. X    NextArg(XtNheight, 32);
  835. X    NextArg(XtNborderWidth, INTERNAL_BW);
  836. X    cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
  837. X                   form, Args, ArgCount);
  838. X    XtAddEventHandler(cancel, ButtonReleaseMask, (Boolean) 0,
  839. X              (XtEventHandler)choice_panel_cancel, (XtPointer) NULL);
  840. X
  841. X    tmp_choice = isw->choices;
  842. X
  843. X    for (i = 0; i < isw->numchoices; tmp_choice++, i++) {
  844. X    if (isw->func == I_FILLSTYLE)
  845. X        p = ((cur_color==BLACK || cur_color==DEFAULT_COLOR ||
  846. X         (!all_colors_available && cur_color!=WHITE))?
  847. X        fillstyle_choices[i].blackPM :fillstyle_choices[i].normalPM);
  848. X    else if (isw->func == I_COLOR) {
  849. X        p = NULL;
  850. X        tmp_choice->value = (i >= NUMCOLORS ? DEFAULT_COLOR : i);
  851. X    } else
  852. X        p = XCreatePixmapFromBitmapData(tool_d, XtWindow(ind_panel),
  853. X                tmp_choice->icon->data, tmp_choice->icon->width,
  854. X               tmp_choice->icon->height, ind_but_fg, ind_but_bg,
  855. X                        DefaultDepthOfScreen(tool_s));
  856. X    if (i % isw->sw_per_row == 0) {
  857. X        if (i == 0)
  858. X        below = label;
  859. X        else
  860. X        below = beside;
  861. X        beside = cancel;
  862. X    }
  863. X    FirstArg(XtNfromVert, below);
  864. X    NextArg(XtNfromHoriz, beside);
  865. X    if (isw->func != I_COLOR) {
  866. X        NextArg(XtNbackgroundPixmap, p);
  867. X        NextArg(XtNwidth, tmp_choice->icon->width);
  868. X        NextArg(XtNheight, tmp_choice->icon->height);
  869. X    } else {        /* Color popup menu */
  870. X        NextArg(XtNheight, 32);
  871. X        NextArg(XtNwidth, 64);
  872. X        if (i < NUMCOLORS && i >= 0) {    /* it's a proper color */
  873. X        if (all_colors_available) {
  874. X            XColor        col;
  875. X
  876. X            col.pixel = appres.color[i];
  877. X            XQueryColor(tool_d, DefaultColormapOfScreen(tool_s), &col);
  878. X            if ((0.3 * col.red + 0.59 * col.green + 0.11 * col.blue) < 0.5 * (255 << 8))
  879. X            form_fg = appres.color[WHITE];
  880. X            else
  881. X            form_fg = appres.color[BLACK];
  882. X            NextArg(XtNforeground, form_fg);
  883. X            NextArg(XtNbackground, appres.color[i]);
  884. X        }
  885. X        NextArg(XtNlabel, colorNames[i + 1]);
  886. X        } else {        /* it's the default color */
  887. X        NextArg(XtNforeground, x_fg_color.pixel);
  888. X        NextArg(XtNlabel, colorNames[0]);
  889. X        }
  890. X    }
  891. X    NextArg(XtNresize, False);
  892. X    NextArg(XtNresizable, False);
  893. X    NextArg(XtNborderWidth, INTERNAL_BW);
  894. X    beside = XtCreateManagedWidget(" ", commandWidgetClass,
  895. X                       form, Args, ArgCount);
  896. X    XtAddEventHandler(beside, ButtonReleaseMask, (Boolean) 0,
  897. X              (XtEventHandler)choice_panel_set, (caddr_t) tmp_choice);
  898. X    }
  899. X
  900. X    /* auxiliary info */
  901. X    switch (isw->func) {
  902. X    case I_LINESTYLE:
  903. X    /* dash length */
  904. X    FirstArg(XtNfromVert, beside);
  905. X    NextArg(XtNborderWidth, 0);
  906. X    NextArg(XtNlabel, "Default dash length =");
  907. X    label = XtCreateManagedWidget("default_dash_length",
  908. X                    labelWidgetClass, form, Args, ArgCount);
  909. X    sprintf(buf, "%1.1f", cur_dashlength);
  910. X    FirstArg(XtNfromVert, beside);
  911. X    NextArg(XtNborderWidth, INTERNAL_BW);
  912. X    NextArg(XtNfromHoriz, label);
  913. X    NextArg(XtNstring, buf);
  914. X    NextArg(XtNinsertPosition, strlen(buf));
  915. X    NextArg(XtNeditType, "append");
  916. X    NextArg(XtNwidth, 40);
  917. X    dash_length = XtCreateManagedWidget(buf, asciiTextWidgetClass,
  918. X                        form, Args, ArgCount);
  919. X    /* dot gap */
  920. X    FirstArg(XtNfromVert, dash_length);
  921. X    NextArg(XtNborderWidth, 0);
  922. X    NextArg(XtNlabel, "    Default dot gap =");
  923. X    label = XtCreateManagedWidget("default_dot_gap",
  924. X                    labelWidgetClass, form, Args, ArgCount);
  925. X    sprintf(buf, "%1.1f", cur_dotgap);
  926. X    FirstArg(XtNfromVert, dash_length);
  927. X    NextArg(XtNborderWidth, INTERNAL_BW);
  928. X    NextArg(XtNfromHoriz, label);
  929. X    NextArg(XtNstring, buf);
  930. X    NextArg(XtNinsertPosition, strlen(buf));
  931. X    NextArg(XtNeditType, "append");
  932. X    NextArg(XtNwidth, 40);
  933. X    dot_gap = XtCreateManagedWidget(buf, asciiTextWidgetClass,
  934. X                    form, Args, ArgCount);
  935. X    break;
  936. X    }
  937. X
  938. X    XtPopup(choice_popup, XtGrabExclusive);
  939. X}
  940. X
  941. Xstatic void
  942. Xnval_panel_dismiss()
  943. X{
  944. X    XtDestroyWidget(nval_popup);
  945. X    XtSetSensitive(nval_i->widget, True);
  946. X}
  947. X
  948. Xstatic void
  949. Xnval_panel_cancel(w, ev)
  950. X    Widget        w;
  951. X    XButtonEvent   *ev;
  952. X{
  953. X    nval_panel_dismiss();
  954. X}
  955. X
  956. Xstatic void
  957. Xnval_panel_set(w, ev)
  958. X    Widget        w;
  959. X    XButtonEvent   *ev;
  960. X{
  961. X    int            new_i_value;
  962. X    float        new_f_value;
  963. X
  964. X
  965. X    if (nval_i->type == I_IVAL)
  966. X        {
  967. X        new_i_value = atoi(panel_get_value(newvalue));
  968. X        (*nval_i->i_varadr) = new_i_value;
  969. X        }
  970. X    else
  971. X        {
  972. X        new_f_value = atof(panel_get_value(newvalue));
  973. X        (*nval_i->f_varadr) = new_f_value;
  974. X        }
  975. X    nval_panel_dismiss();
  976. X    show_action(nval_i);
  977. X}
  978. X
  979. Xpopup_nval_panel(isw)
  980. X    ind_sw_info       *isw;
  981. X{
  982. X    Position        x_val, y_val;
  983. X    Dimension        width, height;
  984. X    char        buf[32];
  985. X
  986. X    nval_i = isw;
  987. X    XtSetSensitive(nval_i->widget, False);
  988. X
  989. X    FirstArg(XtNwidth, &width);
  990. X    NextArg(XtNheight, &height);
  991. X    GetValues(tool);
  992. X    /* position the popup 1/3 in from left and 2/3 down from top */
  993. X    XtTranslateCoords(tool, (Position) (width / 3), (Position) (2 * height / 3),
  994. X              &x_val, &y_val);
  995. X
  996. X    FirstArg(XtNx, x_val);
  997. X    NextArg(XtNy, y_val);
  998. X    NextArg(XtNwidth, 240);
  999. X
  1000. X    nval_popup = XtCreatePopupShell("xfig_set_indicator_panel",
  1001. X                    transientShellWidgetClass, tool,
  1002. X                    Args, ArgCount);
  1003. X
  1004. X    form = XtCreateManagedWidget("form", formWidgetClass, nval_popup, NULL, 0);
  1005. X
  1006. X    FirstArg(XtNborderWidth, 0);
  1007. X    sprintf(buf, "%s %s", isw->line1, isw->line2);
  1008. X    label = XtCreateManagedWidget(buf, labelWidgetClass, form, Args, ArgCount);
  1009. X
  1010. X    FirstArg(XtNfromVert, label);
  1011. X    NextArg(XtNborderWidth, 0);
  1012. X    NextArg(XtNlabel, "Value =");
  1013. X    newvalue = XtCreateManagedWidget("value", labelWidgetClass,
  1014. X                     form, Args, ArgCount);
  1015. X    /* int or float? */
  1016. X    if (isw->type == I_IVAL)
  1017. X        sprintf(buf, "%d", (*isw->i_varadr));
  1018. X    else
  1019. X        sprintf(buf, "%4.1f", (*isw->f_varadr));
  1020. X    FirstArg(XtNfromVert, label);
  1021. X    NextArg(XtNborderWidth, INTERNAL_BW);
  1022. X    NextArg(XtNfromHoriz, newvalue);
  1023. X    NextArg(XtNstring, buf);
  1024. X    NextArg(XtNinsertPosition, strlen(buf));
  1025. X    NextArg(XtNeditType, "append");
  1026. X    NextArg(XtNwidth, 40);
  1027. X    newvalue = XtCreateManagedWidget(buf, asciiTextWidgetClass,
  1028. X                     form, Args, ArgCount);
  1029. X
  1030. X    /* add translation and action to set value on carriage return */
  1031. X    XtAppAddActions(tool_app, set_actions, XtNumber(set_actions));
  1032. X    XtOverrideTranslations(newvalue, XtParseTranslationTable(set_translations));
  1033. X
  1034. X    FirstArg(XtNlabel, "cancel");
  1035. X    NextArg(XtNfromVert, newvalue);
  1036. X    NextArg(XtNborderWidth, INTERNAL_BW);
  1037. X    cancel = XtCreateManagedWidget("cancel", commandWidgetClass,
  1038. X                   form, Args, ArgCount);
  1039. X    XtAddEventHandler(cancel, ButtonReleaseMask, (Boolean) 0,
  1040. X              (XtEventHandler)nval_panel_cancel, (XtPointer) NULL);
  1041. X
  1042. X    FirstArg(XtNlabel, "set");
  1043. X    NextArg(XtNfromVert, newvalue);
  1044. X    NextArg(XtNfromHoriz, cancel);
  1045. X    NextArg(XtNborderWidth, INTERNAL_BW);
  1046. X    set = XtCreateManagedWidget("set", commandWidgetClass,
  1047. X                form, Args, ArgCount);
  1048. X    XtAddEventHandler(set, ButtonReleaseMask, (Boolean) 0,
  1049. X              (XtEventHandler)nval_panel_set, (XtPointer) NULL);
  1050. X
  1051. X    XtPopup(nval_popup, XtGrabExclusive);
  1052. X}
  1053. X
  1054. X/********************************************************
  1055. X
  1056. X    commands to change indicator settings
  1057. X
  1058. X********************************************************/
  1059. X
  1060. Xupdate_current_settings()
  1061. X{
  1062. X    int            i;
  1063. X    ind_sw_info       *isw;
  1064. X
  1065. X    for (i = 0; i < NUM_IND_SW; ++i) {
  1066. X    isw = &ind_switches[i];
  1067. X    show_action(isw);
  1068. X    }
  1069. X}
  1070. X
  1071. Xstatic
  1072. Xdec_choice(sw)
  1073. X    ind_sw_info       *sw;
  1074. X{
  1075. X    if (--(*sw->i_varadr) < 0)
  1076. X    (*sw->i_varadr) = sw->numchoices - 1;
  1077. X    show_action(sw);
  1078. X}
  1079. X
  1080. Xstatic
  1081. Xinc_choice(sw)
  1082. X    ind_sw_info       *sw;
  1083. X{
  1084. X    if (++(*sw->i_varadr) > sw->numchoices - 1)
  1085. X    (*sw->i_varadr) = 0;
  1086. X    show_action(sw);
  1087. X}
  1088. X
  1089. X/* ARROW MODE         */
  1090. X
  1091. Xstatic
  1092. Xshow_arrowmode(sw)
  1093. X    ind_sw_info       *sw;
  1094. X{
  1095. X    update_choice_pixmap(sw, cur_arrowmode);
  1096. X    switch (cur_arrowmode) {
  1097. X    case L_NOARROWS:
  1098. X    autobackwardarrow_mode = 0;
  1099. X    autoforwardarrow_mode = 0;
  1100. X    put_msg("NO ARROWS");
  1101. X    break;
  1102. X    case L_FARROWS:
  1103. X    autobackwardarrow_mode = 0;
  1104. X    autoforwardarrow_mode = 1;
  1105. X    put_msg("Auto FORWARD ARROWS (for ARC, POLYLINE and SPLINE)");
  1106. X    break;
  1107. X    case L_FBARROWS:
  1108. X    autobackwardarrow_mode = 1;
  1109. X    autoforwardarrow_mode = 1;
  1110. X    put_msg("Auto FORWARD and BACKWARD ARROWS (for ARC, POLYLINE and SPLINE)");
  1111. X    break;
  1112. X    case L_BARROWS:
  1113. X    autobackwardarrow_mode = 1;
  1114. X    autoforwardarrow_mode = 0;
  1115. X    put_msg("Auto BACKWARD ARROWS (for ARC, POLYLINE and SPLINE)");
  1116. X    break;
  1117. X    }
  1118. X}
  1119. X
  1120. X/* LINE WIDTH         */
  1121. X
  1122. X#define MAXLINEWIDTH 200
  1123. X
  1124. Xstatic
  1125. Xdec_linewidth(sw)
  1126. X    ind_sw_info       *sw;
  1127. X{
  1128. X    --cur_linewidth;
  1129. X    show_linewidth(sw);
  1130. X}
  1131. X
  1132. Xstatic
  1133. Xinc_linewidth(sw)
  1134. X    ind_sw_info       *sw;
  1135. X{
  1136. X    ++cur_linewidth;
  1137. X    show_linewidth(sw);
  1138. X}
  1139. X
  1140. Xstatic
  1141. Xshow_linewidth(sw)
  1142. X    ind_sw_info       *sw;
  1143. X{
  1144. X    if (cur_linewidth > MAXLINEWIDTH)
  1145. X    cur_linewidth = MAXLINEWIDTH;
  1146. X    else if (cur_linewidth < 0)
  1147. X    cur_linewidth = 0;
  1148. X
  1149. X    /* erase by drawing wide, inverted (white) line */
  1150. X    pw_vector(sw->normalPM, DEF_IND_SW_WD / 2 + 2, DEF_IND_SW_HT / 2,
  1151. X          sw->sw_width - 2, DEF_IND_SW_HT / 2, ERASE,
  1152. X          DEF_IND_SW_HT, PANEL_LINE, 0.0, DEFAULT_COLOR);
  1153. X    /* draw current line thickness into pixmap */
  1154. X    if (cur_linewidth > 0)    /* don't draw line for zero-thickness */
  1155. X    pw_vector(sw->normalPM, DEF_IND_SW_WD / 2 + 2, DEF_IND_SW_HT / 2,
  1156. X          sw->sw_width - 2, DEF_IND_SW_HT / 2, PAINT,
  1157. X          cur_linewidth, PANEL_LINE, 0.0, DEFAULT_COLOR);
  1158. X
  1159. X    /*
  1160. X     * Fool the toolkit by changing the background pixmap to 0 then giving it
  1161. X     * the modified one again.    Otherwise, it sees that the pixmap ID is not
  1162. X     * changed and doesn't actually draw it into the widget window
  1163. X     */
  1164. X    button_args[6].value = 0;
  1165. X    XtSetValues(sw->widget, &button_args[6], 1);
  1166. X    /* put the pixmap in the widget background */
  1167. X    button_args[6].value = (XtArgVal) sw->normalPM;
  1168. X    XtSetValues(sw->widget, &button_args[6], 1);
  1169. X    put_msg("LINE Thickness = %d", cur_linewidth);
  1170. X}
  1171. X
  1172. X/* ANGLE GEOMETRY         */
  1173. X
  1174. Xstatic
  1175. Xshow_anglegeom(sw)
  1176. X    ind_sw_info       *sw;
  1177. X{
  1178. X    update_choice_pixmap(sw, cur_anglegeom);
  1179. X    switch (cur_anglegeom) {
  1180. X    case L_UNCONSTRAINED:
  1181. X    manhattan_mode = 0;
  1182. X    mountain_mode = 0;
  1183. X    latexline_mode = 0;
  1184. X    latexarrow_mode = 0;
  1185. X    put_msg("UNCONSTRAINED geometry (for POLYLINE and SPLINE)");
  1186. X    break;
  1187. X    case L_MOUNTHATTAN:
  1188. X    mountain_mode = 1;
  1189. X    manhattan_mode = 1;
  1190. X    latexline_mode = 0;
  1191. X    latexarrow_mode = 0;
  1192. X    put_msg("MOUNT-HATTAN geometry (for POLYLINE and SPLINE)");
  1193. X    break;
  1194. X    case L_MANHATTAN:
  1195. X    manhattan_mode = 1;
  1196. X    mountain_mode = 0;
  1197. X    latexline_mode = 0;
  1198. X    latexarrow_mode = 0;
  1199. X    put_msg("MANHATTAN geometry (for POLYLINE and SPLINE)");
  1200. X    break;
  1201. X    case L_MOUNTAIN:
  1202. X    mountain_mode = 1;
  1203. X    manhattan_mode = 0;
  1204. X    latexline_mode = 0;
  1205. X    latexarrow_mode = 0;
  1206. X    put_msg("MOUNTAIN geometry (for POLYLINE and SPLINE)");
  1207. X    break;
  1208. X    case L_LATEXLINE:
  1209. X    latexline_mode = 1;
  1210. X    manhattan_mode = 0;
  1211. X    mountain_mode = 0;
  1212. X    latexarrow_mode = 0;
  1213. X    put_msg("LATEX LINE geometry: allow only LaTeX line slopes");
  1214. X    break;
  1215. X    case L_LATEXARROW:
  1216. X    latexarrow_mode = 1;
  1217. X    manhattan_mode = 0;
  1218. X    mountain_mode = 0;
  1219. X    latexline_mode = 0;
  1220. X    put_msg("LATEX ARROW geometry: allow only LaTeX arrow slopes");
  1221. X    break;
  1222. X    }
  1223. X}
  1224. X
  1225. X/* LINE STYLE         */
  1226. X
  1227. Xstatic
  1228. Xshow_linestyle(sw)
  1229. X    ind_sw_info       *sw;
  1230. X{
  1231. X    update_choice_pixmap(sw, cur_linestyle);
  1232. X    switch (cur_linestyle) {
  1233. X    case SOLID_LINE:
  1234. X    cur_styleval = 0.0;
  1235. X    put_msg("SOLID LINE STYLE (for BOX, POLYGON and POLYLINE)");
  1236. X    break;
  1237. X    case DASH_LINE:
  1238. X    cur_styleval = cur_dashlength;
  1239. X    put_msg("DASH LINE STYLE (for BOX, POLYGON and POLYLINE)");
  1240. X    break;
  1241. X    case DOTTED_LINE:
  1242. X    cur_styleval = cur_dotgap;
  1243. X    put_msg("DOTTED LINE STYLE (for BOX, POLYGON and POLYLINE)");
  1244. X    break;
  1245. X    }
  1246. X}
  1247. X
  1248. X/* VERTICAL ALIGNMENT     */
  1249. X
  1250. Xstatic
  1251. Xshow_valign(sw)
  1252. X    ind_sw_info       *sw;
  1253. X{
  1254. X    update_choice_pixmap(sw, cur_valign);
  1255. X    switch (cur_valign) {
  1256. X    case NONE:
  1257. X    put_msg("No vertical alignment");
  1258. X    break;
  1259. X    case TOP:
  1260. X    put_msg("Vertically align to TOP");
  1261. X    break;
  1262. X    case CENTER:
  1263. X    put_msg("Center vertically when aligning");
  1264. X    break;
  1265. X    case BOTTOM:
  1266. X    put_msg("Vertically align to BOTTOM");
  1267. X    break;
  1268. X    }
  1269. X}
  1270. X
  1271. X/* HORIZ ALIGNMENT     */
  1272. X
  1273. Xstatic
  1274. Xshow_halign(sw)
  1275. X    ind_sw_info       *sw;
  1276. X{
  1277. X    update_choice_pixmap(sw, cur_halign);
  1278. X    switch (cur_halign) {
  1279. X    case NONE:
  1280. X    put_msg("No horizontal alignment");
  1281. X    break;
  1282. X    case LEFT:
  1283. X    put_msg("Horizontally align to LEFT");
  1284. X    break;
  1285. X    case CENTER:
  1286. X    put_msg("Center horizontally when aligning");
  1287. X    break;
  1288. X    case RIGHT:
  1289. X    put_msg("Horizontally align to RIGHT");
  1290. X    break;
  1291. X    }
  1292. X}
  1293. X
  1294. X/* GRID MODE     */
  1295. X
  1296. Xstatic
  1297. Xshow_gridmode(sw)
  1298. X    ind_sw_info       *sw;
  1299. X{
  1300. X    static int        prev_gridmode = -1;
  1301. X
  1302. X    update_choice_pixmap(sw, cur_gridmode);
  1303. X    switch (cur_gridmode) {
  1304. X    case GRID_0:
  1305. X    put_msg("No grid");
  1306. X    break;
  1307. X    case GRID_1:
  1308. X    put_msg("Small grid");
  1309. X    break;
  1310. X    case GRID_2:
  1311. X    put_msg("Large grid");
  1312. X    break;
  1313. X    }
  1314. X    if (cur_gridmode != prev_gridmode)
  1315. X    setup_grid(cur_gridmode);
  1316. X    prev_gridmode = cur_gridmode;
  1317. X}
  1318. X
  1319. X/* POINT POSITION     */
  1320. X
  1321. Xstatic
  1322. Xshow_pointposn(sw)
  1323. X    ind_sw_info       *sw;
  1324. X{
  1325. X    char        buf[80];
  1326. X
  1327. X    update_choice_pixmap(sw, cur_pointposn);
  1328. X    switch (cur_pointposn) {
  1329. X    case P_ANY:
  1330. X    put_msg("Arbitrary Positioning of Points");
  1331. X    break;
  1332. X    case P_MAGNET:
  1333. X    case P_GRID1:
  1334. X    case P_GRID2:
  1335. X    sprintf(buf,
  1336. X      "MAGNET MODE: entered points rounded to the nearest %s increment",
  1337. X        grid_name[cur_pointposn]);
  1338. X    put_msg(buf);
  1339. X    break;
  1340. X    }
  1341. X}
  1342. X
  1343. X/* SMART LINK MODE */
  1344. X
  1345. Xstatic
  1346. Xshow_linkmode(sw)
  1347. X    ind_sw_info       *sw;
  1348. X{
  1349. X    update_choice_pixmap(sw, cur_linkmode);
  1350. X    switch (cur_linkmode) {
  1351. X    case SMART_OFF:
  1352. X    put_msg("Do not adjust links automatically");
  1353. X    break;
  1354. X    case SMART_MOVE:
  1355. X    put_msg("Adjust links automatically by moving endpoint");
  1356. X    break;
  1357. X    case SMART_SLIDE:
  1358. X    put_msg("Adjust links automatically by sliding endlink");
  1359. X    break;
  1360. X    }
  1361. X}
  1362. X
  1363. X/* TEXT JUSTIFICATION     */
  1364. X
  1365. Xstatic
  1366. Xshow_textjust(sw)
  1367. X    ind_sw_info       *sw;
  1368. X{
  1369. X    update_choice_pixmap(sw, cur_textjust);
  1370. X    switch (cur_textjust) {
  1371. X    case T_LEFT_JUSTIFIED:
  1372. X    put_msg("Left justify text");
  1373. X    break;
  1374. X    case T_CENTER_JUSTIFIED:
  1375. X    put_msg("Center text");
  1376. X    break;
  1377. X    case T_RIGHT_JUSTIFIED:
  1378. X    put_msg("Right justify text");
  1379. X    break;
  1380. X    }
  1381. X}
  1382. X
  1383. X/* BOX RADIUS     */
  1384. X
  1385. Xstatic
  1386. Xdec_boxradius(sw)
  1387. X    ind_sw_info       *sw;
  1388. X{
  1389. X    --cur_boxradius;
  1390. X    show_boxradius(sw);
  1391. X}
  1392. X
  1393. Xstatic
  1394. Xinc_boxradius(sw)
  1395. X    ind_sw_info       *sw;
  1396. X{
  1397. X    ++cur_boxradius;
  1398. X    show_boxradius(sw);
  1399. X}
  1400. X
  1401. X#define MAXRADIUS 30
  1402. Xstatic
  1403. Xshow_boxradius(sw)
  1404. X    ind_sw_info       *sw;
  1405. X{
  1406. X    if (cur_boxradius > MAXRADIUS)
  1407. X    cur_boxradius = MAXRADIUS;
  1408. X    else if (cur_boxradius < 3)
  1409. X    cur_boxradius = 3;
  1410. X    /* erase by drawing wide, inverted (white) line */
  1411. X    pw_vector(sw->normalPM, DEF_IND_SW_WD / 2, DEF_IND_SW_HT / 2,
  1412. X          DEF_IND_SW_WD, DEF_IND_SW_HT / 2, ERASE,
  1413. X          DEF_IND_SW_HT, PANEL_LINE, 0.0, DEFAULT_COLOR);
  1414. X    /* draw current radius into pixmap */
  1415. X    curve(sw->normalPM, 0, cur_boxradius, -cur_boxradius, 0, 1,
  1416. X      cur_boxradius, cur_boxradius, DEF_IND_SW_WD - 2, DEF_IND_SW_HT - 2,
  1417. X      PAINT, 1, PANEL_LINE, 0.0, 0, DEFAULT_COLOR);
  1418. X
  1419. X    /*
  1420. X     * Fool the toolkit by changing the background pixmap to 0 then giving it
  1421. X     * the modified one again.    Otherwise, it sees that the pixmap ID is not
  1422. X     * changed and doesn't actually draw it into the widget window
  1423. X     */
  1424. X    button_args[6].value = 0;
  1425. X    XtSetValues(sw->widget, &button_args[6], 1);
  1426. X    /* put the pixmap in the widget background */
  1427. X    button_args[6].value = (XtArgVal) sw->normalPM;
  1428. X    XtSetValues(sw->widget, &button_args[6], 1);
  1429. X    put_msg("ROUNDED-CORNER BOX Radius = %d", cur_boxradius);
  1430. X}
  1431. X
  1432. X/* FILL STYLE */
  1433. X
  1434. Xstatic
  1435. Xdarken_fill(sw)
  1436. X    ind_sw_info       *sw;
  1437. X{
  1438. X    if (++cur_fillstyle > NUMFILLPATS)
  1439. X    cur_fillstyle = 0;
  1440. X    show_fillstyle(sw);
  1441. X}
  1442. X
  1443. Xstatic
  1444. Xlighten_fill(sw)
  1445. X    ind_sw_info       *sw;
  1446. X{
  1447. X    if (--cur_fillstyle < 0)
  1448. X    cur_fillstyle = NUMFILLPATS;
  1449. X    show_fillstyle(sw);
  1450. X}
  1451. X
  1452. Xstatic
  1453. Xshow_fillstyle(sw)
  1454. X    ind_sw_info       *sw;
  1455. X{
  1456. X    if (cur_fillstyle == 0) {
  1457. X    XCopyArea(tool_d, ((cur_color==BLACK ||
  1458. X           (cur_color==DEFAULT_COLOR && x_fg_color.pixel==appres.color[BLACK]) ||
  1459. X            (!all_colors_available && cur_color!=WHITE))? 
  1460. X            fillstyle_choices[0].blackPM: fillstyle_choices[0].normalPM),
  1461. X            sw->normalPM,
  1462. X            ind_button_gc, 0, 0, 32, 32, 32, 0);
  1463. X    put_msg("NO-FILL MODE");
  1464. X    } else {
  1465. X    /* put the pixmap in the widget background */
  1466. X    XCopyArea(tool_d, ((cur_color==BLACK ||
  1467. X           (cur_color==DEFAULT_COLOR && x_fg_color.pixel==appres.color[BLACK]) ||
  1468. X            (!all_colors_available && cur_color!=WHITE))? 
  1469. X                fillstyle_choices[cur_fillstyle].blackPM:
  1470. X                fillstyle_choices[cur_fillstyle].normalPM),
  1471. X            sw->normalPM,
  1472. X            ind_button_gc, 0, 0, 26, 24, 35, 4);
  1473. X    put_msg("FILL MODE (black density/color intensity = %d%%)",
  1474. X        ((cur_fillstyle - 1) * 100) / (NUMFILLPATS - 1));
  1475. X    }
  1476. X    button_args[6].value = 0;
  1477. X    XtSetValues(sw->widget, &button_args[6], 1);
  1478. X    button_args[6].value = (XtArgVal) sw->normalPM;
  1479. X    XtSetValues(sw->widget, &button_args[6], 1);
  1480. X}
  1481. X
  1482. X/* COLOR */
  1483. X
  1484. Xstatic
  1485. Xnext_color(sw)
  1486. X    ind_sw_info       *sw;
  1487. X{
  1488. X    if (++cur_color >= NUMCOLORS)
  1489. X    cur_color = DEFAULT_COLOR;
  1490. X    show_color(sw);
  1491. X}
  1492. X
  1493. Xstatic
  1494. Xprev_color(sw)
  1495. X    ind_sw_info       *sw;
  1496. X{
  1497. X    if (--cur_color < DEFAULT_COLOR)
  1498. X    cur_color = NUMCOLORS - 1;
  1499. X    show_color(sw);
  1500. X}
  1501. X
  1502. Xstatic
  1503. Xshow_color(sw)
  1504. X    ind_sw_info       *sw;
  1505. X{
  1506. X    int            color;
  1507. X
  1508. X    if (cur_color < 0 || cur_color >= NUMCOLORS) {
  1509. X    cur_color == DEFAULT_COLOR;
  1510. X    color = x_fg_color.pixel;
  1511. X    } else
  1512. X    color = all_colors_available ? appres.color[cur_color] : x_fg_color.pixel;
  1513. X
  1514. X    put_msg("Color set to %s", colorNames[cur_color + 1]);
  1515. X    XSetForeground(tool_d, color_gc, color);
  1516. X    /* now fill the color rectangle with the new color */
  1517. X    XFillRectangle(tool_d, sw->normalPM, color_gc, sw->sw_width - 29, 4, 26, 24);
  1518. X    /*
  1519. X     * write the widget background over old color name before writing new
  1520. X     * name
  1521. X     */
  1522. X    /* first set the foreground color to the background for the fill */
  1523. X    XSetForeground(tool_d, ind_button_gc, ind_but_bg);
  1524. X    XFillRectangle(tool_d, sw->normalPM, ind_button_gc, 0, DEF_IND_SW_HT / 2,
  1525. X           sw->sw_width - 29, DEF_IND_SW_HT / 2);
  1526. X    /* now restore the foreground in the gc */
  1527. X    XSetForeground(tool_d, ind_button_gc, ind_but_fg);
  1528. X    XDrawImageString(tool_d, sw->normalPM, ind_button_gc, 3, 25,
  1529. X          colorNames[cur_color + 1], strlen(colorNames[cur_color + 1]));
  1530. X    button_args[6].value = 0;
  1531. X    XtSetValues(sw->widget, &button_args[6], 1);
  1532. X    button_args[6].value = (XtArgVal) sw->normalPM;
  1533. X    XtSetValues(sw->widget, &button_args[6], 1);
  1534. X    show_fillstyle(fill_style_sw);
  1535. X}
  1536. X
  1537. X/* FONT */
  1538. X
  1539. Xstatic
  1540. Xinc_font(sw)
  1541. X    ind_sw_info       *sw;
  1542. X{
  1543. X    if (using_ps)
  1544. X    cur_ps_font++;
  1545. X    else
  1546. X    cur_latex_font++;
  1547. X    show_font(sw);
  1548. X}
  1549. X
  1550. Xstatic
  1551. Xdec_font(sw)
  1552. X    ind_sw_info       *sw;
  1553. X{
  1554. X    if (using_ps)
  1555. X    cur_ps_font--;
  1556. X    else
  1557. X    cur_latex_font--;
  1558. X    show_font(sw);
  1559. X}
  1560. X
  1561. Xstatic
  1562. Xshow_font(sw)
  1563. X    ind_sw_info       *sw;
  1564. X{
  1565. X    if (using_ps) {
  1566. X    if (cur_ps_font >= NUM_PS_FONTS)
  1567. X        cur_ps_font = DEFAULT;
  1568. X    else if (cur_ps_font < DEFAULT)
  1569. X        cur_ps_font = NUM_PS_FONTS - 1;
  1570. X    } else {
  1571. X    if (cur_latex_font >= NUM_LATEX_FONTS)
  1572. X        cur_latex_font = 0;
  1573. X    else if (cur_latex_font < 0)
  1574. X        cur_latex_font = NUM_LATEX_FONTS - 1;
  1575. X    }
  1576. X
  1577. X    /* erase larger fontpane bits if we switched to smaller (Latex) */
  1578. X    XFillRectangle(tool_d, sw->normalPM, ind_blank_gc, 0, 0,
  1579. X           32 + max2(PS_FONTPANE_WD, LATEX_FONTPANE_WD), DEF_IND_SW_HT);
  1580. X    /* and redraw info */
  1581. X    XDrawImageString(tool_d, sw->normalPM, ind_button_gc, 3, 12, sw->line1,
  1582. X             strlen(sw->line1));
  1583. X    XDrawImageString(tool_d, sw->normalPM, ind_button_gc, 3, 25, sw->line2,
  1584. X             strlen(sw->line2));
  1585. X
  1586. X    XCopyArea(tool_d, using_ps ? psfont_menu_bitmaps[cur_ps_font + 1] :
  1587. X          latexfont_menu_bitmaps[cur_latex_font],
  1588. X          sw->normalPM, ind_button_gc, 0, 0,
  1589. X          using_ps ? PS_FONTPANE_WD : LATEX_FONTPANE_WD,
  1590. X          using_ps ? PS_FONTPANE_HT : LATEX_FONTPANE_HT,
  1591. X      using_ps ? 32 : 32 + (PS_FONTPANE_WD - LATEX_FONTPANE_WD) / 2, 6);
  1592. X
  1593. X    button_args[6].value = 0;
  1594. X    XtSetValues(sw->widget, &button_args[6], 1);
  1595. X    /* put the pixmap in the widget background */
  1596. X    button_args[6].value = (XtArgVal) sw->normalPM;
  1597. X    XtSetValues(sw->widget, &button_args[6], 1);
  1598. X    put_msg("Font: %s", using_ps ? ps_fontinfo[cur_ps_font + 1].name :
  1599. X        latex_fontinfo[cur_latex_font].name);
  1600. X}
  1601. X
  1602. X/* popup menu of printer fonts */
  1603. X
  1604. Xstatic int    psflag;
  1605. Xstatic ind_sw_info *return_sw;
  1606. X
  1607. Xint        show_font_return();
  1608. X
  1609. Xstatic
  1610. Xpopup_fonts(sw)
  1611. X    ind_sw_info       *sw;
  1612. X{
  1613. X    return_sw = sw;
  1614. X    psflag = using_ps ? 1 : 0;
  1615. X    fontpane_popup(&cur_ps_font, &cur_latex_font, &psflag,
  1616. X           show_font_return, sw->widget);
  1617. X}
  1618. X
  1619. Xshow_font_return(w)
  1620. X    Widget        w;
  1621. X{
  1622. X    if (psflag)
  1623. X    cur_textflags = cur_textflags | PSFONT_TEXT;
  1624. X    else
  1625. X    cur_textflags = cur_textflags & (~PSFONT_TEXT);
  1626. X    show_font(return_sw);
  1627. X}
  1628. X
  1629. X/* increase font size */
  1630. X
  1631. Xstatic
  1632. Xinc_fontsize(sw)
  1633. X    ind_sw_info       *sw;
  1634. X{
  1635. X    if (cur_fontsize >= 100) {
  1636. X    cur_fontsize = (cur_fontsize / 10) * 10;    /* round first */
  1637. X    cur_fontsize += 10;
  1638. X    } else if (cur_fontsize >= 50) {
  1639. X    cur_fontsize = (cur_fontsize / 5) * 5;
  1640. X    cur_fontsize += 5;
  1641. X    } else if (cur_fontsize >= 20) {
  1642. X    cur_fontsize = (cur_fontsize / 2) * 2;
  1643. X    cur_fontsize += 2;
  1644. X    } else
  1645. X    cur_fontsize++;
  1646. X    show_fontsize(sw);
  1647. X}
  1648. X
  1649. X
  1650. X/* decrease font size */
  1651. X
  1652. Xstatic
  1653. Xdec_fontsize(sw)
  1654. X    ind_sw_info       *sw;
  1655. X{
  1656. X    if (cur_fontsize > 100) {
  1657. X    cur_fontsize = (cur_fontsize / 10) * 10;    /* round first */
  1658. X    cur_fontsize -= 10;
  1659. X    } else if (cur_fontsize > 50) {
  1660. X    cur_fontsize = (cur_fontsize / 5) * 5;
  1661. X    cur_fontsize -= 5;
  1662. X    } else if (cur_fontsize > 20) {
  1663. X    cur_fontsize = (cur_fontsize / 2) * 2;
  1664. X    cur_fontsize -= 2;
  1665. X    } else if (cur_fontsize > 4)
  1666. X    cur_fontsize--;
  1667. X    show_fontsize(sw);
  1668. X}
  1669. X
  1670. Xstatic
  1671. Xshow_fontsize(sw)
  1672. X    ind_sw_info       *sw;
  1673. X{
  1674. X    if (cur_fontsize < 4)
  1675. X    cur_fontsize = 4;
  1676. X    else if (cur_fontsize > 1000)
  1677. X    cur_fontsize = 1000;
  1678. X
  1679. X    put_msg("Font size %d", cur_fontsize);
  1680. X    /* write the font size in the background pixmap */
  1681. X    indbuf[0] = indbuf[1] = indbuf[2] = indbuf[3] = indbuf[4] = '\0';
  1682. X    sprintf(indbuf, "%4d", cur_fontsize);
  1683. X    update_string_pixmap(sw, indbuf, sw->sw_width - 28);
  1684. X}
  1685. X
  1686. Xstatic
  1687. Xinc_rotnangle(sw)
  1688. X    ind_sw_info       *sw;
  1689. X{
  1690. X    if (cur_rotnangle < 30 || cur_rotnangle >= 120)
  1691. X    cur_rotnangle = 30;
  1692. X    else if (cur_rotnangle < 45)
  1693. X    cur_rotnangle = 45;
  1694. X    else if (cur_rotnangle < 60)
  1695. X    cur_rotnangle = 60;
  1696. X    else if (cur_rotnangle < 90)
  1697. X    cur_rotnangle = 90;
  1698. X    else if (cur_rotnangle < 120)
  1699. X    cur_rotnangle = 120;
  1700. X    show_rotnangle(sw);
  1701. X}
  1702. X
  1703. Xstatic
  1704. Xdec_rotnangle(sw)
  1705. X    ind_sw_info       *sw;
  1706. X{
  1707. X    if (cur_rotnangle > 120 || cur_rotnangle <= 30)
  1708. X    cur_rotnangle = 120;
  1709. X    else if (cur_rotnangle > 90)
  1710. X    cur_rotnangle = 90;
  1711. X    else if (cur_rotnangle > 60)
  1712. X    cur_rotnangle = 60;
  1713. X    else if (cur_rotnangle > 45)
  1714. X    cur_rotnangle = 45;
  1715. X    else if (cur_rotnangle > 30)
  1716. X    cur_rotnangle = 30;
  1717. X    show_rotnangle(sw);
  1718. X}
  1719. X
  1720. Xstatic
  1721. Xshow_rotnangle(sw)
  1722. X    ind_sw_info       *sw;
  1723. X{
  1724. X    if (cur_rotnangle < 1)
  1725. X    cur_rotnangle = 1;
  1726. X    else if (cur_rotnangle > 180)
  1727. X    cur_rotnangle = 180;
  1728. X
  1729. X    put_msg("Angle of rotation %d", cur_rotnangle);
  1730. X    if (cur_rotnangle == old_rotnangle)
  1731. X    return;
  1732. X
  1733. X    /* write the font size in the background pixmap */
  1734. X    indbuf[0] = indbuf[1] = indbuf[2] = indbuf[3] = indbuf[4] = '\0';
  1735. X    sprintf(indbuf, "%3d", cur_rotnangle);
  1736. X    update_string_pixmap(sw, indbuf, sw->sw_width - 22);
  1737. X
  1738. X    /* change markers if we changed to or from 90 degrees (except at start) */
  1739. X    if (old_rotnangle != -1) {
  1740. X    if (cur_rotnangle == 90)
  1741. X        update_markers(M_ALL);
  1742. X    else if (old_rotnangle == 90)
  1743. X        update_markers(M_ROTATE_ANGLE);
  1744. X    }
  1745. X    old_rotnangle = cur_rotnangle;
  1746. X}
  1747. X
  1748. X/* NUMSIDES */
  1749. X
  1750. Xstatic
  1751. Xinc_numsides(sw)
  1752. X    ind_sw_info       *sw;
  1753. X{
  1754. X    cur_numsides++;
  1755. X    show_numsides(sw);
  1756. X}
  1757. X
  1758. Xstatic
  1759. Xdec_numsides(sw)
  1760. X    ind_sw_info       *sw;
  1761. X{
  1762. X    cur_numsides--;
  1763. X    show_numsides(sw);
  1764. X}
  1765. X
  1766. Xstatic
  1767. Xshow_numsides(sw)
  1768. X    ind_sw_info       *sw;
  1769. X{
  1770. X    if (cur_numsides < 3)
  1771. X    cur_numsides = 3;
  1772. X    else if (cur_numsides > 99)
  1773. X    cur_numsides = 99;
  1774. X
  1775. X    put_msg("Number of sides %2d", cur_numsides);
  1776. X    /* write the font size in the background pixmap */
  1777. X    indbuf[0] = indbuf[1] = indbuf[2] = indbuf[3] = indbuf[4] = '\0';
  1778. X    sprintf(indbuf, "%2d", cur_numsides);
  1779. X    update_string_pixmap(sw, indbuf, sw->sw_width - 18);
  1780. X}
  1781. X
  1782. X/* ZOOM */
  1783. X
  1784. Xstatic
  1785. Xinc_zoom(sw)
  1786. X    ind_sw_info       *sw;
  1787. X{
  1788. X    zoomscale++;
  1789. X    show_zoom(sw);
  1790. X}
  1791. X
  1792. Xstatic
  1793. Xdec_zoom(sw)
  1794. X    ind_sw_info       *sw;
  1795. X{
  1796. X    zoomscale--;
  1797. X    show_zoom(sw);
  1798. X}
  1799. X
  1800. Xshow_zoom(sw)
  1801. X    ind_sw_info       *sw;
  1802. X{
  1803. X    if (zoomscale < 1)
  1804. X    zoomscale = 1;
  1805. X    else if (zoomscale > 10)
  1806. X    zoomscale = 10;
  1807. X
  1808. X    put_msg("Zoom scale %2d", zoomscale);
  1809. X    if (zoomscale == old_zoomscale)
  1810. X    return;
  1811. X
  1812. X    /* write the font size in the background pixmap */
  1813. X    indbuf[0] = indbuf[1] = indbuf[2] = indbuf[3] = indbuf[4] = '\0';
  1814. X    sprintf(indbuf, "%2d", zoomscale);
  1815. X    update_string_pixmap(sw, indbuf, sw->sw_width - 18);
  1816. X
  1817. X    /* fix up the rulers and grid */
  1818. X    reset_rulers();
  1819. X    redisplay_rulers();
  1820. X    setup_grid(cur_gridmode);
  1821. X    old_zoomscale = zoomscale;
  1822. X}
  1823. X
  1824. X/* TEXTSTEP */
  1825. X
  1826. Xstatic
  1827. Xinc_textstep(sw)
  1828. X    ind_sw_info       *sw;
  1829. X{
  1830. X    if (cur_textstep >= 10.0) {
  1831. X    cur_textstep = (int) cur_textstep;    /* round first */
  1832. X    cur_textstep += 1.0;
  1833. X    } else if (cur_textstep >= 5.0) {
  1834. X    cur_textstep = ((int)(cur_textstep*2.0+0.01))/2.0;
  1835. X    cur_textstep += 0.5;
  1836. X    } else if (cur_textstep >= 2.0) {
  1837. X    cur_textstep = ((int)(cur_textstep*5.0+0.01))/5.0;
  1838. X    cur_textstep += 0.2;
  1839. X    } else
  1840. X    cur_textstep += 0.1;
  1841. X    show_textstep(sw);
  1842. X}
  1843. X
  1844. Xstatic
  1845. Xdec_textstep(sw)
  1846. X    ind_sw_info       *sw;
  1847. X{
  1848. X    if (cur_textstep > 10.0) {
  1849. X    cur_textstep = (int)cur_textstep;    /* round first */
  1850. X    cur_textstep -= 1.0;
  1851. X    } else if (cur_textstep > 5.0) {
  1852. X    cur_textstep = ((int)(cur_textstep*2.0+0.01))/2.0;
  1853. X    cur_textstep -= 0.5;
  1854. X    } else if (cur_textstep > 2.0) {
  1855. X    cur_textstep = ((int)(cur_textstep*5.0+0.01))/5.0;
  1856. X    cur_textstep -= 0.2;
  1857. X    } else if (cur_textstep > 0.4)
  1858. X    cur_textstep -= 0.1;
  1859. X    show_textstep(sw);
  1860. X}
  1861. X
  1862. X/* could make this more generic - but a copy will do for font set JNT */
  1863. Xstatic
  1864. Xshow_textstep(sw)
  1865. X    ind_sw_info       *sw;
  1866. X{
  1867. X    if (cur_textstep < 0)
  1868. X    cur_textstep = 0;
  1869. X    else if (cur_textstep > 99.0)
  1870. X    cur_textstep = 99.0;
  1871. X
  1872. X    put_fmsg("Font step %.1f", cur_textstep);
  1873. X    /* write the font size in the background pixmap */
  1874. X    indbuf[0] = indbuf[1] = indbuf[2] = indbuf[3] = indbuf[4] = '\0';
  1875. X    sprintf(indbuf, "%4.1f", cur_textstep);
  1876. X    update_string_pixmap(sw, indbuf, sw->sw_width - 28);
  1877. X}
  1878. END_OF_FILE
  1879. if test 43799 -ne `wc -c <'w_indpanel.c'`; then
  1880.     echo shar: \"'w_indpanel.c'\" unpacked with wrong size!
  1881. fi
  1882. # end of 'w_indpanel.c'
  1883. fi
  1884. echo shar: End of archive 1 \(of 25\).
  1885. cp /dev/null ark1isdone
  1886. MISSING=""
  1887. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
  1888.     if test ! -f ark${I}isdone ; then
  1889.     MISSING="${MISSING} ${I}"
  1890.     fi
  1891. done
  1892. if test "${MISSING}" = "" ; then
  1893.     echo You have unpacked all 25 archives.
  1894.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1895. else
  1896.     echo You still need to unpack the following archives:
  1897.     echo "        " ${MISSING}
  1898. fi
  1899. ##  End of shell archive.
  1900. exit 0
  1901. -- 
  1902. Molecular Simulations, Inc.             mail: dcmartin@msi.com
  1903. 796 N. Pastoria Avenue                  uucp: uunet!dcmartin
  1904. Sunnyvale, California 94086             at&t: 408/522-9236
  1905.