/***********************************************************
Copyright 1993 Interleaf, Inc.

Permission to use, copy, modify, and distribute this software
and its documentation for any purpose without fee is granted,
provided that the above copyright notice appear in all copies
and that both copyright notice and this permission notice appear
in supporting documentation, and that the name of Interleaf not
be used in advertising or publicly pertaining to distribution of
the software without specific written prior permission.

Interleaf makes no representation about the suitability of this
software for any purpose. It is provided "AS IS" without any
express or implied warranty. 
******************************************************************/

Issues:
	TextField only uses 1st segment of items XmString.


1. SpinButton Widget

1.1 Widget Class Name

SpinButton

1.2 Synopsis

    #include "SpinButton.h"

    widget = DtCreateSpinButton(parent, name, arglist, num_args);
    XtManageChild(widget);

1.3 Description

1.4 Resources

    Property		    Type		Init		      Access
    --------		    ----		----		      ------
    XmNactivateCallback     CallbackList        NULL                  CSG
    XmNalignment            unsigned char       XmALIGNMENT_BEGINNING CSG
    XmNarrowLayout          unsigned char       XmARROWS_BEGINNING    CSG
    XmNarrowSensitivity     unsigned char       XmARROWS_SENSITIVE    CSG
    XmNarrowSize            Dimension           dynamic                 G
    XmNchildType            unsigned char       XmSTRING              CSG
    XmNcolumns              Short               20                    CSG
    XmNdecimalPoints        Short               0                     CSG
    XmNeditable             Boolean             TRUE                  CSG
    XmNfocusCallback        CallbackList        NULL                  CSG
    XmNinitialDelay         Unsigned Integer    250                   CSG
    XmNincrement            Integer             1                     CSG
    XmNitemCount            Unsigned Integer    0                     CSG
    XmNitems                XmStringTable       NULL                  CSG
    XmNlosingFocusCallback  CallbackList        NULL                  CSG
    XmNmarginHeight         Dimension           2                     CSG
    XmNmarginWidth          Dimension           2                     CSG
    XmNmaximum              Integer             1                     CSG
    XmNmaxLength            Integer             MAXINT                CSG
    XmNminimum              Integer             0                     CSG
    XmNmodifyVerifyCallback CallbackList        NULL                  CSG
    XmNposition             Unsigned Integer    0                     CSG
    XmNrecomputeSize        Boolean             TRUE                  CSG
    XmNrepeatDelay          Unsigned Integer    200                   CSG
    XmNtextField            Widget              NULL                    G
    XmNvalueChangedCallback CallbackList        NULL                  CSG
    XmNwrap                 Boolean             TRUE                  CSG

    XmNactivateCallback:
		List of callbacks called when the user does KActivate in
		the text-field widget (when SpinButton is editable).
		See also XmTextFieldWidget.
		
    XmNalignment:
		Alignment of the text within the non-editable label.
		This only gets used if XmNeditable is FALSE.  Values are:
			XmALIGNMENT_CENTER, XmALIGNMENT_BEGINNING, 
			XmALIGNMENT_END
		See also XmLabelWidget

    XmNarrowLayout:
		Specifies location of arrows.  Legal values are:
		XmARROWS_FLAT_BEGINNING, XmARROWS_FLAT_END,
		XmARROWS_SPLIT, XmARROWS_BEGINNING, XmARROWS_END

    XmNarrowSensitivity:
		Specifies the sensitivity of the up and down arrows in the
		widget.  The legal values are:
			XmARROWS_SENSITIVE - both sensitive
			XmARROWS_LEFT_SENSITIVE - Up arrow sensitive, 
						  Down arrow insensitive
			XmARROWS_RIGHT_SENSITIVE - Down arrow sensitive,
						   Up arrow insensitive
			XmARROWS_INSENSITIVE - both insensitive

    XmNarrowSize:
		The SpinButton widget calculates the arrow_size dynamically
		based on the size of the text-field or label (which is
		determined by font-size).  This resource is gettable only
		and is here for semi-compatability with the Motif API.

    XmNcolumns:
		This resource is passed on to the text-field widget.
		See also XmTextFieldWidget.

    XmNdecimalPoints:
		This resource is used to position the decimal point
		within the integer value (only used when childType is
		XmNUMERIC). All numeric resources use integer values; use
		this resource to get floats.

    XmNeditable:
		If FALSE, a label is put in the SpinButton; otherwise, 
                an editable text-field is used.

    XmNfocusCallback:
		List of callbacks called when the text-field widget accepts
		focus (when SpinButton is editable).
		See also XmTextFieldWidget.

    XmNincrement:
		If XmNchildType is XmNUMERIC, this is the amount that the
		number will increment/decrement by when the arrows are 
		clicked.

    XmNinitialDelay:
		Specifies the amount of time in milliseconds to wait
                before starting continuous scrolling while a button is
                pressed in an arrow.  This value must be greater than 0.

    XmNchildType:
		If XmSTRING, the items resource is used by the spin-button;
                otherwise, the numeric resources are used for displaying
                data in the label or text-field.  Specifies the kind of
		Spin behavior this child exhibits.  Values are XmNUMERIC which 
		uses the numeric range of values, XmSTRING which uses a list
		of XmStrings.

    XmNitemCount:
		Total numer of items.  This value must be the number of
                items in XmNitems and must not be negative.  It is 
                automatically updated by the widget whenever an item
                is added or deleted.

    XmNitems:   
		A list of xm-strings which will be scrolled
                through when the user presses the up or down arrows.

    XmNlosingFocusCallback:
		List of callbacks called when the text-field widget loses
		focus (when SpinButton is editable).
		See also XmTextFieldWidget.

    XmNmarginHeight:
		Vertical distance from the beginning of the widget to the
                start of the shadow.  Used for making this widget
                look like push-buttons, etc.

    XmNmarginWidth:
		Horizontal distance from the beginning of the widget to 
                the start of the shadow.  Used for making this widget
                look like push-buttons, etc.

    XmNmaximum:
		Upper limit for numeric SpinButton widgets.

    XmNmaxLength:
		Maximum length of the text string that can be entered into
		a text-field widget.  This resource is passed on to the
		text-field (when SpinButton is editable).
		See also XmTextFieldWidget.

    XmNminimum:
		Lower limit for numeric SpinButton widgets.

    XmNmodifyVerifyCallback:
		List of callbacks called when the text-field widget gets
		modified (when SpinButton is editable).
		See also XmTextFieldWidget.

    XmNposition:
		This specifies the current item position when
		XmNchildType is XmSTRING (position of item within the list).
		When XmNchildType is XmNUMERIC this is the current value
		in the label or text-field.

    XmNrecomputeSize:
		If FALSE, the widget will not try to recompute a new
                size if setting some other resource would cause it
                to grow or shrink.

    XmNrepeatDelay:
		The amount of time in milliseconds to wait before
		changing to the next/prev item or number while a
		button is pressed in an arrow.

    XmNtextField:
		text-field widget used within the SpinButton when
		XmNeditable is TRUE.

    XmNvalueChangedCallback:
		List of callbacks called when the value changes in the
		SpinButtin, using the arrows.

    XmNwrap:    
		If FALSE, don't do wrap around (it will beep).


