Blame lib/Xm/Command.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: Command.c /main/21 1999/01/26 18:12:51 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "CommandI.h"
Packit b099d7
#include <Xm/DialogS.h>
Packit b099d7
#include <Xm/List.h>
Packit b099d7
#include <Xm/TextF.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "BulletinBI.h"
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "SelectioBI.h"
Packit b099d7
#include "XmStringI.h"
Packit b099d7
Packit b099d7
#include <string.h>
Packit b099d7
#ifndef X_NOT_STDC_ENV
Packit b099d7
#include <stdlib.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#define ARG_LIST_CNT 25
Packit b099d7
Packit b099d7
/* defines for warning messages */
Packit b099d7
#define WARNING1 _XmMMsgCommand_0000
Packit b099d7
#define WARNING2 _XmMMsgCommand_0001
Packit b099d7
#define WARNING3 _XmMMsgCommand_0002
Packit b099d7
#define WARNING4 _XmMMsgCommand_0003
Packit b099d7
#define WARNING5 _XmMMsgCommand_0004
Packit b099d7
#define WARNING6 _XmMMsgCommand_0005
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void ListCallback( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer client_data,
Packit b099d7
                        XtPointer call_data) ;
Packit b099d7
static void CommandCallback( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer cl_data,
Packit b099d7
                        XtPointer call_data) ;
Packit b099d7
static Boolean CommandParentProcess( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XmParentProcessData event) ;
Packit b099d7
static void Resize(
Packit b099d7
                        Widget wid);
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget ow,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
static XtActionsRec actionsList[] =
Packit b099d7
{
Packit b099d7
        { "Return",                     _XmCommandReturn },     /* Motif 1.0 */
Packit b099d7
        { "UpOrDown",                   _XmCommandUpOrDown },   /* Motif 1.0 */
Packit b099d7
        { "BulletinBoardReturn",        _XmCommandReturn },
Packit b099d7
        { "SelectionBoxUpOrDown",       _XmCommandUpOrDown },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/* define the resource stuff for a command widget */
Packit b099d7
static XmSyntheticResource syn_resources[] = {
Packit b099d7
Packit b099d7
    {   XmNpromptString,
Packit b099d7
        sizeof (XmString),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.selection_label_string),
Packit b099d7
        _XmSelectionBoxGetSelectionLabelString,
Packit b099d7
		NULL },
Packit b099d7
Packit b099d7
    {   XmNcommand,
Packit b099d7
        sizeof (XmString),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.text_string),
Packit b099d7
        _XmSelectionBoxGetTextString,
Packit b099d7
		NULL },
Packit b099d7
Packit b099d7
    {   XmNhistoryItems,
Packit b099d7
        sizeof (XmString *),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_items),
Packit b099d7
        _XmSelectionBoxGetListItems,
Packit b099d7
		NULL },
Packit b099d7
Packit b099d7
    {   XmNhistoryItemCount,
Packit b099d7
        sizeof(int),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_item_count),
Packit b099d7
        _XmSelectionBoxGetListItemCount,
Packit b099d7
		NULL },
Packit b099d7
Packit b099d7
    {   XmNhistoryVisibleItemCount,
Packit b099d7
        sizeof(int),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_visible_item_count),
Packit b099d7
        _XmSelectionBoxGetListVisibleItemCount,
Packit b099d7
		NULL },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource resources[] = 
Packit b099d7
{
Packit b099d7
    {   XmNcommandEnteredCallback, 
Packit b099d7
        XmCCallback, 
Packit b099d7
        XmRCallback, 
Packit b099d7
        sizeof (XtCallbackList),
Packit b099d7
        XtOffsetOf( struct _XmCommandRec, command.callback), 
Packit b099d7
        XmRCallback, 
Packit b099d7
        (XtPointer)NULL},
Packit b099d7
Packit b099d7
    {   XmNcommandChangedCallback, 
Packit b099d7
        XmCCallback, 
Packit b099d7
        XmRCallback, 
Packit b099d7
        sizeof (XtCallbackList),
Packit b099d7
        XtOffsetOf( struct _XmCommandRec, command.value_changed_callback), 
Packit b099d7
        XmRCallback, 
Packit b099d7
        (XtPointer) NULL},
Packit b099d7
Packit b099d7
    {   XmNpromptString,
Packit b099d7
        XmCPromptString, 
Packit b099d7
        XmRXmString, 
Packit b099d7
        sizeof (XmString),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.selection_label_string),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) XmUNSPECIFIED},
Packit b099d7
Packit b099d7
    {   XmNcommand,
Packit b099d7
        XmCTextString, 
Packit b099d7
        XmRXmString, 
Packit b099d7
        sizeof (XmString),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.text_string),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) XmUNSPECIFIED},
Packit b099d7
Packit b099d7
    {   XmNhistoryItems,
Packit b099d7
        XmCItems, 
Packit b099d7
        XmRXmStringTable, 
Packit b099d7
        sizeof (XmString *),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_items),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        NULL},
Packit b099d7
Packit b099d7
    {   XmNhistoryItemCount,
Packit b099d7
        XmCItemCount, 
Packit b099d7
        XmRInt, 
Packit b099d7
        sizeof(int),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_item_count),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) XmUNSPECIFIED_COUNT},
Packit b099d7
Packit b099d7
    {   XmNhistoryMaxItems,
Packit b099d7
        XmCMaxItems,
Packit b099d7
        XmRInt, 
Packit b099d7
        sizeof(int),
Packit b099d7
        XtOffsetOf( struct _XmCommandRec, command.history_max_items),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) 100},
Packit b099d7
Packit b099d7
    {   XmNhistoryVisibleItemCount,
Packit b099d7
        XmCVisibleItemCount, 
Packit b099d7
        XmRInt, 
Packit b099d7
        sizeof(int),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.list_visible_item_count),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) 8},
