Blame lib/Xm/ButtonBox.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
Packit b099d7
/************************************************************
Packit b099d7
 *       INCLUDE FILES
Packit b099d7
 ************************************************************/
Packit b099d7
#include <Xm/Xm.h>
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <Xm/ButtonBoxP.h>
Packit b099d7
#include <Xm/ExtP.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/TakesDefT.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       TYPEDEFS AND DEFINES
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
#define SUPERCLASS ((ConstraintWidgetClass) &xmManagerClassRec)
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       MACROS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
#define IsHorizontal(x) (XmButtonBox_orientation((x)) == XmHORIZONTAL)
Packit b099d7
#define MarginH(x)	(XmButtonBox_margin_height((x)))
Packit b099d7
#define MarginW(x)	(XmButtonBox_margin_width((x)))
Packit b099d7
#define FillOption(x)	(XmButtonBox_fill_option((x)))
Packit b099d7
#define EqualSize(x)	(XmButtonBox_equal_size((x)))
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       EXTERNAL DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       STATIC FUNCTION DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static void 	Initialize(Widget, Widget, ArgList, Cardinal *);
Packit b099d7
static void	    ClassInitialize(void);
Packit b099d7
Packit b099d7
static void     ClassPartInitialize(WidgetClass w_class) ;
Packit b099d7
Packit b099d7
static void	    InsertChild(Widget);
Packit b099d7
static void     Resize(Widget), ChangeManaged(Widget);
Packit b099d7
static void 	ConstraintInitialize(Widget, Widget, ArgList, Cardinal *);
Packit b099d7
Packit b099d7
static Boolean  SetValues(Widget, Widget, Widget, ArgList, Cardinal *);
Packit b099d7
static Boolean  ConstraintSetValues(Widget, Widget,
Packit b099d7
				    Widget, ArgList, Cardinal *);
Packit b099d7
static Boolean CvtStringToFillOption(Display *, XrmValuePtr, Cardinal *,
Packit b099d7
				     XrmValuePtr, XrmValuePtr);
Packit b099d7
Packit b099d7
static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *,
Packit b099d7
					XtWidgetGeometry *);
Packit b099d7
static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *,
Packit b099d7
				      XtWidgetGeometry *);
Packit b099d7
Packit b099d7
static XtGeometryResult TryNewLayout(Widget, Mask *, Boolean);
Packit b099d7
static Cardinal	       	CalcChildrenPrefSizes(XmButtonBoxWidget, Dimension *,
Packit b099d7
					      Dimension *, Dimension *);
Packit b099d7
static void		LayoutChildren(Widget, Widget);
Packit b099d7
static void	 	CalcChildSize(XmButtonBoxWidget, Widget, Dimension,
Packit b099d7
				      Dimension, Dimension, Cardinal,
Packit b099d7
				      Dimension *, Dimension *);
Packit b099d7
Packit b099d7
static void ButtonBoxSetDefaultShadow(Widget button) ;
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       STATIC DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNequalSize, XmCEqualSize, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmButtonBoxRec, button_box.equal_size),
Packit b099d7
    XmRImmediate, (XtPointer) False
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNfillOption, XmCFillOption, XmRXmFillOption,
Packit b099d7
    sizeof(XmFillOption), XtOffsetOf(XmButtonBoxRec, button_box.fill_option),
Packit b099d7
    XmRImmediate, (XtPointer) XmFillNone
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, XmCMargin, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmButtonBoxRec, button_box.margin_height),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginWidth, XmCMargin, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmButtonBoxRec, button_box.margin_width),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNorientation, XmCOrientation, XmROrientation,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmButtonBoxRec, button_box.orientation),
Packit b099d7
    XmRImmediate, (XtPointer)XmHORIZONTAL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdefaultButton, XmCWidget, XmRWidget,
Packit b099d7
    sizeof(Widget), XtOffsetOf(XmButtonBoxRec, button_box.default_button),
Packit b099d7
    XmRImmediate, (XtPointer) NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource get_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmButtonBoxRec, button_box.margin_height),
Packit b099d7
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginWidth, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmButtonBoxRec, button_box.margin_width),
Packit b099d7
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtResource constraints[] =
Packit b099d7
{
Packit b099d7
   {
Packit b099d7
      "pri.vate1", "Pri.vate1", XmRDimension, sizeof(Dimension),
Packit b099d7
      XtOffsetOf(XmBBoxConstraintsRec, bbox.pref_width),
Packit b099d7
      XmRImmediate, (XtPointer) 0
Packit b099d7
   },
Packit b099d7
   {
Packit b099d7
      "pri.vate2", "Pri.vate2", XmRAttachment, sizeof(Dimension),
Packit b099d7
      XtOffsetOf(XmBBoxConstraintsRec, bbox.pref_height),
Packit b099d7
      XmRImmediate, (XtPointer) 0
Packit b099d7
   }
Packit b099d7
};
Packit b099d7
	    
