Blame lib/Xm/SSpinB.c

Packit b099d7
/* $TOG: SSpinB.c /main/14 1999/04/15 10:29:50 mgreess $ */
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1995 Digital Equipment Corporation.
Packit b099d7
 * (c) Copyright 1995 Hewlett-Packard Company.
Packit b099d7
 * (c) Copyright 1995 International Business Machines Corp.
Packit b099d7
 * (c) Copyright 1995 Sun Microsystems, Inc.
Packit b099d7
 * (c) Copyright 1995 Novell, Inc. 
Packit b099d7
 * (c) Copyright 1995 FUJITSU LIMITED.
Packit b099d7
 * (c) Copyright 1995 Hitachi.
Packit b099d7
 */
Packit b099d7
/******************************************************************************
Packit b099d7
 *
Packit b099d7
 *	File:	SSpinB.c
Packit b099d7
 *	Date:	June 1, 1995
Packit b099d7
 *	Author:	Mitchell Greess
Packit b099d7
 *
Packit b099d7
 *	Contents:
Packit b099d7
 *		Implements the XmSimpleSpinBox widget.
Packit b099d7
 *
Packit b099d7
 ******************************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <stdlib.h>
Packit b099d7
#include <string.h>
Packit b099d7
#include <ctype.h>
Packit b099d7
#include <X11/StringDefs.h>
Packit b099d7
#include <X11/Intrinsic.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/cursorfont.h>
Packit b099d7
#include <X11/Shell.h>
Packit b099d7
#include <X11/Xutil.h>
Packit b099d7
#include <X11/keysym.h>
Packit b099d7
Packit b099d7
#include <Xm/TextF.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
#include <Xm/SSpinBP.h>
Packit b099d7
Packit b099d7
#define FIX_1530
Packit b099d7
Packit b099d7
static void	Initialize(
Packit b099d7
			Widget		req,
Packit b099d7
			Widget		w,
Packit b099d7
			ArgList		args,
Packit b099d7
			Cardinal	*num_args);
Packit b099d7
static Boolean	SetValues(
Packit b099d7
			Widget		old,
Packit b099d7
			Widget		req,
Packit b099d7
			Widget		new_w,
Packit b099d7
			ArgList		args,
Packit b099d7
			Cardinal	*num_args);
Packit b099d7
static void	InsertChild(
Packit b099d7
			Widget		newChild);
Packit b099d7
static Widget	GetCallbackWidget(
Packit b099d7
			Widget		widget);
Packit b099d7
static void	SyntheticGetValue(
Packit b099d7
			Widget widget,
Packit b099d7
			int offset,
Packit b099d7
			XtArgVal *value);
Packit b099d7
Packit b099d7
/* Resources */
Packit b099d7
#define Offset(field) XtOffsetOf(XmSimpleSpinBoxRec,simpleSpinBox.field)
Packit b099d7
#define ManagerOffset(field) XtOffsetOf(XmSimpleSpinBoxRec,manager.field)
Packit b099d7
static XtResource resources[] = {
Packit b099d7
  /*
Packit b099d7
   * Inherited resources.
Packit b099d7
   */
Packit b099d7
  {
Packit b099d7
    XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), ManagerOffset(shadow_thickness),
Packit b099d7
    XmRImmediate, (XtPointer) 1
Packit b099d7
  },
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * SimpleSpinBox resources.
Packit b099d7
   */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNarrowSensitivity, XmCArrowSensitivity, XmRArrowSensitivity,
Packit b099d7
    sizeof(unsigned char), Offset(arrow_sensitivity),
Packit b099d7
    XmRImmediate, (XtPointer) XmARROWS_DEFAULT_SENSITIVITY
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNcolumns, XmCColumns, XmRShort,
Packit b099d7
    sizeof(short), Offset(columns), 
Packit b099d7
    XmRImmediate, (XtPointer) 20
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdecimalPoints, XmCDecimalPoints, XmRShort,
Packit b099d7
    sizeof(short), Offset(decimal_points), 
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNeditable, XmCEditable, XmRBoolean,
Packit b099d7
    sizeof(Boolean), Offset(editable), 
Packit b099d7
    XmRImmediate, (XtPointer) True
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNincrementValue, XmCIncrementValue, XmRInt, 
Packit b099d7
    sizeof(int), Offset(increment_value), 
Packit b099d7
    XmRImmediate, (XtPointer) 1
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmaximumValue, XmCMaximumValue, XmRInt, 
Packit b099d7
    sizeof(int), Offset(maximum_value), 
Packit b099d7
    XmRImmediate, (XtPointer) 10
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNminimumValue, XmCMinimumValue, XmRInt, 
Packit b099d7
    sizeof(int), Offset(minimum_value), 
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNnumValues, XmCNumValues, XmRInt,
Packit b099d7
    sizeof(int), Offset(num_values),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNposition, XmCPosition, XmRInt,
