| Previous | Contents | Index | 
Example 4-6 shows the code that implements the help widget for the OpenVMS DECburger sample application. The complete UIL source code for the OpenVMS DECburger application in DECW$EXAMPLES on OpenVMS systems.
| Example 4-6 UIL Help Widget Implementation | 
|---|
| 
   .
   .
   .
!module DECburger_demo 
 
module decburger 
        version = 'v1.1.1' 
        names = case_sensitive 
 
        objects = { 
                XmSeparator = gadget ; 
                XmLabel = gadget ; 
                XmPushButton = gadget ; 
                XmToggleButton = gadget ; 
                } 
 
procedure                                  
        toggle_proc   (integer); 
        activate_proc (integer); 
        create_proc   (integer); 
        scale_proc    (integer); 
        list_proc     (integer); 
        exit_proc     (string); 
        show_hide_proc (integer); 
        pull_proc       (integer); 
        (1)sens_help_proc (compound_string);   
        help_system_proc (string);   
        ok_color_proc   (); 
        apply_color_proc (); 
        cancel_color_proc (); 
                       
value 
    k_create_order          : 1; 
    k_order_pdme            : 2; 
    k_file_pdme             : 3; 
    k_edit_pdme             : 4;    
    k_nyi                   : 5; 
    k_ok                    : 6;  ! NOTE: ok, apply, reset, cancel 
    k_apply                 : 7;  ! must be sequential 
    k_reset                 : 8; 
    k_cancel                : 9; 
    k_cancel_order          : 10; 
    k_submit_order          : 11; 
    k_order_box             : 12; 
    k_burger_min            : 13; 
    k_burger_rare           : 13; 
    k_burger_medium         : 14; 
    k_burger_well           : 15; 
    k_burger_ketchup        : 16; 
    k_burger_mustard        : 17; 
    k_burger_onion          : 18; 
    k_burger_mayo           : 19; 
    k_burger_pickle         : 20; 
    k_burger_max            : 20; 
    k_burger_quantity       : 21; 
    k_fries_tiny            : 22; 
    k_fries_small           : 23; 
    k_fries_medium          : 24; 
    k_fries_large           : 25; 
    k_fries_huge            : 26; 
    k_fries_quantity        : 27;               
    k_drink_list            : 28; 
    k_drink_add             : 29; 
    k_drink_sub             : 30; 
    k_drink_quantity        : 31; 
    k_total_order           : 32; 
    k_burger_label          : 33; 
    k_fries_label           : 34; 
 
    k_drink_label           : 35; 
    k_menu_bar              : 36; 
    k_file_menu             : 37; 
    k_edit_menu             : 38; 
    k_order_menu            : 39; 
    k_help_pdme             : 40;   
    k_help_menu             : 41;      
    k_help_overview         : 42;               
    k_help_about            : 43; 
    k_help_onhelp           : 44;   
    k_help_sensitive        : 45;  
    k_print                 : 46; 
    k_options_pdme          : 47;   
    k_options_menu          : 48;      
    k_create_options        : 49;   
    k_fries_optionmenu      : 50;         
 
