home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / grphctrl.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  7KB  |  209 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    grphctrl.c (Color Graph Control)
  6.  * Purpose:    Manipulate the color graph
  7.  * Subroutine:    map_graphbox()            returns: void
  8.  * Subroutine:    display_graphbox()            returns: void
  9.  * Subroutine:    control_cgraph()        returns: void
  10.  * Xlib calls:    XUnmapWindow(), XMapWindow()
  11.  * Xlib calls:    XSync(), XCheckWindowEvent(), XStoreColors()
  12.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  13.  *        You may do anything you like with this file except remove
  14.  *        this copyright.  The Smithsonian Astrophysical Observatory
  15.  *        makes no representations about the suitability of this
  16.  *        software for any purpose.  It is provided "as is" without
  17.  *        express or implied warranty.
  18.  * Modified:    {0} Michael VanHilst    initial version         11 June 1989
  19.  *        {n} <who> -- <does what> -- <when>
  20.  */
  21.  
  22. #include <stdio.h>        /* stderr, NULL, etc. */
  23. #include <X11/Xlib.h>        /* X window stuff */
  24. #include <X11/Xutil.h>        /* X window manager stuff */
  25. #include "hfiles/constant.h"    /* define codes */
  26. #include "hfiles/struct.h"    /* declare structure types */
  27. #include "hfiles/extern.h"    /* extern main parameter structures */
  28. #include "hfiles/cgraph.h"
  29.  
  30. #define BUTTONMASK (Button1Mask|Button2Mask|Button3Mask)
  31. #define EVENTMASK (ButtonPressMask|ButtonReleaseMask|ButtonMotionMask)
  32.  
  33. #include "defs/cgraph.def"    /* declare the cgraph struct */
  34.  
  35. /*
  36.  * Subroutine:    map_graphbox
  37.  * Purpose:    Varify size and get everything set when mapping the graphbox
  38.  * Xlib calls:    XUnmapWindow(), XMapWindow()
  39.  */
  40. void map_graphbox ( )
  41. {
  42.   int init;
  43.   void create_graphbox(), display_graphbox();
  44.  
  45.   if( graphbox.active ) {
  46.     XUnmapWindow(graphbox.display, graphbox.ID);
  47.     graphbox.active = 0;
  48.     cgraph.inactive = 1;
  49.   } else {
  50.     if( graphbox.ID == NULL ) {
  51.       init = 1;
  52.       create_graphbox();
  53.     } else
  54.       init = 0;
  55.     XMapWindow(graphbox.display, graphbox.ID);
  56.     display_graphbox(init, 1);
  57.   }
  58. }
  59.  
  60. /*
  61.  * Subroutine:    display_graphbox
  62.  * Purpose:    Put up the graphbox when it is mapped or reexposed
  63.  */
  64. void display_graphbox ( init, wait )
  65.      int init;    /* i: initialize graphbox parameters */
  66.      int wait;    /* i: wait for result of mapping before getting dimensions */
  67. {
  68.   void draw_colorbar(), draw_cgraph(), label_colorbar();
  69.   void get_window_dimensions(), adjust_color_graph(), init_color_graph_label();
  70.   void init_graph_colorbar(), adjust_graph_colorbar(), label_color_graph();
  71.  
  72.   get_window_dimensions(&graphbox, wait, 1);
  73.   graphbox.active = 1;
  74.   cgraph.inactive = 0;
  75.   if( init ) {
  76.     init_color_graph_label();
  77.     adjust_color_graph();
  78.     init_graph_colorbar();
  79.   } else {
  80.     adjust_color_graph();
  81.     adjust_graph_colorbar();
  82.   }
  83.   draw_cgraph(1, 0);
  84.   label_color_graph();
  85.   label_colorbar();
  86.   draw_colorbar(1);
  87. }
  88.  
  89. /*
  90.  * Subroutine:    control_cgraph
  91.  * Purpose:    Mouse controlled interaction to alter color table.
  92.  * Called by:    control_event_loop in MainEvent.c
  93.  * Xlib calls:    XSync(), XCheckWindowEvent(), XStoreColors()
  94.  */
  95. void control_cgraph ( )
  96. {
  97.   static int not_active = 1;
  98.   static int oldmode = MOP;
  99.   int drop_cgraph_vertex();
  100.   void draw_cgraph(), move_cgraph_vertices(), get_cgraph_vertex();
  101.   void highlight_active_cgraph_vertex(), make_cellstore_from_tables();
  102.   void replace_draw_queue_end();
  103.  
  104.   /* make sure this an event which we want */
  105.   if( (control.event.xbutton.window != cgraph.graph.ID) &&
  106.       (control.priority == 0) )
  107.     return;
  108.   /* we assume this event was meant to be fielded exclusively here */
  109.   control.completed = 1;
  110.   switch( control.event.type ) {
  111.   case MotionNotify:
  112.     /* get only the most recent move */
  113.     XSync(dispbox.display, 0);
  114.     while( XCheckWindowEvent(cgraph.graph.display, cgraph.graph.ID,
  115.                  ButtonMotionMask, &control.event) );
  116.     if( (control.event.xmotion.state & BUTTONMASK) == 0 ) {
  117.       /* if no buttons are down, we must be done */
  118.       control.priority = 0;
  119.       control.mode = oldmode;
  120.       return;
  121.     }
  122.     /* alter table(s) and graph */
  123.     move_cgraph_vertices(control.event.xmotion.x, control.event.xmotion.y);
  124.     /* make color cellmap and send colors to the display */
  125.     make_cellstore_from_tables(&color);
  126.     XStoreColors(color.display, color.colormap,
  127.          color.cellstore, color.ncolors);
  128.     /* shift will cause the graph to track the changes as well */
  129.     if( ((control.event.xmotion.state & (ShiftMask | LockMask)) !=0) ^
  130.         (control.tracking !=0) )
  131.       draw_cgraph (0, 1);
  132.     break;
  133.   case ButtonPress:
  134.     /* if one of the three mouse buttons was pressed */
  135.     if( (control.event.xbutton.state & BUTTONMASK) == 0 ) {
  136.       /* if no mouse button was previously down */
  137.       if( control.event.xbutton.state & ControlMask ) {
  138.     /* lone button with control key means delete vertex */
  139.     if( drop_cgraph_vertex(&control.event) == 0 )
  140.       /* if nothing is deleted, do nothing */
  141.       return;
  142.       } else if( (control.event.xbutton.button == Button1) ||
  143.          (control.event.xbutton.button == Button2) ||
  144.          (control.event.xbutton.button == Button3) ) {
  145.     /* first button to grab a vertex starts priority mode */
  146.     oldmode = control.mode;
  147.     control.mode = GOP;
  148.     /* events to send through here in any case */
  149.     control.priority = EVENTMASK;
  150.       } else {
  151.     return;
  152.       }
  153.     } else if( not_active || (control.event.xbutton.state & ControlMask) )
  154.       /* don't respond if things don't look right */
  155.       return;
  156.     /* if this was not a delete command, it is a grab vertex command */
  157.     if( (control.event.xbutton.state & ControlMask) == 0 ) {
  158.       not_active = 0;
  159.       get_cgraph_vertex(&control.event);
  160.     }
  161.     /* make color cellmap and send colors to the display */
  162.     make_cellstore_from_tables(&color);
  163.     XStoreColors(color.display, color.colormap,
  164.          color.cellstore, color.ncolors);
  165.     /* redraw the graph with newly grabbed vertex */
  166.     draw_cgraph(0, 1);
  167.     highlight_active_cgraph_vertex();
  168.     break;
  169.   case ButtonRelease:
  170.     /* draw the color graph when any button is released */
  171.     draw_cgraph(0, 0);
  172.     switch( control.event.xbutton.button ) {
  173.     case Button1:
  174.       cgraph.red.active = 0;
  175.       if( (control.event.xbutton.state & BUTTONMASK) == Button1Mask )
  176.     not_active = 1;
  177.       else if( cgraph.queue[2] == &cgraph.red )
  178.     replace_draw_queue_end();
  179.       break;
  180.     case Button2:
  181.       cgraph.green.active = 0;
  182.       if( (control.event.xbutton.state & BUTTONMASK) == Button2Mask )
  183.     not_active = 1;
  184.       else if( cgraph.queue[2] == &cgraph.green )
  185.     replace_draw_queue_end();
  186.       break;
  187.     case Button3:
  188.       cgraph.blue.active = 0;
  189.       if( (control.event.xbutton.state & BUTTONMASK) == Button3Mask )
  190.     not_active = 1;
  191.       else if( cgraph.queue[2] == &cgraph.blue )
  192.     replace_draw_queue_end();
  193.       break;
  194.     }
  195.     if( not_active ) {
  196.       /* if the last button was just released */
  197.       control.priority = 0;
  198.       control.mode = oldmode;
  199.     } else
  200.       /* if there are still active vertices, rehighlight them */
  201.       highlight_active_cgraph_vertex();
  202.     break;
  203.   default:
  204.     /* this event was not meant for us */
  205.     control.completed = 0;
  206.     break;
  207.   }
  208. }
  209.