home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / xfig2.8 / part09 / autoarrow.c next >
C/C++ Source or Header  |  1990-07-03  |  9KB  |  317 lines

  1. /* 
  2.  *    FIG : Facility for Interactive Generation of figures
  3.  *
  4.  *    Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
  5.  *    January 1985.
  6.  *    1st revision : Aug 1985.
  7.  *
  8.  *    %W%    %G%
  9. */
  10. #include "fig.h"
  11. #include "resources.h"
  12. #include "func.h"
  13. #include "object.h"
  14. #include "paintop.h"
  15.  
  16. #define            TOLERANCE    7
  17.  
  18. extern            (*canvas_kbd_proc)();
  19. extern            (*canvas_locmove_proc)();
  20. extern            (*canvas_leftbut_proc)();
  21. extern            (*canvas_middlebut_proc)();
  22. extern            (*canvas_rightbut_proc)();
  23. extern            null_proc();
  24. extern            set_popupmenu();
  25. extern F_line        *line_point_search();
  26. extern F_spline        *spline_point_search();
  27. extern F_arc        *arc_point_search();
  28. extern F_arrow        *forward_arrow(), *backward_arrow();
  29.  
  30. extern int        foreground_color, background_color;
  31. extern int        pointmarker_shown;
  32.  
  33. F_point            *selected_point, *left_point;
  34. int            arcpoint_num;
  35. extern int        add_arrow_head();
  36. extern int        delete_arrow_head();
  37.  
  38. #define            round(x)    ((int) (x + .5))
  39.  
  40. arrow_head_selected()
  41. {
  42.     canvas_kbd_proc = null_proc;
  43.     canvas_locmove_proc = null_proc;
  44.     canvas_leftbut_proc = add_arrow_head;
  45.     canvas_middlebut_proc = delete_arrow_head;
  46.     canvas_rightbut_proc = set_popupmenu;
  47.     set_cursor(&pick9_cursor);
  48.     }
  49.  
  50. add_arrow_head(x, y)
  51. int    x, y;
  52. {
  53.     F_line        *line;
  54.     F_spline    *spline;
  55.     F_arc        *arc;
  56.  
  57.     if ((line = line_point_search(x, y, TOLERANCE,
  58.         &left_point, &selected_point)) != NULL) {
  59.         add_linearrow(line);
  60.         }
  61.     else if ((spline = spline_point_search(x, y, 
  62.         TOLERANCE, &left_point, &selected_point)) != NULL){
  63.         add_splinearrow(spline);
  64.         }
  65.     else if ((arc = arc_point_search(x, y, TOLERANCE, 
  66.         &arcpoint_num)) != NULL) {
  67.         add_arcarrow(arc);
  68.         }
  69.     else
  70.         return;
  71.  
  72.     set_modifiedflag();
  73.     }
  74.  
  75. delete_arrow_head(x, y)
  76. int    x, y;
  77. {
  78.     F_line        *line;
  79.     F_spline    *spline;
  80.     F_arc        *arc;
  81.  
  82.     if ((line = line_point_search(x, y, TOLERANCE,
  83.         &left_point, &selected_point)) != NULL) {
  84.         delete_linearrow(line);
  85.         }
  86.     else if ((spline = spline_point_search(x, y, 
  87.         TOLERANCE, &left_point, &selected_point)) != NULL){
  88.         delete_splinearrow(spline);
  89.         }
  90.     else if ((arc = arc_point_search(x, y, TOLERANCE, 
  91.         &arcpoint_num)) != NULL) {
  92.         delete_arcarrow(arc);
  93.         }
  94.     else
  95.         return;
  96.  
  97.     set_modifiedflag();
  98.     }
  99.  
  100. add_linearrow(line)
  101. F_line    *line;
  102. {
  103.     F_point    *p;
  104.  
  105.     if (line->type == T_POLYGON 
  106.         || line->type == T_BOX || line->type == T_ARC_BOX) 
  107.             return;
  108.     if (line->points->next == NULL) return;    /* A single point line */
  109.  
  110.     if (left_point == NULL) { /*  selected_point is the first point */
  111.         if (line->back_arrow) return;
  112.         p = selected_point->next;
  113.         line->back_arrow = backward_arrow();
  114.         if (pointmarker_shown) toggle_linepointmarker(line);
  115.         draw_arrow(p->x, p->y, selected_point->x, selected_point->y, 
  116.             line->back_arrow, PAINT);
  117.         if (pointmarker_shown) toggle_linepointmarker(line);
  118.         }
  119.     else if (selected_point->next == NULL) { /* forward arrow */
  120.         if (line->for_arrow) return;
  121.         line->for_arrow = forward_arrow();
  122.         if (pointmarker_shown) toggle_linepointmarker(line);
  123.         draw_arrow(left_point->x, left_point->y, 
  124.             selected_point->x, selected_point->y, 
  125.             line->for_arrow, PAINT);
  126.         if (pointmarker_shown) toggle_linepointmarker(line);
  127.         }
  128.     clean_up();
  129.     set_action_object(F_ADD_ARROW_HEAD, O_POLYLINE);
  130.     }
  131.  
  132. add_arcarrow(arc)
  133. F_arc    *arc;
  134. {
  135.  
  136.     if (arcpoint_num == 0) { /*  backward arrow  */
  137.         if (arc->back_arrow) return;
  138.         arc->back_arrow = backward_arrow();
  139.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  140.         draw_arcarrow(arc, foreground_color);
  141.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  142.         }
  143.     else if (arcpoint_num == 2) { /*  for_arrow  */
  144.         if (arc->for_arrow) return;
  145.         arc->for_arrow = forward_arrow();
  146.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  147.         draw_arcarrow(arc, foreground_color);
  148.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  149.         }
  150.     clean_up();
  151.     set_action_object(F_ADD_ARROW_HEAD, O_ARC);
  152.     }
  153.  
  154. add_splinearrow(spline)
  155. F_spline    *spline;
  156. {
  157.     F_point        *p;
  158.     F_control    *c;
  159.  
  160.     if (closed_spline(spline)) return;
  161.     if (left_point == NULL) { /* add backward arrow */
  162.         if (spline->back_arrow) return;
  163.         p = selected_point->next;
  164.         spline->back_arrow = backward_arrow();
  165.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  166.         if (normal_spline(spline)) {
  167.         draw_arrow(p->x, p->y, selected_point->x,
  168.             selected_point->y, spline->back_arrow, PAINT);
  169.         }
  170.         else {
  171.         c = spline->controls;
  172.         draw_arrow(round(c->rx), round(c->ry), selected_point->x,
  173.             selected_point->y, spline->back_arrow, PAINT);
  174.         }
  175.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  176.         }
  177.     else if (selected_point->next == NULL) { /* add forward arrow */
  178.         if (spline->for_arrow) return;
  179.         spline->for_arrow = forward_arrow();
  180.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  181.         if (normal_spline(spline)) {
  182.         draw_arrow(left_point->x, left_point->y,
  183.             selected_point->x, selected_point->y,
  184.             spline->for_arrow, PAINT);
  185.         }
  186.         else {
  187.         for (c = spline->controls; c->next != NULL; c = c->next);
  188.         draw_arrow(round(c->lx), round(c->ly), selected_point->x,
  189.             selected_point->y, spline->for_arrow, PAINT);
  190.         }
  191.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  192.         }
  193.     clean_up();
  194.     set_action_object(F_ADD_ARROW_HEAD, O_SPLINE);
  195.     }
  196.  
  197. delete_linearrow(line)
  198. F_line    *line;
  199. {
  200.     if (line->type == T_POLYGON 
  201.         || line->type == T_BOX || line->type == T_ARC_BOX) 
  202.             return;
  203.  
  204.     if (left_point == NULL) { /*  selected_point is the first point */
  205.         if (! line->back_arrow) return;
  206.         if (pointmarker_shown) toggle_linepointmarker(line);
  207.         draw_line(line, INV_PAINT);
  208.         free((char*)line->back_arrow);
  209.         line->back_arrow = NULL;
  210.         draw_line(line, PAINT);
  211.         if (pointmarker_shown) toggle_linepointmarker(line);
  212.         }
  213.     else if (selected_point->next == NULL) { /* forward arrow */
  214.         if (! line->for_arrow) return;
  215.         if (pointmarker_shown) toggle_linepointmarker(line);
  216.         draw_line(line, INV_PAINT);
  217.         free((char*)line->for_arrow);
  218.         line->for_arrow = NULL;
  219.         draw_line(line, PAINT);
  220.         if (pointmarker_shown) toggle_linepointmarker(line);
  221.         }
  222.     clean_up();
  223.     set_action_object(F_DELETE_ARROW_HEAD, O_POLYLINE);
  224.     }
  225.  
  226. delete_arcarrow(arc)
  227. F_arc    *arc;
  228. {
  229.     if (arcpoint_num == 0) { /*  backward arrow  */
  230.         if (! arc->back_arrow) return;
  231.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  232.         draw_arc(arc, background_color);
  233.         free((char*)arc->back_arrow);
  234.         arc->back_arrow = NULL;
  235.         draw_arc(arc, foreground_color);
  236.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  237.         }
  238.     else if (arcpoint_num == 2) { /*  for_arrow  */
  239.         if (! arc->for_arrow) return;
  240.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  241.         draw_arc(arc, background_color);
  242.         free((char*)arc->for_arrow);
  243.         arc->for_arrow = NULL;
  244.         draw_arc(arc, foreground_color);
  245.         if (pointmarker_shown) toggle_arcpointmarker(arc);
  246.         }
  247.     clean_up();
  248.     set_action_object(F_DELETE_ARROW_HEAD, O_ARC);
  249.     }
  250.  
  251. delete_splinearrow(spline)
  252. F_spline    *spline;
  253. {
  254.     F_point    *p;
  255.  
  256.     if (closed_spline(spline)) return;
  257.     if (left_point == NULL) { /*  selected_point is the first point */
  258.         if (! spline->back_arrow) return;
  259.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  260.         p = selected_point->next;
  261.         if (normal_spline(spline)) {
  262.         draw_arrow(p->x, p->y, selected_point->x,
  263.             selected_point->y, spline->back_arrow, ERASE);
  264.         pw_vector(canvas_win, selected_point->x, selected_point->y,
  265.             round((p->x+selected_point->x)/2.0),
  266.             round((p->y+selected_point->y)/2.0), PAINT, 
  267.             spline->thickness, spline->style, spline->style_val);
  268.         }
  269.         else {
  270.         F_control    *a, *b;
  271.  
  272.         a = spline->controls;
  273.         b = a->next;
  274.         draw_arrow(round(a->rx), round(a->ry), selected_point->x,
  275.             selected_point->y, spline->back_arrow, ERASE);
  276.         bezier_spline(
  277.             (float)selected_point->x, (float)selected_point->y,
  278.             a->rx, a->ry, b->lx, b->ly, (float)p->x, (float)p->y,
  279.             PAINT,spline->thickness, spline->style, spline->style_val);
  280.         }
  281.         free((char*)spline->back_arrow);
  282.         spline->back_arrow = NULL;
  283.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  284.         }
  285.     else if (selected_point->next == NULL) { /* forward arrow */
  286.         if (! spline->for_arrow) return;
  287.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  288.         if (normal_spline(spline)) {
  289.         draw_arrow(left_point->x, left_point->y,
  290.             selected_point->x, selected_point->y,
  291.             spline->for_arrow, ERASE);
  292.         pw_vector(canvas_win, selected_point->x, selected_point->y,
  293.             round((selected_point->x+left_point->x)/2.0),
  294.             round((selected_point->y+left_point->y)/2.0), 
  295.             PAINT, spline->thickness, spline->style, spline->style_val);
  296.         }
  297.         else {
  298.         F_control    *a, *b;
  299.  
  300.         a = spline->controls;
  301.         for (b = a->next; b->next != NULL; a = b, b = b->next);
  302.         draw_arrow(round(b->lx), round(b->ly), selected_point->x,
  303.             selected_point->y, spline->for_arrow, ERASE);
  304.         bezier_spline(
  305.             (float)left_point->x, (float)left_point->y,
  306.             a->rx, a->ry, b->lx, b->ly,
  307.             (float)selected_point->x, (float)selected_point->y,
  308.             PAINT,spline->thickness, spline->style, spline->style_val);
  309.         }
  310.         free((char*)spline->for_arrow);
  311.         spline->for_arrow = NULL;
  312.         if (pointmarker_shown) toggle_splinepointmarker(spline);
  313.         }
  314.     clean_up();
  315.     set_action_object(F_DELETE_ARROW_HEAD, O_SPLINE);
  316.     }
  317.