Packit b099d7
    sizeof(int), Offset(position),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpositionType, XmCPositionType, XmRPositionType,
Packit b099d7
    sizeof(unsigned char), Offset(position_type),
Packit b099d7
    XmRImmediate, (XtPointer) XmPOSITION_VALUE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNspinBoxChildType, XmCSpinBoxChildType, XmRSpinBoxChildType,
Packit b099d7
    sizeof(unsigned char), Offset(sb_child_type),
Packit b099d7
    XmRImmediate, (XtPointer) XmSTRING
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNtextField, XmCTextField, XmRWidget,
Packit b099d7
    sizeof(Widget), Offset(text_field),
Packit b099d7
    XmRImmediate, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNvalues, XmCValues, XmRXmStringTable, 
Packit b099d7
    sizeof(XmStringTable), Offset(values), 
Packit b099d7
    XmRStringTable, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNwrap, XmCWrap, XmRBoolean,
Packit b099d7
    sizeof(Boolean), Offset(wrap),
Packit b099d7
    XmRImmediate, (XtPointer) True
Packit b099d7
  }
Packit b099d7
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] = 
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNarrowSensitivity, sizeof(unsigned char), Offset(arrow_sensitivity),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNcolumns, sizeof(short), Offset(columns), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdecimalPoints, sizeof(short), Offset(decimal_points), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNeditable, sizeof(Boolean), Offset(editable), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNincrementValue, sizeof(int), Offset(increment_value), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmaximumValue, sizeof(int), Offset(maximum_value), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNminimumValue, sizeof(int), Offset(minimum_value), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNnumValues, sizeof(int), Offset(num_values),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNposition, sizeof(int), Offset(position),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpositionType, sizeof(unsigned char), Offset(position_type),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNspinBoxChildType, sizeof(unsigned char), Offset(sb_child_type),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNvalues, sizeof(XmStringTable), Offset(values), 
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNwrap, sizeof(Boolean), Offset(wrap),
Packit b099d7
    SyntheticGetValue, NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