value 
       k_decburger_title              : 'DECburger: Order Entry Box'; 
       k_nyi_label_text               : 'This feature is not yet implemented.'; 
       k_file_label_text              : 'File'; 
           k_print_label_text         :   'Print Order..';     
           k_exit_label_text          :   'Exit'; 
       k_edit_label_text              : 'Edit'; 
           k_cut_dot_label_text       :   'Cut'; 
           k_copy_dot_label_text      :   'Copy'; 
           k_paste_dot_label_text     :   'Paste'; 
           k_clear_dot_label_text     :   'Clear'; 
           k_select_all_label_text    :   'Select All'; 
       k_order_label_text             : 'Order'; 
           k_cancel_order_label_text  :   'Cancel Order'; 
           k_submit_order_label_text  :   'Submit Order'; 
       k_options_label_text           : 'Options'; 
           k_options_color_label_text :   'Background Color...'; 
       (2)k_help_label_text              : 'Help'; 
           k_sensitive_label_text     :   'On Context';    
           k_overview_label_text      :   'On Window';   
           k_about_label_text         :   'On Version'; 
           k_onhelp_label_text        :   'On Help';   
       k_hamburgers_label_text        : 'Hamburgers'; 
           k_rare_label_text          :   'Rare'; 
           k_medium_label_text        :   'Medium'; 
           k_well_done_label_text     :   'Well Done'; 
           k_ketchup_label_text       :   'Ketchup'; 
           k_mustard_label_text       :   'Mustard'; 
           k_onion_label_text         :   'Onion'; 
           k_mayonnaise_label_text    :   'Mayonnaise'; 
           k_pickle_label_text        :   'Pickle'; 
           k_quantity_label_text      : 'Quantity'; 
       k_fries_label_text             : 'Fries'; 
           k_size_label_text          : 'Size'; 
           k_tiny_label_text          :   'Tiny'; 
           k_small_label_text         :   'Small'; 
           k_large_label_text         :   'Large'; 
           k_huge_label_text          :   'Huge'; 
       k_drinks_label_text            : 'Drinks'; 
           k_0_label_text             : ' 0'; 
           k_drink_list_text          : 
                   string_table (     'Apple Juice', 
                                      'Orange Juice', 
                                      'Grape Juice', 
                                      'Cola', 
                                      'Punch', 
                                      'Root beer', 
                                      'Water', 
                                      'Ginger Ale', 
                                      'Milk', 
                                      'Coffee', 
                                      'Tea'); 
           k_drink_list_select        : string_table('Apple Juice'); 
       k_ok_label_text                : 'OK'; 
       k_apply_label_text             : 'Apply'; 
       k_reset_label_text             : 'Reset'; 
       k_cancel_label_text            : 'Cancel'; 
 
 
 
 
 
!Compound strings to use for context-sensitive help callbacks 
 
  (3)value 
        k_order_help            :  compound_string ("order"); 
        k_print_help            :  compound_string ("print"); 
        k_options_help          :  compound_string ("options"); 
        k_menu_bar_help         :  compound_string ("menu_bar"); 
        k_file_help             :  compound_string ("file_menu"); 
        k_edit_help             :  compound_string ("edit_menu"); 
        k_order_menu_help       :  compound_string ("order_menu"); 
        k_help_help             :  compound_string ("help"); 
        k_sensitive_help        :  compound_string ("sensitive"); 
        k_onhelp_help           :  compound_string ("onhelp"); 
        k_about_help            :  compound_string ("about"); 
        k_overview_help         :  compound_string ("overview"); 
        k_nyi_help              :  compound_string ("not_implemented"); 
 
 
   .
   .
   .
               
  (4)object                      
       main_help : DXmHelpDialog { 
           arguments            
                { 
                DXmNapplicationName = compound_string("Help Example");  
                DXmNglossaryTopic   = compound_string("glossary"); 
                DXmNoverviewTopic   = compound_string("overview");  
                DXmNlibrarySpec     = compound_string("decburger.hlb"); 
                }; 
                                
            };     
                
   .
   .
   .
object      
    s_menu_bar : XmMenuBar { 
 
        arguments {                                                    
            XmNorientation         = XmHORIZONTAL; 
            (5)XmNmenuHelpWidget  = XmCascadeButton help_menu_entry;   
        }; 
 
        controls {                              
            XmCascadeButton        file_menu_entry; 
            XmCascadeButton        edit_menu_entry; 
            XmCascadeButton        order_menu_entry;    
            XmCascadeButton        options_menu_entry;  
            (6)XmCascadeButton        help_menu_entry;    
        }; 
        callbacks { 
            MrmNcreateCallback     = procedure create_proc (k_menu_bar); 
            (7)XmNhelpCallback    = procedure sens_help_proc(k_menu_bar_help); 
        }; 
    }; 
 
       
   .
   .
   .
(8)object help_menu_entry : XmCascadeButton {                 
            arguments { 
                XmNlabelString     = k_help_label_text; 
                XmNmnemonic        = keysym("H"); 
                };          
            controls { 
                XmPulldownMenu     help_menu; 
                }; 
            callbacks 
                {                             
                XmNhelpCallback    = procedure sens_help_proc(k_help_help); 
                };     
            }; 
 
                           