Packit b099d7
XmButtonBoxClassRec xmButtonBoxClassRec = {
Packit b099d7
  {
Packit b099d7
    /* core_class members      */
Packit b099d7
    /* superclass         */	(WidgetClass)SUPERCLASS,
Packit b099d7
    /* class_name         */	"XmButtonBox",                            
Packit b099d7
    /* widget_size        */	sizeof(XmButtonBoxRec),                 
Packit b099d7
    /* class_initialize   */	ClassInitialize,
Packit b099d7
    /* class_part_init    */	ClassPartInitialize, 	
Packit b099d7
    /* class_inited       */	False,                            	
Packit b099d7
    /* initialize         */	Initialize, 
Packit b099d7
    /* initialize_hook    */	NULL,                             	
Packit b099d7
    /* realize            */	XtInheritRealize, 
Packit b099d7
    /* actions            */	NULL,                     
Packit b099d7
Packit b099d7
        
Packit b099d7
    /* num_actions        */	0,                                	
Packit b099d7
    /* resources          */	(XtResource*)resources,                     
Packit b099d7
    /* num_resources      */	XtNumber(resources), 
Packit b099d7
    /* xrm_class          */	NULLQUARK,                        
Packit b099d7
    /* compress_motion    */	True,                             	
Packit b099d7
    /* compress_exposure  */	True,                             	
Packit b099d7
    /* compress_enterleave*/	True,                             	
Packit b099d7
    /* visible_interest   */	False,                            
Packit b099d7
    /* destroy            */	NULL,                             
Packit b099d7
    /* resize             */	Resize,                           
Packit b099d7
    /* expose             */	NULL,                             
Packit b099d7
    /* set_values         */	SetValues,                             
Packit b099d7
    /* set_values_hook    */	NULL,                             
Packit b099d7
    /* set_values_almost  */	XtInheritSetValuesAlmost,         
Packit b099d7
    /* get_values_hook    */	NULL,                             	
Packit b099d7
    /* accept_focus       */	NULL,                             
Packit b099d7
    /* version            */	XtVersion,
Packit b099d7
    /* callback_private   */	NULL,                             
Packit b099d7
    /* tm_table           */	XtInheritTranslations, 
Packit b099d7
    /* query_geometry     */	(XtGeometryHandler) QueryGeometry, 
Packit b099d7
    /* display_accelerator*/	NULL,                             
Packit b099d7
    /* extension          */	NULL,                             
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    /* composite_class members */
Packit b099d7
    /* geometry_manager   */	GeometryManager,                  
Packit b099d7
    /* change_managed     */	ChangeManaged,                    
Packit b099d7
    /* insert_child       */	InsertChild,
Packit b099d7
    /* delete_child       */	XtInheritDeleteChild,
Packit b099d7
    /* extension          */	NULL,
Packit b099d7
  },
Packit b099d7
  { /* constraint_class fields */
Packit b099d7
    /* resource list      */    constraints,
Packit b099d7
    /* num resources      */    XtNumber(constraints),
Packit b099d7
    /* constraint size    */ 	sizeof(XmBBoxConstraintsRec),
Packit b099d7
    /* init proc          */ 	ConstraintInitialize,
Packit b099d7
    /* destroy proc       */ 	NULL,
Packit b099d7
    /* set values proc    */ 	ConstraintSetValues,
Packit b099d7
    /* extension          */ 	NULL,
Packit b099d7
  },
Packit b099d7
  { /* manager_class fields */
Packit b099d7
    /* default translations */ 	XtInheritTranslations,
Packit b099d7
    /* syn_resources        */ 	get_resources,
Packit b099d7
    /* num_syn_resources    */ 	XtNumber(get_resources),
Packit b099d7
    /* syn_cont_resources   */ 	NULL,
Packit b099d7
    /* num_syn_cont_resources */ 0,
Packit b099d7
    /* parent_process       */ 	XmInheritParentProcess,
Packit b099d7
    /* extension            */ 	NULL,
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    /* Row class members */
Packit b099d7
    /* extension            */	NULL,                                
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
WidgetClass xmButtonBoxWidgetClass = (WidgetClass)&xmButtonBoxClassRec;
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       STATIC CODE
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*      Function Name: ClassInitialize
Packit b099d7
 *      Description:   Called to initialize information specific
Packit b099d7
 *                     to this widget class.
Packit b099d7
 *      Arguments:     none.
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
ClassInitialize()
Packit b099d7
{
Packit b099d7
    XmButtonBoxClassRec *wc = &xmButtonBoxClassRec;
Packit b099d7
Packit b099d7
    XtSetTypeConverter(XmRString, XmRXmFillOption, 
Packit b099d7
		       (XtTypeConverter) CvtStringToFillOption,
Packit b099d7
                       NULL, (Cardinal)0, XtCacheAll, (XtDestructor)NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(WidgetClass w_class )
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidgetClass bbClass
Packit b099d7
        = (XmButtonBoxWidgetClass) w_class ;
Packit b099d7
Packit b099d7
/* this seems to do nothing.... why is it here? -rh
Packit b099d7
    XmButtonBoxWidgetClass bbSuper
Packit b099d7
	    = (XmButtonBoxWidgetClass) w_class->core_class.superclass ;
Packit b099d7
*/
Packit b099d7
    _XmFastSubclassInit (w_class, XmBUTTONBOX_BIT);
Packit b099d7
Packit b099d7
    
Packit b099d7
    /* Install the specifyrendertable trait for all subclasses */
Packit b099d7
    /*
Packit b099d7
    XmeTraitSet((XtPointer)w_class, XmQTspecifyRenderTable, 
Packit b099d7
		(XtPointer) &bulletinbSRT);
Packit b099d7
    */
Packit b099d7
    return ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
/*	Function Name: Initialize
Packit b099d7
 *	Description:   Called to initialize information specific
Packit b099d7
 *                     to this widget.
Packit b099d7
 *	Arguments:     req - what was originally requested.
Packit b099d7
 *                     new - what will be created (our superclasses have
Packit b099d7
 *                           already mucked with this)
Packit b099d7
 *                     args, num_args - The arguments passed to 
Packit b099d7
 *                                      the creation call.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void Initialize(Widget req, Widget set, 
Packit b099d7
		       ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * This is here just in case no children are added before the
Packit b099d7
     * widget is realized.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (req->core.width == 0)
Packit b099d7
	set->core.width = 1;
Packit b099d7
Packit b099d7
    if (req->core.height == 0)
Packit b099d7
	set->core.height = 1;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ConstraintInitialize
Packit b099d7
 *	Description:   Called to initialize information specific
Packit b099d7
 *                     to this child widget.
Packit b099d7
 *	Arguments:     req - what was originally requested.
Packit b099d7
 *                     set - what will be created (our superclassed have
Packit b099d7
 *                           already mucked with this)
Packit b099d7
 *                     args, num_args - The arguments passed to 
Packit b099d7
 *                                      the creation call.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
ConstraintInitialize(Widget request, Widget set, ArgList args, Cardinal *num_args)
Packit b099d7
{
Packit b099d7
    XmButtonBoxC_pref_width(set) = XmButtonBoxC_pref_height(set) = 0;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*      Function Name: ConstraintSetValues
Packit b099d7
 *      Description:   Called when child widget data needs to be modified on-
Packit b099d7
 *                     the-fly.
Packit b099d7
 *      Arguments:     current - the current (old) widget values.
Packit b099d7
 *                     request - before superclassed have changed things.
Packit b099d7
 *                     set - what will acutally be the new values.
Packit b099d7
 *                     args, num_args - the arguments in the list.
Packit b099d7
 *      Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
ConstraintSetValues(Widget current, Widget request, Widget set,
Packit b099d7
		    ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    if ((XmButtonBoxC_pref_width(set) != set->core.width) ||
Packit b099d7
	(XmButtonBoxC_pref_height(set) != set->core.height))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The desired height or width changed, this will
Packit b099d7
	 * tell the icon box to perform a new XtQueryGeom.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	XmButtonBoxC_pref_width(set) = XmButtonBoxC_pref_height(set) = 0;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *	Function Name: Resize
Packit b099d7
 *      Description:   Called when this widget has been resized.
Packit b099d7
 *      Arguments:     w - Button Box Widget to resize.
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED */
Packit b099d7
static void
Packit b099d7
Resize(Widget w)
Packit b099d7
{
Packit b099d7
    LayoutChildren(w, NULL);
Packit b099d7
} 
Packit b099d7
Packit b099d7
/*      Function Name: QueryGeometry
Packit b099d7
 *      Description:   Called when my parent wants to know my
Packit b099d7
 *                     preferred size.
Packit b099d7
 *      Arguments:     w - the widget to check.
Packit b099d7
 *                     intended - parent imposed geometry.
Packit b099d7
 *                     preferred - what I would like.
Packit b099d7
 *      Returns:       status.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtGeometryResult
Packit b099d7
QueryGeometry(Widget w, XtWidgetGeometry *request,
Packit b099d7
              XtWidgetGeometry *preferred)
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidget 	bbox = (XmButtonBoxWidget)w;
Packit b099d7
    Dimension		max_major, max_minor, child_major_total;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Calculate our desired size.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    (void) CalcChildrenPrefSizes(bbox, &max_major,
Packit b099d7
				 &max_minor, &child_major_total);
Packit b099d7
Packit b099d7
    if (IsHorizontal(bbox)) {
Packit b099d7
	preferred->width = child_major_total + (2 * MarginW(bbox));
Packit b099d7
	preferred->height = max_minor + (2 * MarginH(bbox));
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	preferred->width = max_minor + (2 * MarginW(bbox));
Packit b099d7
	preferred->height = child_major_total + (2 * MarginH(bbox));
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return(_XmHWQuery(w, request, preferred));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*      Function Name: GeometryManager
Packit b099d7
 *      Description:   handles request from children for size changes.
Packit b099d7
 *      Arguments:     child - the child to change.
Packit b099d7
 *                     request - desired geometry of child.
Packit b099d7
 *                     result - what will be allowed if almost.
Packit b099d7
 *      Returns:       status.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static XtGeometryResult
Packit b099d7
GeometryManager(Widget w, XtWidgetGeometry *request,
Packit b099d7
                XtWidgetGeometry *reply)
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidget	bbox = (XmButtonBoxWidget)w->core.parent;
Packit b099d7
    Mask             	mask = 0;
Packit b099d7
    XtGeometryResult 	result;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Say no to any change in position.
Packit b099d7
     */
Packit b099d7
  
Packit b099d7
    if ( (request->request_mode & (CWX | CWY | CWBorderWidth)) && 
Packit b099d7
	 !(request->request_mode & (CWWidth | CWHeight)) )
Packit b099d7
    {
Packit b099d7
	return (XtGeometryNo);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
    if ( request->request_mode & (CWWidth | CWHeight) )
Packit b099d7
    {
Packit b099d7
	Dimension		max_major, max_minor;
Packit b099d7
	Dimension		child_major, child_minor;
Packit b099d7
	Dimension	        child_width, child_height;
Packit b099d7
	Dimension		child_major_total;
Packit b099d7
    
Packit b099d7
	Cardinal   		num_managed;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Save the old size, and set the corresponding
Packit b099d7
	 * widget fields to the requested sizes.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	Dimension old_width       = XmButtonBoxC_pref_width(w);
Packit b099d7
	Dimension old_height      = XmButtonBoxC_pref_height(w);
Packit b099d7
Packit b099d7
	if ( request->request_mode & CWWidth )
Packit b099d7
	    XmButtonBoxC_pref_width(w)  = request->width;
Packit b099d7
	
Packit b099d7
	if ( request->request_mode & CWHeight )
Packit b099d7
	    XmButtonBoxC_pref_height(w) = request->height;
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * See if everything fits with the new size.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	(void) TryNewLayout((Widget)bbox, &mask, 
Packit b099d7
			    (request->request_mode & XtCWQueryOnly));
Packit b099d7
Packit b099d7
	num_managed = CalcChildrenPrefSizes(bbox, &max_major,
Packit b099d7
					    &max_minor, &child_major_total);
Packit b099d7
Packit b099d7
	CalcChildSize(bbox, w, max_major, max_minor, 
Packit b099d7
		      child_major_total, num_managed, &child_major, 
Packit b099d7
		      &child_minor);
Packit b099d7
Packit b099d7
	if (IsHorizontal(bbox)) {
Packit b099d7
	    child_height = child_minor;
Packit b099d7
	    child_width = child_major;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    child_height = child_major;
Packit b099d7
	    child_width = child_minor;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ( (int)child_width >= (int)(2 * w->core.border_width) ) 
Packit b099d7
	    child_width -= (2 * w->core.border_width);
Packit b099d7
	
Packit b099d7
	if ( (int)child_height >= (int)(2 * w->core.border_width) )
Packit b099d7
	    child_height -= (2 * w->core.border_width);
Packit b099d7
Packit b099d7
	if (((child_width == XmButtonBoxC_pref_width(w)) ||
Packit b099d7
	     !(request->request_mode & CWWidth)) &&
Packit b099d7
	    ((child_height == XmButtonBoxC_pref_height(w)) ||
Packit b099d7
	     !(request->request_mode & CWHeight)))
Packit b099d7
	{
Packit b099d7
	    result = XtGeometryYes;
Packit b099d7
	}
Packit b099d7
	else if ((child_width != w->core.width) || 
Packit b099d7
		 (child_height != w->core.height))
Packit b099d7
	{
Packit b099d7
	    reply->request_mode = CWHeight | CWWidth;
Packit b099d7
	    reply->height = child_height;
Packit b099d7
	    reply->width = child_width;
Packit b099d7
	    result = XtGeometryAlmost;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    result = XtGeometryNo;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ((request->request_mode & XtCWQueryOnly) ||
Packit b099d7
	    (result != XtGeometryYes))
Packit b099d7
	{
Packit b099d7
	    XmButtonBoxC_pref_width(w) = old_width;
Packit b099d7
	    XmButtonBoxC_pref_height(w) = old_height;
Packit b099d7
	}
Packit b099d7
	else 
Packit b099d7
	    LayoutChildren((Widget)bbox, w);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * We didn't get what we wanted, our preferred
Packit b099d7
	 * size should be recomputed the next time we have
Packit b099d7
	 * a chance to ask it, given that we're rejecting
Packit b099d7
	 * its current geometry and that it may not agree
Packit b099d7
	 * with our Almost reply.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (result != XtGeometryYes) {
Packit b099d7
	    if ( request->request_mode & CWWidth )
Packit b099d7
		XmButtonBoxC_pref_width(w) = 0;
Packit b099d7
	    
Packit b099d7
	    if ( request->request_mode & CWHeight )
Packit b099d7
		XmButtonBoxC_pref_height(w) = 0;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	return(result);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Stacking request only.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    return (XtGeometryYes);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*      Function Name: ChangeManaged
Packit b099d7
 *      Description:   when a management change has occurred.
Packit b099d7
 *      Arguments:     w - the ButtonBox widget.
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ChangeManaged(Widget w)
Packit b099d7
{
Packit b099d7
    Mask		mask = 0;
Packit b099d7
    /* CR03420 mask should be set accordingly */
Packit b099d7
    if (w->core.width == 1) mask |= CWWidth;
Packit b099d7
    if (w->core.height == 1) mask |= CWHeight;
Packit b099d7
    if (mask) (void)TryNewLayout(w, &mask, False);
Packit b099d7
    LayoutChildren(w, NULL);
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * for Motif navigation
Packit b099d7
    */
Packit b099d7
Packit b099d7
   XmeNavigChangeManaged(w);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*      Function Name: InsertChild
Packit b099d7
 *      Description:   when a child widget is added.
Packit b099d7
 *      Arguments:     w - the child widget
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
InsertChild(register Widget child)
Packit b099d7
{
Packit b099d7
Boolean         is_button = False ;
Packit b099d7
XmButtonBoxWidget bb = (XmButtonBoxWidget) XtParent( child) ;
Packit b099d7
    /*
Packit b099d7
     * Check for non-widgets - ButtonBox doesn't support gadgets, for now ...
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (_XmGadgetWarning(child))
Packit b099d7
    {
Packit b099d7
    	return;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Insert the child widget in the composite children list with the
Packit b099d7
     * superclass insert_child routine.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /* (*SUPERCLASS->composite_class.insert_child)(w); */
Packit b099d7
Packit b099d7
    /* Another process may be updating the superclass's data */
Packit b099d7
    /* (This was missed for some reason... - scorch)
Packit b099d7
     * use composite class insert proc to do all the dirty work
Packit b099d7
     */
Packit b099d7
    {
Packit b099d7
       XtWidgetProc insert_child;
Packit b099d7
       _XmProcessLock();
Packit b099d7
       insert_child = ((XmManagerWidgetClass)xmManagerWidgetClass)->
Packit b099d7
				composite_class.insert_child; 
Packit b099d7
       _XmProcessUnlock();
Packit b099d7
       (*insert_child)(child);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if(XmeTraitGet((XtPointer)XtClass(child), XmQTtakesDefault))
Packit b099d7
    {
Packit b099d7
        is_button = TRUE ;
Packit b099d7
Packit b099d7
        if( XmButtonBox_default_button( bb) )
Packit b099d7
        {   
Packit b099d7
            /* Notify child that it has to be ready for default visual */
Packit b099d7
            ButtonBoxSetDefaultShadow( child) ;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
    
Packit b099d7
/*      Function Name: SetValues
Packit b099d7
 *      Description:   Called when some widget data needs to be modified on-
Packit b099d7
 *                     the-fly.
Packit b099d7
 *      Arguments:     current - the current (old) widget values.
Packit b099d7
 *                     request - before superclassed have changed things.
Packit b099d7
 *                     set - what will acutally be the new values.
Packit b099d7
 *                     args, num_args - the arguments in the list.
Packit b099d7
 *      Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
SetValues(Widget current, Widget request, Widget set,
Packit b099d7
          ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidget b_old = (XmButtonBoxWidget) current;
Packit b099d7
    XmButtonBoxWidget b_set = (XmButtonBoxWidget) set;
Packit b099d7
    Boolean	      newLayout = False;
Packit b099d7
    Mask mask = 0; /* CR03420 */
Packit b099d7
    if ( XmButtonBox_equal_size(b_set) != XmButtonBox_equal_size(b_old) ||
Packit b099d7
	 XmButtonBox_fill_option(b_set) != XmButtonBox_fill_option(b_old) ||
Packit b099d7
	 XmButtonBox_margin_height(b_set) != XmButtonBox_margin_height(b_old) ||
Packit b099d7
	 XmButtonBox_margin_width(b_set) != XmButtonBox_margin_width(b_old) ||
Packit b099d7
	 XmButtonBox_orientation(b_set) != XmButtonBox_orientation(b_old) )
Packit b099d7
    {
Packit b099d7
	newLayout = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (set->core.width == 0) 
Packit b099d7
    { /* CR03420 */
Packit b099d7
      set->core.width = 1; /* setting to 1 to prevent zero width */
Packit b099d7
      mask |= CWWidth;
Packit b099d7
    }
Packit b099d7
    if (set->core.height == 0)
Packit b099d7
    { /* CR03420 */
Packit b099d7
      set->core.height = 1; /* setting to 1 to prevent zero height */
Packit b099d7
      mask |= CWHeight;
Packit b099d7
    }
Packit b099d7
    if (mask) TryNewLayout((Widget)b_set, &mask, False);
Packit b099d7
    if ( newLayout == True ) LayoutChildren((Widget)b_set, NULL);
Packit b099d7
    
Packit b099d7
    return(False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 * Type Converters.
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*      Function Name: CvtStringToFillOption
Packit b099d7
 *      Description:   Converts a string to a FillOption
Packit b099d7
 *      Arguments:     dpy - the X Display.
Packit b099d7
 *                     args, num_args - *** NOT USED ***
Packit b099d7
 *                     fromVal - contains the string to convert.
Packit b099d7
 *                     toVal - contains the converted node state.
Packit b099d7
 *      Returns:
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
CvtStringToFillOption(Display * dpy, XrmValuePtr args, Cardinal *num_args,
Packit b099d7
		      XrmValuePtr fromVal, XrmValuePtr toVal)
Packit b099d7
{
Packit b099d7
    static XmFillOption 	option;
Packit b099d7
    char 			lowerName[BUFSIZ];
Packit b099d7
Packit b099d7
    XmCopyISOLatin1Lowered(lowerName, (char *)fromVal->addr);
Packit b099d7
    
Packit b099d7
    if ( streq(lowerName, "none") || streq(lowerName,"fillnone") )
Packit b099d7
        option = XmFillNone;
Packit b099d7
    else if ( streq(lowerName, "major") || streq(lowerName, "fillmajor") )
Packit b099d7
	option = XmFillMajor;
Packit b099d7
    else if ( streq(lowerName, "minor") || streq(lowerName, "fillminor") )
Packit b099d7
	option = XmFillMinor;
Packit b099d7
    else if ( streq(lowerName, "all") || streq(lowerName, "fillall") )
Packit b099d7
	option = XmFillAll;
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XtDisplayStringConversionWarning(dpy, fromVal->addr, XmRXmFillOption);
Packit b099d7
        return(False);          /* Conversion failed. */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ( toVal->addr == NULL ) 
Packit b099d7
    {
Packit b099d7
        toVal->size = sizeof(XmFillOption);
Packit b099d7
        toVal->addr = (XtPointer)&option;
Packit b099d7
        return(True);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	toVal->size = sizeof(XmFillOption);
Packit b099d7
	if ( toVal->size >= sizeof(XmFillOption) ) 
Packit b099d7
	{
Packit b099d7
	    XmFillOption *state = (XmFillOption *)toVal->addr;
Packit b099d7
Packit b099d7
	    *state = option;
Packit b099d7
	    return(True);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    return(False);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *      LOCAL CODE
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*      Function Name: TryNewLayout
Packit b099d7
 *      Description:   tries to do a layout within the current width
Packit b099d7
 *                     and height.  If that fails, it tries to resize and
Packit b099d7
 *                     do it within the geometry given in preferred_size.
Packit b099d7
 *      Arguments:     parent - the ButtonBox
Packit b099d7
 *		       mask - request mask
Packit b099d7
 *		       queryOnly - should this only query
Packit b099d7
 *      Returns:       status.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static XtGeometryResult 
Packit b099d7
TryNewLayout(Widget parent, Mask *mask, 
Packit b099d7
	     Boolean queryOnly)
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidget 	bbox = (XmButtonBoxWidget)parent;
Packit b099d7
    Dimension		new_width, new_height;
Packit b099d7
    Dimension		max_major, max_minor, child_major_total;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Get the bounding width and height of all children.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    (void) CalcChildrenPrefSizes(bbox, &max_major,
Packit b099d7
				 &max_minor, &child_major_total);
Packit b099d7
Packit b099d7
    if (IsHorizontal(bbox)) 
Packit b099d7
    {
Packit b099d7
	new_width = child_major_total + 2 * MarginW(bbox);
Packit b099d7
	new_height = max_minor + 2 * MarginH(bbox);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	new_width = max_minor + 2 * MarginW(bbox);
Packit b099d7
	new_height = child_major_total + 2 * MarginH(bbox);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Be sure that we are always at least one pixel high.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (new_width == 0)
Packit b099d7
	new_width = 1;
Packit b099d7
    if (new_height == 0)
Packit b099d7
	new_height = 1;
Packit b099d7
Packit b099d7
    if ( new_width != parent->core.width || new_height != parent->core.height )
Packit b099d7
    {
Packit b099d7
	XtWidgetGeometry	request, reply;
Packit b099d7
	XtGeometryResult	result;
Packit b099d7
Packit b099d7
	request.width = new_width;
Packit b099d7
	request.height = new_height;
Packit b099d7
Packit b099d7
	reply.width = 0;
Packit b099d7
	reply.height = 0;
Packit b099d7
	
Packit b099d7
	request.request_mode = *mask; /* CR03420 */
Packit b099d7
	if ( queryOnly )
Packit b099d7
	{
Packit b099d7
	    request.request_mode |= XtCWQueryOnly;
Packit b099d7
	}
Packit b099d7
	result = XtMakeGeometryRequest(parent, &request, &reply);
Packit b099d7
Packit b099d7
	if ( request.width == reply.width )
Packit b099d7
	{
Packit b099d7
	    *mask |= CWWidth;
Packit b099d7
	}
Packit b099d7
	if ( request.height == reply.height )
Packit b099d7
	{
Packit b099d7
	    *mask |= CWHeight;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ( result == XtGeometryAlmost && !queryOnly )
Packit b099d7
	{
Packit b099d7
	    result = XtMakeGeometryRequest(parent, &reply, &reply);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	return(result);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    *mask = CWWidth | CWHeight;
Packit b099d7
    return(XtGeometryYes);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*      Function Name: LayoutChildren
Packit b099d7
 *      Description:   Lays out the "child" widgets in the ButtonBox widget.
Packit b099d7
 *      Arguments:     w - the ButtonBox widget.
Packit b099d7
 *                     special_child - Treat this child special, actually
Packit b099d7
 *                                     set the new width and height instead
Packit b099d7
 *                                     of calling the Xt routine.  This helps
Packit b099d7
 *                                     the geom mgr implement XtGeometryYes
Packit b099d7
 *                                     policy.
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
LayoutChildren(Widget w, Widget special_child)
Packit b099d7
{
Packit b099d7
    XmButtonBoxWidget 	bbox = (XmButtonBoxWidget)w;
Packit b099d7
    Widget             *childp;
Packit b099d7
Packit b099d7
    Dimension		margin_major, margin_minor;
Packit b099d7
    Dimension		max_major, max_minor;
Packit b099d7
    Dimension		box_major, box_minor;
Packit b099d7
    Dimension		child_major, child_minor;
Packit b099d7
    Dimension	        child_width, child_height;
Packit b099d7
    Dimension		child_major_total;
Packit b099d7
    
Packit b099d7
    Position		pos_minor;
Packit b099d7
    Position   	        pos_x, pos_y;
Packit b099d7
Packit b099d7
    float  		pad = 0, pos_major;
Packit b099d7
    Cardinal   		num_managed;
Packit b099d7
Packit b099d7
    child_major = 0;
Packit b099d7
    child_minor = 0;
Packit b099d7
    
Packit b099d7
    if ( IsHorizontal(bbox) )
Packit b099d7
    {
Packit b099d7
	margin_major = MarginW(bbox);
Packit b099d7
	margin_minor = MarginH(bbox);
Packit b099d7
	box_major = bbox->core.width;
Packit b099d7
	box_minor = bbox->core.height;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	margin_major = MarginH(bbox);
Packit b099d7
	margin_minor = MarginW(bbox);
Packit b099d7
	box_major = bbox->core.height;
Packit b099d7
	box_minor = bbox->core.width;
Packit b099d7
    }
Packit b099d7
    if ((int)box_major > (int)(2 * margin_major))
Packit b099d7
	box_major -= 2 * margin_major;
Packit b099d7
    else
Packit b099d7
	box_major = 1;
Packit b099d7
Packit b099d7
    if ((int)box_minor > (int)(2 * margin_minor))
Packit b099d7
	box_minor -= 2 * margin_minor;
Packit b099d7
    else
Packit b099d7
	box_minor = 1;
Packit b099d7
Packit b099d7
    num_managed = CalcChildrenPrefSizes(bbox, &max_major,
Packit b099d7
					&max_minor, &child_major_total);
Packit b099d7
Packit b099d7
    pad = 0.0;
Packit b099d7
    pos_major = (float) margin_major;
Packit b099d7
    if ((FillOption(bbox) == XmFillNone) || (FillOption(bbox) == XmFillMinor))
Packit b099d7
    {
Packit b099d7
	if ( box_major >= child_major_total ) {
Packit b099d7
	    pad = ((float) box_major - 
Packit b099d7
		   (float) child_major_total) / ((float) num_managed + 1.0);
Packit b099d7
	    pos_major += pad;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    ForAllChildren(bbox, childp) {
Packit b099d7
	if ( !XtIsManaged(*childp) ) 
Packit b099d7
	    continue;
Packit b099d7
Packit b099d7
	CalcChildSize(bbox, *childp, max_major, max_minor, 
Packit b099d7
		      child_major_total, num_managed, &child_major, 
Packit b099d7
		      &child_minor);
Packit b099d7
	
Packit b099d7
	if ((FillOption(bbox) == XmFillNone) || 
Packit b099d7
	    (FillOption(bbox) == XmFillMajor))
Packit b099d7
	{
Packit b099d7
	    pos_minor = (((int)(box_minor - child_minor)) /2) + margin_minor;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    pos_minor = margin_minor;
Packit b099d7
	
Packit b099d7
	if ( IsHorizontal(bbox) ) {
Packit b099d7
	    child_width = child_major;
Packit b099d7
	    child_height = child_minor;
Packit b099d7
	    if (LayoutIsRtoLM(bbox))
Packit b099d7
		pos_x = box_major - (int) pos_major - child_width;
Packit b099d7
	    else
Packit b099d7
		pos_x = (int) pos_major;
Packit b099d7
	    pos_y = pos_minor;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    pos_x = pos_minor;
Packit b099d7
	    pos_y = (int) pos_major;
Packit b099d7
	    child_width = child_minor;
Packit b099d7
	    child_height = child_major;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ( (int)child_width >= (int)(2 * (*childp)->core.border_width) ) 
Packit b099d7
	    child_width -= (2 * (*childp)->core.border_width);
Packit b099d7
	
Packit b099d7
	if ( (int)child_height >= (int)(2 * (*childp)->core.border_width) )
Packit b099d7
	    child_height -= (2 * (*childp)->core.border_width);
Packit b099d7
	
Packit b099d7
	child_width = (child_width == 0) ? 1 : child_width;
Packit b099d7
	child_height = (child_height == 0) ? 1 : child_height;
Packit b099d7
Packit b099d7
	if (*childp == special_child) {
Packit b099d7
	    special_child->core.x = pos_x;
Packit b099d7
	    special_child->core.y = pos_y;
Packit b099d7
	    special_child->core.width = child_width;
Packit b099d7
	    special_child->core.height = child_height;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    _XmConfigureWidget(*childp, pos_x, pos_y, child_width, 
Packit b099d7
			       child_height, (*childp)->core.border_width);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	pos_major += (float) child_major + pad;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*      Function Name: CalcChildrenPrefSizes
Packit b099d7
 *      Description:   Determines the total size in the major direction
Packit b099d7
 *		       of all children of the ButtonBox, as well as the 
Packit b099d7
 *                     maximum value in both major and minor directions.
Packit b099d7
 *      Arguments:     bbox - the ButtonBox parent.
Packit b099d7
 *		       max_major - the maximum size of all the children
Packit b099d7
 *				   in the major dimension.
Packit b099d7
 *		       total - return location for the total size in the
Packit b099d7
 *			       major direction.
Packit b099d7
 *      Returns:       number of managed children.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Cardinal
Packit b099d7
CalcChildrenPrefSizes(XmButtonBoxWidget bbox, Dimension *max_major,
Packit b099d7
		      Dimension *max_minor, Dimension *total)
Packit b099d7
{
Packit b099d7
    Cardinal		num_managed = 0;
Packit b099d7
    Widget	       *childp;
Packit b099d7
    XtWidgetGeometry	geo;
Packit b099d7
    Dimension	       *maj_dim, *minor_dim;
Packit b099d7
    Boolean		is_equal = EqualSize(bbox);
Packit b099d7
    
Packit b099d7
    if ( IsHorizontal(bbox) ) 
Packit b099d7
    {
Packit b099d7
	maj_dim = &geo.width;
Packit b099d7
	minor_dim = &geo.height;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	maj_dim = &geo.height;
Packit b099d7
	minor_dim = &geo.width;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    *total = *max_major = *max_minor = 1;
Packit b099d7
    
Packit b099d7
    ForAllChildren(bbox, childp) {
Packit b099d7
Packit b099d7
	if ( !XtIsManaged(*childp) ) 
Packit b099d7
	    continue;
Packit b099d7
Packit b099d7
	num_managed++;
Packit b099d7
	    
Packit b099d7
	if ((XmButtonBoxC_pref_width(*childp) == 0) ||
Packit b099d7
	    (XmButtonBoxC_pref_height(*childp) == 0)) 
Packit b099d7
	{
Packit b099d7
	    XtQueryGeometry(*childp, NULL, &geo;;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	    geo.border_width = (*childp)->core.border_width;
Packit b099d7
	
Packit b099d7
	if (XmButtonBoxC_pref_width(*childp) == 0)
Packit b099d7
	    XmButtonBoxC_pref_width(*childp) = geo.width;
Packit b099d7
	else
Packit b099d7
	    geo.width = XmButtonBoxC_pref_width(*childp);
Packit b099d7
	
Packit b099d7
	if (XmButtonBoxC_pref_height(*childp) == 0)
Packit b099d7
	    XmButtonBoxC_pref_height(*childp) = geo.height;
Packit b099d7
	else
Packit b099d7
	    geo.height = XmButtonBoxC_pref_height(*childp);
Packit b099d7
	
Packit b099d7
	ASSIGN_MAX(*max_major, *maj_dim + (2 * geo.border_width));
Packit b099d7
	ASSIGN_MAX(*max_minor, *minor_dim + (2 * geo.border_width));
Packit b099d7
	
Packit b099d7
	if (!is_equal) 
Packit b099d7
	    *total += (*maj_dim + (2 * geo.border_width));
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if ( is_equal )
Packit b099d7
        *total = num_managed * (*max_major);
Packit b099d7
    
Packit b099d7
    return(num_managed);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*      Function Name: CalcChildSize
Packit b099d7
 *      Description:   Determines the size of a child
Packit b099d7
 *      Arguments:     bbox - the ButtonBox parent.
Packit b099d7
 *		       w - the child of interest.
Packit b099d7
 *		       max_major - the largest size allowed in the
Packit b099d7
 *				   major direction.
Packit b099d7
 *		       max_minor - the largest size allowed in the
Packit b099d7
 *				   minor direction.
Packit b099d7
 *		       child_major_total - total size of all children in the
Packit b099d7
 *					   major direction.
Packit b099d7
 *		       num_managed - number of managed children.
Packit b099d7
 *		       child_major - return location for child's base 
Packit b099d7
 *				     major size.
Packit b099d7
 *		       child_minor - return location for child's base
Packit b099d7
 *				     minor size.
Packit b099d7
 *      Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
CalcChildSize(XmButtonBoxWidget bbox, Widget w, Dimension max_major,
Packit b099d7
	      Dimension max_minor, Dimension child_major_total, 
Packit b099d7
	      Cardinal num_managed, Dimension *child_major, 
Packit b099d7
	      Dimension *child_minor)
Packit b099d7
{
Packit b099d7
    XtWidgetGeometry	geo;
Packit b099d7
    Dimension		box_minor, box_major;
Packit b099d7
    Dimension		margin_major, margin_minor;
Packit b099d7
    
Packit b099d7
    if ((XmButtonBoxC_pref_width(w) == 0)||(XmButtonBoxC_pref_height(w) == 0)) 
Packit b099d7
	XtQueryGeometry(w, NULL, &geo;;
Packit b099d7
    else
Packit b099d7
	geo.border_width = w->core.border_width;
Packit b099d7
    
Packit b099d7
    if (XmButtonBoxC_pref_width(w) != 0)
Packit b099d7
	geo.width = XmButtonBoxC_pref_width(w);
Packit b099d7
    
Packit b099d7
    if (XmButtonBoxC_pref_height(w) != 0)
Packit b099d7
	geo.height = XmButtonBoxC_pref_height(w);
Packit b099d7
Packit b099d7
    if ( IsHorizontal(bbox) )
Packit b099d7
    {
Packit b099d7
	margin_major = MarginW(bbox);
Packit b099d7
	margin_minor = MarginH(bbox);
Packit b099d7
	box_major = bbox->core.width;
Packit b099d7
        box_minor = bbox->core.height;
Packit b099d7
        *child_major = geo.width;
Packit b099d7
        *child_minor = geo.height;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	margin_major = MarginH(bbox);
Packit b099d7
	margin_minor = MarginW(bbox);
Packit b099d7
	box_major = bbox->core.height;
Packit b099d7
        box_minor = bbox->core.width;
Packit b099d7
        *child_major = geo.height;
Packit b099d7
        *child_minor = geo.width;
Packit b099d7
    }
Packit b099d7
    *child_major += (2 * geo.border_width);
Packit b099d7
    *child_minor += (2 * geo.border_width);
Packit b099d7
Packit b099d7
    if ((int)box_major > (int)(2 * margin_major))
Packit b099d7
	box_major -= (2 * margin_major);
Packit b099d7
    else
Packit b099d7
	box_major = 1;
Packit b099d7
Packit b099d7
    if ((int)box_minor > (int)(2 * margin_minor))
Packit b099d7
	box_minor -= (2 * margin_minor);
Packit b099d7
    else
Packit b099d7
	box_minor = 1;
Packit b099d7
Packit b099d7
    if ( EqualSize(bbox) )
Packit b099d7
    {
Packit b099d7
        *child_major = max_major;
Packit b099d7
        *child_minor = max_minor;
Packit b099d7
    }
Packit b099d7
    if ( FillOption(bbox) == XmFillMajor || FillOption(bbox) == XmFillAll ||
Packit b099d7
	 child_major_total > box_major )
Packit b099d7
    {
Packit b099d7
	*child_major = (Dimension)
Packit b099d7
	    (((float)*child_major/(float)child_major_total) * box_major);
Packit b099d7
    }
Packit b099d7
    if ( FillOption(bbox) == XmFillMinor || FillOption(bbox) == XmFillAll || 
Packit b099d7
	 *child_minor > box_minor )
Packit b099d7
    {
Packit b099d7
	*child_minor = box_minor;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  Public functions
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: XmCreateButtonBox
Packit b099d7
 *	Description: Creation Routine for UIL and ADA.
Packit b099d7
 *	Arguments: parent - the parent widget.
Packit b099d7
 *                 name - the name of the widget.
Packit b099d7
 *                 args, num_args - the number and list of args.
Packit b099d7
 *	Returns: The created widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmCreateButtonBox(Widget parent, String name, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    return(XtCreateWidget(name, 
Packit b099d7
			  xmButtonBoxWidgetClass, parent, args, num_args));
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateButtonBox(
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
                         xmButtonBoxWidgetClass,
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
XmVaCreateManagedButtonBox(
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
                         xmButtonBoxWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
static void 
Packit b099d7
ButtonBoxSetDefaultShadow(Widget button)
Packit b099d7
{   
Packit b099d7
    XmTakesDefaultTrait trait_default ;
Packit b099d7
    
Packit b099d7
    trait_default = (XmTakesDefaultTrait) XmeTraitGet((XtPointer)
Packit b099d7
						      XtClass(button), 
Packit b099d7
						      XmQTtakesDefault) ;
Packit b099d7
    if (trait_default) 
Packit b099d7
	trait_default->showAsDefault  (button, XmDEFAULT_READY);
Packit b099d7
}