home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / master12.zip / mastering / scaledemo.c < prev    next >
C/C++ Source or Header  |  1992-08-25  |  9KB  |  324 lines

  1. /*
  2.  * Include File Declarations
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <Xm/MainW.h>
  7. #include <Xm/Form.h>
  8. #include <Xm/Frame.h>
  9. #include <Xm/Label.h>
  10. #include <Xm/RowColumn.h>
  11. #include <Xm/PushBG.h>
  12. #include <Xm/PushB.h>
  13. #include <Xm/Scale.h>
  14. #include <Xm/CascadeB.h>
  15. #include <Xm/MessageB.h>
  16.  
  17. /*-------------------------------------------------------------
  18. ** Forward Declarations
  19. */
  20.  
  21. void main();
  22. Widget CreateHelp ();
  23. void HelpCB ();
  24. void QuitCB ();
  25. void ScaleCallback();
  26.  
  27. /*
  28.  * Global Variables
  29.  */
  30.  
  31. static XmStringCharSet charset = (XmStringCharSet) XmFONTLIST_DEFAULT_TAG;
  32.  
  33. Widget appshell; 
  34. Arg args [15];
  35. int n;
  36. int i;
  37.  
  38. /*-------------------------------------------------------------
  39. **  HelpCB      - callback for help button
  40. */
  41. void HelpCB (w, client_data, call_data) 
  42. Widget    w;    /*  widget id    */
  43. XtPointer    client_data;  /*  data from application   */
  44. XtPointer    call_data;  /*  data from widget class  */
  45. {
  46.   Widget    message_box;    /*  message box    */
  47.  
  48.  
  49.   /*  Create help window. */
  50.   message_box = CreateHelp (w);
  51.  
  52.  
  53.   /*  Display help window. */
  54.   XtManageChild (message_box);
  55. }
  56.  
  57. /*-------------------------------------------------------------
  58. **  CreateHelp    - create help window
  59. */
  60. Widget CreateHelp (parent) 
  61.   Widget    parent;    /*  parent widget  */
  62. {
  63.   Widget    button;
  64.   Widget    message_box;  /*  Message Dialog   */
  65.   Arg    args[10];    /*  arg list    */
  66.   register int  n;    /*  arg count    */
  67.  
  68.   static char  message[1000];  /*  help text  */
  69.   XmString  title_string = NULL;
  70.   XmString  message_string = NULL;
  71.   XmString  button_string = NULL;
  72.  
  73.   /*  Generate message to display. */
  74.   sprintf (message, "\
  75. This program shows you how to create and use a scale widget.  When\n\
  76. you move the slider, the values are displayed on the scale and a\n\
  77. message appears on the terminal window with the callback reason and the\n\
  78. new scale value.  To terminate the program, press the File button \n\
  79. and then the Exit button.\0");
  80.  
  81.   /* Create the compound strings */
  82.   message_string = XmStringCreateLtoR (message, charset);
  83.   button_string = XmStringCreateLtoR ("Close", charset);
  84.   title_string = XmStringCreateLtoR ("getdlog help", charset);
  85.  
  86.   /*  Create message box dialog. */
  87.   n = 0;
  88.   XtSetArg (args[n], XmNdialogTitle, title_string);  n++;
  89.   XtSetArg (args[n], XmNokLabelString, button_string);  n++;
  90.   XtSetArg (args[n], XmNmessageString, message_string);  n++;
  91.   message_box = XmCreateMessageDialog (parent, "helpbox", args, n);
  92.  
  93.   button = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON);
  94.   XtUnmanageChild (button);
  95.   button = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON);
  96.   XtUnmanageChild (button);
  97.  
  98.   /*  Free strings and return message box. */
  99.   if (title_string) XmStringFree (title_string);
  100.   if (message_string) XmStringFree (message_string);
  101.   if (button_string) XmStringFree (button_string);
  102.   return (message_box);
  103. }
  104.  
  105. /*-------------------------------------------------------------
  106. **  QuitCB      - callback for quit button
  107. */
  108. void QuitCB (w, client_data, call_data) 
  109. Widget    w;    /*  widget id    */
  110. XtPointer    client_data;  /*  data from application   */
  111. XtPointer    call_data;  /*  data from widget class  */
  112. {
  113.  
  114.   /*  Terminate the application. */
  115.   exit (0);
  116. }
  117.  
  118.  
  119. /* ScaleCallback is executed for any callback from scale.  The
  120.    scale callback structure is used to find the callback reason and
  121.    the scale value.  Control is switched based on the callback reason.
  122.  *
  123.  */
  124. void ScaleCallback (sw, closure, call_data)
  125. Widget sw;
  126. XtPointer closure;
  127. XtPointer call_data;
  128.  
  129. {
  130.    int value;
  131.    int reason;
  132.    int pixel;
  133.    XmScaleCallbackStruct * call_value = (XmScaleCallbackStruct *) call_data;
  134.       
  135.  
  136.    reason = call_value -> reason;
  137.    value = call_value -> value;
  138.  
  139.  
  140.    switch (reason)
  141.    {
  142.       case XmCR_VALUE_CHANGED:
  143.          printf ("Reason = XmCR_VALUE_CHANGED,    Value = %d\n", value);
  144.       break;
  145.  
  146.       case XmCR_DRAG:
  147.          printf ("Reason = XmCR_DRAG,    Value = %d\n", value);
  148.       break;
  149.  
  150.       default:
  151.          printf ("Hit the default, incorrect reason sent!!\n");
  152.       break;
  153.  
  154.    }
  155. }
  156. /*
  157.  *main
  158.  */
  159. void main(argc, argv)
  160.  unsigned int argc;
  161.  char **argv;
  162. {
  163.   Widget  main_window, form, frame, menu_bar, menu_pane, cascade, button;
  164.   XtAppContext app_context;
  165.   Display *display;
  166.    
  167.   Widget scale;
  168.   Widget label[11];
  169.   XmFontList fontlist;
  170.   XFontStruct * font;
  171.   XmStringCharSet cset = XmFONTLIST_DEFAULT_TAG;
  172.   XmString titleString;
  173.  
  174. /*
  175.  * Initialize the application shell widget
  176.  */
  177.   appshell = XtAppInitialize(&app_context, "Scaledemo", NULL, 0, &argc, argv,
  178.   NULL, args, 0);
  179.  
  180.  /* Create main window.
  181.  */
  182.  n = 0;
  183.  main_window = XmCreateMainWindow (appshell, "main1", args, n);
  184.  XtManageChild (main_window);
  185.  
  186.  /* Create menu bar in main window. */
  187.  n = 0;
  188.  menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n); 
  189.  XtManageChild (menu_bar);
  190.  
  191.  /* Create File pulldown menu. */
  192.  n = 0;
  193.  menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
  194.  
  195.  n = 0;
  196.  button = XmCreatePushButtonGadget (menu_pane, "Exit", args, n);
  197.  XtManageChild (button);
  198.  XtAddCallback (button, XmNactivateCallback, QuitCB, NULL);
  199.  
  200.  n = 0;
  201.  XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
  202.  cascade = XmCreateCascadeButton (menu_bar, "File", args, n);
  203.  XtManageChild (cascade);
  204.  
  205.  /* Create "Help" button. */
  206.  n = 0;
  207.  cascade = XmCreateCascadeButton (menu_bar, "Help", args, n);
  208.  XtManageChild (cascade);
  209.  XtAddCallback (cascade, XmNactivateCallback, HelpCB, NULL);
  210.  
  211.  n = 0;
  212.  XtSetArg (args[n], XmNmenuHelpWidget, cascade); n++;
  213.  XtSetValues (menu_bar, args, n);
  214.  
  215.  i = 0; 
  216.     
  217. /*
  218.  *Create a form widget 
  219.  */
  220.  i = 0;
  221.  form = XmCreateForm (main_window, "form", args, i);
  222.  
  223. /*
  224.  *Manage the form widget 
  225.  */
  226.   XtManageChild(form);
  227.  
  228. /*
  229.  * Set main window areas 
  230.  */
  231.   XmMainWindowSetAreas (main_window, menu_bar, NULL, NULL, NULL, form);
  232.  
  233. /*
  234.  *Create a frame widget to enhance the scale's appearance 
  235.  */
  236.   i = 0;
  237.   XtSetArg (args[i], XmNbottomOffset, 15); i++;
  238.   XtSetArg (args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  239.   XtSetArg (args[i], XmNtopOffset, 15); i++;
  240.   XtSetArg (args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  241.   XtSetArg (args[i], XmNleftOffset, 15); i++;
  242.   XtSetArg (args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  243.   XtSetArg (args[i], XmNrightOffset, 15); i++;
  244.   XtSetArg (args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  245.   XtSetArg (args[i], XmNmarginHeight, 10); i++;
  246.   XtSetArg (args[i], XmNmarginWidth, 10); i++;
  247.   frame = XmCreateFrame (form, "frame", args, i);
  248.  
  249. /*
  250.  *Manage the frame widget 
  251.  */
  252.   XtManageChild(frame);
  253.  
  254. /*
  255.  *Create a compound string for the scale title 
  256.  */
  257.    font = XLoadQueryFont (XtDisplay (appshell), "courB14");
  258.    fontlist = XmStringCreateFontList (font, cset);
  259.    titleString = XmStringCreateLtoR ("Scale Demonstration", cset);
  260.  
  261. /* 
  262.  *Set up arglist and create the scale  
  263.  */
  264.    n = 0;
  265.    XtSetArg (args[n], XmNfontList, fontlist);    n++; 
  266.    XtSetArg (args[n], XmNshowValue, True);    n++; 
  267.    XtSetArg (args[n], XmNtitleString, titleString); n++;
  268.    XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
  269.    XtSetArg (args[n], XmNmaximum, 100); n++;
  270.    XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++;
  271.    scale = XmCreateScale(frame, "scale", args, n); 
  272.    XmStringFree (titleString);
  273.    XmFontListFree (fontlist);
  274.  
  275. /*
  276.  *Manage the scale 
  277.  */
  278.    XtManageChild (scale);
  279.  
  280. /*
  281.  *Add the callbacks 
  282.  */
  283.    XtAddCallback (scale, XmNvalueChangedCallback, ScaleCallback, NULL);
  284.    XtAddCallback (scale, XmNdragCallback,         ScaleCallback, NULL);
  285.  
  286. /*
  287.  * Set fontlist for all the labels 
  288.  */
  289.    n = 0;
  290.    XtSetArg (args[0], XmNfontList, fontlist); n++;    
  291.  
  292. /*
  293.  *Create the labels for the scale values 
  294.  */
  295.    i = 0;
  296.    label[i] = XmCreateLabel (scale, "0", args, n); i++;
  297.    label[i] = XmCreateLabel (scale, "10", args, n); i++;
  298.    label[i] = XmCreateLabel (scale, "20", args, n); i++;
  299.    label[i] = XmCreateLabel (scale, "30", args, n); i++;
  300.    label[i] = XmCreateLabel (scale, "40", args, n); i++;
  301.    label[i] = XmCreateLabel (scale, "50", args, n); i++;
  302.    label[i] = XmCreateLabel (scale, "60", args, n); i++;
  303.    label[i] = XmCreateLabel (scale, "70", args, n); i++;
  304.    label[i] = XmCreateLabel (scale, "80", args, n); i++;
  305.    label[i] = XmCreateLabel (scale, "90", args, n); i++;
  306.    label[i] = XmCreateLabel (scale, "100", args, n); i++;
  307.  
  308. /*
  309.  * Manage all the labels 
  310.  */
  311.   XtManageChildren (label,i);
  312.   XmFontListFree (fontlist);
  313.  
  314. /*
  315.  * Realize the appshell widget, which displays all children
  316.  */ 
  317.   XtRealizeWidget(appshell);
  318.  
  319. /*
  320.  * Go into a loop and wait for input
  321.  */
  322.   XtAppMainLoop(app_context);
  323. }
  324.