Packit b099d7
Packit b099d7
    {   XmNdialogType,
Packit b099d7
        XmCDialogType, 
Packit b099d7
        XmRSelectionType, 
Packit b099d7
        sizeof (unsigned char),
Packit b099d7
        XtOffsetOf( struct _XmSelectionBoxRec, selection_box.dialog_type),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) XmDIALOG_COMMAND},
Packit b099d7
Packit b099d7
    {   XmNdefaultPosition,
Packit b099d7
        XmCDefaultPosition, 
Packit b099d7
        XmRBoolean, 
Packit b099d7
        sizeof (Boolean),
Packit b099d7
        XtOffsetOf( struct _XmBulletinBoardRec, bulletin_board.default_position),
Packit b099d7
        XmRImmediate, 
Packit b099d7
        (XtPointer) False},
Packit b099d7
Packit b099d7
    {   XmNautoUnmanage,
Packit b099d7
        XmCAutoUnmanage,
Packit b099d7
        XmRBoolean, 
Packit b099d7
        sizeof (Boolean),
Packit b099d7
        XtOffsetOf( struct _XmBulletinBoardRec, bulletin_board.auto_unmanage),
Packit b099d7
        XmRImmediate,
Packit b099d7
        (XtPointer) False},
Packit b099d7
Packit b099d7
    {   XmNresizePolicy,
Packit b099d7
        XmCResizePolicy,
Packit b099d7
        XmRResizePolicy,
Packit b099d7
        sizeof (unsigned char),
Packit b099d7
        XtOffsetOf( struct _XmBulletinBoardRec, bulletin_board.resize_policy),
Packit b099d7
        XmRImmediate,
Packit b099d7
        (XtPointer) XmRESIZE_NONE},
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Full class record constant
Packit b099d7
 *
Packit b099d7
 ****************************************************************/
Packit b099d7
Packit b099d7
externaldef( xmcommandclassrec) XmCommandClassRec xmCommandClassRec =
Packit b099d7
{
Packit b099d7
    {                                            /*core class record         */
Packit b099d7
        (WidgetClass) &xmSelectionBoxClassRec,   /* superclass ptr           */
Packit b099d7
        "XmCommand",                             /* class_name               */
Packit b099d7
        sizeof(XmCommandRec),                    /* size of widget instance  */
Packit b099d7
        NULL,                         /* class init proc          */
Packit b099d7
        ClassPartInitialize,                     /* class part init proc     */
Packit b099d7
        FALSE,                                   /* class is not init'ed     */
Packit b099d7
        Initialize,                              /* widget init proc         */
Packit b099d7
        NULL,                                    /* widget init hook         */
Packit b099d7
        XtInheritRealize,                        /* widget realize proc      */
Packit b099d7
        actionsList,                             /* class action table       */
Packit b099d7
        XtNumber (actionsList),                  /* class action count       */
Packit b099d7
        resources,                               /* class resource list      */
Packit b099d7
        XtNumber (resources),                    /* class  resource_count    */
Packit b099d7
        NULLQUARK,                               /* xrm_class                */
Packit b099d7
        TRUE,                                    /* compressed motion        */
Packit b099d7
        XtExposeCompressSeries,		 	 /* compressed exposure      */
Packit b099d7
        TRUE,                                    /* compressed enter/exit    */
Packit b099d7
        FALSE,                                   /* VisibilityNotify         */
Packit b099d7
        NULL,                                    /* class destroy proc       */
Packit b099d7
        Resize,                         	 /* class resize proc        */
Packit b099d7
        XtInheritExpose,                         /* class expose proc        */
Packit b099d7
        SetValues,                               /* class set_value proc     */
Packit b099d7
        NULL,                                    /* widget setvalues hook    */
Packit b099d7
        XtInheritSetValuesAlmost,                /* set values almost        */
Packit b099d7
        NULL,                                    /* widget getvalues hook    */
Packit b099d7
        NULL,                                    /* class accept focus proc  */
Packit b099d7
        XtVersion,                               /* version                  */
Packit b099d7
        NULL,                                    /* callback offset list     */
Packit b099d7
        XtInheritTranslations,                   /* default translations     */
Packit b099d7
        XtInheritQueryGeometry,                  /* query geometry           */
Packit b099d7
        NULL,                                    /* Display Accelerator      */
Packit b099d7
        NULL,                                    /* Extension pointer        */
Packit b099d7
    },
Packit b099d7
    {                                            /*composite class record    */
Packit b099d7
        XtInheritGeometryManager,                /* childrens geo mgr proc   */
Packit b099d7
        XtInheritChangeManaged,                  /* set changed proc         */
Packit b099d7
        XtInheritInsertChild,                    /* add a child              */
Packit b099d7
        XtInheritDeleteChild,                    /* remove a child           */
Packit b099d7
        NULL,                                    /* Extension pointer        */
Packit b099d7
    },
Packit b099d7
    {                                            /*constraint class record   */
Packit b099d7
        NULL,                                    /* no additional resources  */
Packit b099d7
        0,                                       /* num additional resources */
Packit b099d7
        0,                                       /* size of constraint rec   */
Packit b099d7
        NULL,                                    /* constraint_initialize    */
Packit b099d7
        NULL,                                    /* constraint_destroy       */
Packit b099d7
        NULL,                                    /* constraint_setvalue      */
Packit b099d7
        NULL,                                    /* Extension pointer        */
Packit b099d7
    },
Packit b099d7
    {                                            /*manager class record      */
Packit b099d7
        XtInheritTranslations,                   /* default translations     */
Packit b099d7
        syn_resources,                           /* syn_resources            */
Packit b099d7
        XtNumber(syn_resources),                 /* num_syn_resources        */
Packit b099d7
        NULL,                                    /* syn_cont_resources       */
Packit b099d7
        0,                                       /* num_syn_cont_resources   */
Packit b099d7
        CommandParentProcess,                    /* parent_process           */
Packit b099d7
        NULL,                                    /* extension                */
Packit b099d7
    },
Packit b099d7
    {                                            /*bulletin board class rec  */
Packit b099d7
        TRUE,                                    /*always_install_accelerators*/
Packit b099d7
        XmInheritGeoMatrixCreate,                /* geo_matrix_create */
Packit b099d7
        XmInheritFocusMovedProc,                 /* focus_moved_proc */
Packit b099d7
        NULL                                     /* Extension pointer - none */
Packit b099d7
    },
Packit b099d7
    {                                            /*selection box class rec  */
Packit b099d7
        ListCallback,                            /* list_callback */
Packit b099d7
        NULL,                                    /* Extension pointer - none */
Packit b099d7
    },
Packit b099d7
    {                                            /*command class record      */
Packit b099d7
        NULL,                                    /* Extension pointer - none */
Packit b099d7
    }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * now make a public symbol that points to this class record
Packit b099d7
 */
Packit b099d7
Packit b099d7
externaldef( xmcommandwidgetclass) WidgetClass xmCommandWidgetClass
Packit b099d7
                                           = (WidgetClass) &xmCommandClassRec ;
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    _XmFastSubclassInit (wc, XmCOMMAND_BOX_BIT);
Packit b099d7
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
/****************************************************************
Packit b099d7
 * Set attributes of a command widget
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmCommandWidget new_w = (XmCommandWidget) nw ;
Packit b099d7
    int max;
Packit b099d7
    Arg             argv[5] ;
Packit b099d7
    Cardinal        argc ;
Packit b099d7
/****************/
Packit b099d7
    
Packit b099d7
    /*	Here we have now to take care of XmUNSPECIFIED (CR 4856).
Packit b099d7
     */  
Packit b099d7
    if (new_w->selection_box.selection_label_string == 
Packit b099d7
	(XmString) XmUNSPECIFIED) {
Packit b099d7
	XmString local_xmstring ;
Packit b099d7
Packit b099d7
	local_xmstring = XmStringCreate(">", XmFONTLIST_DEFAULT_TAG);
Packit b099d7
	argc = 0 ;
Packit b099d7
	XtSetArg( argv[argc], XmNlabelString, local_xmstring) ; ++argc ;
Packit b099d7
	XtSetValues( SB_SelectionLabel( new_w), argv, argc) ;
Packit b099d7
	XmStringFree(local_xmstring);
Packit b099d7
Packit b099d7
	new_w->selection_box.selection_label_string = NULL ;
Packit b099d7
    }
Packit b099d7
	   
Packit b099d7
    /* mustMatch does not apply to command... (it is always false) */
Packit b099d7
    if (new_w->selection_box.must_match != False) { 
Packit b099d7
        new_w->selection_box.must_match = False; 
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING5);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* check for and change max history items (remove items if needed) */
Packit b099d7
    if (new_w->command.history_max_items < 1) {
Packit b099d7
        new_w->command.history_max_items = 100;
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING6);
Packit b099d7
    }