(9)object help_menu : XmPulldownMenu                          
            {                               
            controls   
                {                 
                XmPushButton       help_sensitive; 
                XmPushButton       help_window; 
                XmPushButton       help_version; 
                XmPushButton       help_onhelp; 
                }; 
                 
            callbacks 
                {                             
                XmNhelpCallback    = procedure sens_help_proc(k_help_help); 
                }; 
            };         
                                           
 
object help_sensitive : XmPushButton 
            {                  
            arguments 
                {                
                XmNlabelString     = k_sensitive_label_text; 
                XmNmnemonic        = keysym("C");  
                };     
            callbacks 
                {                                                  
          (10)XmNactivateCallback  = procedure activate_proc (k_help_sensitive); 
          XmNhelpCallback      = procedure sens_help_proc(k_sensitive_help); 
                };                                     
            };                                                 
 
 
object help_onhelp : XmPushButton 
            {                  
            arguments 
                {                           
                XmNlabelString     = k_onhelp_label_text; 
                XmNmnemonic        = keysym("H"); 
                };     
            callbacks 
                {                             
             XmNactivateCallback = procedure activate_proc (k_help_onhelp); 
             XmNhelpCallback     = procedure sens_help_proc(k_onhelp_help); 
                };     
            };                                                 
             
 
 
object help_version : XmPushButton   
            { 
            arguments 
                {                                  
                XmNlabelString      = k_about_label_text; 
                XmNmnemonic         = keysym("V"); 
                }; 
            callbacks 
                { 
             XmNactivateCallback = procedure activate_proc (k_help_about); 
             XmNhelpCallback     = procedure sens_help_proc(k_about_help); 
               };                      
            };   
 
object help_window : XmPushButton 
             { 
             arguments 
                {              
                XmNlabelString      = k_overview_label_text; 
                XmNmnemonic         = keysym("W"); 
                }; 
             callbacks 
                {                           
             XmNactivateCallback = procedure activate_proc (k_help_overview); 
             XmNhelpCallback     = procedure sens_help_proc(k_overview_help); 
                };                                   
            }; 
 
   .
   .
   .
 | 
Example 4-7 and Example 4-8 show the C language code that implements the help widget created in Example 4-9. The complete C source code for the OpenVMS DECburger application is included in DECW$EXAMPLES on OpenVMS systems.
| Example 4-7 Help Widget Implementation---C Language Module | 
|---|
| 
   .
   .
   .
#include <stdio.h>                              /* For printf and so on. */ 
        
#include   <Xm/Text.h>      
#include   <Mrm/MrmAppl.h>      
(1)#include   <DXm/DXmHelpB.h>      
#include   <DXm/DXmPrint.h>      
#include   <X11/Xlib.h>      
#include   <X11/Xutil.h>      
#include   <DXm/DXmColor.h> 
#include   <DXm/DECspecific.h>  
 
#ifdef VMS 
/* For OpenVMS systems, use the following include file:  */ 
#include   <sys$library/DECw$Cursor.h> 
 
#else 
/* For UNIX systems, use the following include file:  */ 
#include   <X11/decwcursor.h> 
 
#endif 
 
/* 
 * These numbers are matched with corresponding numbers in the 
 * OpenVMS DECburger UIL module. 
 */            
 
#define k_create_order         1 
#define k_order_pdme           2 
#define k_file_pdme            3 
#define k_edit_pdme            4 
#define k_nyi                  5 
#define k_ok                   6    /* NOTE: ok, apply, reset, cancel */ 
#define k_apply                7    /* must be sequential */ 
#define k_reset                8 
#define k_cancel               9 
#define k_cancel_order         10 
#define k_submit_order         11 
#define k_order_box            12 
#define k_burger_min           13 
#define k_burger_rare          13 
#define k_burger_medium        14 
#define k_burger_well          15 
#define k_burger_ketchup       16 
#define k_burger_mustard       17 
#define k_burger_onion         18 
#define k_burger_mayo          19 
#define k_burger_pickle        20 
#define k_burger_max           20 
#define k_burger_quantity      21 
#define k_fries_tiny           22 
#define k_fries_small          23 
 
