home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / xfig2.8 / part02 / box.c < prev    next >
C/C++ Source or Header  |  1990-07-02  |  3KB  |  130 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 "alloc.h"
  13. #include "func.h"
  14. #include "object.h"
  15. #include "paintop.h"
  16.  
  17. extern int        line_style, line_thickness;
  18. extern float        cur_styleval;
  19. extern int        cur_color;
  20. extern int        cur_areafill;
  21. extern int        fill_mode;
  22. extern int        fix_x, fix_y, cur_x, cur_y;
  23. extern            (*canvas_kbd_proc)();
  24. extern            (*canvas_locmove_proc)();
  25. extern            (*canvas_leftbut_proc)();
  26. extern            (*canvas_middlebut_proc)();
  27. extern            (*canvas_rightbut_proc)();
  28. extern            null_proc();
  29. extern            set_popupmenu();
  30.  
  31. extern F_compound    objects;
  32.  
  33. /*************************** locally global procedures *********************/
  34.  
  35. extern int        elastic_box();
  36. extern int        create_boxobject();
  37. extern int        init_box_drawing();
  38.  
  39. box_drawing_selected()
  40. {
  41.     canvas_kbd_proc = null_proc;
  42.     canvas_locmove_proc = null_proc;
  43.     canvas_leftbut_proc = init_box_drawing;
  44.     canvas_middlebut_proc = null_proc;
  45.     canvas_rightbut_proc = set_popupmenu;
  46.     set_cursor(&arrow_cursor);
  47.     reset_action_on();
  48.     }
  49.  
  50. init_box_drawing(x, y)
  51. int    x, y;
  52. {
  53.     cur_x = fix_x = x; 
  54.     cur_y = fix_y = y;
  55.     canvas_locmove_proc = elastic_box;
  56.     canvas_leftbut_proc = canvas_rightbut_proc = null_proc;
  57.     canvas_middlebut_proc = create_boxobject;
  58.     draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT);
  59.     set_temp_cursor(&null_cursor);
  60.     set_action_on();
  61.     }
  62.  
  63. draw_rectbox(x1, y1, x2, y2, op)
  64. int    x1, y1, x2, y2, op;
  65. {
  66.     pw_vector(canvas_win, x1, y1, x1, y2, op, 1, SOLID_LINE, 0.0);
  67.     pw_vector(canvas_win, x1, y2, x2, y2, op, 1, SOLID_LINE, 0.0);
  68.     pw_vector(canvas_win, x2, y2, x2, y1, op, 1, SOLID_LINE, 0.0);
  69.     pw_vector(canvas_win, x2, y1, x1, y1, op, 1, SOLID_LINE, 0.0);
  70.     }
  71.  
  72. elastic_box(x, y)
  73. int    x, y;
  74. {
  75.     draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT);
  76.     cur_x = x;  
  77.     cur_y = y;
  78.     draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT);
  79.     }
  80.  
  81. create_boxobject(x, y)
  82. int    x, y;
  83. {
  84.     F_line    *box;
  85.     F_point    *point;
  86.  
  87.     draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT);
  88.  
  89.     
  90.     if ((Point_malloc(point)) == NULL) {
  91.         blink_msg();
  92.         put_msg(Err_mem);
  93.         return;
  94.         }
  95.     point->x = fix_x;
  96.     point->y = fix_y;
  97.     point->next = NULL;
  98.  
  99.     if ((Line_malloc(box)) == NULL) {
  100.         blink_msg();
  101.         put_msg(Err_mem);
  102.         free((char *)point);
  103.         return;
  104.         }
  105.     box->type = T_BOX;
  106.     box->style = line_style;
  107.     box->thickness = line_thickness;
  108.     box->color = cur_color;
  109.     box->depth = NULL;
  110.     box->pen = 0;
  111.     box->area_fill = fill_mode? cur_areafill : 0;
  112.     box->style_val = cur_styleval;
  113.     box->radius = 0;
  114.     box->for_arrow = NULL;
  115.     box->back_arrow = NULL;
  116.     box->points = point;
  117.     box->next  = NULL;
  118.     append_point(x, fix_y, &point);
  119.     append_point(x, y, &point);
  120.     append_point(fix_x, y, &point);
  121.     append_point(fix_x, fix_y, &point);
  122.     draw_line(box, PAINT);
  123.     clean_up();
  124.     set_action_object(F_CREATE, O_POLYLINE);
  125.     insert_line(&objects.lines, box);
  126.     set_latestline(box);
  127.     set_modifiedflag();
  128.     box_drawing_selected();
  129.     }
  130.