/*
 * demo.c - simple spin button demo.
 *
 * Jerry Adair
 * adair@iglou.com
 * 
 */
#include <stdio.h>
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/Separator.h>
#include <Xm/PushB.h>
#include "SpinButton.h"

int  main(    int,    char **                                 );
void test(    Widget, XtPointer, XmSpinButtonCallbackStruct * );
void test1(   Widget, XtPointer, XmSpinButtonCallbackStruct * );
void GetText( Widget, Widget,    XtPointer                    );
void DoQuit(  Widget, XtPointer, XtPointer                    );

Widget           topLevel;
Widget           form;
Widget           quitButton;
Widget           separator;
Widget           spinButton1;
Widget           spinButton2;
Widget           getTextButton;
XtAppContext     appContext;


int main( int argc, char **argv )
{
   char             text[20];
   unsigned         i;
   XmString         str;
   Boolean          Trav;
   XFontStruct     *localFont;
   XmFontList       fontList;


   topLevel = XtVaAppInitialize( &appContext, "Demo", NULL, 0,
                                 &argc, argv, NULL,
                                 XmNtitle, "Spin Button", NULL );

   form = XtVaCreateManagedWidget(
                      "form",
                      xmFormWidgetClass,
                      topLevel,
                      NULL );

   str = XmStringCreateLtoR( "Quit Demo", XmFONTLIST_DEFAULT_TAG  );
   quitButton = XtVaCreateManagedWidget(
                      "quitButton",
                      xmPushButtonWidgetClass,
                      form, 
                      XmNlabelString, str, 
                      XmNleftAttachment, XmATTACH_FORM, 
                      XmNleftOffset, 8, 
                      XmNtopAttachment,  XmATTACH_FORM, 
                      XmNtopOffset, 8, 
                      NULL);
   XmStringFree(str);
   XtAddCallback( quitButton,
                  XmNactivateCallback, ( XtCallbackProc ) DoQuit,
                  NULL );

   separator = XtVaCreateManagedWidget(
                      "separator1",
                      xmSeparatorWidgetClass,
                      form, 
                      XmNleftAttachment,  XmATTACH_FORM, 
                      XmNrightAttachment, XmATTACH_FORM,
                      XmNtopAttachment,   XmATTACH_WIDGET, 
                      XmNtopWidget,       quitButton, 
                      NULL ); 

   if( ( localFont = XLoadQueryFont( XtDisplay(form), "-adobe-times-medium-r-normal--18-180-75-75-p-94-iso8859-1\0") ) != NULL )
     fontList  = XmFontListCreate( localFont, XmFONTLIST_DEFAULT_TAG );
   else
   {
     localFont = XLoadQueryFont( XtDisplay(form), "8x13\0");
     fontList  = XmFontListCreate( localFont, XmFONTLIST_DEFAULT_TAG );

   } /* end else can't load that font */

   spinButton1 = XtVaCreateManagedWidget( "spinButton2",
                      xmSpinButtonWidgetClass,
                      form, 
                      XmNcolumns,                  4,
                      XmNmaxLength,                4,
                      XmNmaximum,                  900,
                      XmNminimum,                  100,
                      XmNposition,                 100,
                      XmNarrowLayout,              XmARROWS_END,
                      XmNinitialDelay,             500,
                      XmNrepeatDelay,              50,
                      XmNspinButtonLabelFontList,  fontList,
                      XmNspinButtonTextFontList,   fontList,
                      XmNdecimalPoints,            2,
                      XmNverticalSpacing,          10,
                      XmNchildType,                XmNUMERIC,
                      XmNleftAttachment,           XmATTACH_FORM, 
                      XmNrightAttachment,          XmATTACH_FORM,
                      XmNtopAttachment,            XmATTACH_WIDGET, 
                      XmNtopWidget,                separator, 
                      NULL );

   XtAddCallback( spinButton1, XmNvalueChangedCallback, test, NULL );

   spinButton2 = XtVaCreateManagedWidget( "spinButton2",
                      xmSpinButtonWidgetClass,
                      form, 
                      XmNcolumns,                  10,
                      XmNmaxLength,                3,
                      XmNarrowLayout,              XmARROWS_END,
                      XmNinitialDelay,             500,
                      XmNrepeatDelay,              50,
                      XmNminimum,                  1,
                      XmNmaximum,                  100,
                      XmNspinButtonLabelFontList,  fontList,
                      XmNspinButtonTextFontList,   fontList,
                      XmNchildType,                XmSTRING,
                      XmNleftAttachment,           XmATTACH_FORM, 
                      XmNrightAttachment,          XmATTACH_FORM,
                      XmNtopAttachment,            XmATTACH_WIDGET, 
                      XmNtopWidget,                spinButton1, 
                      NULL );

   for( i=1 ; i<100 ; i++ )
   {
      sprintf( text, "%d", i );
      str = XmStringCreateLtoR( text, XmFONTLIST_DEFAULT_TAG );
      XmSpinButtonAddItem( spinButton2, str, i, 1 );
      XmStringFree( str );

   } /* end for */

   XtAddCallback( spinButton2, XmNvalueChangedCallback, test1, NULL );

   str = XmStringCreateLtoR( "Get String in SpinButton1", XmFONTLIST_DEFAULT_TAG );
   getTextButton = XtVaCreateManagedWidget(
                      "getTextButton",
                      xmPushButtonWidgetClass,
                      form, 
                      XmNlabelString,              str, 
                      XmNleftAttachment,           XmATTACH_FORM, 
                      XmNtopAttachment,            XmATTACH_WIDGET, 
                      XmNtopWidget,                spinButton2, 
                      NULL );
    XmStringFree( str );
    XtAddCallback( getTextButton,
                   XmNactivateCallback, ( XtCallbackProc ) GetText,
                   spinButton1 );

    XtRealizeWidget( topLevel   );

    XtAppMainLoop(   appContext );

} /* end main() */


void test( Widget widget, XtPointer client_data, XmSpinButtonCallbackStruct *call_data )
{
   char   *text;

   XmStringGetLtoR( call_data->value, XmFONTLIST_DEFAULT_TAG, &text );
   printf( "value = %s\n", text );
   XtFree( text );

}


void test1( Widget widget, XtPointer client_data, XmSpinButtonCallbackStruct *call_data )
{
   char   *text;

   XmStringGetLtoR( call_data->value, XmFONTLIST_DEFAULT_TAG, &text );
   printf( "value = %s\n", text );
   XtFree( text );

}


void GetText( Widget widget, Widget client_data, XtPointer call_data )
{
   char   *text;

   text = XmSpinButtonGetTextString( client_data );
   printf( "Retrieving text; value = >%s<\n", text );
   XtFree( text );

}


void DoQuit( Widget widget, XtPointer client_data, XtPointer call_data )
{
   XmString   str;
   char      *text;

   exit( 0 );

}


syntax highlighted by Code2HTML, v. 0.9.1