#define k_fries_medium         24 
#define k_fries_large          25 
#define k_fries_huge           26 
#define k_fries_quantity       27 
#define k_drink_list           28 
#define k_drink_add            29 
#define k_drink_sub            30 
#define k_drink_quantity       31 
#define k_total_order          32 
#define k_burger_label         33 
#define k_fries_label          34 
#define k_drink_label          35 
#define k_menu_bar             36 
#define k_file_menu            37 
#define k_edit_menu            38 
#define k_order_menu           39 
(2)#define k_help_pdme            40 
#define k_help_menu            41 
#define k_help_overview        42 
#define k_help_about           43 
#define k_help_onhelp          44 
#define k_help_sensitive       45 
#define k_print                46 
#define k_custom_pdme          47 
#define k_custom_menu          48 
#define k_create_custom        49 
#define k_fries_optionmenu     50 
 
#define k_max_widget           50 
 
 
#define MAX_WIDGETS (k_max_widget + 1) 
 
#define NUM_BOOLEAN (k_burger_max - k_burger_min + 1) 
 
#define k_burger_index   0 
#define k_fries_index    1 
#define k_drinks_index   2 
#define k_index_count    3 
 
 
/* 
 * Global data 
 */ 
 
static Cursor watch = NULL; 
 
static Widget 
  toplevel_widget = (Widget)NULL,     /* Root widget ID of our application. */ 
  main_window_widget = (Widget)NULL,  /* Root widget ID of main MRM fetch   */ 
  widget_array[MAX_WIDGETS],          /* Place to keep all other widget IDs */ 
  (3)main_help_widget = (Widget)NULL,    /* Primary help widget */ 
  (4)help_widget[MAX_WIDGETS],           /* Array of help widgets */ 
  help_array[MAX_WIDGETS],            /* Array of help widgets for Toolkit  */ 
  print_widget = (Widget)NULL,        /* Print widget                       */ 
  color_widget = (Widget)NULL;        /* Color Mix widget                   */ 
  
static Screen   *the_screen;            /* Pointer to screen data*/ 
static Display  *the_display;           /* Pointer to display data */ 
static XColor  savecolor;  
 
static int help_num = 0;                /* make sure they start zero */   
static int low_num = 0; 
 
   .
   .
   .
 
/* 
 * Forward declarations 
 */ 
 
static void s_error(); 
static void get_something(); 
static void set_something(); 
static void activate_proc(); 
static void create_proc(); 
static void list_proc(); 
static void exit_proc(); 
static void pull_proc(); 
static void scale_proc(); 
static void show_hide_proc(); 
static void show_label_proc(); 
static void toggle_proc(); 
 
(5)static void create_help(); 
static void tracking_help(); 
static void sens_help_proc();    
static void help_system_proc();    
static void create_print(); 
static void activate_print(); 
static void create_color();   
static void ok_color_proc(); 
static void apply_color_proc();   
static void cancel_color_proc();   
static void xmstring_append(); 
static void start_watch(); 
static void stop_watch(); 
 
 
/* The names and addresses of things that Mrm has to bind.  The names do 
 * not have to be in alphabetical order.  */ 
 
static MrmRegisterArg reglist[] = { 
    {"activate_proc", (caddr_t) activate_proc}, 
    {"create_proc", (caddr_t) create_proc}, 
    {"list_proc", (caddr_t) list_proc}, 
    {"pull_proc", (caddr_t) pull_proc}, 
    {"exit_proc", (caddr_t) exit_proc}, 
    {"scale_proc", (caddr_t) scale_proc}, 
    {"show_hide_proc", (caddr_t) show_hide_proc}, 
    {"show_label_proc", (caddr_t) show_label_proc}, 
    {"toggle_proc", (caddr_t) toggle_proc}, 
    (6){"sens_help_proc", (caddr_t) sens_help_proc}, 
    {"help_system_proc", (caddr_t) help_system_proc},      
    {"cancel_color_proc", (caddr_t) cancel_color_proc}, 
    {"apply_color_proc", (caddr_t) apply_color_proc}, 
    {"ok_color_proc", (caddr_t) ok_color_proc}       
}; 
 
 
static int reglist_num = (sizeof reglist / sizeof reglist [0]); 
static font_unit = 400; 
 