/*  The Spin class record definition  */
Packit b099d7
externaldef (xmspinboxclassrec) XmSimpleSpinBoxClassRec xmSimpleSpinBoxClassRec= {
Packit b099d7
  {
Packit b099d7
    (WidgetClass)&xmSpinBoxClassRec,    /* superclass */   
Packit b099d7
    "XmSimpleSpinBox",                  /* class_name */	
Packit b099d7
    sizeof(XmSimpleSpinBoxRec),         /* widget_size */	
Packit b099d7
    (XtProc) NULL,		    	/* class_initialize */    
Packit b099d7
    (XtWidgetClassProc) NULL,		/* class_part_initialize */
Packit b099d7
    FALSE,    		                /* class_inited */	
Packit b099d7
    Initialize,    	                /* initialize */	
Packit b099d7
    NULL,    		                /* initialize_hook */
Packit b099d7
    XtInheritRealize,		        /* realize */	
Packit b099d7
    NULL, 	     	                /* actions */
Packit b099d7
    0,					/* num_actions */	
Packit b099d7
    resources,    	                /* resources */
Packit b099d7
    XtNumber(resources),                /* num_resources */
Packit b099d7
    NULLQUARK,    	                /* xrm_class */	
Packit b099d7
    TRUE,    		                /* compress_motion */	
Packit b099d7
    XtExposeCompressMaximal,           	/* compress_exposure */	
Packit b099d7
    TRUE,    		              	/* compress_enterleave */
Packit b099d7
    FALSE,    		              	/* visible_interest */	
Packit b099d7
    (XtWidgetProc) NULL,		/* destroy */	
Packit b099d7
    XtInheritResize,		      	/* resize */
Packit b099d7
    XtInheritExpose,   	              	/* expose */	
Packit b099d7
    SetValues,    	              	/* set_values */	
Packit b099d7
    (XtArgsFunc) NULL,			/* set_values_hook */
Packit b099d7
    XtInheritSetValuesAlmost,          	/* set_values_almost */
Packit b099d7
    (XtArgsProc) NULL,			/* get_values_hook */
Packit b099d7
    XtInheritAcceptFocus,	      	/* accept_focus */	
Packit b099d7
    XtVersion,    	              	/* version */
Packit b099d7
    (XtPointer) NULL,			/* callback proc list */
Packit b099d7
    XtInheritTranslations,	        /* tm_table */
Packit b099d7
    XtInheritQueryGeometry, 	      	/* query_geometry */
Packit b099d7
    (XtStringProc) NULL,		/* display_accelerator */
Packit b099d7
    (XtPointer) NULL,			/* extension */
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  {    /* composite_class fields */
Packit b099d7
    XtInheritGeometryManager,          	/* geometry_manager */
Packit b099d7
    XtInheritChangeManaged,            	/* change_managed */
Packit b099d7
    InsertChild,		        /* insert_child */
Packit b099d7
    XtInheritDeleteChild,	        /* delete_child */
Packit b099d7
    (XtPointer) NULL,			/* extension */
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  {    /* constraint_class fields */
Packit b099d7
    (XtResourceList) NULL,     		/* resource_list */
Packit b099d7
    (Cardinal) 0,		      	/* num_resources */
Packit b099d7
    (Cardinal) sizeof(
Packit b099d7
        XmSimpleSpinBoxConstraintRec),	/* constraint_size */
Packit b099d7
    (XtInitProc) NULL,			/* init_proc */
Packit b099d7
    (XtWidgetProc) NULL,		/* destroy_proc */
Packit b099d7
    (XtSetValuesFunc) NULL,		/* set_values_proc */
Packit b099d7
    (XtPointer) NULL,    		/* extension */
Packit b099d7
  },
Packit b099d7
      /* manager_class fields */
Packit b099d7
  {
Packit b099d7
    XtInheritTranslations,		/* translations */
Packit b099d7
    (XmSyntheticResource *) syn_resources, /* syn_resources */
Packit b099d7
    XtNumber(syn_resources),           	/* num_syn_resources */
Packit b099d7
    (XmSyntheticResource *) NULL,	/* syn_cont_resources */
Packit b099d7
    0,    		              	/* num_syn_cont_resources */
Packit b099d7
    (XmParentProcessProc) NULL,		/* parent_process */
Packit b099d7
    (XtPointer) NULL,			/* extension */
Packit b099d7
  },
Packit b099d7
      /* spinbox_class fields */
Packit b099d7
  {
Packit b099d7
    (XmGetCallbackWidgetProc)
Packit b099d7
        GetCallbackWidget,		/* get_callback_widget */
Packit b099d7
    (XtPointer) NULL,			/* extension */
Packit b099d7
  },
Packit b099d7
      /* simple_spinbox_class fields */
Packit b099d7
  {
Packit b099d7
    (XtPointer) NULL,			/* extension */
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmsimplespinboxwidgetclass) WidgetClass xmSimpleSpinBoxWidgetClass =
Packit b099d7
       (WidgetClass) &xmSimpleSpinBoxClassRec;
Packit b099d7
     
Packit b099d7
Packit b099d7
#define BAD_SSPIN_SET_TEXT_FIELD	_XmMMsgSSpinB_0001
Packit b099d7
#define BAD_SSPIN_SET_POSITION_TYPE	_XmMMsgSSpinB_0002
Packit b099d7
#define BAD_SSPIN_SET_ITEM		_XmMMsgSSpinB_0003
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 **
Packit b099d7
 ***			MACROS
Packit b099d7
 **
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
#define SSB_TEXTFIELD_NAME_FORMAT	"%s_TF"
Packit b099d7
#define SSB_SIMPLE_SPIN_BOX_PART(w)	\
Packit b099d7
	(& ((XmSimpleSpinBoxWidget)(w))->simpleSpinBox)
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 **
Packit b099d7
 ***			METHODS
Packit b099d7
 **
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void
Packit b099d7
Initialize(Widget	request,	/* unused */
Packit b099d7
	   Widget	new, 
Packit b099d7
	   ArgList	user_args,	/* unused */
Packit b099d7
	   Cardinal	*n_user_args)	/* unused */
Packit b099d7
{
Packit b099d7
    char			*widget_name;
Packit b099d7
    XmSimpleSpinBoxWidget	ssb_w;
Packit b099d7
    XmSimpleSpinBoxPart		*ssb_p;
Packit b099d7
    XmSpinBoxConstraint		textf_c;
Packit b099d7
    Arg				args[XtNumber(resources)];
Packit b099d7
    int				nargs = 0;
Packit b099d7
Packit b099d7
    ssb_w = (XmSimpleSpinBoxWidget) new;
Packit b099d7
    ssb_p = &ssb_w->simpleSpinBox;
Packit b099d7
Packit b099d7
    ssb_w->simpleSpinBox.text_field = (Widget) NULL;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Create and insert the text field child widget;
Packit b099d7
     */
Packit b099d7
    widget_name = XtMalloc(strlen(XtName(new)) + 10);
Packit b099d7
    sprintf(widget_name, SSB_TEXTFIELD_NAME_FORMAT, XtName(new));
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Collect all the resources that apply to the TextField child,
Packit b099d7
     * and push include them in the creation call.
Packit b099d7
     * Allow the SpinBox widget worry about ensuring values are valid
Packit b099d7
     * and about saving values.
Packit b099d7
     * Once the child has been created, copy the relevant values out of
Packit b099d7
     * the constraint record for the TextField into our instance record.
Packit b099d7
     */
Packit b099d7
    XtSetArg(args[nargs], XmNarrowSensitivity,ssb_p->arrow_sensitivity);nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNdecimalPoints, ssb_p->decimal_points); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNincrementValue, ssb_p->increment_value); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNmaximumValue, ssb_p->maximum_value); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNminimumValue, ssb_p->minimum_value); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNnumValues, ssb_p->num_values); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNposition, ssb_p->position); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNpositionType, ssb_p->position_type); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNspinBoxChildType, ssb_p->sb_child_type); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNvalues, ssb_p->values); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNwrap,ssb_p->wrap);nargs++;
