1 /*
2  * @(#)help.c	1.2	01/03/85
3  *
4  * Routines to provide help screens for the SUN Gremlin picture editor.
5  *
6  * Mark Opperman (opcode@monet.BERKELEY)
7  *
8  */
9 
10 #include <suntool/tool_hs.h>
11 #include "gremlin.h"
12 #include "icondata.h"
13 
14 /* imports from main.c */
15 
16 extern struct pixwin *pix_pw;
17 extern struct rect pix_size;
18 extern struct pixrect *scratch_pr;
19 extern struct pixfont *text_pf;
20 extern pix_fd;
21 extern menu_fd;
22 extern text_fd;
23 extern tool_fd;
24 
25 /* imports from sun.c */
26 
27 extern get_any_button();
28 
29 /* locals */
30 
31 static help_x, help_y;		/* current position on help screen */
32 
33 #define help_dy  (text_pf->pf_defaultsize.y)
34 #define HELP_LEFT 8
35 #define HELP_SKIP 16
36 
37 
38 /*
39  * Display a help screen consisting of a pixrect, a title and some text.
40  * The current picture is saved in the scratch pixrect before displaying
41  * the help screen.  After the user presses a mouse button, the picture
42  * is restored and processing continues.
43  */
44 static
45 help_screen(icon_pr, title, text)
46 struct pixrect *icon_pr;
47 char *title, *text;
48 {
49     /* save current display */
50     pw_read(scratch_pr, 0, 0, pix_size.r_width, pix_size.r_height, PIX_SRC,
51 			pix_pw, 0, 0);
52 
53     /* clear picture subwindow before help screen display */
54     pw_writebackground(pix_pw, 0, 0, 2000, 2000, PIX_SRC);
55 
56     help_x = HELP_LEFT;
57     help_y = 8;
58 
59     /* display icon if not a NULL pointer */
60     if (icon_pr != NULL) {
61 	pw_write(pix_pw, help_x, help_y, icon_pr->pr_size.x, icon_pr->pr_size.y,
62 			 PIX_SRC, icon_pr, 0, 0);
63 	help_x += icon_pr->pr_size.x + HELP_SKIP;
64 	help_message(title);
65 	help_y += icon_pr->pr_size.y + HELP_SKIP;
66     }
67     else {
68 	help_message(title);
69 	help_y += help_dy + HELP_SKIP;
70     }
71 
72     help_x = HELP_LEFT;
73     help_message(text);
74 
75     help_y += HELP_SKIP;
76     help_x = HELP_LEFT;
77     help_message("Press a mouse button to continue.");
78 
79     /* wait for mouse button in any subwindow or tool border */
80     get_any_button();
81 
82     /* restore picture subwindow */
83     pw_write(pix_pw, 0, 0, pix_size.r_width, pix_size.r_height, PIX_SRC,
84 			scratch_pr, 0, 0);
85 }
86 
87 
88 /*
89  * A simple text display tool for help messages.
90  * Text is displayed at the current help location (help_x, help_y).
91  * Newlines within the text string are handled appropriately.
92  * Maximum line length (between newlines) is 80 characters, although
93  * only about 64 can be displayed on the default Gremlin screen.
94  */
95 static
help_message(text)96 help_message(text)
97 char *text;
98 {
99     char buf[80];
100     register i;
101 
102     while (*text != '\0') {
103 	i = 0;
104 
105 	while ((*text != '\n') && (*text != '\0'))
106 	    buf[i++] = *text++;
107 	buf[i] = '\0';
108 
109 	if (*text == '\n')
110 	    text++;
111 
112 	pw_text(pix_pw, help_x, help_y + TEXT_BASELINE + 2, PIX_SRC,
113 							    text_pf, buf);
114 	help_y += help_dy;
115     }
116 }
117 
118 
119 static char help_HELP[] = "\
120 The three subwindows in Gremlin are used for text entry,\n\
121 menu display and command selection, and picture display.\n\
122 In addition, the normal tool manager pop-up menu is available\n\
123 from the tool borders.\n\
124 \n\
125 In the menu subwindow, the left mouse button is used to\n\
126 invoke commands after selecting the appropriate icon, the\n\
127 middle mouse button is used to effect the same command on\n\
128 only the current set (where appropriate), and the right mouse\n\
129 button provides a help screen for the icon.\n\
130 \n\
131 In the picture subwindow, the left mouse button is used to\n\
132 lay down points, the middle mouse button erases points in the\n\
133 opposite order from which they were layed down, and the right\n\
134 mouse button provides a help screen.\n\
135 \n\
136 In the text subwindow, command arguments (when required)\n\
137 are entered from the keyboard.  Arguments must be entered\n\
138 before the command is selected.  Simple editing commands\n\
139 (backspace, line and word delete) can be used to modify the\n\
140 argument.  Again, the right mouse button provides a help\n\
141 screen display.";
142 
help()143 help()
144 {
145     help_screen(&question_pr, "Help ('?')", help_HELP);
146 }
147 
148 
149 static char justify_HELP[] = "\
150 Select text justification by moving marker to one of nine\n\
151 positioning points within the JUSTIFY icon and pressing the\n\
152 left mouse button.\n\
153 \n\
154 Modify justification of text in the current set by moving the\n\
155 marker as above and then pressing the middle mouse button.\n\
156 \n\
157 When text is displayed in the current set, its justification\n\
158 mode is indicated by a small dot.";
159 
justify_help()160 justify_help()
161 {
162     help_screen(&justify_pr, "Text Justification", justify_HELP);
163 }
164 
165 
166 static char size1_HELP[] = "\n\
167 Set the default font size to one with the left mouse button.\n\
168 \n\
169 Modify text in the current set to size one with the middle\n\
170 mouse button.";
171 
size1_help()172 size1_help()
173 {
174     help_screen(&size1_pr, "Set Text Size One", size1_HELP);
175 }
176 
177 
178 static char roman_HELP[] = "\
179 Set the default font to Roman with the left mouse button.\n\
180 \n\
181 Modify text in the current set to Roman font with the middle\n\
182 mouse button.";
183 
roman_help()184 roman_help()
185 {
186     help_screen(&roman_pr, "Set Roman Text Font", roman_HELP);
187 }
188 
189 
190 static char scale_HELP[] = "\
191 Scaling uses three points to define a transformation.\n\
192 The current set is scaled by the ratio of the distances\n\
193 between the first and second and the first and third points.";
194 
scale_help()195 scale_help()
196 {
197     help_screen(&scale_pr, "Scale Current Set ('s')", scale_HELP);
198 }
199 
200 
201 static char move_HELP[] = "\
202 Translation uses two points to define a transformation.\n\
203 The current set is translated through the relative distance\n\
204 between the two points.";
205 
move_help()206 move_help()
207 {
208     help_screen(&move_pr, "Translate Current Set ('t')", move_HELP);
209 }
210 
211 
212 static char hmirror_HELP[] = "\
213 Mirroring uses one point to define a transformation.\n\
214 The current set is reflected about the horizontal line\n\
215 containing the point.";
216 
hmirror_help()217 hmirror_help()
218 {
219     help_screen(&hmirror_pr, "Horizontal Mirror", hmirror_HELP);
220 }
221 
222 
223 static char vmirror_HELP[] = "\
224 Mirroring uses one point to define a transformation.\n\
225 The current set is reflected about the vertical line\n\
226 containing the point.";
227 
vmirror_help()228 vmirror_help()
229 {
230     help_screen(&vmirror_pr, "Vertical Mirror", vmirror_HELP);
231 }
232 
233 
234 static char include_HELP[] = "\
235 The current set is selected by points.  Using the left mouse\n\
236 button, the current set will include ONLY those elements near\n\
237 the points.  With the middle mouse button, those elements near\n\
238 the points will be ADDED to the current set.";
239 
include_help()240 include_help()
241 {
242     help_screen(&include_pr, "Define Current Set ('d')", include_HELP);
243 }
244 
245 
246 static char put_HELP[] = "\
247 The current set is copied into the specified set buffer for\n\
248 possible later retrieval.  An optional positioning point may\n\
249 be specified for use in positioning the set when it is later\n\
250 copied into a picture.  With no positioning point specified,\n\
251 a point is selected from among the reference points of the\n\
252 current set.";
253 
put1_help()254 put1_help()
255 {
256     help_screen(&put1_pr, "Save Current Set in Buffer One ('1')", put_HELP);
257 }
258 
259 
put2_help()260 put2_help()
261 {
262     help_screen(&put2_pr, "Save Current Set in Buffer Two ('2')", put_HELP);
263 }
264 
265 
put3_help()266 put3_help()
267 {
268     help_screen(&put3_pr, "Save Current Set in Buffer Three ('3')", put_HELP);
269 }
270 
271 
put4_help()272 put4_help()
273 {
274     help_screen(&put4_pr, "Save Current Set in Buffer Four ('4')", put_HELP);
275 }
276 
277 
278 static char horizontal_HELP[] = "\
279 Horizontal adjustment forces each point laid down to lie on\n\
280 a horizontal line from the previous point.  The left mouse\n\
281 button toggles this drawing mode.";
282 
horizontal_help()283 horizontal_help()
284 {
285     help_screen(&horizontal_pr, "Horizontal Adjustment", horizontal_HELP);
286 }
287 
288 
289 static char vertical_HELP[] = "\
290 Vertical adjustment forces each point laid down to lie on a\n\
291 vertical line from the previous point.  The left mouse button\n\
292 toggles this drawing mode.";
293 
vertical_help()294 vertical_help()
295 {
296     help_screen(&vertical_pr, "Vertical Adjustment", vertical_HELP);
297 }
298 
299 
300 static char stipple_HELP[] = "\
301 Select the stipple pattern used for drawing polygons with\n\
302 the left mouse button.\n\
303 \n\
304 Modify polygons in the current set to the specified stipple\n\
305 pattern with the middle mouse button.";
306 
stipple1_help()307 stipple1_help()
308 {
309     help_screen(&white_pr, "Set Stipple Pattern One", stipple_HELP);
310 }
311 
312 
stipple2_help()313 stipple2_help()
314 {
315     help_screen(&gray_pr, "Set Stipple Pattern Two", stipple_HELP);
316 }
317 
318 
stipple3_help()319 stipple3_help()
320 {
321     help_screen(&_50_pr, "Set Stipple Pattern Three", stipple_HELP);
322 }
323 
324 
stipple4_help()325 stipple4_help()
326 {
327     help_screen(&black_pr, "Set Stipple Pattern Four", stipple_HELP);
328 }
329 
330 
stipple5_help()331 stipple5_help()
332 {
333     help_screen(&stipple5_pr, "Set Stipple Pattern Five", stipple_HELP);
334 }
335 
336 
stipple6_help()337 stipple6_help()
338 {
339     help_screen(&stipple6_pr, "Set Stipple Pattern Six", stipple_HELP);
340 }
341 
342 
stipple7_help()343 stipple7_help()
344 {
345     help_screen(&stipple7_pr, "Set Stipple Pattern Seven", stipple_HELP);
346 }
347 
348 
stipple8_help()349 stipple8_help()
350 {
351     help_screen(&stipple8_pr, "Set Stipple Pattern Eight", stipple_HELP);
352 }
353 
354 
355 static char size2_HELP[] = "\n\
356 Set the default font size to two with the left mouse button.\n\
357 \n\
358 Modify text in the current set to size two with the middle\n\
359 mouse button.";
360 
size2_help()361 size2_help()
362 {
363     help_screen(&size2_pr, "Set Text Size Two", size2_HELP);
364 }
365 
366 
367 static char italics_HELP[] = "\
368 Set the default font to Italics with the left mouse button.\n\
369 \n\
370 Modify text in the current set to Italics font with the middle\n\
371 mouse button.";
372 
italics_help()373 italics_help()
374 {
375     help_screen(&italics_pr, "Set Italics Text Font", italics_HELP);
376 }
377 
378 
379 static char copy_HELP[] = "\
380 Copying uses two or more points.  A copy of the current set\n\
381 is made and translated by a relative distance between the\n\
382 first and each additional point.  The last copy becomes\n\
383 the new current set.";
384 
copy_help()385 copy_help()
386 {
387     help_screen(&copy_pr, "Copy Current Set ('c')", copy_HELP);
388 }
389 
390 
391 static char erase_HELP[] = "\
392 The current set is erased.  See also the undo command.";
393 
erase_help()394 erase_help()
395 {
396     help_screen(&erase_pr, "Erase Current Set ('e')", erase_HELP);
397 }
398 
399 
400 static char movepoint_HELP[] = "\
401 This command uses one or more points.  The element of the\n\
402 current set which contains the point closest to the first of\n\
403 these points is redrawn with that point replaced by the\n\
404 remaining points, or deleted if there is only one point.";
405 
movepoint_help()406 movepoint_help()
407 {
408     help_screen(&movepoint_pr, "Move Point", movepoint_HELP);
409 }
410 
411 
412 static char rotate_HELP[] = "\
413 Three points are used to define a rotation.  The rotation is\n\
414 performed relative to the first point, through an angle formed\n\
415 by the lines between points one and two and points one and\n\
416 three, respectively.";
417 
rotate_help()418 rotate_help()
419 {
420     help_screen(&rotate_pr, "Rotate Current Set ('r')", rotate_HELP);
421 }
422 
423 
424 static char filecabinet_HELP[] = "\
425 This icon produces a pop-up menu to select commands for\n\
426 manipulating files: Edit, Path, Read, Write and Save Set.\n\
427 With each command, parameters should be specified in the\n\
428 text subwindow before invocation.\n\
429 \n\
430 The Edit command causes a new file to be opened for editing.\n\
431 Picture sets saved in the buffers are preserved across edits.\n\
432 The file name will be displayed in the Gremlin tool border.\n\
433 \n\
434 The Path command is used to set the directory search path\n\
435 for the Edit and Read commands.  Directory names should be\n\
436 separated by colons and may include the ~ notation.  If a file\n\
437 cannot be found using any of the paths, a final check will be\n\
438 made in the Gremlin library, /usr/local/lib/gremlin.\n\
439 \n\
440 The Read command is used to add elements from the specified\n\
441 file into the current picture.  The new elements become the\n\
442 current set.  A point may be specified to position the file\n\
443 in the picture.\n\
444 \n\
445 The Write command saves the entire picture in a file.  If no\n\
446 file name is specified in the text subwindow, the current Edit\n\
447 file name is used.  An optional point may be specified to aid\n\
448 in Reading the picture later.\n\
449 \n\
450 The Save Set command is similar to the Write command with two\n\
451 exceptions: only the current set is written, and a file name\n\
452 must be specified.";
453 
filecabinet_help()454 filecabinet_help()
455 {
456     help_screen(&filecabinet_pr, "File Commands", filecabinet_HELP);
457 }
458 
459 
460 static char boxinc_HELP[] = "\
461 Two points must be placed that define a rectangular area\n\
462 (the endpoints of the diagonal of the rectangle).\n\
463 \n\
464 With the left mouse button, all elements contained within the\n\
465 the rectangle become the current set.\n\
466 \n\
467 With the middle mouse button, those same elements are ADDED\n\
468 to the current set.";
469 
boxinc_help()470 boxinc_help()
471 {
472     help_screen(&boxinc_pr, "Select Area for Current Set ('f')", boxinc_HELP);
473 }
474 
475 
476 static char manhattan_HELP[] = "\
477 Manhattan adjustment forces each point laid down to be either\n\
478 directly horizontal or vertical with respect to the previous\n\
479 point, whichever it is closer to.  The left mouse button\n\
480 toggles this drawing mode.";
481 
manhattan_help()482 manhattan_help()
483 {
484     help_screen(&horvert_pr, "Manhattan Adjustment ('z')", manhattan_HELP);
485 }
486 
487 
488 static char gravity_HELP[] = "\
489 This command toggles each time it is selected.  When on,\n\
490 gravity forces a point to coincide with the nearest existing\n\
491 point or reference point.  It will only take affect, however,\n\
492 if the point is near enough to an element to be gravitiated\n\
493 to it.";
494 
gravity_help()495 gravity_help()
496 {
497     help_screen(&gravity_pr, "Set Gravity ('g')", gravity_HELP);
498 }
499 
500 
501 static char size3_HELP[] = "\n\
502 Set the default font size to three with the left mouse button.\n\
503 \n\
504 Modify text in the current set to size three with the middle\n\
505 mouse button.";
506 
size3_help()507 size3_help()
508 {
509     help_screen(&size3_pr, "Set Text Size Three", size3_HELP);
510 }
511 
512 
513 static char bold_HELP[] = "\
514 Set the default font to Bold with the left mouse button.\n\
515 \n\
516 Modify text in the current set to Bold font with the middle\n\
517 mouse button.";
518 
bold_help()519 bold_help()
520 {
521     help_screen(&bold_pr, "Set Bold Text Font", bold_HELP);
522 }
523 
524 
525 static char brush_HELP[] = "\
526 The left mouse button sets the current brush style.\n\
527 \n\
528 The middle mouse button modifies all elements in the current\n\
529 set (except text) to the selected brush style.";
530 
brush1_help()531 brush1_help()
532 {
533     help_screen(&dotted_pr, "Set Dotted Line Style", brush_HELP);
534 }
535 
536 
brush2_help()537 brush2_help()
538 {
539     help_screen(&broken_pr, "Set Broken Line Style", brush_HELP);
540 }
541 
542 
brush3_help()543 brush3_help()
544 {
545     help_screen(&thick_pr, "Set Thick Line Style", brush_HELP);
546 }
547 
548 
brush4_help()549 brush4_help()
550 {
551     help_screen(&dashed_pr, "Set Dashed Line Style", brush_HELP);
552 }
553 
554 
brush5_help()555 brush5_help()
556 {
557     help_screen(&narrow_pr, "Set Narrow Line Style", brush_HELP);
558 }
559 
560 
brush6_help()561 brush6_help()
562 {
563     help_screen(&medium_pr, "Set Medium Line Style", brush_HELP);
564 }
565 
566 
567 static char arrow_HELP[] = "\
568 This command requires two points.  The first point indicates\n\
569 the tip of the arrow.  The second point indicates the\n\
570 direction from which the arrow points.";
571 
arrow_help()572 arrow_help()
573 {
574     help_screen(&arrow_pr, "Draw Arrowhead ('w')", arrow_HELP);
575 }
576 
577 
578 static char text_HELP[] = "\
579 Text is positioned using one or two points.  If two points\n\
580 are used, the text is positioned relative to their locus.\n\
581 The text specified in the text subwindow is displayed using\n\
582 the current font, size and justification.\n\
583 \n\
584 See the text subwindow help display for an explanation of\n\
585 quick text entry.";
586 
text_help()587 text_help()
588 {
589     help_screen(&text_pr, "Display Text", text_HELP);
590 }
591 
592 
593 static char misc_HELP[] = "\
594 This command invokes a pop-up menu of infrequently used\n\
595 commands: Clear Points, Show Points, Gripe (rarely used)\n\
596 and Point.\n\
597 \n\
598 Clear Points will clear all positioning points and reference\n\
599 points from the display.\n\
600 \n\
601 Show Points will display the reference points of those\n\
602 elements in the current set.\n\
603 \n\
604 Gripe displays a message indicating the mail address of\n\
605 the current Gremlin maintainer.\n\
606 \n\
607 Point can be used to lay down a point at a specific location.\n\
608 The coordinates of the point must first be entered in the\n\
609 text subwindow.";
610 
misc_help()611 misc_help()
612 {
613     help_screen(&misc_pr, "Miscellaneous Commands", misc_HELP);
614 }
615 
616 
617 static char get_HELP[] = "\
618 This command retrieves a set from the specified buffer and\n\
619 copies it into the picture.  At least one point must be\n\
620 specified, indicating the position(s) in the picture where\n\
621 the set is to be copied.";
622 
get1_help()623 get1_help()
624 {
625     help_screen(&get1_pr, "Add Buffer One To Picture", get_HELP);
626 }
627 
628 
get3_help()629 get3_help()
630 {
631     help_screen(&get3_pr, "Add Buffer Three To Picture", get_HELP);
632 }
633 
634 
get2_help()635 get2_help()
636 {
637     help_screen(&get2_pr, "Add Buffer Two To Picture", get_HELP);
638 }
639 
640 
get4_help()641 get4_help()
642 {
643     help_screen(&get4_pr, "Add Buffer Four To Picture", get_HELP);
644 }
645 
646 
647 static char linestyle_HELP[] = "\
648 This command toggles symbolic line display.  When highlighted,\n\
649 this icon indicates that elements will be drawn using their\n\
650 true line style (or brush).  When not highlighted, all\n\
651 elements are drawn using the narrow brush, decreasing display\n\
652 times.";
653 
linestyle_help()654 linestyle_help()
655 {
656     help_screen(&linestyle_pr, "Toggle Line Style Mode", linestyle_HELP);
657 }
658 
659 
660 static char align_HELP[] = "\
661 This command forces points to be aligned on pixel boundaries\n\
662 as specified in the icon.  Alignment occurs in powers of two.\n\
663 To select the next alignment value use the left mouse button,\n\
664 and to select the previous value use the middle mouse button.\n\
665 \n\
666 The precedence of point positioning modifiers is as follows:\n\
667 gravity will override alignment, and adjustment (vertical,\n\
668 horizontal or manhattan) will be applied to the point to which\n\
669 the point has been gravitated.";
670 
align_help()671 align_help()
672 {
673     help_screen(&align_pr, "Set Point Alignment", align_HELP);
674 }
675 
676 
677 static char size4_HELP[] = "\n\
678 Set the default font size to four with the left mouse button.\n\
679 \n\
680 Modify text in the current set to size four with the middle\n\
681 mouse button.";
682 
size4_help()683 size4_help()
684 {
685     help_screen(&size4_pr, "Set Text Size Four", size4_HELP);
686 }
687 
688 
689 static char special_HELP[] = "\
690 Set the default font to Special with the left mouse button.\n\
691 \n\
692 Modify text in the current set to Special font with the middle\n\
693 mouse button.";
694 
special_help()695 special_help()
696 {
697     help_screen(&special_pr, "Set Special Text Font", special_HELP);
698 }
699 
700 
701 static char arc_HELP[] = "\
702 This command requires two points to draw a full circle or\n\
703 three points to draw an arc.  The first point determines the\n\
704 center of a circle.  The second is a point on the circle,\n\
705 thus defining the radius.  An optional third point determines\n\
706 a counter-clockwise angle from the second point which is the\n\
707 extent of the arc.";
708 
arc_help()709 arc_help()
710 {
711     help_screen(&arc_pr, "Draw Circle or Arc ('a')", arc_HELP);
712 }
713 
714 
715 static char curve_HELP[] = "\
716 A curve is determined by a number of points distributed along\n\
717 its trajectory.  Two points yield a straight line.  If the\n\
718 first and last points of a spline are the same, a smooth\n\
719 closed figure will be drawn.  Curves are drawn with the left\n\
720 mouse button using the current brush style.\n\
721 \n\
722 With the middle mouse button, vectors and polygons in the\n\
723 current set are modified to become curves.";
724 
curve_help()725 curve_help()
726 {
727     help_screen(&curve_pr, "Draw Curve ('b')", curve_HELP);
728 }
729 
730 
731 static char vector_HELP[] = "\
732 With the left mouse button, a line is drawn connecting each\n\
733 of the points layed down in order.  The current brush (narrow,\n\
734 dotted, etc) is used.\n\
735 \n\
736 With the middle mouse button, curves and polygons in the\n\
737 current set are modified to become vectors.";
738 
vector_help()739 vector_help()
740 {
741     help_screen(&vector_pr, "Draw Vector ('v')", vector_HELP);
742 }
743 
744 
745 static char box_HELP[] = "\
746 Two points are used to define the endpoints of the diagonal\n\
747 of a rectangle.  A box is drawn in the current brush which\n\
748 forms the rectangle.";
749 
box_help()750 box_help()
751 {
752     help_screen(&box_pr, "Draw Box ('x')", box_HELP);
753 }
754 
755 
756 static char grid_HELP[] = "\
757 This command toggles the display of a grid used to aid in\n\
758 laying down points.  The grid is displayed on 32 pixel\n\
759 boundaries.";
760 
grid_help()761 grid_help()
762 {
763     help_screen(&grid_pr, "Toggle Grid Display ('q')", grid_HELP);
764 }
765 
766 
767 static char littlepoint_HELP[] = "\
768 This command toggles the style of points displayed.  When the\n\
769 icon is highlighted, points are indicated by a small circle\n\
770 and are numbered from zero.  When the icon is unhighlighted,\n\
771 points are displayed as a small diamond.";
772 
littlepoint_help()773 littlepoint_help()
774 {
775     help_screen(&littlepoint_pr, "Toggle Point Style", littlepoint_HELP);
776 }
777 
778 
779 static char undo_HELP[] = "\
780 This command undoes the last command which modified the\n\
781 picture contents.";
782 
undo_help()783 undo_help()
784 {
785     help_screen(&undo_pr, "Undo Last Command", undo_HELP);
786 }
787 
788 
789 static char pan_HELP[] = "\
790 With the left mouse button this command requires one point.\n\
791 The entire picture and current set are translated such that\n\
792 the specified point is located at the center of the display.\n\
793 \n\
794 With the middle mouse button no point is required.  The\n\
795 picture is translated such that its absolute center is\n\
796 brought to the center of the display.";
797 
pan_help()798 pan_help()
799 {
800     help_screen(&pan_pr, "Panning", pan_HELP);
801 }
802 
803 
804 static char polygon_HELP[] = "\
805 Polygons can be drawn either bordered or unbordered.  At\n\
806 least three points are required to draw a polygon.  If the\n\
807 first and the last points are not the same, that line\n\
808 segment will be added automatically.  With the left mouse\n\
809 button, a filled polygon will be added to the display in the\n\
810 current stipple style.  If a border is to be drawn, this\n\
811 will be added in the current line style.\n\
812 \n\
813 The middle mouse button is used to modify curves, vectors and\n\
814 other polygons in the current set to be polygons of the\n\
815 selected type (bordered or unbordered).";
816 
bpolygon_help()817 bpolygon_help()
818 {
819     help_screen(&bpolygon_pr, "Fill Bordered Polygon", polygon_HELP);
820 }
821 
822 
polygon_help()823 polygon_help()
824 {
825     help_screen(&polygon_pr, "Fill Polygon", polygon_HELP);
826 }
827 
828 
829 static char textsw_HELP[] = "\
830 Command arguments (when required) are entered here from the\n\
831 keyboard.  Arguments must be entered before the command is\n\
832 selected.  Simple editing commands (backspace, line and word\n\
833 delete) can be used to modify the argument.  The middle mouse\n\
834 button is used to display the previous text string.\n\
835 \n\
836 The quick form of the TEXT command is invoked by pressing\n\
837 RETURN after entering a string to be displayed in the picture.\n\
838 The string is displayed at the LAST point layed down (using\n\
839 the current justification mode), and this point is removed\n\
840 from the display.";
841 
textsw_help()842 textsw_help()
843 {
844     help_screen(NULL, "Text Subwindow Help", textsw_HELP);
845 }
846 
847 
848 static char pixsw_HELP[] = "\
849 The left mouse button is used to lay down points.  The middle\n\
850 mouse button erases points in the opposite order from which\n\
851 they were layed down.";
852 
pixsw_help()853 pixsw_help()
854 {
855     help_screen(NULL, "Picture Subwindow Help", pixsw_HELP);
856 }
857 
858 
menusw_help()859 menusw_help()
860 {
861     /* keeps getting invoked by mistake - not useful anyway */
862 }
863