home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / s / stex2-18.zip / SeeTeX / Xtex / Valuator.c < prev    next >
C/C++ Source or Header  |  1991-02-19  |  14KB  |  437 lines

  1. #ifndef lint
  2. static char Xrcsid[] =
  3.     "$XConsortium: Valuator.c,v 1.52 89/10/09 16:20:20 jim Exp $";
  4. #endif /* lint */
  5.  
  6. /***********************************************************
  7. Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
  8. and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  9.  
  10.                         All Rights Reserved
  11.  
  12. Permission to use, copy, modify, and distribute this software and its 
  13. documentation for any purpose and without fee is hereby granted, 
  14. provided that the above copyright notice appear in all copies and that
  15. both that copyright notice and this permission notice appear in 
  16. supporting documentation, and that the names of Digital or MIT not be
  17. used in advertising or publicity pertaining to distribution of the
  18. software without specific, written prior permission.  
  19.  
  20. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  21. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  22. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  23. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  24. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  25. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  26. SOFTWARE.
  27.  
  28. ******************************************************************/
  29.  
  30. /* ValuatorBar.c */
  31. /* created by weissman, Mon Jul  7 13:20:03 1986 */
  32. /* converted by swick, Thu Aug 27 1987 */
  33.  
  34. #include <stdio.h>
  35. #include <X11/Xos.h>
  36. #include <X11/IntrinsicP.h>
  37. #include <X11/StringDefs.h>
  38.  
  39. #include <X11/Xmu/Misc.h>
  40. #include <X11/Xaw/XawInit.h>
  41. #include <X11/Xaw/Label.h>
  42. #include <X11/Xaw/Scrollbar.h>
  43. #include "ValuatorP.h"
  44. #include <X11/Xaw/Cardinals.h>
  45.  
  46. static void Initialize();
  47. static void Destroy();
  48. static void ConstraintInitialize();
  49. static Boolean SetValues();
  50.  
  51. static char *DEFAULT_FORMAT = "%3.2f";
  52.  
  53. #define Offset(field) XtOffset(ValuatorWidget, field)
  54.  
  55. static XtResource resources[] = {
  56.   {XtNmin, XtCMin, XtRFloat, sizeof(float),
  57.        Offset(valuator.min), XtRString,  (caddr_t) "0.0"},
  58.   {XtNmax, XtCMax, XtRFloat, sizeof(float),
  59.        Offset(valuator.max), XtRString,  (caddr_t) "1.0"},
  60.   {XtNvalue, XtCValue, XtRFloat, sizeof(float),
  61.        Offset(valuator.value), XtRString, (caddr_t) "0.0"},
  62.   {XtNincrement, XtCIncrement, XtRFloat, sizeof(float),
  63.        Offset(valuator.increment), XtRString, (caddr_t) "-1"},
  64.   {XtNformat, XtCFormat, XtRString, sizeof(String),
  65.        Offset(valuator.format), XtRString, (caddr_t) 0},
  66.   {XtNvalueLabel, XtCValueLabel, XtRWidget, sizeof(Widget),
  67.        Offset(valuator.valueWidget), XtRWidget, (caddr_t) 0}
  68. };
  69.  
  70. ValuatorClassRec valuatorClassRec = {
  71.   {/* core fields */
  72.     /* superclass       */      (WidgetClass) &formClassRec,
  73.     /* class_name       */      "Valuator",
  74.     /* size             */      sizeof(ValuatorRec),
  75.     /* class_initialize   */    XawInitializeWidgetSet,
  76.     /* class_part_init  */    NULL,
  77.     /* class_inited    */    FALSE,
  78.     /* initialize       */      Initialize,
  79.     /* initialize_hook  */    NULL,
  80.     /* realize          */      XtInheritRealize,
  81.     /* actions          */      NULL,
  82.     /* num_actions    */    0,
  83.     /* resources        */      resources,
  84.     /* num_resources    */      XtNumber(resources),
  85.     /* xrm_class        */      NULLQUARK,
  86.     /* compress_motion    */    TRUE,
  87.     /* compress_exposure*/    TRUE,
  88.     /* compress_enterleave*/    TRUE,
  89.     /* visible_interest */      FALSE,
  90.     /* destroy          */      Destroy,
  91.     /* resize           */      XtInheritResize,
  92.     /* expose           */      XtInheritExpose,
  93.     /* set_values       */      SetValues,
  94.     /* set_values_hook  */    NULL,
  95.     /* set_values_almost */    XtInheritSetValuesAlmost,
  96.     /* get_values_hook  */    NULL,
  97.     /* accept_focus     */      NULL,
  98.     /* version          */    XtVersion,
  99.     /* callback_private */      NULL,
  100.     /* tm_table         */      NULL,
  101.     /* query_geometry    */    XtInheritQueryGeometry,
  102.     /* display_accelerator*/    XtInheritDisplayAccelerator,
  103.     /* extension        */    NULL
  104.     },
  105.   { /* composite_class fields */
  106.     /* geometry_manager   */   XtInheritGeometryManager,
  107.     /* change_managed     */   XtInheritChangeManaged,
  108.     /* insert_child       */   XtInheritInsertChild,
  109.     /* delete_child       */   XtInheritDeleteChild,
  110.     /* extension          */   NULL
  111.   },
  112.   { /* constraint_class fields */
  113.     /* subresourses       */   NULL,
  114.     /* subresource_count  */   0,
  115.     /* constraint_size    */   sizeof(ValuatorConstraintsRec),
  116.     /* initialize         */   ConstraintInitialize,
  117.     /* destroy            */   NULL,
  118.     /* set_values         */   NULL,
  119.     /* extension          */   NULL
  120.   },
  121.   { /* form_class fields */
  122.     /* layout             */   XtInheritLayout
  123.   },
  124.   { /* valuator_class fields */
  125.     /* empty              */   0
  126.   }
  127. };
  128.  
  129. WidgetClass valuatorWidgetClass = (WidgetClass)&valuatorClassRec;
  130.  
  131. static void ValuatorNormalizeValue(vw)
  132. ValuatorWidget vw;
  133. {
  134.   if ( vw -> valuator.increment > 0 ) {
  135.     float value = vw -> valuator.value;
  136.     float inc = vw -> valuator.increment;
  137.     int chunks = ( (value)/inc )  + 0.5;
  138.     float newValue = (chunks * inc);
  139.  
  140.     vw -> valuator.value = newValue;
  141.   }
  142. }
  143.  
  144. static void ValuatorUpdateValue(vw)
  145. ValuatorWidget vw;
  146. {
  147.   if ( vw -> valuator.valueWidget
  148.       && vw -> valuator.value != vw -> valuator.lastValueShown ) {
  149.     char formatString[128];
  150.     char *format = DEFAULT_FORMAT;
  151.     double value = vw -> valuator.value;
  152.     Arg argList[20];
  153.     Cardinal args = 0;
  154.  
  155.     if ( vw -> valuator.format ) {
  156.       format = vw -> valuator.format;
  157.     }
  158.     sprintf(formatString, format, value);
  159.     args = 0;
  160.     XtSetArg(argList[args], XtNlabel, formatString); args++;
  161.     XtSetValues(vw -> valuator.valueWidget, argList, args);
  162.     vw -> valuator.lastValueShown = vw -> valuator.value;
  163.   }
  164. }
  165.      
  166. static int ValuatorJumpProc(w, vw, call_data)
  167.      Widget w;
  168.      ValuatorWidget vw;
  169.      float *call_data;
  170. {
  171.   float top = *call_data;
  172.   float min = vw -> valuator.min;
  173.   float max = vw -> valuator.max;
  174.   float delta = vw -> valuator.delta;
  175.   float value =  top * delta + min;
  176.  
  177.   vw -> valuator.value = value;
  178.   ValuatorNormalizeValue(vw);
  179.   ValuatorUpdateValue(vw);
  180. }
  181.  
  182. static int ValuatorScrollProc(w, vw, call_data)
  183.      Widget w;
  184.      ValuatorWidget vw;
  185.      int call_data;
  186. {
  187.   float inc = vw -> valuator.increment;
  188.   float min = vw -> valuator.min;
  189.   float max = vw -> valuator.max;
  190.   float delta = vw -> valuator.delta;
  191.   float value;
  192.   float newValue;
  193.   double top;
  194.  
  195.   ValuatorNormalizeValue(vw);
  196.  
  197.   value = vw -> valuator.value;
  198.   newValue = (call_data < 0) ? (value + inc) : (value - inc);
  199.  
  200.   if ( newValue < min ) newValue = min;
  201.   if ( newValue > max ) newValue = max;
  202.   top = (newValue - min) / delta;
  203.  
  204.   XawScrollbarSetThumb(vw -> valuator.scrollWidget, top, -1.0);
  205.  
  206.   vw -> valuator.value = newValue;
  207.   ValuatorUpdateValue(vw);
  208. }
  209.  
  210. /* ARGSUSED */
  211. static void Initialize( request, new )
  212.      Widget request;        /* what the client asked for */
  213.      Widget new;        /* what we're going to give him */
  214. {
  215.   ValuatorWidget rw = (ValuatorWidget) request;
  216.   ValuatorWidget vw = (ValuatorWidget) new;
  217.   Arg argList[20];
  218.   Cardinal args = 0;
  219.   char formatString[128];
  220.   double top;
  221.   double thumb;
  222.   char *format;
  223.   
  224.   static XtCallbackRec jumpCallbacks[] = {
  225.     {(XtCallbackProc) ValuatorJumpProc, NULL},
  226.     {(XtCallbackProc) NULL, NULL}};
  227.  
  228.   static XtCallbackRec scrollCallbacks[] = {
  229.     {(XtCallbackProc) ValuatorScrollProc, NULL},
  230.     {(XtCallbackProc) NULL, NULL}};
  231.  
  232.   jumpCallbacks[0].closure = (XtPointer) new;
  233.   scrollCallbacks[0].closure = (XtPointer) new;
  234.  
  235.   /*
  236.    * Copy & normalize values
  237.    */
  238.  
  239.   vw -> valuator.min = rw -> valuator.min;
  240.   vw -> valuator.max = rw -> valuator.max;
  241.   vw -> valuator.value = rw -> valuator.value;
  242.   vw -> valuator.increment = rw -> valuator.increment;
  243.  
  244.   if ( rw -> valuator.format ) {
  245.     int len = strlen(rw -> valuator.format);
  246.     vw -> valuator.format = XtMalloc(len+1);
  247.     strcpy(vw -> valuator.format, rw -> valuator.format);
  248.   }
  249.  
  250.   format = DEFAULT_FORMAT;
  251.   if ( vw -> valuator.format ) {
  252.     format = vw -> valuator.format;
  253.   }
  254.  
  255.   if ( vw ->  valuator.min > vw ->  valuator.max ) {
  256.     float t = vw ->  valuator.max;
  257.     vw ->  valuator.max = vw ->  valuator.min;
  258.     vw ->  valuator.min = t;
  259.   }
  260.  
  261.   vw -> valuator.delta = vw -> valuator.max - vw -> valuator.min;
  262.   
  263.   if ( vw ->  valuator.value < vw ->  valuator.min ) {
  264.     vw ->  valuator.value = vw ->  valuator.min;
  265.   }
  266.   
  267.   if ( vw ->  valuator.value > vw ->  valuator.max ) {
  268.     vw ->  valuator.value = vw ->  valuator.max;
  269.   }
  270.  
  271.   ValuatorNormalizeValue(vw);
  272.  
  273.   if ( vw -> valuator.valueWidget ) {
  274.     args = 0;
  275.     sprintf( formatString, format, vw -> valuator.value );
  276.     XtSetArg(argList[args], XtNlabel, formatString); args++;
  277.     XtSetValues( vw -> valuator.valueWidget, argList, args);
  278.   }
  279.  
  280.   args = 0;
  281.   XtSetArg(argList[args], XtNborderWidth, 0); args++;
  282.   XtSetArg(argList[args], XtNleft, XtChainLeft); args++;
  283.   XtSetArg(argList[args], XtNjustify, XtJustifyRight); args++;
  284.   sprintf( formatString, format, vw -> valuator.min );
  285.   XtSetArg(argList[args], XtNlabel, formatString); args++;
  286.   vw -> valuator.minLabelWidget =
  287.     XtCreateManagedWidget("minLabel", labelWidgetClass,
  288.               new, argList, args);
  289.   args = 0;
  290.   XtSetArg(argList[args], XtNborderWidth, 0); args++;
  291.   XtSetArg(argList[args], XtNfromHoriz, vw -> valuator.minLabelWidget); args++;
  292.   XtSetArg(argList[args], XtNleft, XtRubber); args++;
  293.   XtSetArg(argList[args], XtNright, XtRubber); args++;
  294.   XtSetArg(argList[args], XtNjumpProc, jumpCallbacks); args++;
  295.   XtSetArg(argList[args], XtNscrollProc, scrollCallbacks); args++;
  296.   XtSetArg(argList[args], XtNorientation, XtorientHorizontal);  args++;
  297.   XtSetArg(argList[args], XtNlength, 100);  args++;
  298.   vw -> valuator.scrollWidget =
  299.     XtCreateManagedWidget("scrollbar", scrollbarWidgetClass,
  300.               new, argList, args);
  301.   
  302.   if (vw -> valuator.max == vw -> valuator.min) {
  303.     top = 0;
  304.   } else {
  305.     top = (vw -> valuator.value - vw -> valuator.min)
  306.       / (vw -> valuator.max - vw -> valuator.min);
  307.   }
  308.  
  309.   thumb = -1.0;
  310.  
  311.   if ( vw -> valuator.increment > 0 && vw -> valuator.delta != 0) {
  312.     thumb = vw -> valuator.increment / vw -> valuator.delta;
  313.   }
  314.   XawScrollbarSetThumb( vw -> valuator.scrollWidget, top, thumb);
  315.  
  316.   args = 0;
  317.   XtSetArg(argList[args], XtNborderWidth, 0); args++;
  318.   XtSetArg(argList[args], XtNfromHoriz, vw -> valuator.scrollWidget); args++;
  319.   XtSetArg(argList[args], XtNjustify, XtJustifyRight); args++;
  320.   XtSetArg(argList[args], XtNright, XtChainRight); args++;
  321.   sprintf( formatString, format, vw -> valuator.max );
  322.   XtSetArg(argList[args], XtNlabel, formatString); args++;
  323.   vw -> valuator.maxLabelWidget =
  324.     XtCreateManagedWidget("maxLabel", labelWidgetClass,
  325.               new, argList, args);
  326.   
  327.   ValuatorUpdateValue(vw);
  328. }
  329.  
  330. /* ARGSUSED */
  331. static void ConstraintInitialize(request, new)
  332.     Widget request, new;
  333. {
  334. }
  335.  
  336. /* ARGSUSED */
  337. static void Destroy(current)
  338. ValuatorWidget current;
  339. {
  340.   ValuatorPart *v = &(current -> valuator);
  341.   if ( v -> scrollWidget ) XtDestroyWidget( v -> scrollWidget );
  342.   if ( v -> minLabelWidget ) XtDestroyWidget( v -> minLabelWidget );
  343.   if ( v -> maxLabelWidget ) XtDestroyWidget( v -> maxLabelWidget );
  344.   if ( v -> format ) XtFree( v -> format );
  345. }
  346.  
  347. /* ARGSUSED */
  348. static Boolean SetValues( current, request, desired )
  349.      Widget current,        /* what I am */
  350.        request,        /* what he wants me to be */
  351.        desired;        /* what I will become */
  352. {
  353.   ValuatorWidget w = (ValuatorWidget) current;
  354.   ValuatorWidget rw = (ValuatorWidget) request;
  355.   ValuatorWidget vw = (ValuatorWidget) desired;
  356.   Boolean redraw = FALSE;
  357.   Boolean realized = XtIsRealized (desired);
  358.   Arg argList[5];
  359.   Cardinal args;
  360.   char formatString[128];
  361.   char *format;
  362.  
  363.   vw -> valuator.value = rw -> valuator.value;
  364.   vw -> valuator.min = rw -> valuator.min;
  365.   vw -> valuator.max = rw -> valuator.max;
  366.   vw -> valuator.increment = rw -> valuator.increment;
  367.  
  368.   if ( !vw -> valuator.format
  369.       || ! strcmp(rw -> valuator.format, vw -> valuator.format) ) {
  370.  
  371.     int len = strlen(rw -> valuator.format);
  372.     XtFree( vw -> valuator.format );
  373.     vw -> valuator.format = XtMalloc(len+1);
  374.     strcpy(vw -> valuator.format, rw -> valuator.format);
  375.   }
  376.   
  377.   if ( vw -> valuator.min > vw -> valuator.max ) {
  378.     double t = vw -> valuator.max;
  379.     vw -> valuator.max = vw -> valuator.min;
  380.     vw -> valuator.min = t;
  381.   }
  382.  
  383.   vw -> valuator.delta = vw -> valuator.max - vw -> valuator.min;
  384.   
  385.   if ( vw -> valuator.value < vw -> valuator.min ) {
  386.     vw -> valuator.value = vw -> valuator.min;
  387.   }
  388.   
  389.   if ( vw -> valuator.value > vw -> valuator.max ) {
  390.     vw -> valuator.value = vw -> valuator.max;
  391.   }
  392.   
  393.   /*
  394.    * repaint labels & scroll bar if values changed
  395.    */
  396.  
  397.   format = DEFAULT_FORMAT;
  398.   if ( vw -> valuator.format ) {
  399.     format = vw -> valuator.format;
  400.   }
  401.   
  402.   if ( vw -> valuator.min != w -> valuator.min ) {
  403.     sprintf( formatString, format, vw -> valuator.min );
  404.     args = 0;
  405.     XtSetArg(argList[args], XtNlabel, formatString); args++;
  406.     XtSetValues( w -> valuator.minLabelWidget, argList, args);
  407.     redraw = TRUE;
  408.   }
  409.   
  410.   if ( vw -> valuator.max != w -> valuator.max ) {
  411.     sprintf( formatString, format, vw -> valuator.max );
  412.     args = 0;
  413.     XtSetArg(argList[args], XtNlabel, formatString); args++;
  414.     XtSetValues( w -> valuator.maxLabelWidget, argList, args);
  415.     redraw = TRUE;
  416.   }
  417.   
  418.   if ( vw -> valuator.value != w -> valuator.value
  419.       || vw -> valuator.increment != w -> valuator.increment
  420.       || vw -> valuator.delta != w -> valuator.delta ) {
  421.  
  422.     double top = (vw -> valuator.value - vw -> valuator.min)
  423.       / (vw -> valuator.max - vw -> valuator.min);
  424.  
  425.     double thumb = -1.0;
  426.     if ( vw -> valuator.increment > 0 ) {
  427.       thumb = vw -> valuator.increment / vw -> valuator.delta;
  428.     }
  429.     XawScrollbarSetThumb( w -> valuator.scrollWidget, top, thumb);
  430.     ValuatorNormalizeValue(w);
  431.     ValuatorUpdateValue(vw);
  432.     redraw = TRUE;
  433.   }
  434.   
  435.   return( redraw );
  436. }
  437.