/*   
 * OS transfer point.  The main routine does all the one-time setup and 
 * then calls XtMainLoop. 
 */ 
 
static String fallback = 
          "DECburger.title: DECburger\nDECburger.x: 100\nDECburger.y: 100"; 
 
unsigned int main(argc, argv) 
    unsigned int argc;                  /* Command line argument count. */ 
    char *argv[];                       /* Pointers to command line args. */ 
{ 
    XtAppContext app_context;    
 
    MrmInitialize();                    /* Initialize MRM before initializing 
                                        /* the X Toolkit. */ 
 
    (7)DXmInitialize();                 /* Initialize DXm widgets */    
 
  /* If we had user-defined widgets, we would register them with Mrm here. */ 
 
  /* Initialize the X Toolkit. We get back a top level shell widget. */ 
 
      toplevel_widget = XtAppInitialize( 
          &app_context,                   /* App. context is returned */ 
          "DECburger",                    /* Root class name. */ 
           NULL,                          /* No option list. */ 
           0,                             /* Number of options. */ 
           &argc,                         /* Address of argc */ 
           argv,                          /* argv */ 
           &fallback,                     /* Fallback resources */ 
           NULL,                          /* No override resources */ 
           0);                            /* No override resources */ 
 
    /* Open the UID files (the output of the UIL compiler) in the hierarchy*/ 
 
    if (MrmOpenHierarchy( 
        db_filename_num,                    /* Number of files. */ 
        db_filename_vec,                    /* Array of file names.  */ 
        NULL,                               /* Default OS extension. */ 
        &s_MrmHierarchy)                    /* Pointer to returned MRM ID */ 
      !=MrmSUCCESS) 
        s_error("can't open hierarchy"); 
 
    init_application(); 
 
    /* Register the items MRM needs to bind for us. */ 
 
    MrmRegisterNames(reglist, reglist_num); 
          
 
    /* Go get the main part of the application. */ 
    if (MrmFetchWidget(s_MrmHierarchy, "S_MAIN_WINDOW", toplevel_widget, 
      &main_window_widget, &dummy_class) != MrmSUCCESS) 
        s_error("can't fetch main window"); 
 
    /* Save some frequently used values */ 
    the_screen = XtScreen(toplevel_widget); 
    the_display = XtDisplay(toplevel_widget); 
 
    /* If it's a color display, map customize color menu entry */ 
 
    if ((XDefaultVisualOfScreen(the_screen))->class == TrueColor 
        ||  (XDefaultVisualOfScreen(the_screen))->class == PseudoColor 
        ||  (XDefaultVisualOfScreen(the_screen))->class == DirectColor 
        ||  (XDefaultVisualOfScreen(the_screen))->class == StaticColor) 
 
          XtSetMappedWhenManaged(widget_array[k_custom_pdme], TRUE); 
 
 
    /* Manage the main part and realize everything.  The interface comes up 
     * on the display now. */ 
 
    XtManageChild(main_window_widget); 
    XtRealizeWidget(toplevel_widget); 
 
   .
   .
   .
 
 
    /* Sit around forever waiting to process X-events.  We never leave 
     * XtAppMainLoop. From here on, we only execute our callback routines. */ 
    XtAppMainLoop(app_context); 
} 
 
 
 
 
/* 
 * One-time initialization of application data structures. 
 */ 
 