Packit b099d7
    argc = 0 ;
Packit b099d7
    XtSetArg( argv[argc], XmNitemCount, &max) ; ++argc ;
Packit b099d7
    XtGetValues( SB_List( new_w), argv, argc) ;
Packit b099d7
Packit b099d7
    if (new_w->command.history_max_items < max)
Packit b099d7
    {
Packit b099d7
        while (max > new_w->command.history_max_items) {
Packit b099d7
            XmListDeletePos (new_w->selection_box.list, 1);
Packit b099d7
            if (new_w->selection_box.list_selected_item_position > 0)
Packit b099d7
                new_w->selection_box.list_selected_item_position--;
Packit b099d7
            max--;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    if (new_w->selection_box.dialog_type != XmDIALOG_COMMAND)
Packit b099d7
    {   
Packit b099d7
        new_w->selection_box.dialog_type = XmDIALOG_COMMAND ;
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING1);
Packit b099d7
        } 
Packit b099d7
    XtAddCallback (new_w->selection_box.text, XmNvalueChangedCallback, 
Packit b099d7
                                              CommandCallback, (XtPointer) new_w);
Packit b099d7
    new_w->command.error = FALSE;
Packit b099d7
Packit b099d7
    return ;
Packit b099d7
}
Packit b099d7
   
Packit b099d7
/****************************************************************
Packit b099d7
 * Process callback from the List in a SelectionBox.
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ListCallback(
Packit b099d7
        Widget w,		/* unused */
Packit b099d7
        XtPointer client_data,
Packit b099d7
        XtPointer call_data )