Packit b099d7
Packit b099d7
    XtSetArg(args[nargs], XmNeditable, ssb_p->editable); nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNcolumns, ssb_p->columns); nargs++;
Packit b099d7
Packit b099d7
    ssb_p->text_field = XtCreateManagedWidget(	widget_name,
Packit b099d7
						xmTextFieldWidgetClass,
Packit b099d7
						(Widget) new,
Packit b099d7
						args, nargs);
Packit b099d7
    XtSetValues(ssb_p->text_field, args, nargs);
Packit b099d7
Packit b099d7
    textf_c = SB_GetConstraintRec(ssb_p->text_field);
Packit b099d7
    ssb_p->arrow_sensitivity = textf_c->arrow_sensitivity;
Packit b099d7
    ssb_p->decimal_points = textf_c->decimal_points;
Packit b099d7
    ssb_p->increment_value = textf_c->increment_value;
Packit b099d7
    ssb_p->maximum_value = textf_c->maximum_value;
Packit b099d7
    ssb_p->minimum_value = textf_c->minimum_value;
Packit b099d7
    ssb_p->num_values = textf_c->num_values;
Packit b099d7
    ssb_p->position = textf_c->position;
Packit b099d7
    ssb_p->position_type = textf_c->position_type;
Packit b099d7
    ssb_p->sb_child_type = textf_c->sb_child_type;
Packit b099d7
    ssb_p->values = textf_c->values;
Packit b099d7
    ssb_p->wrap = textf_c->wrap;
Packit b099d7
Packit b099d7
    XtVaGetValues(ssb_p->text_field,
Packit b099d7
		  XmNeditable, &ssb_p->editable,
Packit b099d7
		  XmNcolumns, &ssb_p->columns,
Packit b099d7
		  NULL);
Packit b099d7
Packit b099d7
    XtFree(widget_name);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean
Packit b099d7
SetValues(Widget	current, 
Packit b099d7
	  Widget	request, 	/* unused */
Packit b099d7
	  Widget	new, 
Packit b099d7
	  ArgList	args,		/* unused */
Packit b099d7
	  Cardinal	*num_args)	/* unused */
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxPart	*cur_ssbp = SSB_SIMPLE_SPIN_BOX_PART(current);
Packit b099d7
    XmSimpleSpinBoxPart	*new_ssbp = SSB_SIMPLE_SPIN_BOX_PART(new);
Packit b099d7
    XmSpinBoxConstraint	textf_c;
Packit b099d7
    Boolean		display_flag;
Packit b099d7
    Arg			changed_args[XtNumber(resources)];
Packit b099d7
    int			nchanged_args = 0;
Packit b099d7
  
Packit b099d7
    /*
Packit b099d7
     * These resources have CG permissions only:
Packit b099d7
     *	XmNpositionType, XmNspinBoxChildType, XmNtextField
Packit b099d7
     *
Packit b099d7
     * BINARY COMPATIBILITY with DTSPINBOX
Packit b099d7
     * However, DtSpinBox does not prevent setting XmNspinBoxChildType
Packit b099d7
     * so we have to allow it.
Packit b099d7
     *
Packit b099d7
     * new_ssbp->sb_child_type = cur_ssbp->sb_child_type;
Packit b099d7
     */
Packit b099d7
    if (new_ssbp->position_type != cur_ssbp->position_type) {
Packit b099d7
        new_ssbp->position_type = cur_ssbp->position_type;
Packit b099d7
	XmeWarning(new, BAD_SSPIN_SET_POSITION_TYPE);
Packit b099d7
    }