Callback Information:

	typedef struct
	{
	   int		reason;
	   XEvent	*event;
	   Widget	widget;
	   Boolean	doit;
	   int		position;
	   XmString	value;
	   Boolean	crossed_boundary;
	} DtSpinButtonCallbackStruct;

Event is null during continuous spin.
Value is given for both XmNUMERIC and XmSTRING.

========================================================================


Functions available in SpinButton for list manipulation:

	void
	DtSpinButtonAddItem(widget, item, position)
	DtSpinButtonWidget widget;
	XmString item;
	int position;

Adds the given item to the list at the given position.
position is an integer specifying the position of the new item in the
list.  A value of 1 makes the new item the first item in the list; a value
of 2 makes it the second item, and so on.  A value of 0 (zero) makes the new
item the last item in the list.


	void
	DtSpinButtonDeletePos(widget, position)
	DtSpinButtonWidget widget;
	int position;


Deletes the item at the given position from the list.
position is an integer specifying the position of the item to delete 
in the list.  A value of 1 indicates that the first item in the list is
to be deleted. A value of 2 indicates the second item, etc.  A value of 0
indicates that the last item is to be deleted.


	void
	DtSpinButtonSetItem(widget, item)
	DtSpinButtonWidget widget;
	XmString item;

Puts the given item into the spin-button label or text-field (this will be the
new value shown).

