|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 16404 (0x4014) Types: TextFile Names: »panel.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./tex82/TeXgraphics/fig2latex/fig_src/panel.c«
/* * FIG : Facility for Interactive Generation of figures * * Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) * January 1985. * 1st revision : Aug 1985. * * %W% %G% */ #include <fcntl.h> #include "func.h" #include "object.h" #include "paintop.h" extern struct toolsw *panel_sw; extern struct pixwin *panel_pixwin; extern int panel_swfd; extern null_proc(); /************** local variables and routines **************/ #include "panel.h" static panel_selected(); static panel_sighandler(); static init_switch(); static F_switch *switch_selected(); static panel_selected(); static switch_handler(); static switch_action(); static mode_on(); static mode_off(); static set_command(); static set_geometry(); static set_grid(); static set_style(); #define on_action(z) (z->on_func)(z) #define off_action(z) (z->off_func)(z) static F_switch switches[] = { 0, 0, 0, 0, &cirrad_ic, F_CIRCLE_BY_RAD, set_command, null_proc, S_ON, 0, 0, 1, 0, &cirdia_ic, F_CIRCLE_BY_DIA, set_command, null_proc, S_ON, 0, 0, 0, 1, &ellrad_ic, F_ELLIPSE_BY_RAD, set_command, null_proc, S_ON, 0, 0, 1, 1, &elldia_ic, F_ELLIPSE_BY_DIA, set_command, null_proc, S_ON, 0, 0, 0, 2, &c_spl_ic, F_CLOSED_SPLINE, set_command, null_proc, S_ON, 0, 0, 1, 2, &spl_ic, F_SPLINE, set_command, null_proc, S_ON, 0, 0, 0, 3, &c_intspl_ic, F_CLOSED_INTSPLINE, set_command, null_proc, S_ON, 0, 0, 1, 3, &intspl_ic, F_INTSPLINE, set_command, null_proc, S_ON, 0, 0, 0, 4, &box_ic, F_BOX, set_command, null_proc, S_ON, 0, 0, 1, 4, &polygon_ic, F_POLYGON, set_command, null_proc, S_ON, 0, 0, 0, 5, &line_ic, F_POLYLINE, set_command, null_proc, S_ON, 0, 0, 1, 5, &text_ic, F_TEXT, set_command, null_proc, S_ON, 0, 0, 0, 6, &arc_ic, F_CIRCULAR_ARC, set_command, null_proc, S_ON, 0, 0, 1, 6, &turn_ic, F_TURN, set_command, null_proc, S_ON, 0, 0, 0, 8, &glue_ic, F_GLUE, set_command, null_proc, S_ON, 0, 0, 1, 8, &break_ic, F_BREAK, set_command, null_proc, S_ON, 0, 0, 0, 9, &scale_ic, F_SCALE, set_command, null_proc, S_ON, 0, 0, 1, 9, &autoarrow_ic, F_AUTOARROW, set_command, null_proc, S_ON, 0, 0, 0, 10, &addpt_ic, F_ADD_POINT, set_command, null_proc, S_ON, 0, 0, 1, 10, &deletept_ic, F_DELETE_POINT, set_command, null_proc, S_ON, 0, 0, 0, 11, &move_ic, F_MOVE, set_command, null_proc, S_ON, 0, 0, 1, 11, &movept_ic, F_MOVE_POINT, set_command, null_proc, S_ON, 0, 0, 0, 12, ©_ic, F_COPY, set_command, null_proc, S_ON, 0, 0, 1, 12, &remove_ic, F_REMOVE, set_command, null_proc, S_ON, 0, 0, 0, 13, &flip_x_ic, F_FLIP_XAXIS, set_command, null_proc, S_ON, 0, 0, 1, 13, &flip_y_ic, F_FLIP_YAXIS, set_command, null_proc, S_ON, 0, 0, 0, 14, &rot90_ic, F_ROTATE90, set_command, null_proc, S_ON, 0, 0, 1, 14, &rot270_ic, F_ROTATE270, set_command, null_proc, S_ON, 0, 1, 0, 16, &grid1_ic, F_GRID1, set_grid, set_grid, S_TOG, 0, 1, 1, 16, &grid2_ic, F_GRID2, set_grid, set_grid, S_TOG, 1, 2, 0, 17, &unconstraint_ic, F_UNCONSTRAINT, set_geometry, null_proc, S_ON, 0, 2, 1, 17, &mounthattan_ic, F_MOUNTHATTAN, set_geometry, null_proc, S_ON, 0, 2, 0, 18, &manhattan_ic, F_MANHATTAN, set_geometry, null_proc, S_ON, 0, 2, 1, 18, &mountain_ic, F_MOUNTAIN, set_geometry, null_proc, S_ON, 0, 2, 0, 19, &latexline_ic, F_LATEX_LINE, set_geometry, null_proc, S_ON, 0, 2, 1, 19, &latexarrow_ic, F_LATEX_ARROW, set_geometry, null_proc, S_ON, 0, -1, 0, 20, &backarrow_ic, F_AUTOB_ARROW, mode_on, mode_off, S_TOG, 0, -1, 1, 20, &forarrow_ic, F_AUTOF_ARROW, mode_on, mode_off, S_TOG, 1, 3, 0, 21, &solidline_ic, F_SET_SOLID_LINE, set_style, null_proc, S_ON, 0, 3, 1, 21, &dashline_ic, F_SET_DASH_LINE, set_style, null_proc, S_ON, 0, 3, 1, 22, &dottedline_ic, F_SET_DOTTED_LINE, set_style, null_proc, S_ON, 1, -1, 1, 23, &magnet_ic, F_MAGNET, mode_on, mode_off, S_TOG, }; #define NUM_GROUP 4 #define NUM_SWITCH (sizeof(switches) / sizeof(F_switch)) static F_switch *group[NUM_GROUP]; /* * Panel subwindow section */ init_panel(tool) struct tool *tool; { extern struct cursor arrow_cursor; struct inputmask mask; panel_sw = tool_createsubwindow(tool, "", -1, -1); if (panel_sw == (struct toolsw *) 0) return(0); panel_swfd = panel_sw->ts_windowfd; panel_pixwin = pw_open(panel_swfd); panel_sw->ts_io.tio_selected = panel_selected; panel_sw->ts_io.tio_handlesigwinch = panel_sighandler; panel_sw->ts_destroy = null_proc; input_imnull(&mask); win_setinputcodebit(&mask, MS_LEFT); win_setinputcodebit(&mask, MS_MIDDLE); win_setinputcodebit(&mask, MS_RIGHT); win_setinputmask(panel_swfd, &mask, NULL, WIN_NULLLINK); win_setcursor(panel_swfd, &arrow_cursor); (void)fcntl(panel_swfd, F_SETFL, fcntl(panel_swfd, F_GETFL, 0) | O_NDELAY); init_switch(); return(1); } static panel_selected(nullsw, ibits, obits, ebits, timer) caddr_t *nullsw; int *ibits, *obits, *ebits; struct timeval *timer; { extern int action_on; extern int receiving_msg; struct inputevent ie; int x, y; x = -1; while (input_readevent(panel_swfd, &ie) != -1) { if (ie.ie_code == MS_LEFT) { x = ie.ie_locx; y = ie.ie_locy; } } *ibits = *obits = *ebits = 0; if (action_on) return; if (receiving_msg) return; /* ignore mouse input when msg is being accepted */ if (x != -1) switch_handler(x, y); } static panel_sighandler() { pw_damaged(panel_pixwin); pw_writebackground(panel_pixwin, 0, 0, 2048, 2048, PAINT); redisplay_panel(); pw_donedamaged(panel_pixwin); } redisplay_panel() { F_switch *s, *t; t = &switches[NUM_SWITCH-1]; for (s = switches; s <= t; s++) { if (s->on == 1) turn_on(s); else turn_off(s); } } static F_switch * switch_selected(x, y) int x, y; { F_switch *sw; int i; for (sw = switches, i = 0; i < NUM_SWITCH; sw++, i++) { if (sw->x > x || sw->x + SWITCH_ICON_WIDTH < x) continue; if (sw->y <= y && y <= sw->y + SWITCH_ICON_HEIGHT) return(sw); } return(NULL); /* no item is selected */ } static init_switch() { extern int manhattan_mode; extern int mountain_mode; extern int autoforwardarrow_mode; extern int autobackwardarrow_mode; extern int latexline_mode; extern int latexarrow_mode; extern int magnet_mode; extern int cur_line_style; extern float cur_styleval; extern float cur_dashlength; extern float cur_dotgap; int i; F_switch *sw; for (sw = switches, i = 0; i < NUM_SWITCH; sw++, i++) { sw->x *= SWITCH_ICON_WIDTH; sw->y *= SWITCH_ICON_HEIGHT; } for (i = 0; i < NUM_GROUP; ) group[i++] = NULL; for (sw = switches, i = 0; i < NUM_SWITCH; sw++, i++) { if (sw->on) { /* Only the following switch can be preset */ switch (sw->value) { case F_UNCONSTRAINT : manhattan_mode = 0; mountain_mode = 0; latexline_mode = 0; latexarrow_mode = 0; group[sw->group] = sw; break; case F_MOUNTHATTAN : manhattan_mode = 1; mountain_mode = 1; group[sw->group] = sw; break; case F_MANHATTAN : manhattan_mode = 1; group[sw->group] = sw; break; case F_MOUNTAIN : mountain_mode = 1; group[sw->group] = sw; break; case F_LATEX_LINE : latexline_mode = 1; group[sw->group] = sw; break; case F_LATEX_ARROW : latexarrow_mode = 1; group[sw->group] = sw; break; case F_AUTOF_ARROW : autoforwardarrow_mode = 1; break; case F_AUTOB_ARROW : autobackwardarrow_mode = 1; break; case F_SET_SOLID_LINE : cur_line_style = SOLID_LINE; cur_styleval = 0.0; break; case F_SET_DASH_LINE : cur_line_style = DASH_LINE; cur_styleval = cur_dashlength; break; case F_SET_DOTTED_LINE : cur_line_style = DOTTED_LINE; cur_styleval = cur_dotgap; break; case F_MAGNET : magnet_mode = 1; break; default : continue; } turn_on(sw); if (sw->group != -1) group[sw->group] = sw; } } } static switch_handler(x, y) int x, y; { F_switch *s; if (NULL == (s = switch_selected(x, y))) return; switch_action(s); } static set_command(sw) F_switch *sw; { extern int cur_command; extern int rotate_angle; extern int flip_axis; switch (sw->value) { case F_CIRCLE_BY_RAD : circlebyradius_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("CIRCLE drawing: specify RADIUS"); break; case F_CIRCLE_BY_DIA : circlebydiameter_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("CIRCLE drawing: specify DIAMETER"); break; case F_ELLIPSE_BY_RAD : ellipsebyradius_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("ELLIPSE drawing: specify RADIUSES"); break; case F_ELLIPSE_BY_DIA : ellipsebydiameter_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("ELLIPSE drawing: specify DIAMETERS"); break; case F_BOX : box_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("Rectangular BOX drawing"); break; case F_POLYGON : line_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("POLYGON drawing"); break; case F_POLYLINE : line_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("POLYLINE drawing"); break; case F_TEXT : text_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("TEXT input (from keyboard)"); break; case F_CIRCULAR_ARC : arc_drawing_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("ARC drawing: specify three points on the arc"); break; case F_SPLINE : draw_spline_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("SPLINE drawing: specify control points"); break; case F_CLOSED_SPLINE : draw_spline_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("CLOSED SPLINE drawing: specify control points"); break; case F_INTSPLINE : draw_intspline_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("INTERPOLATED SPLINE drawing"); break; case F_CLOSED_INTSPLINE : draw_intspline_selected(); erase_pointmarker(); erase_compoundbox(); put_msg("CLOSED INTERPOLATED SPLINE drawing"); break; case F_GLUE : compound_selected(); erase_pointmarker(); show_compoundbox(); put_msg("GLUE objects into COMPOUND object with bounding box"); break; case F_BREAK : break_selected(); erase_pointmarker(); show_compoundbox(); put_msg("BREAK COMPOUND object"); break; case F_SCALE : scale_compound_selected(); erase_pointmarker(); show_compoundbox(); put_msg("SCALE COMPOUND object"); break; case F_ADD_POINT : point_adding_selected(); show_pointmarker(); erase_compoundbox(); put_msg("ADD POINTs (to POLYLINE, POLYGON, CLOSED-SPLINE and SPLINE)"); break; case F_DELETE_POINT : delete_point_selected(); show_pointmarker(); erase_compoundbox(); put_msg("DELETE POINTs (from POLYLINE, POLYGON, CLOSED-SPLINE and SPLINE)"); break; case F_MOVE : move_selected(); show_pointmarker(); show_compoundbox(); put_msg("MOVE objects"); break; case F_MOVE_POINT : move_point_selected(); show_pointmarker(); erase_compoundbox(); put_msg("MOVE POINTs (of POLYLINE, POLYGON, CLOSED-SPLINE, SPLINE and BOX)"); break; case F_REMOVE : remove_selected(); show_pointmarker(); show_compoundbox(); put_msg("REMOVE objects"); break; case F_COPY : copy_selected(); show_pointmarker(); show_compoundbox(); put_msg("COPY objects"); break; case F_ROTATE270 : rotate_selected(); show_pointmarker(); show_compoundbox(); rotate_angle = 270; put_msg("ROTATE objects (middle button) or COPY & ROTATE (left button) -90 degree"); break; case F_ROTATE90 : rotate_selected(); show_pointmarker(); show_compoundbox(); rotate_angle = 90; put_msg("ROTATE objects (middle button) or COPY & ROTATE (left button) 90 degree"); break; case F_FLIP_XAXIS : flip_selected(); show_pointmarker(); show_compoundbox(); flip_axis = 1; put_msg("FLIP objects (middle button) or COPY & FLIP (left button) up or down"); break; case F_FLIP_YAXIS : flip_selected(); show_pointmarker(); show_compoundbox(); flip_axis = 2; put_msg("FLIP objects (middle button) or COPY & FLIP (left button) left or right"); break; case F_TURN : turn_selected(); show_pointmarker(); erase_compoundbox(); put_msg("Turn POLYGON (POLYLINE) into CLOSED-SPLINE (SPLINE) or vice versa"); break; case F_AUTOARROW : arrow_head_selected(); show_pointmarker(); erase_compoundbox(); put_msg("ADD arrow head (left button); DELETE arrow head (middle button)"); break; } cur_command = sw->value; } static set_geometry(sw) F_switch *sw; { extern int manhattan_mode; extern int mountain_mode; extern int latexline_mode; extern int latexarrow_mode; switch (sw->value) { case F_UNCONSTRAINT : manhattan_mode = 0; mountain_mode = 0; latexline_mode = 0; latexarrow_mode = 0; put_msg("UNCONSTRAINT geometry (for POLYLINE and SPLINE)"); break; case F_MOUNTHATTAN : mountain_mode = 1; manhattan_mode = 1; latexline_mode = 0; latexarrow_mode = 0; put_msg("MOUNT-HATTAN geometry (for POLYLINE and SPLINE)"); break; case F_MANHATTAN : manhattan_mode = 1; mountain_mode = 0; latexline_mode = 0; latexarrow_mode = 0; put_msg("MANHATTAN geometry (for POLYLINE and SPLINE)"); break; case F_MOUNTAIN : mountain_mode = 1; manhattan_mode = 0; latexline_mode = 0; latexarrow_mode = 0; put_msg("MOUNTAIN geometry (for POLYLINE and SPLINE)"); break; case F_LATEX_LINE : latexline_mode = 1; manhattan_mode = 0; mountain_mode = 0; latexarrow_mode = 0; put_msg("LATEX LINE geometry: allow only LaTeX line slopes"); break; case F_LATEX_ARROW : latexarrow_mode = 1; manhattan_mode = 0; mountain_mode = 0; latexline_mode = 0; put_msg("LATEX ARROW geometry: allow only LaTeX arrow slopes"); break; } } static set_grid(sw) F_switch *sw; { setup_grid(sw->value); } static mode_on(sw) F_switch *sw; { extern int autoforwardarrow_mode; extern int autobackwardarrow_mode; extern int magnet_mode; switch (sw->value) { case F_AUTOF_ARROW : autoforwardarrow_mode = 1; put_msg("AUTO FORWARD ARROW (for ARC, POLYLINE and SPLINE)"); break; case F_AUTOB_ARROW : autobackwardarrow_mode = 1; put_msg("AUTO BACKWARD ARROW (for ARC, POLYLINE and SPLINE)"); break; case F_MAGNET : magnet_mode = 1; put_msg("MAGNET: round entered points to the nearest 1/16\" increment"); break; } } static mode_off(sw) F_switch *sw; { extern int autoforwardarrow_mode; extern int autobackwardarrow_mode; extern int magnet_mode; switch (sw->value) { case F_AUTOF_ARROW : autoforwardarrow_mode = 0; break; case F_AUTOB_ARROW : autobackwardarrow_mode = 0; break; case F_MAGNET : magnet_mode = 0; break; } } static set_style(sw) F_switch *sw; { extern int cur_line_style; extern float cur_styleval; extern float cur_dashlength; extern float cur_dotgap; switch (sw->value) { case F_SET_SOLID_LINE : cur_line_style = SOLID_LINE; cur_styleval = 0.0; put_msg("SOLID LINE STYLE (for BOX, POLYGON and POLYLINE)"); break; case F_SET_DASH_LINE : cur_line_style = DASH_LINE; cur_styleval = cur_dashlength; put_msg("DASH LINE STYLE (for BOX, POLYGON and POLYLINE)"); break; case F_SET_DOTTED_LINE : cur_line_style = DOTTED_LINE; cur_styleval = cur_dotgap; put_msg("DOTTED LINE STYLE (for BOX, POLYGON and POLYLINE)"); break; } } static turn_on(s) F_switch *s; { s->on = 1; pw_write(panel_pixwin, s->x, s->y, SWITCH_ICON_WIDTH, SWITCH_ICON_HEIGHT, ERASE, s->icon, 0, 0); } static turn_off(s) F_switch *s; { s->on = 0; pw_write(panel_pixwin, s->x, s->y, SWITCH_ICON_WIDTH, SWITCH_ICON_HEIGHT, PAINT, s->icon, 0, 0); } static switch_action(sw) F_switch *sw; { F_switch *old; if (sw == NULL) return; if (sw->group == -1) { if (sw->on) { turn_off(sw); off_action(sw); } else { turn_on(sw); on_action(sw); } return; } old = group[sw->group]; if (old == sw) { if (old->type != S_ON) { turn_off(old); off_action(old); group[old->group] = NULL; } return; } else if (old) { turn_off(old); off_action(old); } turn_on(sw); on_action(sw); group[sw->group] = sw; }