Packit b099d7
    if (new_ssbp->text_field != cur_ssbp->text_field) {
Packit b099d7
        new_ssbp->text_field = cur_ssbp->text_field;
Packit b099d7
	XmeWarning(new, BAD_SSPIN_SET_TEXT_FIELD);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Collect changed args and push them onto the TextField child.
Packit b099d7
     * Let the SpinBox widget worry about ensuring values are valid
Packit b099d7
     * and about saving values.
Packit b099d7
     *
Packit b099d7
     * Later, we'll copy the relevant values back into the SimpleSpinBox
Packit b099d7
     * record to ensure consistancy.
Packit b099d7
     */
Packit b099d7
    XtVaSetValues(new_ssbp->text_field,
Packit b099d7
		  XmNarrowSensitivity, new_ssbp->arrow_sensitivity,
Packit b099d7
		  XmNdecimalPoints, new_ssbp->decimal_points,
Packit b099d7
		  XmNincrementValue, new_ssbp->increment_value,
Packit b099d7
		  XmNmaximumValue, new_ssbp->maximum_value,
Packit b099d7
		  XmNminimumValue, new_ssbp->minimum_value,
Packit b099d7
		  XmNnumValues, new_ssbp->num_values,
Packit b099d7
		  XmNposition, new_ssbp->position,
Packit b099d7
		  XmNspinBoxChildType, new_ssbp->sb_child_type,
Packit b099d7
		  XmNvalues, new_ssbp->values,
Packit b099d7
		  XmNwrap, new_ssbp->wrap,
Packit b099d7
Packit b099d7
		  XmNeditable, new_ssbp->editable,
Packit b099d7
		  XmNcolumns, new_ssbp->columns,
Packit b099d7
		  NULL);
Packit b099d7
    
Packit b099d7
    textf_c = SB_GetConstraintRec(new_ssbp->text_field);
Packit b099d7
    new_ssbp->arrow_sensitivity = textf_c->arrow_sensitivity;
Packit b099d7
    new_ssbp->decimal_points = textf_c->decimal_points;
Packit b099d7
    new_ssbp->increment_value = textf_c->increment_value;
Packit b099d7
    new_ssbp->maximum_value = textf_c->maximum_value;
Packit b099d7
    new_ssbp->minimum_value = textf_c->minimum_value;
Packit b099d7
    new_ssbp->num_values = textf_c->num_values;
Packit b099d7
    new_ssbp->position = textf_c->position;
Packit b099d7
    new_ssbp->sb_child_type = textf_c->sb_child_type;
Packit b099d7
    new_ssbp->values = textf_c->values;
Packit b099d7
    new_ssbp->wrap = textf_c->wrap;
Packit b099d7
Packit b099d7
    XtVaGetValues(new_ssbp->text_field,
Packit b099d7
		  XmNeditable, &new_ssbp->editable,
Packit b099d7
		  XmNcolumns, &new_ssbp->columns,
Packit b099d7
		  NULL);
Packit b099d7
Packit b099d7
    return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void
Packit b099d7
InsertChild(Widget newChild)
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxWidget	ssb_w;
Packit b099d7
    WidgetClass			super;
Packit b099d7
    XtWidgetProc 		insert_child;
Packit b099d7
  
Packit b099d7
    ssb_w = (XmSimpleSpinBoxWidget) XtParent(newChild);
Packit b099d7
    if (ssb_w->composite.num_children != 0) {
Packit b099d7
	XmeWarning((Widget) ssb_w, BAD_SSPIN_SET_TEXT_FIELD);
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Call SpinBox's InsertChild method */
Packit b099d7
    _XmProcessLock();
Packit b099d7
    insert_child = ((XmSpinBoxWidgetClass)xmSpinBoxWidgetClass)->
Packit b099d7
	 			composite_class.insert_child;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    (*insert_child)(newChild);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Widget
Packit b099d7
GetCallbackWidget(Widget widget)
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxWidget	ssb_w;
Packit b099d7
    WidgetClass			super;
Packit b099d7
  
Packit b099d7
    ssb_w = (XmSimpleSpinBoxWidget) widget;
Packit b099d7
    return((Widget) ssb_w->simpleSpinBox.text_field);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 * SyntheticGetValue
Packit b099d7
 *	XmExportProc conversion routine.
Packit b099d7
 *	Used to retrieve constraint resources from the spinbox for the
Packit b099d7
 *	textfield child.
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void
Packit b099d7
SyntheticGetValue(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
  XmSimpleSpinBoxWidget	ssb_w = (XmSimpleSpinBoxWidget) widget;
Packit b099d7
  
Packit b099d7
  switch (offset)
Packit b099d7
   {
Packit b099d7
     case Offset(arrow_sensitivity):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        unsigned char new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNarrowSensitivity, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNarrowSensitivity, (unsigned char *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(columns):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        short new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNcolumns, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNcolumns, (short *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(decimal_points):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        short new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNdecimalPoints, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNdecimalPoints, (short *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(editable):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        Boolean new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNeditable, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNeditable, (Boolean *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(increment_value):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        short new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNincrementValue, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNincrementValue, (short *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(minimum_value):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        int new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNminimumValue, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNminimumValue, (int *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
       break;
Packit b099d7
     case Offset(maximum_value):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        int new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNmaximumValue, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNmaximumValue, (int *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(num_values):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        int new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNnumValues, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNnumValues, (int *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(position):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        int new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNposition, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNposition, (int *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(position_type):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        unsigned char new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNpositionType, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNpositionType, (unsigned char *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(sb_child_type):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        unsigned char new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNspinBoxChildType, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNspinBoxChildType, (unsigned char *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(values):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        XmStringTable new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNvalues, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNvalues, (XmStringTable *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     case Offset(wrap):
Packit b099d7
#ifdef FIX_1530
Packit b099d7
      {
Packit b099d7
        Boolean new_value;
Packit b099d7
        XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		      XmNwrap, &new_value,
Packit b099d7
		      NULL);
Packit b099d7
        *value = (XtArgVal)new_value;
Packit b099d7
      }
Packit b099d7
#else
Packit b099d7
       XtVaGetValues(ssb_w->simpleSpinBox.text_field,
Packit b099d7
		     XmNwrap, (Boolean *) value,
Packit b099d7
		     NULL);
Packit b099d7
#endif
Packit b099d7
       break;
Packit b099d7
     default:
Packit b099d7
       fprintf(stderr,
Packit b099d7
	       "SimpleSpinBox ERROR:  Invalid synthetic resource offset  %d\n",
Packit b099d7
	       offset);
Packit b099d7
       break;
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 **
Packit b099d7
 ***			EVENT HANDLERS
Packit b099d7
 **
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 **
Packit b099d7
 ***			ACTIONS
Packit b099d7
 **
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/******************************************************************************
Packit b099d7
 **
Packit b099d7
 ***			OTHER FUNCTIONS
Packit b099d7
 **
Packit b099d7
 *****************************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Public API
Packit b099d7
 */
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *  XmCreateSimpleSpinBox
Packit b099d7
 *	Create an instance of a Spin widget and return the widget id.
Packit b099d7
 ************************************************************************/
Packit b099d7
Widget 
Packit b099d7
XmCreateSimpleSpinBox(	Widget		parent,
Packit b099d7
			String		name, 
Packit b099d7
			ArgList		arglist,
Packit b099d7
			Cardinal	argcount)
Packit b099d7
{
Packit b099d7
    return(XtCreateWidget(name, xmSimpleSpinBoxWidgetClass, parent,
Packit b099d7
			  arglist, argcount));
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateSimpleSpinBox(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    register Widget w;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var,name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmSimpleSpinBoxWidgetClass,
Packit b099d7
                         parent, False, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmVaCreateManagedSimpleSpinBox(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    Widget w = NULL;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmSimpleSpinBoxWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *  XmSimpleSpinBoxAddItem
Packit b099d7
 *	Add an item to the list of strings at the specified position.
Packit b099d7
 ************************************************************************/
Packit b099d7
void 
Packit b099d7
XmSimpleSpinBoxAddItem(	Widget		ssb_w,
Packit b099d7
			XmString	item, 
Packit b099d7
			int	 	pos)
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxPart	*ssb_p = SSB_SIMPLE_SPIN_BOX_PART(ssb_w);
Packit b099d7
    XmSpinBoxConstraint	textf_c;
Packit b099d7
    XmStringTable	values;
Packit b099d7
    int			new_nvalues;
Packit b099d7
    int			i;
Packit b099d7
    _XmWidgetToAppContext(ssb_w);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  
Packit b099d7
    /*
Packit b099d7
     * Get the latest resource values for the SimpleSpinBox child.
Packit b099d7
     * These may have been changed either by internal operation
Packit b099d7
     * of the SpinBox or by the application doing a SetValues on
Packit b099d7
     * the SimpleSpinBox child.
Packit b099d7
     */
Packit b099d7
    XtVaGetValues(ssb_p->text_field,
Packit b099d7
		  XmNarrowSensitivity, &ssb_p->arrow_sensitivity,
Packit b099d7
		  XmNdecimalPoints, &ssb_p->decimal_points,
Packit b099d7
		  XmNincrementValue, &ssb_p->increment_value,
Packit b099d7
		  XmNmaximumValue, &ssb_p->maximum_value,
Packit b099d7
		  XmNminimumValue, &ssb_p->minimum_value,
Packit b099d7
		  XmNnumValues, &ssb_p->num_values,
Packit b099d7
		  XmNposition, &ssb_p->position,
Packit b099d7
		  XmNspinBoxChildType, &ssb_p->sb_child_type,
Packit b099d7
		  XmNvalues, &ssb_p->values,
Packit b099d7
		  XmNwrap, &ssb_p->wrap,
Packit b099d7
Packit b099d7
		  XmNeditable, &ssb_p->editable,
Packit b099d7
		  XmNcolumns, &ssb_p->columns,
Packit b099d7
		  NULL);
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Error checking.
Packit b099d7
     */
Packit b099d7
    if (ssb_p->sb_child_type != XmSTRING) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (item == (XmString) NULL) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * BINARY COMPATIBILITY with DTSPINBOX
Packit b099d7
     *
Packit b099d7
     * User gives pos starting at 1 (0 means end of list) 
Packit b099d7
     */
Packit b099d7
    pos--;
Packit b099d7
    if ((pos < 0) || (pos > ssb_p->num_values))
Packit b099d7
      pos = ssb_p->num_values;
Packit b099d7
Packit b099d7
    new_nvalues = ssb_p->num_values + 1;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Keep the position up to date.
Packit b099d7
     */
Packit b099d7
    if (ssb_p->position > pos)
Packit b099d7
      ssb_p->position++;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Copy the current array of values adding in the new item.
Packit b099d7
     */
Packit b099d7
    values = (XmStringTable)
Packit b099d7
	     XtRealloc((char *) NULL, sizeof(XmString) * new_nvalues);
Packit b099d7
    if (values == (XmStringTable) NULL) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (i=0; i
Packit b099d7
      values[i] = XmStringCopy(ssb_p->values[i]);
Packit b099d7
    values[pos] =  XmStringCopy(item);
Packit b099d7
    for (i=pos+1; i
Packit b099d7
      values[i] = XmStringCopy(ssb_p->values[i-1]);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the values array in the parent and save the XmStringTable.
Packit b099d7
     */
Packit b099d7
    XtVaSetValues(ssb_p->text_field,
Packit b099d7
    		  XmNvalues, values,
Packit b099d7
    		  XmNnumValues, new_nvalues,
Packit b099d7
    		  XmNposition, ssb_p->position,
Packit b099d7
		  NULL);
Packit b099d7
    textf_c = SB_GetConstraintRec(ssb_p->text_field);
Packit b099d7
    ssb_p->values = textf_c->values;
Packit b099d7
    ssb_p->num_values = textf_c->num_values;
Packit b099d7
    ssb_p->position = textf_c->position;
Packit b099d7
  
Packit b099d7
   /*
Packit b099d7
    * Free up the memory in the values array.
Packit b099d7
    */
Packit b099d7
    for (i=0; i
Packit b099d7
      if (values[i] != (XmString) NULL)
Packit b099d7
        XmStringFree(values[i]);
Packit b099d7
Packit b099d7
    XtFree((char *) values);
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *  XmSimpleSpinBoxDeletePos
Packit b099d7
 *	Delete the item at the specified position from the list of strings.
Packit b099d7
 ************************************************************************/
Packit b099d7
void 
Packit b099d7
XmSimpleSpinBoxDeletePos(
Packit b099d7
			Widget		ssb_w,
Packit b099d7
			int	 	pos)
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxPart	*ssb_p = SSB_SIMPLE_SPIN_BOX_PART(ssb_w);
Packit b099d7
    XmSpinBoxConstraint	textf_c;
Packit b099d7
    int			i, skipped;
Packit b099d7
    int			new_nvalues;
Packit b099d7
    XmStringTable	values;
Packit b099d7
    _XmWidgetToAppContext(ssb_w);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  
Packit b099d7
    /*
Packit b099d7
     * Get the latest resource values for the SimpleSpinBox child.
Packit b099d7
     * These may have been changed either by internal operation
Packit b099d7
     * of the SpinBox or by the application doing a SetValues on
Packit b099d7
     * the SimpleSpinBox child.
Packit b099d7
     */
Packit b099d7
    XtVaGetValues(ssb_p->text_field,
Packit b099d7
		  XmNarrowSensitivity, &ssb_p->arrow_sensitivity,
Packit b099d7
		  XmNdecimalPoints, &ssb_p->decimal_points,
Packit b099d7
		  XmNincrementValue, &ssb_p->increment_value,
Packit b099d7
		  XmNmaximumValue, &ssb_p->maximum_value,
Packit b099d7
		  XmNminimumValue, &ssb_p->minimum_value,
Packit b099d7
		  XmNnumValues, &ssb_p->num_values,
Packit b099d7
		  XmNposition, &ssb_p->position,
Packit b099d7
		  XmNspinBoxChildType, &ssb_p->sb_child_type,
Packit b099d7
		  XmNvalues, &ssb_p->values,
Packit b099d7
		  XmNwrap, &ssb_p->wrap,
Packit b099d7
Packit b099d7
		  XmNeditable, &ssb_p->editable,
Packit b099d7
		  XmNcolumns, &ssb_p->columns,
Packit b099d7
		  NULL);
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Error checking. 
Packit b099d7
     */
Packit b099d7
    if ((ssb_p->sb_child_type != XmSTRING) || (ssb_p->num_values < 1)) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * BINARY COMPATIBILITY with DTSPINBOX
Packit b099d7
     *
Packit b099d7
     * User gives pos starting at 1 (0 means end of list) 
Packit b099d7
     */
Packit b099d7
    pos--; 
Packit b099d7
    if ((pos < 0) || (pos > ssb_p->num_values))
Packit b099d7
      pos = ssb_p->num_values - 1;
Packit b099d7
Packit b099d7
    new_nvalues = ssb_p->num_values - 1;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Keep the position up to date.
Packit b099d7
     */
Packit b099d7
    if (ssb_p->position > pos)
Packit b099d7
      ssb_p->position--;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Copy the current array of values skipping the item in position 'pos'.
Packit b099d7
     */
Packit b099d7
    values = (XmStringTable)
Packit b099d7
	     XtRealloc((char *) NULL, sizeof(XmString) * new_nvalues);
Packit b099d7
    if (values == (XmStringTable) NULL) {
Packit b099d7
      _XmAppUnlock(app);
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (i=0, skipped=0; i<ssb_p->num_values; i++)
Packit b099d7
      if (i != pos)
Packit b099d7
        values[i-skipped] = XmStringCopy(ssb_p->values[i]);
Packit b099d7
      else
Packit b099d7
	skipped++;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the values array in the parent and save the XmStringTable.
Packit b099d7
     */
Packit b099d7
    XtVaSetValues(ssb_p->text_field, 
Packit b099d7
    		  XmNvalues, values,
Packit b099d7
    		  XmNnumValues, new_nvalues,
Packit b099d7
    		  XmNposition, ssb_p->position,
Packit b099d7
		  NULL);
Packit b099d7
    textf_c = SB_GetConstraintRec(ssb_p->text_field);
Packit b099d7
    ssb_p->values = textf_c->values;
Packit b099d7
    ssb_p->num_values = textf_c->num_values;
Packit b099d7
    ssb_p->position = textf_c->position;
Packit b099d7
  
Packit b099d7
   /*
Packit b099d7
    * Free up the memory in the values array.
Packit b099d7
    */
Packit b099d7
    for (i=0; i
Packit b099d7
      if (values[i] != (XmString) NULL)
Packit b099d7
        XmStringFree(values[i]);
Packit b099d7
Packit b099d7
    XtFree((char *) values);
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *  XmSimpleSpinBoxDeletePos
Packit b099d7
 *	Make the given item the currently visible item in the text-field
Packit b099d7
 *	or label.
Packit b099d7
 ************************************************************************/
Packit b099d7
void 
Packit b099d7
XmSimpleSpinBoxSetItem(	Widget		ssb_w,
Packit b099d7
			XmString 	item)
Packit b099d7
{
Packit b099d7
    XmSimpleSpinBoxPart	*ssb_p = SSB_SIMPLE_SPIN_BOX_PART(ssb_w);
Packit b099d7
    XmSpinBoxConstraint	textf_c;
Packit b099d7
    int			pos;
Packit b099d7
    Arg			args[1];
Packit b099d7
    _XmWidgetToAppContext(ssb_w);
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
  
Packit b099d7
    /*
Packit b099d7
     * Get the latest resource values for the SimpleSpinBox child.
Packit b099d7
     * These may have been changed either by internal operation
Packit b099d7
     * of the SpinBox or by the application doing a SetValues on
Packit b099d7
     * the SimpleSpinBox child.
Packit b099d7
     */
Packit b099d7
    XtVaGetValues(ssb_p->text_field,
Packit b099d7
		  XmNarrowSensitivity, &ssb_p->arrow_sensitivity,
Packit b099d7
		  XmNdecimalPoints, &ssb_p->decimal_points,
Packit b099d7
		  XmNincrementValue, &ssb_p->increment_value,
Packit b099d7
		  XmNmaximumValue, &ssb_p->maximum_value,
Packit b099d7
		  XmNminimumValue, &ssb_p->minimum_value,
Packit b099d7
		  XmNnumValues, &ssb_p->num_values,
Packit b099d7
		  XmNposition, &ssb_p->position,
Packit b099d7
		  XmNspinBoxChildType, &ssb_p->sb_child_type,
Packit b099d7
		  XmNvalues, &ssb_p->values,
Packit b099d7
		  XmNwrap, &ssb_p->wrap,
Packit b099d7
Packit b099d7
		  XmNeditable, &ssb_p->editable,
Packit b099d7
		  XmNcolumns, &ssb_p->columns,
Packit b099d7
		  NULL);
Packit b099d7
    
Packit b099d7
    if (item && ssb_p->num_values > 0) {
Packit b099d7
	for (pos=0; pos<ssb_p->num_values; pos++)
Packit b099d7
	  if (XmStringCompare(item, ssb_p->values[pos]))
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	if (pos < ssb_p->num_values) {
Packit b099d7
	    XtSetArg(args[0], XmNposition, pos);
Packit b099d7
            XtSetValues(ssb_p->text_field, args, 1);
Packit b099d7
            textf_c = SB_GetConstraintRec(ssb_p->text_field);
Packit b099d7
            ssb_p->position = textf_c->position;
Packit b099d7
        }
Packit b099d7
	else
Packit b099d7
	  XmeWarning((Widget) ssb_w, BAD_SSPIN_SET_ITEM);
Packit b099d7
    }
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
}