static int init_application() 
{ 
    int k;      
    int i; 
 
    /* Initialize the application data structures. */ 
    for (k = 0; k < MAX_WIDGETS; k++) 
        widget_array[k] = NULL; 
    for (k = 0; k < NUM_BOOLEAN; k++) 
        toggle_array[k] = FALSE; 
 
 
    /* Initialize CS help widgets. */   
 
    (8)for (i = 0; i < MAX_WIDGETS; i++) 
        help_widget[i] = NULL;          
 
   .
   .
   .
 | 
| Example 4-8 Help Widget Implementation---Callbacks | 
|---|
| 
   .
   .
   .
 
/* 
 * All push buttons in this application call back to this routine.  We 
 * use the tag to tell us what widget it is, then react accordingly. 
 */ 
 
static void activate_proc(w, tag, reason) 
    Widget               w; 
    int                  *tag; 
    XmAnyCallbackStruct  *reason; 
{ 
    int         widget_num = *tag;        /* Convert tag to widget number. */ 
    int         i, value; 
    XmString    topic;    
                                                                                     
    switch (widget_num) {   
        case k_nyi: 
                        
            /* The user activated a 'not yet implemented' push button.  Send 
             * the user a message. */ 
            if (widget_array[k_nyi] == NULL) { 
                 /* The first time, fetch from  the data base. */ 
                if (MrmFetchWidget(s_MrmHierarchy, "nyi", toplevel_widget, 
                  &widget_array[k_nyi], &dummy_class) != MrmSUCCESS) { 
                    s_error("can't fetch nyi widget"); 
                } 
            } 
            /*  Put up the message box saying 'not yet implemented'. */ 
            XtManageChild(widget_array[k_nyi]); 
            break; 
 
        case k_submit_order: 
            /*  This would send the order off to the kitchen. In this case, 
             *  we just pretend the order was submitted. */ 
            clear_order(); 
            break; 
 
   .
   .
   .
 
         (1)case k_help_overview: 
            topic = XmStringCreateLtoR("overview",XmSTRING_ISO8859_1);   
            create_help(topic); 
            XmStringFree(topic); 
            break;      
          
          case k_help_about: 
            topic = XmStringCreateLtoR("about",XmSTRING_ISO8859_1);   
            create_help(topic); 
            XmStringFree(topic); 
            break;      
          
          case k_help_onhelp: 
            topic = XmStringCreateLtoR("onhelp",XmSTRING_ISO8859_1);   
            create_help(topic); 
            XmStringFree(topic); 
            break;   
            
          case k_help_sensitive: 
            tracking_help(); 
            break;      
                  
         case k_print: 
            create_print(); 
            break;              
            
         case k_create_custom: 
            create_color(); 
            break;                  
 
         default: 
            break; 
    } 
} 
 
   .
   .
   .
 
 
 
/*                   
 * Context sensitive help callback. 
 */                               
(2)static void sens_help_proc(w, tag, reason) 
    Widget              w; 
    XmString           *tag; 
    XmAnyCallbackStruct *reason;    
{ 
     create_help(tag); 
} 
 
                                         
 
 
/* Creates an instance of the help widget for the push buttons in the help 
pull-down menu and for context-sensitive help callbacks. */ 
                                                                        
                 
 
(3)static void create_help (help_topic) 
    XmString   help_topic; 
                        
{                  
    Arg             arglist[1];         
               
    start_watch();                         
    if (!main_help_widget) {                                    
        if (MrmFetchWidget (s_MrmHierarchy, "main_help", toplevel_widget, 
                            &main_help_widget, &dummy_class) != MrmSUCCESS) 
        s_error ("can't fetch help widget"); 
    }      
 
 
    if (XtIsManaged(main_help_widget)) {   
       
        if (MrmFetchWidget (s_MrmHierarchy, "main_help", toplevel_widget, 
                          &help_widget[help_num], &dummy_class) != MrmSUCCESS) 
        s_error ("can't fetch help widget"); 
           
        XtSetArg (arglist[0], DXmNfirstTopic, help_topic); 
        XtSetValues (help_widget[help_num], arglist, 1);       
        XtManageChild(help_widget[help_num]);    
        help_num++;    
        return; 
    }   
      
    XtSetArg (arglist[0], DXmNfirstTopic, help_topic); 
    XtSetValues (main_help_widget, arglist, 1);       
    XtManageChild(main_help_widget);     
    stop_watch();  
}              
       
 
   .
   .
   .
 | 
| Previous | Next | Contents | Index |