Packit b099d7
{   
Packit b099d7
            XmListCallbackStruct * listCB = (XmListCallbackStruct *)
Packit b099d7
                                                                    call_data ;
Packit b099d7
            XmCommandCallbackStruct cmdCB ;
Packit b099d7
            XmCommandWidget cmdWid = (XmCommandWidget) client_data ;
Packit b099d7
            char *          text_value ;
Packit b099d7
            Arg             argv[5] ;
Packit b099d7
            Cardinal        argc ;
Packit b099d7
            int             count ;
Packit b099d7
            XmString        tmpXmString ;
Packit b099d7
/*********** reset is not used ************
Packit b099d7
            Boolean         reset = FALSE ;
Packit b099d7
****************/
Packit b099d7
Packit b099d7
    argc = 0 ;
Packit b099d7
    XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ;
Packit b099d7
    XtGetValues( SB_List( cmdWid), argv, argc) ;
Packit b099d7
Packit b099d7
    if(    !count    )
Packit b099d7
    {   return ;
Packit b099d7
        } 
Packit b099d7
    if(    cmdWid->command.error    )
Packit b099d7
    {   
Packit b099d7
        if(    (listCB->item_position == (count - 1))
Packit b099d7
            || (    (listCB->item_position == count)
Packit b099d7
                 && (listCB->reason != XmCR_DEFAULT_ACTION))    )
Packit b099d7
        {   
Packit b099d7
            /* Selection or default action on the blank line, or selection on
Packit b099d7
            *   error message.  Restore previous selection and return.
Packit b099d7
            */
Packit b099d7
            XmListDeselectPos( SB_List( cmdWid), listCB->item_position) ;
Packit b099d7
Packit b099d7
            if(    cmdWid->selection_box.list_selected_item_position    )
Packit b099d7
            {   XmListSelectPos( SB_List( cmdWid), 
Packit b099d7
                    cmdWid->selection_box.list_selected_item_position, FALSE) ;
Packit b099d7
                } 
Packit b099d7
            return ;
Packit b099d7
            } 
Packit b099d7
        XmListDeletePos( SB_List( cmdWid), 0) ;   /* Delete error message.*/
Packit b099d7
        XmListDeletePos( SB_List( cmdWid), 0) ;   /* Delete blank line.*/
Packit b099d7
        cmdWid->command.error = FALSE ;
Packit b099d7
Packit b099d7
        if(    count <= 2    )
Packit b099d7
        {   /* List only contained error message and blank line.
Packit b099d7
            */
Packit b099d7
            cmdWid->selection_box.list_selected_item_position = 0 ;
Packit b099d7
            return ;
Packit b099d7
            } 
Packit b099d7
        count -= 2 ;
Packit b099d7
Packit b099d7
        if(    (listCB->item_position > count)
Packit b099d7
            && (listCB->reason == XmCR_DEFAULT_ACTION)    )
Packit b099d7
        {   
Packit b099d7
            /* Default action on the error message line.  Restore previous
Packit b099d7
            *   selection, clear text area, and return.
Packit b099d7
            */
Packit b099d7
            if(    cmdWid->selection_box.list_selected_item_position    )
Packit b099d7
            {   XmListSelectPos( SB_List( cmdWid), 
Packit b099d7
                    cmdWid->selection_box.list_selected_item_position, FALSE) ;
Packit b099d7
                } 
Packit b099d7
            XmTextFieldSetString( cmdWid->selection_box.text, "") ;
Packit b099d7
            return ;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
    if(    listCB->reason == XmCR_DEFAULT_ACTION    )
Packit b099d7
    {   
Packit b099d7
        /* If we are already at max items, remove first item.
Packit b099d7
        */
Packit b099d7
        if(    count >= cmdWid->command.history_max_items    )
Packit b099d7
        {
Packit b099d7
            XmListDeletePos( cmdWid->selection_box.list, 1) ;
Packit b099d7
Packit b099d7
            if(    cmdWid->selection_box.list_selected_item_position > 0    )
Packit b099d7
            {   cmdWid->selection_box.list_selected_item_position-- ;
Packit b099d7
                } 
Packit b099d7
            }
Packit b099d7
        tmpXmString = XmStringCopy( listCB->item) ;
Packit b099d7
        XmListAddItemUnselected( cmdWid->selection_box.list, tmpXmString, 0) ;
Packit b099d7
Packit b099d7
        XmListSetBottomPos( cmdWid->selection_box.list, 0) ;
Packit b099d7
        XmTextFieldSetString( cmdWid->selection_box.text, "") ;
Packit b099d7
        /* Call the users command entered callback.
Packit b099d7
        */
Packit b099d7
        cmdCB.reason = XmCR_COMMAND_ENTERED ;
Packit b099d7
        cmdCB.event  = NULL ;
Packit b099d7
        cmdCB.value  = tmpXmString ;
Packit b099d7
        cmdCB.length = XmStringLength( tmpXmString) ;
Packit b099d7
        XtCallCallbackList( (Widget) cmdWid, cmdWid->command.callback, &cmdCB) ;
Packit b099d7
Packit b099d7
        XmStringFree( tmpXmString) ;
Packit b099d7
        } 
Packit b099d7
    else /* listCB->reason is BROWSE_SELECT or SINGLE_SELECT */
Packit b099d7
    {   /* Update the text widget to relect the latest list selection.
Packit b099d7
        */
Packit b099d7
        cmdWid->selection_box.list_selected_item_position = 
Packit b099d7
                                                        listCB->item_position ;
Packit b099d7
        if((text_value = _XmStringGetTextConcat( listCB->item)) != NULL)
Packit b099d7
        {   
Packit b099d7
            XmTextFieldSetString( SB_Text( cmdWid), text_value) ;
Packit b099d7
            XmTextFieldSetInsertionPosition( SB_Text( cmdWid),
Packit b099d7
			       XmTextFieldGetLastPosition( SB_Text( cmdWid))) ;
Packit b099d7
            XtFree( text_value) ;
Packit b099d7
            } 
Packit b099d7
        } 
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
/****************************************************************
Packit b099d7
 * Callback for Text ValueChanged callback
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
CommandCallback(
Packit b099d7
        Widget w,		/* unused */
Packit b099d7
        XtPointer cl_data,
Packit b099d7
        XtPointer call_data )
Packit b099d7
{
Packit b099d7
            XmCommandWidget client_data = (XmCommandWidget) cl_data ;
Packit b099d7
    XmCommandCallbackStruct  cb;
Packit b099d7
    char *str;
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    cb.reason = XmCR_COMMAND_CHANGED;
Packit b099d7
    cb.event = ((XmAnyCallbackStruct *) call_data)->event ;
Packit b099d7
Packit b099d7
    /* get char* string from text and convert to XmString type */
Packit b099d7
    str = XmTextFieldGetString (client_data->selection_box.text);
Packit b099d7
    cb.value = XmStringGenerate(str, XmFONTLIST_DEFAULT_TAG,
Packit b099d7
				XmCHARSET_TEXT, NULL);
Packit b099d7
    XtFree (str);
Packit b099d7
Packit b099d7
    cb.length = XmStringLength (cb.value);
Packit b099d7
Packit b099d7
    XtCallCallbackList ((Widget) client_data, client_data->command.value_changed_callback, &cb;;
Packit b099d7
    XmStringFree (cb.value);
Packit b099d7
    return ;
Packit b099d7
}
Packit b099d7

Packit b099d7
/****************************************************************/
Packit b099d7
static Boolean 
Packit b099d7
CommandParentProcess(
Packit b099d7
        Widget wid,
Packit b099d7
        XmParentProcessData event )
Packit b099d7
{
Packit b099d7
            XmCommandWidget cmd = (XmCommandWidget) wid ;
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    if(    (event->any.process_type == XmINPUT_ACTION)
Packit b099d7
        && (   (event->input_action.action == XmPARENT_ACTIVATE)
Packit b099d7
            || (    (event->input_action.action == XmPARENT_CANCEL)
Packit b099d7
                 && BB_CancelButton( cmd)))    )
Packit b099d7
    {   
Packit b099d7
        if(    event->input_action.action == XmPARENT_ACTIVATE    )
Packit b099d7
        {   
Packit b099d7
            _XmCommandReturn( (Widget) cmd, event->input_action.event,
Packit b099d7
                                      event->input_action.params,
Packit b099d7
                                         event->input_action.num_params) ;
Packit b099d7
            } 
Packit b099d7
        else
Packit b099d7
        {   _XmBulletinBoardCancel( (Widget) cmd,
Packit b099d7
               event->input_action.event, event->input_action.params,
Packit b099d7
                                         event->input_action.num_params) ;
Packit b099d7
            } 
Packit b099d7
        return( TRUE) ;
Packit b099d7
        } 
Packit b099d7
Packit b099d7
    return( _XmParentProcess( XtParent( cmd), event)) ;
Packit b099d7
    }
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * Return function to "complete" text entry
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmCommandReturn(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *numParams )	/* unused */
Packit b099d7
{
Packit b099d7
            XmCommandWidget w = (XmCommandWidget) wid ;
Packit b099d7
    XmCommandCallbackStruct cb;
Packit b099d7
    XmString                   tmpXmString;
Packit b099d7
    String                     tmpString;
Packit b099d7
            Arg             argv[5] ;
Packit b099d7
            Cardinal        argc ;
Packit b099d7
            int             count ;
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    /* if an error has been sent to the history list, remove it now */
Packit b099d7
    if (w->command.error) {
Packit b099d7
        XmListDeletePos (w->selection_box.list, 0);     /* delete error msg  */
Packit b099d7
        XmListDeletePos (w->selection_box.list, 0);     /* delete blank line */
Packit b099d7
        w->command.error = FALSE;
Packit b099d7
        XmListSetBottomPos (w->selection_box.list, 0);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* update the history:  - get text, check null/empty  */
Packit b099d7
    /*                      - create XmString from text   */
Packit b099d7
    /*                      - increment local list count  */
Packit b099d7
    /*                      - add to history list         */
Packit b099d7
    /*                      - delete first element if too */
Packit b099d7
    /*                        many items (maxItemCount)   */
Packit b099d7
    /*                      - position list to end        */
Packit b099d7
    /*                      - reset selection list ptr    */
Packit b099d7
    /*                      - reset command to ""         */
Packit b099d7
Packit b099d7
    tmpString = XmTextFieldGetString (w->selection_box.text);
Packit b099d7
    if ((tmpString == NULL) || (strcmp(tmpString, "") == 0)) { 
Packit b099d7
        if (tmpString) XtFree(tmpString);
Packit b099d7
        return;
Packit b099d7
    }
Packit b099d7
    argc = 0 ;
Packit b099d7
    XtSetArg( argv[argc], XmNitemCount, &count) ; ++argc ;
Packit b099d7
    XtGetValues( SB_List( w), argv, argc) ;
Packit b099d7
    /* if already at max items, remove first item in list */
Packit b099d7
Packit b099d7
    if (count >= w->command.history_max_items) 
Packit b099d7
    {
Packit b099d7
        XmListDeletePos (w->selection_box.list, 1);
Packit b099d7
        if (w->selection_box.list_selected_item_position > 0)
Packit b099d7
            w->selection_box.list_selected_item_position--;
Packit b099d7
    }
Packit b099d7
    tmpXmString = XmStringGenerate(tmpString, XmFONTLIST_DEFAULT_TAG,
Packit b099d7
				   XmCHARSET_TEXT, NULL);
Packit b099d7
    XmListAddItemUnselected (w->selection_box.list, tmpXmString, 0);
Packit b099d7
Packit b099d7
    XmListSetBottomPos (w->selection_box.list, 0);
Packit b099d7
    XmTextFieldSetString (w->selection_box.text, "");
Packit b099d7
    /* call the users command entered callback */
Packit b099d7
Packit b099d7
    cb.reason = XmCR_COMMAND_ENTERED;
Packit b099d7
    cb.event  = event;
Packit b099d7
    cb.value  = tmpXmString;
Packit b099d7
    cb.length = XmStringLength (tmpXmString);
Packit b099d7
    XtCallCallbackList ((Widget) w, w->command.callback, &cb;;
Packit b099d7
    XmStringFree (tmpXmString);
Packit b099d7
    XtFree (tmpString);
Packit b099d7
    return ;
Packit b099d7
}
Packit b099d7
/****************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmCommandUpOrDown(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,		/* unused */
Packit b099d7
        String *argv,
Packit b099d7
        Cardinal *argc )	/* unused */
Packit b099d7
{
Packit b099d7
            XmCommandWidget cmd = (XmCommandWidget) wid ;
Packit b099d7
            int             visible ;
Packit b099d7
            int	            top ;
Packit b099d7
            int	            key_pressed ;
Packit b099d7
            Widget	    list ;
Packit b099d7
            int	*           position ;
Packit b099d7
            int	            count ;
Packit b099d7
            Arg             av[5] ;
Packit b099d7
            Cardinal        ac ;
Packit b099d7
            int             selected_count ;
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    if(    !(list = cmd->selection_box.list)    )
Packit b099d7
    {   return ;
Packit b099d7
        } 
Packit b099d7
    ac = 0 ;
Packit b099d7
    XtSetArg( av[ac], XmNitemCount, &count) ; ++ac ;
Packit b099d7
    XtSetArg( av[ac], XmNtopItemPosition, &top) ; ++ac ;
Packit b099d7
    XtSetArg( av[ac], XmNvisibleItemCount, &visible) ; ++ac ;
Packit b099d7
    XtSetArg( av[ac], XmNselectedItemCount, &selected_count); ac++;
Packit b099d7
    XtGetValues( (Widget) list, av, ac) ;
Packit b099d7
Packit b099d7
    if(    !count
Packit b099d7
        || (cmd->command.error  &&  (count <= 2))    )
Packit b099d7
    {   return ;
Packit b099d7
        } 
Packit b099d7
 
Packit b099d7
 /*
Packit b099d7
  * Fix for 5237 - Check the selected_count to ensure that a selection 
Packit b099d7
  *                exists.  No items may be selected if the application
Packit b099d7
  *                has run XmListDeselect* routine.  If no items in the
Packit b099d7
  *                list are selected, set list_selected_item_position to 0.
Packit b099d7
  */
Packit b099d7
    if (!selected_count)
Packit b099d7
       cmd->selection_box.list_selected_item_position = 0;
Packit b099d7
Packit b099d7
    if (_XmConvertActionParamToRepTypeId((Widget) cmd,
Packit b099d7
			 XmRID_COMMAND_SELECTION_BOX_UP_OR_DOWN_ACTION_PARAMS,
Packit b099d7
			 argv[0], True, &key_pressed) == False)
Packit b099d7
    {
Packit b099d7
	/* We couldn't convert the value. Just assume a value of 0. */
Packit b099d7
	key_pressed = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    position = &(cmd->selection_box.list_selected_item_position) ;
Packit b099d7
Packit b099d7
    if(    *position == 0    )
Packit b099d7
    {   
Packit b099d7
        /* If error is visible, select last item - 2.  Otherwise, select
Packit b099d7
        *   last item in list.
Packit b099d7
        */
Packit b099d7
        if(    cmd->command.error    )
Packit b099d7
        {   *position = count - 2 ;
Packit b099d7
            } 
Packit b099d7
        else
Packit b099d7
        {   *position = count ;
Packit b099d7
            } 
Packit b099d7
        XmListSelectPos( list, *position, True) ;
Packit b099d7
        } 
Packit b099d7
    else
Packit b099d7
    {   if(    !key_pressed && (*position > 1)    )
Packit b099d7
        {   /*  up  */
Packit b099d7
            XmListDeselectPos( list, *position) ;
Packit b099d7
            XmListSelectPos( list, --*position, True) ;
Packit b099d7
            }
Packit b099d7
        else
Packit b099d7
        {   if(    (key_pressed == 1) && (*position < count)    )
Packit b099d7
            {   /*  down  */
Packit b099d7
                XmListDeselectPos( list, *position) ;
Packit b099d7
                XmListSelectPos( list, ++*position, True) ;
Packit b099d7
                } 
Packit b099d7
            else
Packit b099d7
            {   if(    key_pressed == 2    )
Packit b099d7
                {   /*  home  */
Packit b099d7
                    XmListDeselectPos( list, *position) ;
Packit b099d7
                    *position = 1 ;
Packit b099d7
                    XmListSelectPos( list, *position, True) ;
Packit b099d7
                    } 
Packit b099d7
                else
Packit b099d7
                {   if(    key_pressed == 3    )
Packit b099d7
                    {   /*  end  */
Packit b099d7
                        XmListDeselectPos( list, *position) ;
Packit b099d7
                        *position = count ;
Packit b099d7
                        XmListSelectPos( list, *position, True) ;
Packit b099d7
                        } 
Packit b099d7
                    } 
Packit b099d7
                } 
Packit b099d7
            }
Packit b099d7
        } 
Packit b099d7
    if(    top > *position    )
Packit b099d7
    {   XmListSetPos( list, *position) ;
Packit b099d7
        } 
Packit b099d7
    else
Packit b099d7
    {   if(    (top + visible) <= *position    )
Packit b099d7
        {   XmListSetBottomPos( list, *position) ;
Packit b099d7
            } 
Packit b099d7
        } 
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*************************************************************************
Packit b099d7
 *                                                                      *
Packit b099d7
 * Resize - update visibleItemCount when resized
Packit b099d7
 *                                                                      *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
static void
Packit b099d7
Resize(Widget wid)
Packit b099d7
{
Packit b099d7
  Cardinal ac;
Packit b099d7
  Arg             av[5] ;
Packit b099d7
 XmCommandWidget cw = (XmCommandWidget)wid;
Packit b099d7
 XtWidgetProc resize;
Packit b099d7
 
Packit b099d7
 _XmProcessLock();
Packit b099d7
 resize = xmSelectionBoxClassRec.core_class.resize;
Packit b099d7
 _XmProcessUnlock();
Packit b099d7
 (*resize) ((Widget) cw) ;
Packit b099d7
Packit b099d7
  /* keep list_visible_item_count in sync with List's visibleItemCount*/
Packit b099d7
  ac = 0 ;
Packit b099d7
  XtSetArg( av[ac], XmNvisibleItemCount, &(cw->selection_box.list_visible_item_count)) ; ++ac
Packit b099d7
;
Packit b099d7
  XtGetValues( cw->selection_box.list, av, ac) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 * Set attributes of a command widget
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
        Widget ow,
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
            XmCommandWidget old = (XmCommandWidget) ow ;
Packit b099d7
            XmCommandWidget new_w = (XmCommandWidget) nw ;
Packit b099d7
            int max;
Packit b099d7
            Arg             argv[5] ;
Packit b099d7
            Cardinal        argc ;
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    /* mustMatch does not apply to command... (it is always false) */
Packit b099d7
    if (new_w->selection_box.must_match != False) { 
Packit b099d7
        new_w->selection_box.must_match = False; 
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING5);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (new_w->selection_box.dialog_type != XmDIALOG_COMMAND) {
Packit b099d7
        new_w->selection_box.dialog_type = XmDIALOG_COMMAND;
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* check for and change max history items (remove items if needed) */
Packit b099d7
    if (new_w->command.history_max_items < 1) {
Packit b099d7
        new_w->command.history_max_items = old->command.history_max_items;
Packit b099d7
        XmeWarning( (Widget) new_w, WARNING6);
Packit b099d7
    }
Packit b099d7
    if (new_w->command.history_max_items < 
Packit b099d7
        old->command.history_max_items)
Packit b099d7
    {
Packit b099d7
        argc = 0 ;
Packit b099d7
        XtSetArg( argv[argc], XmNitemCount, &max) ; ++argc ;
Packit b099d7
        XtGetValues( SB_List( new_w), argv, argc) ;
Packit b099d7
Packit b099d7
        while (max > new_w->command.history_max_items) {
Packit b099d7
            XmListDeletePos (new_w->selection_box.list, 1);
Packit b099d7
            if (new_w->selection_box.list_selected_item_position > 0)
Packit b099d7
                new_w->selection_box.list_selected_item_position--;
Packit b099d7
            max--;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    if (old->command.error)
Packit b099d7
    {
Packit b099d7
	XmString new_xms, old_xms;
Packit b099d7
        int new_count = new_w->selection_box.list_item_count;
Packit b099d7
        int old_count = old->selection_box.list_item_count;
Packit b099d7
Packit b099d7
	if (new_count > 2 && old_count > 2)
Packit b099d7
	{
Packit b099d7
            XmString new_blank, old_blank, new_error, old_error;
Packit b099d7
	    
Packit b099d7
            new_error = new_w->selection_box.list_items[new_count-1];
Packit b099d7
            old_error = old->selection_box.list_items[new_count-1];
Packit b099d7
            new_blank = new_w->selection_box.list_items[new_count-2];
Packit b099d7
            old_blank = old->selection_box.list_items[new_count-2];
Packit b099d7
Packit b099d7
	    if (XmStringCompare(new_error, old_error) &&
Packit b099d7
	        XmStringCompare(new_blank, old_blank))
Packit b099d7
	    {
Packit b099d7
                new_w->command.error = FALSE;
Packit b099d7
#if 0
Packit b099d7
                XmListDeletePos(SB_List(old), 0);   /* Delete error message.*/
Packit b099d7
                XmListDeletePos(SB_List(old), 0) ;   /* Delete blank line.*/
Packit b099d7
                old->command.error = FALSE ;
Packit b099d7
#endif
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else new_w->command.error = FALSE;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /* require redisplay */
Packit b099d7
    return(True);
Packit b099d7
}
Packit b099d7
/****************************************************************
Packit b099d7
 * Create an instance of the widget
Packit b099d7
 ****************/
Packit b099d7
Widget 
Packit b099d7
XmCreateCommand(
Packit b099d7
        Widget parent,
Packit b099d7
        String name,
Packit b099d7
        ArgList al,
Packit b099d7
        Cardinal ac )
Packit b099d7
{
Packit b099d7
    Widget   w;
Packit b099d7
    ArgList  argsNew;
Packit b099d7
Packit b099d7
    /* add dialogType to arglist and force to XmDIALOG_COMMAND... */
Packit b099d7
    /* big time bad stuff will happen if they use prompt type...  */
Packit b099d7
    /* (like, no list gets created, but used all through command) */
Packit b099d7
Packit b099d7
    /*  allocate arglist, copy args, add dialog type arg */
Packit b099d7
    argsNew = (ArgList) XtMalloc (sizeof(Arg) * (ac + 1));
Packit b099d7
    memcpy( argsNew, al, sizeof(Arg) * ac);
Packit b099d7
    XtSetArg (argsNew[ac], XmNdialogType, XmDIALOG_COMMAND);  ac++;
Packit b099d7
Packit b099d7
    /*  create Command, free argsNew, return */
Packit b099d7
    w = XtCreateWidget (name, xmCommandWidgetClass, parent, argsNew, ac);
Packit b099d7
    XtFree ((char *) argsNew);
Packit b099d7
Packit b099d7
    return (w);
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateCommand(
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
                         xmCommandWidgetClass,
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
XmVaCreateManagedCommand(
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
                         xmCommandWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmCommandGetChild(
Packit b099d7
        Widget widget,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        unsigned int child )
Packit b099d7
#else
Packit b099d7
        unsigned char child )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    XmCommandWidget   w = (XmCommandWidget)widget;
Packit b099d7
    Widget ret_widget = NULL;
Packit b099d7
    _XmWidgetToAppContext(widget);
Packit b099d7
/****************/
Packit b099d7
    _XmAppLock(app);
Packit b099d7
Packit b099d7
    switch (child) {
Packit b099d7
        case XmDIALOG_COMMAND_TEXT:    
Packit b099d7
		ret_widget = w->selection_box.text;
Packit b099d7
		break;
Packit b099d7
        case XmDIALOG_HISTORY_LIST:    
Packit b099d7
		ret_widget = w->selection_box.list;
Packit b099d7
		break;
Packit b099d7
        case XmDIALOG_PROMPT_LABEL:    
Packit b099d7
		ret_widget = w->selection_box.selection_label;
Packit b099d7
		break;
Packit b099d7
	case XmDIALOG_WORK_AREA:       
Packit b099d7
		ret_widget = w->selection_box.work_area;
Packit b099d7
		break;
Packit b099d7
        default: 
Packit b099d7
		XmeWarning( (Widget) w, WARNING2);
Packit b099d7
		break;
Packit b099d7
    }
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return ret_widget;
Packit b099d7
}
Packit b099d7
/****************************************************************
Packit b099d7
 * Replace the text value with "value" 
Packit b099d7
 *     note: selection_box.text_string isn't updated, as we are not
Packit b099d7
 *           going to guarantee that text_string is up to date with
Packit b099d7
 *           the text widget string at all times...
Packit b099d7
 ****************/
Packit b099d7
void 
Packit b099d7
XmCommandSetValue(
Packit b099d7
        Widget widget,
Packit b099d7
        XmString value )
Packit b099d7
{
Packit b099d7
    XmCommandWidget   w = (XmCommandWidget)widget;
Packit b099d7
    char *str;
Packit b099d7
    _XmWidgetToAppContext(widget);
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    if(    !(str = _XmStringGetTextConcat( value))    )
Packit b099d7
    {   
Packit b099d7
        XmeWarning( (Widget) w, WARNING3);
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
        return;
Packit b099d7
        }
Packit b099d7
    XmTextFieldSetString(w->selection_box.text, str);
Packit b099d7
    XtFree(str);
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
/****************************************************************
Packit b099d7
 * Append "value" to the end of the current text value
Packit b099d7
 ****************/
Packit b099d7
void 
Packit b099d7
XmCommandAppendValue(
Packit b099d7
        Widget widget,
Packit b099d7
        XmString value )
Packit b099d7
{
Packit b099d7
    XmCommandWidget   w = (XmCommandWidget)widget;
Packit b099d7
    char            *strNew;
Packit b099d7
    XmTextPosition   endPosition;
Packit b099d7
    _XmWidgetToAppContext(widget);
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    if (value == NULL) return;
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
    /* return if invalid string from "value" passed in */
Packit b099d7
    if(    !(strNew = _XmStringGetTextConcat( value))    )
Packit b099d7
    {   
Packit b099d7
        XmeWarning( (Widget) w, WARNING3);
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
        return;
Packit b099d7
        }
Packit b099d7
    if(    !strNew  ||  !*strNew    ) {
Packit b099d7
        XmeWarning( (Widget) w, WARNING4);
Packit b099d7
	_XmAppUnlock(app);
Packit b099d7
        return;
Packit b099d7
        }
Packit b099d7
    /* get string length of current command string */
Packit b099d7
    endPosition = XmTextFieldGetLastPosition( w->selection_box.text) ;
Packit b099d7
    /* append new string to existing string */
Packit b099d7
    XmTextFieldReplace (w->selection_box.text, endPosition, endPosition,
Packit b099d7
			                                              strNew) ;
Packit b099d7
    /* reset insertion position to end of text, and free new string */
Packit b099d7
    XmTextFieldSetInsertionPosition( w->selection_box.text,
Packit b099d7
			  XmTextFieldGetLastPosition( w->selection_box.text)) ;
Packit b099d7
    XtFree (strNew);
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
/****************************************************************
Packit b099d7
 * Print a blank string and error string, which will get removed the next
Packit b099d7
 *   time a string is added to the history.
Packit b099d7
 ****************/
Packit b099d7
void 
Packit b099d7
XmCommandError(
Packit b099d7
        Widget widget,
Packit b099d7
        XmString error )
Packit b099d7
{
Packit b099d7
    XmCommandWidget   w = (XmCommandWidget)widget;
Packit b099d7
    XmString  blankXmString;
Packit b099d7
Packit b099d7
    _XmWidgetToAppContext(widget);
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    if (error == NULL) return;
Packit b099d7
Packit b099d7
    _XmAppLock(app);
Packit b099d7
Packit b099d7
    /* If error is currently in list remove it, but leave (or add) blank item.
Packit b099d7
    */
Packit b099d7
    if(    w->command.error    )
Packit b099d7
    {
Packit b099d7
        XmListDeletePos (w->selection_box.list, 0);
Packit b099d7
        }
Packit b099d7
    else
Packit b099d7
    {   blankXmString = XmStringCreate(" ", XmFONTLIST_DEFAULT_TAG);
Packit b099d7
        XmListAddItemUnselected (w->selection_box.list, blankXmString, 0);
Packit b099d7
        XmStringFree (blankXmString);
Packit b099d7
        w->command.error = TRUE;
Packit b099d7
        }
Packit b099d7
Packit b099d7
    /* create and add the error string as a list item */
Packit b099d7
    XmListAddItemUnselected (w->selection_box.list, error, 0);
Packit b099d7
    XmListSetBottomPos (w->selection_box.list, 0);
Packit b099d7
Packit b099d7
    _XmAppUnlock(app);
Packit b099d7
    return ;
Packit b099d7
    }
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * This convenience function creates a DialogShell and a Command
Packit b099d7
 *   child of the shell; returns the Command widget.
Packit b099d7
 ****************/
Packit b099d7
Widget 
Packit b099d7
XmCreateCommandDialog(
Packit b099d7
        Widget ds_p,
Packit b099d7
        String name,
Packit b099d7
        ArgList com_args,
Packit b099d7
        Cardinal com_n )
Packit b099d7
{
Packit b099d7
    return XmeCreateClassDialog (xmCommandWidgetClass,
Packit b099d7
				 ds_p, name, com_args, com_n) ;
Packit b099d7
}