Blame lib/Xm/Column.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
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#include <Xm/ColumnP.h>
Packit b099d7
#include <Xm/RowColumn.h>
Packit b099d7
#include <Xm/Label.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
#define XK_LATIN1
Packit b099d7
#include <X11/keysymdef.h>
Packit b099d7
Packit b099d7
static void ClassInitialize(void);
Packit b099d7
Packit b099d7
static void Initialize(Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static void ClassPartInitialize(WidgetClass w_class);
Packit b099d7
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static void Destroy(Widget);
Packit b099d7
static void Resize(Widget);
Packit b099d7
static XtGeometryResult QueryGeometry(Widget, 
Packit b099d7
        XtWidgetGeometry*, XtWidgetGeometry*);
Packit b099d7
static XtGeometryResult GeometryManager(Widget, 
Packit b099d7
        XtWidgetGeometry*, XtWidgetGeometry*);
Packit b099d7
static void ChangeManaged(Widget);
Packit b099d7
static void ConstraintInitialize(Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static Boolean ConstraintSetValues(Widget, Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static void ConstraintDestroy(Widget);
Packit b099d7
static void ConstraintGetValues(Widget, ArgList, Cardinal*);
Packit b099d7
Packit b099d7
Packit b099d7
static Boolean CvtStringToXiAlignment(
Packit b099d7
	Display*, XrmValue*, Cardinal*, XrmValue*, XrmValue*, XtPointer
Packit b099d7
);
Packit b099d7
static Boolean CvtStringToFillStyle(
Packit b099d7
	Display*, XrmValue*, Cardinal*, XrmValue*, XrmValue*, XtPointer
Packit b099d7
);
Packit b099d7
static Boolean CvtStringToDistribution(
Packit b099d7
	Display*, XrmValue*, Cardinal*, XrmValue*, XrmValue*, XtPointer
Packit b099d7
);
Packit b099d7
Packit b099d7
static void Layout(
Packit b099d7
	XmColumnWidget, Widget, XtWidgetGeometry*, int, int
Packit b099d7
);
Packit b099d7
static void HorizontalLayout(
Packit b099d7
	XmColumnWidget, Widget, XtWidgetGeometry*, int, int
Packit b099d7
);
Packit b099d7
static void VerticalLayout(
Packit b099d7
	XmColumnWidget, Widget, XtWidgetGeometry*, int, int
Packit b099d7
);
Packit b099d7
static void VerifyResources(
Packit b099d7
	XmColumnWidget, XmColumnWidget, XmColumnWidget
Packit b099d7
);
Packit b099d7
static void VerifyConstraints(
Packit b099d7
	Widget, Widget, Widget
Packit b099d7
);
Packit b099d7
static void CalcSize(
Packit b099d7
	XmColumnWidget, Widget, XtWidgetGeometry*, Boolean, Dimension*, Dimension*
Packit b099d7
);
Packit b099d7
static Boolean CompareGeometry(
Packit b099d7
Packit b099d7
	XtWidgetGeometry*, XtWidgetGeometry*
Packit b099d7
Packit b099d7
);
Packit b099d7
static Boolean CompareGeometryToWidget(
Packit b099d7
	XtWidgetGeometry*, Widget
Packit b099d7
Packit b099d7
);
Packit b099d7
static void CheckSetEntryLabelRenderTable(Widget wid, int offs, XrmValue *value); 
Packit b099d7
static void CheckSetDefaultEntryLabelRenderTable(Widget wid, int offs, XrmValue *value); 
Packit b099d7
static void XmColumnLabelDestroyedCallback(
Packit b099d7
	Widget, XtPointer, XtPointer
Packit b099d7
);
Packit b099d7
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
	Note: this code was never finished and has been pulled out. The
Packit b099d7
	public and semi-public traces have been pulled out of the header files.
Packit b099d7
	Everything is marked with the #if used above.
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#define BBPart(w) ((XmBulletinBoardPart*)(&(((XmBulletinBoardWidget)(w))->bulletin_board)))
Packit b099d7
#define XiC(w) ((XmColumnConstraintPart*)(&((XmColumnConstraintPtr)((w)->core.constraints))->column))
Packit b099d7
#define XiValidChild(c) (((c)) != NULL && XtIsManaged((c)) && \
Packit b099d7
			 !(c)->core.being_destroyed && \
Packit b099d7
			 XiC(c)->label_widget != NULL)
Packit b099d7
#define XmColumn(c) ((XmColumnWidget) XtParent((c)))
Packit b099d7
#define XiAlignment(c) ((XiC((c))->label_alignment == XmALIGNMENT_UNSPECIFIED) \
Packit b099d7
			? XmColumn_default_label_alignment(XmColumn((c))) \
Packit b099d7
			: XiC(c)->label_alignment)
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
#define XiPosition(c) ((XiC(c)->label_position == XiLABEL_POSITION_UNSPECIFIED)\
Packit b099d7
		       ? XmColumn_default_label_position(XmColumn(c)) \
Packit b099d7
		       : XiC(c)->label_position)
Packit b099d7
#endif
Packit b099d7
#define XiFill(c) ((XiC(c)->fill_style == XmFILL_UNSPECIFIED)\
Packit b099d7
		   ? XmColumn_default_fill_style(XmColumn(c)) \
Packit b099d7
		   : XiC(c)->fill_style)
Packit b099d7
Packit b099d7
#define XiWidth(c) (XtWidth(c) + 2 * XtBorderWidth(c))
Packit b099d7
#define XiHeight(c) (XtHeight(c) + 2 * XtBorderWidth(c))
Packit b099d7
Packit b099d7
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
Packit b099d7
/* from public .h file */
Packit b099d7
#define XiLABEL_POSITION_UNSPECIFIED	0
Packit b099d7
#define XiLABEL_POSITION_CENTER 	(1L<<0)
Packit b099d7
#define XiLABEL_POSITION_LEFT		(1L<<1)
Packit b099d7
#define XiLABEL_POSITION_RIGHT		(1L<<2)
Packit b099d7
#define XiLABEL_POSITION_TOP		(1L<<3)
Packit b099d7
#define XiLABEL_POSITION_BOTTOM		(1L<<4)
Packit b099d7
Packit b099d7
/* structure member elements from private P.h file */
Packit b099d7
    unsigned char default_label_position;
Packit b099d7
    unsigned char       label_position;
Packit b099d7
#define XmColumnC_label_position(w) XmColCField(w, label_position, unsigned char)
Packit b099d7
#define XmColumn_default_label_position(w) XmColField(w, default_label_position, unsigned char)
Packit b099d7
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#define DEFAULT_ALIGNMENT XmALIGNMENT_BEGINNING
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
#define DEFAULT_POSITION XiLABEL_POSITION_LEFT
Packit b099d7
#endif
Packit b099d7
#define DEFAULT_ORIENTATION XmVERTICAL
Packit b099d7
#define DEFAULT_FILL_STYLE XmFILL_RAGGED
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    "pri.vate", "Pri.vate", XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmColumnRec, column.check_set_render_table),
Packit b099d7
    XmRImmediate, (XtPointer) False
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdefaultEntryLabelFontList, XmCFontList, XmRFontList,
Packit b099d7
    sizeof(XmFontList), XtOffsetOf(XmBulletinBoardRec, bulletin_board.label_font_list),
Packit b099d7
    XmRCallProc, (XtPointer) CheckSetDefaultEntryLabelRenderTable
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdefaultEntryLabelRenderTable, XmCRenderTable, XmRRenderTable,
Packit b099d7
    sizeof(XmRenderTable), XtOffsetOf(XmBulletinBoardRec, bulletin_board.label_font_list),
Packit b099d7
    XmRCallProc, (XtPointer) CheckSetDefaultEntryLabelRenderTable
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdefaultEntryLabelAlignment, XmCAlignment, XmRXmAlignment,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnRec, column.default_label_alignment),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_ALIGNMENT
Packit b099d7
  },
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
  {
Packit b099d7
    XmNdefaultEntryLabelPosition, XmCEntryLabelPosition, XmRLabelPosition,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnRec, column.default_label_position),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_POSITION
Packit b099d7
  },
Packit b099d7
#endif
Packit b099d7
  {
Packit b099d7
    XmNdefaultFillStyle, XmCFillStyle, XmRFillStyle,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnRec, column.default_fill_style),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_FILL_STYLE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNitemSpacing, XmCItemSpacing, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmColumnRec, column.item_spacing),
Packit b099d7
    XmRImmediate, (XtPointer) 2
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNlabelSpacing, XmCLabelSpacing, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmColumnRec, column.label_spacing),
Packit b099d7
    XmRImmediate, (XtPointer) 10
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNorientation, XmCOrientation, XmROrientation,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnRec, column.orientation),
Packit b099d7
    XmRImmediate, (XtPointer) DEFAULT_ORIENTATION
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNdistribution, XmCDistribution, XmRDistribution,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnRec, column.distribution),
Packit b099d7
    XmRImmediate, (XtPointer) XmDISTRIBUTE_TIGHT
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource get_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNlabelSpacing, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmColumnRec, column.label_spacing),
Packit b099d7
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNitemSpacing, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmColumnRec, column.item_spacing),
Packit b099d7
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtResource constraint_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    "pri.vate", "Pri.vate", XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmColumnConstraintRec, column.check_set_render_table),
Packit b099d7
    XmRImmediate, (XtPointer) False
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNentryLabelFontList, XmCFontList, XmRFontList,
Packit b099d7
    sizeof(XmFontList), XtOffsetOf(XmColumnConstraintRec, column.label_font_list),
Packit b099d7
    XmRCallProc, (XtPointer) CheckSetEntryLabelRenderTable
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNentryLabelRenderTable, XmCRenderTable, XmRRenderTable,
Packit b099d7
    sizeof(XmRenderTable), XtOffsetOf(XmColumnConstraintRec, column.label_font_list),
Packit b099d7
    XmRCallProc, (XtPointer) CheckSetEntryLabelRenderTable
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNentryLabelAlignment, XmCAlignment, XmRXmAlignment,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnConstraintRec, column.label_alignment),
Packit b099d7
    XmRImmediate, (XtPointer) XmALIGNMENT_UNSPECIFIED
Packit b099d7
  },
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
  {
Packit b099d7
    XmNentryLabelPosition, XmCEntryLabelPosition, XmRLabelPosition,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnConstraintRec, column.label_position),
Packit b099d7
    XmRImmediate, (XtPointer) XiLABEL_POSITION_UNSPECIFIED
Packit b099d7
  },
Packit b099d7
#endif
Packit b099d7
  {
Packit b099d7
    XmNfillStyle, XmCFillStyle, XmRFillStyle,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnConstraintRec, column.fill_style),
Packit b099d7
    XmRImmediate, (XtPointer) XmFILL_UNSPECIFIED
Packit b099d7
  },
Packit b099d7
Packit b099d7
  { 
Packit b099d7
    XmNentryLabelType, XmCLabelType, XmRLabelType,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmColumnConstraintRec, column.label_type),
Packit b099d7
    XmRImmediate, (XtPointer) XmSTRING
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
      XmNentryLabelString, XmCLabelString, XmRXmString,
Packit b099d7
      sizeof(XmString), XtOffsetOf(XmColumnConstraintRec, column.label_string),
Packit b099d7
      XmRImmediate, (XtPointer) NULL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
      XmNentryLabelPixmap, XmCLabelPixmap, XmRPrimForegroundPixmap,
Packit b099d7
      sizeof(Pixmap), XtOffsetOf(XmColumnConstraintRec, column.label_pixmap),
Packit b099d7
      XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
      XmNshowEntryLabel, XmCShowLabel, XmRBoolean,
Packit b099d7
      sizeof(Boolean), XtOffsetOf(XmColumnConstraintRec, column.show_label),
Packit b099d7
      XmRImmediate, (XtPointer) True
Packit b099d7
  },
Packit b099d7
  
Packit b099d7
  {
Packit b099d7
      XmNstretchable, XmCStretchable, XmRBoolean,
Packit b099d7
      sizeof(Boolean), XtOffsetOf(XmColumnConstraintRec, column.stretchable),
Packit b099d7
      XmRImmediate, (XtPointer) False
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Synthetic constraints.  Note that these are NOT currently used,
Packit b099d7
 * as the constraint get_values_hook method below seems to work where
Packit b099d7
 * synthetic resources don't.  Dunno.
Packit b099d7
 */
Packit b099d7
static void Get_entryLabelString(Widget, int, XtArgVal *);
Packit b099d7
static XmSyntheticResource cont_get_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNentryLabelString, sizeof(XmString),
Packit b099d7
    XtOffsetOf(XmColumnConstraintRec, column.label_string),
Packit b099d7
    Get_entryLabelString, (XmImportProc) NULL
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
ConstraintClassExtensionRec xiColumnConstraintExtension = {
Packit b099d7
    NULL,			         /* next_extension  */
Packit b099d7
    NULLQUARK,			         /* record_type     */
Packit b099d7
    XtConstraintExtensionVersion,        /* version         */
Packit b099d7
    sizeof(ConstraintClassExtensionRec), /* record_size     */
Packit b099d7
    ConstraintGetValues		         /* get_values_hook */
Packit b099d7
};
Packit b099d7
Packit b099d7
XmColumnClassRec xmColumnClassRec = {
Packit b099d7
  {
Packit b099d7
    /* core_class members      */
Packit b099d7
    /* superclass         */	(WidgetClass) &xmBulletinBoardClassRec,
Packit b099d7
    /* class_name         */	"XmColumn",                            
Packit b099d7
    /* widget_size        */	sizeof(XmColumnRec),
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
    /* 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            */	Destroy,
Packit b099d7
    /* resize             */	Resize,                           
Packit b099d7
    /* expose             */	XtInheritExpose,
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       */	XtInheritInsertChild,
Packit b099d7
    /* delete_child       */	XtInheritDeleteChild,
Packit b099d7
    /* extension          */	NULL,                             
Packit b099d7
  },
Packit b099d7
  { /* constraint_class fields */
Packit b099d7
    /* resource list      */    (XtResource*)constraint_resources,
Packit b099d7
    /* num resources      */ 	XtNumber(constraint_resources),
Packit b099d7
    /* constraint size    */ 	sizeof(XmColumnConstraintRec),
Packit b099d7
    /* init proc          */ 	ConstraintInitialize,
Packit b099d7
    /* destroy proc       */ 	ConstraintDestroy,
Packit b099d7
    /* set values proc    */ 	ConstraintSetValues,
Packit b099d7
    /* extension          */ 	&xiColumnConstraintExtension,
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, /* cont_get_resources, */
Packit b099d7
    /* num_syn_cont_resources */ 0, /* XtNumber(cont_get_resources),*/
Packit b099d7
    /* parent_process       */ 	XmInheritParentProcess,
Packit b099d7
    /* extension            */ 	NULL,
Packit b099d7
  },
Packit b099d7
  { /* bulletin board members */
Packit b099d7
    /* always_install_accel */  False,
Packit b099d7
    /* geo_matrix_create    */  NULL,
Packit b099d7
    /* focus_moved_proc     */  XmInheritFocusMovedProc,
Packit b099d7
    /* extension            */  NULL,
Packit b099d7
  },
Packit b099d7
  {
Packit b099d7
    /* column class members */
Packit b099d7
    /* extension            */	NULL,                                
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
WidgetClass xmColumnWidgetClass = (WidgetClass) &xmColumnClassRec;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	ClassInitialize(void)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called the first time XmColumn or subclass is
Packit b099d7
 *	created.  This function is used to install all need type
Packit b099d7
 *	converters for this widget class.
Packit b099d7
 * Input:
Packit b099d7
 *	None.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ClassInitialize(void)
Packit b099d7
{
Packit b099d7
    XmColumnClassRec* wc = &xmColumnClassRec;
Packit b099d7
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
    XtSetTypeConverter(XmRString, XmRLabelPosition,
Packit b099d7
		       (XtTypeConverter) CvtStringToLabelPosition,
Packit b099d7
		       NULL, 0, XtCacheAll, NULL);
Packit b099d7
#endif
Packit b099d7
    XtSetTypeConverter(XmRString, XmRXmAlignment,
Packit b099d7
		       (XtTypeConverter) CvtStringToXiAlignment,
Packit b099d7
		       NULL, 0, XtCacheAll, NULL);
Packit b099d7
    XtSetTypeConverter(XmRString, XmRFillStyle,
Packit b099d7
		       (XtTypeConverter) CvtStringToFillStyle,
Packit b099d7
		       NULL, 0, XtCacheAll, NULL);
Packit b099d7
    XtSetTypeConverter(XmRString, XmRDistribution,
Packit b099d7
		       (XtTypeConverter) CvtStringToDistribution,
Packit b099d7
		       NULL, 0, XtCacheAll, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * ClassPartInitialize sets up the fast subclassing for the widget.
Packit b099d7
 */
Packit b099d7
static void 
Packit b099d7
#ifdef _NO_PROTO
Packit b099d7
ClassPartInitialize(w_class)
Packit b099d7
        WidgetClass w_class ;
Packit b099d7
#else
Packit b099d7
ClassPartInitialize(WidgetClass w_class)
Packit b099d7
#endif /* _NO_PROTO */
Packit b099d7
{
Packit b099d7
    _XmFastSubclassInit (w_class, XmCOLUMN_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	Initialize(request, set, arg_list, arg_cnt)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called to initialize the resource values for each
Packit b099d7
 *	new widget instance.  This function verifies the resource values
Packit b099d7
 *	and takes the needed actions to initialize the new instance.
Packit b099d7
 * Input:
Packit b099d7
 *	request  : Widget   - user resource requests
Packit b099d7
 *	set      : Widget   - the resource values for the new widget
Packit b099d7
 *	arg_list : ArgList  - the argument list used to set the resource
Packit b099d7
 *	ang_cnt  : Cardinal - the number of arguments in the list
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
Initialize(Widget request, Widget set, ArgList arg_list, Cardinal *arg_cnt)
Packit b099d7
{
Packit b099d7
    XmColumnWidget rc = (XmColumnWidget) request,
Packit b099d7
                   sc = (XmColumnWidget) set;
Packit b099d7
    
Packit b099d7
    VerifyResources(rc, (XmColumnWidget) NULL, sc);
Packit b099d7
Packit b099d7
    if( rc->core.width == 0 )
Packit b099d7
    {
Packit b099d7
	sc->core.width = 2 * (rc->manager.shadow_thickness +
Packit b099d7
			      BBPart(rc)->margin_width);
Packit b099d7
    }
Packit b099d7
    if( rc->core.height == 0 )
Packit b099d7
    {
Packit b099d7
	sc->core.height = 2 * (rc->manager.shadow_thickness +
Packit b099d7
			       BBPart(rc)->margin_height);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	Destroy(widget)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when an instance of the Column is being
Packit b099d7
 *	destroyed.  This function deallocates any memory allocated by the
Packit b099d7
 *	instance.
Packit b099d7
 * Input:
Packit b099d7
 *	widget : Widget - the widget being destroyed
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
Destroy(Widget widget)
Packit b099d7
{
Packit b099d7
    /* This space intentionally left blank */
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	Resize(widget)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when an instance changes size.  This 
Packit b099d7
 *	function needs to adjust the childrens sizes and positions
Packit b099d7
 *	appropriately for the new size.
Packit b099d7
 * Input:
Packit b099d7
 *	widget : Widget - the widget that changed size.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
Resize(Widget widget)
Packit b099d7
{
Packit b099d7
    WidgetClass    sc = XtSuperclass(widget);
Packit b099d7
    XmColumnWidget cw = (XmColumnWidget) widget;
Packit b099d7
Packit b099d7
    XtWidgetProc resize;
Packit b099d7
    
Packit b099d7
    _XmProcessLock(); 
Packit b099d7
    resize = *sc->core_class.resize;
Packit b099d7
    _XmProcessUnlock();
Packit b099d7
    (* resize) (widget);
Packit b099d7
Packit b099d7
    Layout(cw, NULL, NULL, -1, -1);
Packit b099d7
Packit b099d7
    XmColumn_resize_done(cw) = True;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	SetValues(current, request, set, arg_list, arg_cnt)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when the user changes the resource
Packit b099d7
 *	values for the column.  This function adjusts the columns
Packit b099d7
 *	appearance and behavior based on the new resource settings.
Packit b099d7
 * Input:
Packit b099d7
 *	current  : Widget  - the current resource values for the widget
Packit b099d7
 *	request  : Widget  - the requested resource values for the widget
Packit b099d7
 *	set      : Widget  - the new resource values for the widget
Packit b099d7
 *	arg_list : ArgList - the argument list used to change the resource
Packit b099d7
 *			     values
Packit b099d7
 *	arg_cnt  :Cardinal - the number of arguments
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the Column needs redisplayed, else False.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
SetValues(Widget current, Widget request, Widget set, ArgList arg_list,
Packit b099d7
	  Cardinal *arg_cnt)
Packit b099d7
{
Packit b099d7
    XmColumnWidget cc = (XmColumnWidget) current,
Packit b099d7
                   cs = (XmColumnWidget) set;
Packit b099d7
    Boolean        request_size = False,
Packit b099d7
                   relayout = False;
Packit b099d7
    WidgetList     kid, kids = cs->composite.children;
Packit b099d7
    Cardinal       n, i, kidCnt = cs->composite.num_children;
Packit b099d7
    Arg            args[10];
Packit b099d7
Packit b099d7
    VerifyResources((XmColumnWidget) request, cc, cs);
Packit b099d7
Packit b099d7
    if( XmColumn_item_spacing(cc) != XmColumn_item_spacing(cs) ||
Packit b099d7
        XmColumn_label_spacing(cc) != XmColumn_label_spacing(cs) ||
Packit b099d7
        XmColumn_distribution(cc) != XmColumn_distribution(cs) ||
Packit b099d7
        XmColumn_orientation(cc) != XmColumn_orientation(cs) ||
Packit b099d7
        cc->manager.shadow_thickness != cs->manager.shadow_thickness ||
Packit b099d7
        BBPart(cc)->margin_width != BBPart(cs)->margin_width ||
Packit b099d7
        BBPart(cc)->margin_height != BBPart(cs)->margin_height)
Packit b099d7
    {
Packit b099d7
	request_size = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( XmColumn_default_fill_style(cc) != XmColumn_default_fill_style(cs) 
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
	|| XmColumn_default_label_position(cc) != XmColumn_default_label_position(cs) 
Packit b099d7
#endif
Packit b099d7
	)
Packit b099d7
    {
Packit b099d7
	relayout = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    if( cc->core.background_pixel != cs->core.background_pixel )
Packit b099d7
    {
Packit b099d7
	XtSetArg(args[n], XmNbackground, cs->core.background_pixel); n++;
Packit b099d7
    }
Packit b099d7
    if( cc->manager.foreground != cs->manager.foreground )
Packit b099d7
    {
Packit b099d7
	XtSetArg(args[n], XmNforeground, cs->manager.foreground); n++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	if( (*kid) == NULL || (*kid)->core.being_destroyed ||
Packit b099d7
	    XiC(*kid)->label_widget == NULL ) continue;
Packit b099d7
Packit b099d7
	XtSetValues(XiC(*kid)->label_widget, args, n);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( BBPart(cc)->label_font_list !=
Packit b099d7
            BBPart(cs)->label_font_list )
Packit b099d7
    {
Packit b099d7
	for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
	{
Packit b099d7
	    if( (*kid) == NULL || (*kid)->core.being_destroyed ||
Packit b099d7
	       XiC(*kid)->label_widget == NULL ) continue;
Packit b099d7
Packit b099d7
	    if( XiC(*kid)->label_font_list == NULL )
Packit b099d7
	    {
Packit b099d7
		XtVaSetValues(XiC(*kid)->label_widget,
Packit b099d7
			      XmNrenderTable,
Packit b099d7
			      BBPart(cs)->label_font_list,
Packit b099d7
			      NULL);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( XmColumn_default_label_alignment(cc) !=
Packit b099d7
            XmColumn_default_label_alignment(cs) )
Packit b099d7
    {
Packit b099d7
	for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
	{
Packit b099d7
	    if( (*kid) == NULL || (*kid)->core.being_destroyed ||
Packit b099d7
	       XiC(*kid)->label_widget == NULL ) continue;
Packit b099d7
Packit b099d7
	    if( XiC(*kid)->label_alignment == XmALIGNMENT_UNSPECIFIED )
Packit b099d7
	    {
Packit b099d7
		XtVaSetValues(XiC(*kid)->label_widget,
Packit b099d7
			      XmNalignment,
Packit b099d7
			      XmColumn_default_label_alignment(cs),
Packit b099d7
			      NULL);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( request_size )
Packit b099d7
    {
Packit b099d7
	Dimension width, height;
Packit b099d7
Packit b099d7
	XmColumn_resize_done(cs) = False;
Packit b099d7
	CalcSize(cs, NULL, NULL, False, &width, &height);
Packit b099d7
	if( XtMakeResizeRequest((Widget) cs, width, height, &width,
Packit b099d7
			&height) == XtGeometryAlmost )
Packit b099d7
	{
Packit b099d7
	    XmColumn_resize_done(cs) = False;
Packit b099d7
	    XtMakeResizeRequest((Widget) cs, width, height, NULL, NULL);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	relayout = !XmColumn_resize_done(cs);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( relayout )
Packit b099d7
    {
Packit b099d7
	Resize((Widget) cs);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( False );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	QueryGeometry(widget, request, allowed)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when someone wants to know how the Column
Packit b099d7
 *	would react to a specific geometry or when someone wants to know
Packit b099d7
 *	what size the Column wants to be.
Packit b099d7
 * Input:
Packit b099d7
 *	widget  : Widget            - the column widget
Packit b099d7
 *	request : XtWidgetGeometry* - the requested widget geometry
Packit b099d7
 *	allowed : XtWidgetGeometry* - the geometry column is will to accept
Packit b099d7
 * Output:
Packit b099d7
 *	XtWidgetResult - the columns response to the geometry request
Packit b099d7
 */
Packit b099d7
static XtGeometryResult
Packit b099d7
QueryGeometry(Widget widget, XtWidgetGeometry *request,
Packit b099d7
	      XtWidgetGeometry *wanted)
Packit b099d7
{
Packit b099d7
    XmColumnWidget   cw = (XmColumnWidget) widget;
Packit b099d7
    XtGeometryResult result;
Packit b099d7
    Dimension        width, height;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Lets start by calling this handly dandy function to calculate
Packit b099d7
     * the geometry we want to be.
Packit b099d7
     */
Packit b099d7
    CalcSize(cw, NULL, NULL, False, &width, &height);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now lets see if the caller requested anything and if not
Packit b099d7
     * lets give him our prefered geometry.
Packit b099d7
     */
Packit b099d7
    if( request->request_mode == 0 )
Packit b099d7
    {
Packit b099d7
	wanted->request_mode = CWWidth | CWHeight;
Packit b099d7
	wanted->width = width;
Packit b099d7
	wanted->height = height;
Packit b099d7
Packit b099d7
	if( width == XtWidth(cw) && height == XtHeight(cw) )
Packit b099d7
	{
Packit b099d7
	    return( XtGeometryNo );
Packit b099d7
	}
Packit b099d7
	return( XtGeometryAlmost );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    *wanted = *request;
Packit b099d7
    if( request->request_mode & CWWidth )
Packit b099d7
    {
Packit b099d7
	if( request->width < width )
Packit b099d7
	{
Packit b099d7
	    wanted->width = width;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( request->request_mode & CWHeight )
Packit b099d7
    {
Packit b099d7
	if( request->height < height )
Packit b099d7
	{
Packit b099d7
	    wanted->height = height;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now we have set everything in our return structure to what we
Packit b099d7
     * want it to be.  Now all that is left is to come up with the
Packit b099d7
     * correct return result.  The return result is something like.
Packit b099d7
     *
Packit b099d7
     * o request == wanted and wanted != real	-> XtGeometryYes
Packit b099d7
     * o request == wanted and wanted == real	-> XtGeometryNo
Packit b099d7
     * o request != wanted and wanted != real	-> XtGeometryAlmost
Packit b099d7
     * o request != wanted and wanted == real   -> XtGeometryNo
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Lets first see if request == wanted
Packit b099d7
     */
Packit b099d7
    if( CompareGeometryToWidget(wanted, (Widget) cw) )
Packit b099d7
    {
Packit b099d7
	result = XtGeometryNo;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	if( CompareGeometry(request, wanted) )
Packit b099d7
	{
Packit b099d7
	    result = XtGeometryYes;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    result = XtGeometryNo;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( result );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	GeometryManager(widget, request, allowed)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when a child of the Column would like
Packit b099d7
 *	to change size.  This function reacts to the child's request.
Packit b099d7
 * Input:
Packit b099d7
 *	widget  : Widget            - the child requesting the change
Packit b099d7
 *	request : XtWidgetGeometry* - the requested widget geometry
Packit b099d7
 *	allowed : XtWidgetGeometry* - the geometry column is will to accept
Packit b099d7
 * Output:
Packit b099d7
 *	XtWidgetResult - the columns response to the geometry request
Packit b099d7
 */
Packit b099d7
static XtGeometryResult
Packit b099d7
GeometryManager(Widget widget, XtWidgetGeometry *request,
Packit b099d7
		XtWidgetGeometry *allowed)
Packit b099d7
{
Packit b099d7
    XmColumnWidget   cw = (XmColumnWidget) XtParent(widget);
Packit b099d7
    Dimension        width, height, width_return, height_return;
Packit b099d7
    XtGeometryResult result;
Packit b099d7
    Boolean          equal;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now being the mean manager that we are, we are only going to 
Packit b099d7
     * allow our children to change geometry parts the affect their
Packit b099d7
     * size.  i.e. we will not even discuss with them their position,
Packit b099d7
     * this is mainly because we do not want to deal with it.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    *allowed = *request;
Packit b099d7
    allowed->request_mode = request->request_mode =
Packit b099d7
	(request->request_mode & ~(CWX | CWY));
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now lets see what this child wants to change.
Packit b099d7
     */
Packit b099d7
    if( request->request_mode & CWWidth )
Packit b099d7
    {
Packit b099d7
	allowed->width = request->width;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	allowed->width = XiC(widget)->request_width;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( request->request_mode & CWHeight )
Packit b099d7
    {
Packit b099d7
	allowed->height = request->height;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	allowed->height = XiC(widget)->request_height;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( request->request_mode & CWBorderWidth )
Packit b099d7
    {
Packit b099d7
	allowed->border_width = request->border_width;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	allowed->border_width = XtBorderWidth(widget);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now that we know what size our child want to be lets see
Packit b099d7
     * how that effects the geometry we want to be.
Packit b099d7
     */
Packit b099d7
    CalcSize(cw, widget, allowed, False, &width, &height);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now that we know that size that we want to be, lets ask our
Packit b099d7
     * parent and see what they have to say.
Packit b099d7
     */
Packit b099d7
    if( request->request_mode & XtCWQueryOnly )
Packit b099d7
    {
Packit b099d7
	XtWidgetGeometry req, alw;
Packit b099d7
Packit b099d7
	req.request_mode = CWWidth | CWHeight | XtCWQueryOnly;
Packit b099d7
	req.width = width;
Packit b099d7
	req.height = height;
Packit b099d7
Packit b099d7
	width = XtWidth(cw);
Packit b099d7
	height = XtHeight(cw);
Packit b099d7
	switch( XtMakeGeometryRequest((Widget) cw, &req, &alw) )
Packit b099d7
	{
Packit b099d7
	case XtGeometryYes:
Packit b099d7
	    return( XtGeometryYes );
Packit b099d7
	    break;
Packit b099d7
	case XtGeometryAlmost:
Packit b099d7
	    if( alw.request_mode & CWWidth ) width = alw.width;
Packit b099d7
	    if( alw.request_mode & CWHeight ) height = alw.height;
Packit b099d7
	case XtGeometryNo:
Packit b099d7
	default:
Packit b099d7
	    Layout(cw, widget, allowed, width, height);
Packit b099d7
Packit b099d7
	    allowed->width = XiC(widget)->position.width;
Packit b099d7
	    allowed->height = XiC(widget)->position.height;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	Dimension cur_width, cur_height;
Packit b099d7
Packit b099d7
	XiC(widget)->request_width = allowed->width;
Packit b099d7
	XiC(widget)->request_height = allowed->height;
Packit b099d7
	XmColumn_resize_done(cw) = False;
Packit b099d7
	
Packit b099d7
	cur_width = XtWidth(cw);
Packit b099d7
	cur_height = XtHeight(cw);
Packit b099d7
	switch( XtMakeResizeRequest((Widget) cw, width, height,
Packit b099d7
				    &width_return, &height_return) )
Packit b099d7
	{
Packit b099d7
	case XtGeometryYes:
Packit b099d7
	    /*
Packit b099d7
	     * It appears that our parent will has let us change to 
Packit b099d7
	     * the size that we want to be, so lets see if we need to
Packit b099d7
	     * call our resize procedure.
Packit b099d7
	     */
Packit b099d7
	    if( !XmColumn_resize_done(cw) ) Resize((Widget) cw);
Packit b099d7
Packit b099d7
	    Layout(cw, widget, allowed, width, height);
Packit b099d7
	    allowed->width = XiC(widget)->position.width;
Packit b099d7
	    allowed->height = XiC(widget)->position.height;
Packit b099d7
	    break;
Packit b099d7
	case XtGeometryAlmost:
Packit b099d7
	    cur_width = width_return;
Packit b099d7
	    cur_height = height_return;
Packit b099d7
	case XtGeometryNo:
Packit b099d7
	default:
Packit b099d7
	    Layout(cw, widget, allowed, cur_width, cur_height);
Packit b099d7
Packit b099d7
	    allowed->width = XiC(widget)->position.width;
Packit b099d7
	    allowed->height = XiC(widget)->position.height;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    width = XtWidth(widget);
Packit b099d7
    height = XtHeight(widget);
Packit b099d7
    equal = CompareGeometryToWidget(allowed, widget);
Packit b099d7
Packit b099d7
    if( equal )
Packit b099d7
    {
Packit b099d7
	result = XtGeometryNo;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	if( CompareGeometry(request, allowed) )
Packit b099d7
	{
Packit b099d7
	    result = XtGeometryYes;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    result = XtGeometryAlmost;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( result == XtGeometryYes )
Packit b099d7
    {
Packit b099d7
	Layout(cw, NULL, NULL, -1, -1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( result );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	ChangeManaged(widget)
Packit b099d7
 * Description:
Packit b099d7
 *	This is called when one of the children of the column changes
Packit b099d7
 *	managed state.  This routine just takes care of this situation.
Packit b099d7
 * Input:
Packit b099d7
 *	widget : Widget - the column widget
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ChangeManaged(Widget widget)
Packit b099d7
{
Packit b099d7
    static Boolean in = False;
Packit b099d7
    XmColumnWidget cw = (XmColumnWidget) widget;
Packit b099d7
    WidgetList     kid = cw->composite.children;
Packit b099d7
    Widget         label;
Packit b099d7
    Cardinal       i;
Packit b099d7
    Dimension      width, height;
Packit b099d7
Packit b099d7
    if( in ) return;
Packit b099d7
Packit b099d7
    in = True;
Packit b099d7
Packit b099d7
    for( i = 0; i < cw->composite.num_children; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	if( !XiValidChild(*kid) ) 
Packit b099d7
	{
Packit b099d7
	  if( (*kid) != NULL && !XtIsManaged(*kid) )
Packit b099d7
	    {	/* CR03731 */
Packit b099d7
	      if (XiC(*kid)->label_widget) {
Packit b099d7
		XtUnmanageChild(XiC(*kid)->label_widget);
Packit b099d7
	      }
Packit b099d7
	      XiC(*kid)->request_width = 0;
Packit b099d7
	      XiC(*kid)->request_height = 0;
Packit b099d7
	    }
Packit b099d7
	    continue; 
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	label = XiC(*kid)->label_widget;
Packit b099d7
	if( !XiC(*kid)->show_label )
Packit b099d7
	{
Packit b099d7
	    if( XtIsManaged(*kid) ) XtUnmanageChild(label);
Packit b099d7
	}
Packit b099d7
	else if( XtIsManaged(*kid) != XtIsManaged(label) )
Packit b099d7
	{
Packit b099d7
	    if( XtIsManaged(*kid) )
Packit b099d7
	    {
Packit b099d7
		XtManageChild(label);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {	
Packit b099d7
		XtUnmanageChild(label);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if( XiC(*kid)->request_width == 0 && XtIsManaged(*kid) )
Packit b099d7
	{
Packit b099d7
	    XiC(*kid)->request_width = XtWidth(*kid);
Packit b099d7
	    XiC(*kid)->request_height = XtHeight(*kid);
Packit b099d7
	}
Packit b099d7
	if( XtIsManaged(label) )
Packit b099d7
	{
Packit b099d7
	    if( XiC(label)->request_width == 0 )
Packit b099d7
	    {
Packit b099d7
#if 0
Packit b099d7
		XiC(label)->request_width = XtWidth(label);
Packit b099d7
		XiC(label)->request_height = XtHeight(label);
Packit b099d7
#else
Packit b099d7
		{
Packit b099d7
		/* Unfortunately, XtWidth() and XtHeight() may not be valid in
Packit b099d7
		** this case. The request_width and request_height values are
Packit b099d7
		** used both to indicate real requested size and also, when 0,
Packit b099d7
		** to indicate a label with particular geometry needs. 
Packit b099d7
		** However, if the code goes through ConstraintSetValues (in
Packit b099d7
		** code generated by the Xcessory tools, constraint resources
Packit b099d7
		** are set via set-values after widget creation) first, the 
Packit b099d7
		** sizes are 0 and are then set to 1 in VerticalLayout; then
Packit b099d7
		** the code comes through here and updates the request values
Packit b099d7
		** from the real widths -- 1 -- which are then set back on the
Packit b099d7
		** widget as the geometry. The net result is that the labels
Packit b099d7
		** appear with width 1 (and correct height).
Packit b099d7
		**
Packit b099d7
		** Ideally we would cache the real initial requested value and
Packit b099d7
		** update from that value.
Packit b099d7
		**
Packit b099d7
		** For now, rather than storing those values, query the 
Packit b099d7
		** label locally for its preferences and use those; the result
Packit b099d7
		** should be that the size is set correctly (going through
Packit b099d7
		** CalcSize and then VerticalLayout).
Packit b099d7
		*/
Packit b099d7
		
Packit b099d7
    		    XtWidgetGeometry wants;
Packit b099d7
		    XtQueryGeometry(label, NULL, &wants);
Packit b099d7
Packit b099d7
		    if( wants.request_mode & CWWidth )
Packit b099d7
		    {
Packit b099d7
			XiC(label)->request_width = wants.width;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			XiC(label)->request_width = XtWidth(label);
Packit b099d7
		    }
Packit b099d7
Packit b099d7
		    if( wants.request_mode & CWHeight )
Packit b099d7
		    {
Packit b099d7
			XiC(label)->request_height = wants.height;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			XiC(label)->request_height = XtHeight(label);
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
#endif
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XiC(label)->request_width = 0;
Packit b099d7
	    XiC(label)->request_height = 0;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    CalcSize(cw, NULL, NULL, False, &width, &height);
Packit b099d7
Packit b099d7
    if( XtMakeResizeRequest(widget, width, height, &width, &height) ==
Packit b099d7
        XtGeometryAlmost )
Packit b099d7
    {
Packit b099d7
	XtMakeResizeRequest(widget, width, height, NULL, NULL);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    Layout(cw, NULL, NULL, -1, -1);
Packit b099d7
Packit b099d7
    in = False;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	ConstraintInitialize(request, new_w, arg_list, arg_cnt)
Packit b099d7
 * Description:
Packit b099d7
 *	This function initializes the constraint record for a new child,
Packit b099d7
 *	this includes adding a label for each child.
Packit b099d7
 * Input:
Packit b099d7
 *	request  : Widget   - the requested resource values
Packit b099d7
 *	new_w      : Widget   - the new_w resource values (the new widget)
Packit b099d7
 *	arg_list : ArgList  - the argument used to create the widget
Packit b099d7
 *	arg_cnt  : Cardinal - the number of arguments
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ConstraintInitialize(Widget request, Widget new_w, ArgList arg_list,
Packit b099d7
		     Cardinal *arg_cnt)
Packit b099d7
{
Packit b099d7
    static         Boolean label_widget = False;	/* STATIC DATA */
Packit b099d7
    XmColumnWidget cw = (XmColumnWidget) XtParent(new_w);
Packit b099d7
    XmBulletinBoardPart *bbpart;
Packit b099d7
Packit b099d7
	/* CR03562 CR02961 When ChangeManaged is bypassed, request width and height
Packit b099d7
	   are not set. The 2 line will prevent this assumption which sometimes
Packit b099d7
	   will case the widget size to have zero width/height */
Packit b099d7
#if 1
Packit b099d7
	/* Note! below fix problematic w.r.t. ChangeManaged code, and needs
Packit b099d7
	** revisiting; back out temporarily
Packit b099d7
	*/
Packit b099d7
	/*
Packit b099d7
	** It is possible that the widget will have a constraint resource set 
Packit b099d7
	** on it before the XmColumn itself is realized (ChangeManaged is
Packit b099d7
	** bypassed in that case), so that we enter the Layout code without
Packit b099d7
	** having the values request_width and request_height set from the
Packit b099d7
	** code in ChangeManaged. Rather than use 0 here, which gives poor
Packit b099d7
	** results when those values are used in XtConfigureWidget to set
Packit b099d7
	** the size, initialize them to reasonable default values.
Packit b099d7
	*/
Packit b099d7
	XiC(new_w)->request_width = XtWidth(new_w);
Packit b099d7
	XiC(new_w)->request_height = XtHeight(new_w);
Packit b099d7
#else
Packit b099d7
	XiC(new_w)->request_width = 0;
Packit b099d7
	XiC(new_w)->request_height = 0;
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    XiC(new_w)->label_string = XmStringCopy(XiC(new_w)->label_string);
Packit b099d7
    if( label_widget )
Packit b099d7
    {
Packit b099d7
	XiC(new_w)->label_alignment = XmALIGNMENT_UNSPECIFIED;
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
	XiC(new_w)->label_position = XiLABEL_POSITION_UNSPECIFIED;
Packit b099d7
#endif
Packit b099d7
	XiC(new_w)->label_type = XmSTRING;
Packit b099d7
	XiC(new_w)->label_pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
	XiC(new_w)->label_string = (XmString) NULL;
Packit b099d7
	XiC(new_w)->label_widget = (Widget) NULL;
Packit b099d7
	XiC(new_w)->show_label = False;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	Arg    args[64];
Packit b099d7
	int    nargs;
Packit b099d7
	char   buf[256];
Packit b099d7
	Widget label;
Packit b099d7
	XmFontList lfont;
Packit b099d7
Packit b099d7
	VerifyConstraints(request, NULL, new_w);
Packit b099d7
	
Packit b099d7
	if( strlen(XtName(new_w)) > 240 )
Packit b099d7
	{
Packit b099d7
	    strncpy(buf, XtName(new_w), 240);
Packit b099d7
	    buf[240] = '\0';
Packit b099d7
	    strcat(buf, "_label");
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    strcpy(buf, XtName(new_w));
Packit b099d7
	    strcat(buf, "_label");
Packit b099d7
	}
Packit b099d7
Packit b099d7
	label_widget = True;
Packit b099d7
Packit b099d7
	lfont = XmColumnC_label_font_list(new_w);
Packit b099d7
	bbpart = BBPart(XtParent(new_w));
Packit b099d7
	if(lfont == NULL)
Packit b099d7
	    lfont = bbpart->label_font_list;
Packit b099d7
Packit b099d7
	nargs = 0;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginWidth,        0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginHeight,       0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginTop,          0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginBottom,       0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginLeft,         0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNmarginRight,        0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNshadowThickness,    0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNhighlightThickness, 0); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNtraversalOn,      False); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNlabelType,   XiC(new_w)->label_type); nargs++;
Packit b099d7
	XtSetArg(args[nargs],
Packit b099d7
		 XmNlabelString, XiC(new_w)->label_string); nargs++;
Packit b099d7
	XtSetArg(args[nargs],
Packit b099d7
		 XmNlabelPixmap, XiC(new_w)->label_pixmap); nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNalignment,   XiAlignment(new_w));     nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNrenderTable,    lfont);          nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNrecomputeSize, True);                 nargs++;
Packit b099d7
	XtSetArg(args[nargs], XmNforeground,  cw->manager.foreground); nargs++;
Packit b099d7
	XtSetArg(args[nargs],
Packit b099d7
		 XmNbackground,  cw->core.background_pixel); nargs++;
Packit b099d7
	label = XtCreateWidget(buf, xmLabelWidgetClass, (Widget) cw,
Packit b099d7
		       args, nargs);
Packit b099d7
	XiC(new_w)->label_widget = label;
Packit b099d7
Packit b099d7
	XtAddCallback(label, XmNdestroyCallback,
Packit b099d7
		      XmColumnLabelDestroyedCallback, (XtPointer) new_w);
Packit b099d7
	XiC(label)->label_alignment = XmALIGNMENT_UNSPECIFIED;
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
	XiC(label)->label_position = XiLABEL_POSITION_UNSPECIFIED;
Packit b099d7
#endif
Packit b099d7
	XiC(label)->label_type = XmSTRING;
Packit b099d7
	XiC(label)->label_pixmap = XmUNSPECIFIED_PIXMAP;
Packit b099d7
	XiC(label)->label_string = (XmString) NULL;
Packit b099d7
	XiC(label)->label_widget = (Widget) NULL;
Packit b099d7
	XiC(label)->show_label = False;
Packit b099d7
	label_widget = False;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	ConstraintSetValues(current, request, new_w, arg_list, arg_cnt)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called when the user changes an attribute of
Packit b099d7
 * 	one of the columns children.  This routine reacts to the change.
Packit b099d7
 * Input:
Packit b099d7
 *	current  : Widget   - the current state of the child
Packit b099d7
 *	request  : Widget   - the request state of the child
Packit b099d7
 *	new_w      : Widget   - the child with the requested changes
Packit b099d7
 *	arg_list : ArgList  - the argument that modified the child
Packit b099d7
 *	arg_cnt  : Cardinal - the number of argument
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the child needs to be redisplayed, else False.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
ConstraintSetValues(Widget current, Widget request, Widget new_w,
Packit b099d7
		    ArgList arg_list, Cardinal *arg_cnt)
Packit b099d7
{
Packit b099d7
    XmColumnWidget         cw = (XmColumnWidget) XtParent(new_w);
Packit b099d7
    XmColumnConstraintPart *cc = XiC(current),
Packit b099d7
                           *sc = XiC(new_w);
Packit b099d7
    Boolean                relayout = False;
Packit b099d7
    Arg                    args[10];
Packit b099d7
    Cardinal               i = 0;
Packit b099d7
Packit b099d7
    if( XiC(new_w)->label_widget == NULL ) return( False );
Packit b099d7
Packit b099d7
    VerifyConstraints(request, current, new_w);
Packit b099d7
Packit b099d7
    if( 
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
	cc->label_position != sc->label_position ||
Packit b099d7
#endif
Packit b099d7
        cc->fill_style != sc->fill_style ||
Packit b099d7
        cc->show_label != sc->show_label )
Packit b099d7
    {
Packit b099d7
	relayout = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( cc->label_font_list != sc->label_font_list )
Packit b099d7
    {
Packit b099d7
	XmFontList lfont = XmColumnC_label_font_list(new_w);
Packit b099d7
	if(lfont == NULL)
Packit b099d7
	    lfont = BBPart(XtParent(new_w))->label_font_list;
Packit b099d7
	XtSetArg(args[i], XmNrenderTable, lfont); ++i;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( cc->label_alignment != sc->label_alignment )
Packit b099d7
    {
Packit b099d7
	XtSetArg(args[i], XmNalignment, XiAlignment(new_w)); ++i;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( cc->label_string != sc->label_string )
Packit b099d7
    {
Packit b099d7
	XmStringFree(cc->label_string);
Packit b099d7
	sc->label_string = XmStringCopy(sc->label_string);
Packit b099d7
	XtSetArg(args[i], XmNlabelString, sc->label_string); ++i;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( cc->label_pixmap != sc->label_pixmap )
Packit b099d7
    {
Packit b099d7
	XtSetArg(args[i], XmNlabelPixmap, sc->label_pixmap); ++i;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( cc->label_type != sc->label_type )
Packit b099d7
    {
Packit b099d7
	XtSetArg(args[i], XmNlabelType, sc->label_type); ++i;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( i >  0 ) XtSetValues(sc->label_widget, args, i);
Packit b099d7
Packit b099d7
    XmColumn_resize_done(cw) = False;
Packit b099d7
    if( cc->show_label != sc->show_label )
Packit b099d7
    {
Packit b099d7
	if( sc->show_label )
Packit b099d7
	{
Packit b099d7
	    XtManageChild(sc->label_widget);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XtUnmanageChild(sc->label_widget);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if( relayout && !XmColumn_resize_done(cw) )
Packit b099d7
    {
Packit b099d7
	Layout(cw, NULL, NULL, -1, -1);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( False );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	ConstraintDestroy(widget)
Packit b099d7
 * Description:
Packit b099d7
 *	This function is called to deallocate any resources allocated by
Packit b099d7
 *	the constraint record.
Packit b099d7
 * Input:
Packit b099d7
 *	widget : Widget - the widget being destroyed.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ConstraintDestroy(Widget widget)
Packit b099d7
{
Packit b099d7
    XmStringFree(XiC(widget)->label_string);
Packit b099d7
    if( XiC(widget)->label_widget != NULL )
Packit b099d7
    {
Packit b099d7
	XtRemoveCallback(XiC(widget)->label_widget, XmNdestroyCallback,
Packit b099d7
			 XmColumnLabelDestroyedCallback, (XtPointer) widget);
Packit b099d7
	XtDestroyWidget(XiC(widget)->label_widget);
Packit b099d7
	XiC(widget)->label_widget = NULL;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *      ConstraintGetValues
Packit b099d7
 * Description:
Packit b099d7
 *      The constraint get_values_hook method.  It makes copies of the 
Packit b099d7
 *      XmNentryLabelString values to prevent returning internal
Packit b099d7
 *      XmString data.
Packit b099d7
 * Input:
Packit b099d7
 *      w - The child widget
Packit b099d7
 *      args - Array of Arg structures
Packit b099d7
 *      num_args - Number of entries in args
Packit b099d7
 * Output:
Packit b099d7
 *      none (other than the silently copies XmString value)
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ConstraintGetValues(Widget w, ArgList args, Cardinal *num_args)
Packit b099d7
{
Packit b099d7
    XrmQuark                    quark;
Packit b099d7
    int                         i;
Packit b099d7
    
Packit b099d7
    quark = XrmStringToQuark(XmNentryLabelString);
Packit b099d7
    for (i = 0; i < ((int) *num_args); i++)
Packit b099d7
    {
Packit b099d7
        if (quark == XrmStringToQuark(args[i].name))
Packit b099d7
        {
Packit b099d7
            args[i].value =
Packit b099d7
		(XtArgVal) XmStringCopy(XmColumnC_label_string(w));
Packit b099d7
            break;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static int
Packit b099d7
CompareISOLatin1 (char *first, char *second)
Packit b099d7
{
Packit b099d7
    register unsigned char *ap, *bp;
Packit b099d7
Packit b099d7
    for (ap = (unsigned char *) first, bp = (unsigned char *) second;
Packit b099d7
         *ap && *bp; ap++, bp++) {
Packit b099d7
        register unsigned char a, b;
Packit b099d7
Packit b099d7
        if ((a = *ap) != (b = *bp)) {
Packit b099d7
            /* try lowercasing and try again */
Packit b099d7
Packit b099d7
            if ((a >= XK_A) && (a <= XK_Z))
Packit b099d7
		a += (XK_a - XK_A);
Packit b099d7
            else if ((a >= XK_Agrave) && (a <= XK_Odiaeresis))
Packit b099d7
              a += (XK_agrave - XK_Agrave);
Packit b099d7
            else if ((a >= XK_Ooblique) && (a <= XK_Thorn))
Packit b099d7
              a += (XK_oslash - XK_Ooblique);
Packit b099d7
Packit b099d7
            if ((b >= XK_A) && (b <= XK_Z))
Packit b099d7
              b += (XK_a - XK_A);
Packit b099d7
            else if ((b >= XK_Agrave) && (b <= XK_Odiaeresis))
Packit b099d7
              b += (XK_agrave - XK_Agrave);
Packit b099d7
            else if ((b >= XK_Ooblique) && (b <= XK_Thorn))
Packit b099d7
              b += (XK_oslash - XK_Ooblique);
Packit b099d7
Packit b099d7
            if (a != b) break;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    return (((int) *bp) - ((int) *ap));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	done
Packit b099d7
 * Description:
Packit b099d7
 *	This macro is used by the resource conversion routines and
Packit b099d7
 *	simply assigns the value and returns the correct result.
Packit b099d7
 */
Packit b099d7
#define done(type, value) 				\
Packit b099d7
    {							\
Packit b099d7
	if( to->addr != NULL )				\
Packit b099d7
	{						\
Packit b099d7
	    if( to->size < sizeof(type) )		\
Packit b099d7
	    {						\
Packit b099d7
		to->size = sizeof(type);		\
Packit b099d7
		return( False );			\
Packit b099d7
	    }						\
Packit b099d7
	    *(type*)(to->addr) = (value);		\
Packit b099d7
	}						\
Packit b099d7
	else						\
Packit b099d7
	{						\
Packit b099d7
	    static type static_val;			\
Packit b099d7
	    static_val = (value);			\
Packit b099d7
	    to->addr = (XtPointer) &static_val;		\
Packit b099d7
	}						\
Packit b099d7
	to->size = sizeof(type);			\
Packit b099d7
	return( True );					\
Packit b099d7
    }
Packit b099d7
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CvtStringToLabelPosition(dpy, args, arg_cnt, from, to, data)
Packit b099d7
 * Description:
Packit b099d7
 *	This function converts a string representation of the representation
Packit b099d7
 *	type XmRLabelPosition to an actual value.
Packit b099d7
 * Input:
Packit b099d7
 *	dpy     : Display   - unused
Packit b099d7
 *	args    : XrmValue* - unused
Packit b099d7
 *	arg_cnt : Cardinal  - unused
Packit b099d7
 *	from    : XrmValue* - contains the string representation of the value
Packit b099d7
 *	to      : XrmValue* - returns the actual value
Packit b099d7
 *	data    : XtPointer - unused
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the conversion was successful else False.
Packit b099d7
 */
Packit b099d7
static Boolean
Packit b099d7
CvtStringToLabelPosition(Display *dpy, XrmValue *args, Cardinal *arg_cnt,
Packit b099d7
			 XrmValue *from, XrmValue *to, XtPointer data)
Packit b099d7
{
Packit b099d7
    unsigned char result = XiLABEL_POSITION_LEFT;
Packit b099d7
    String        str = (String) (from->addr);
Packit b099d7
Packit b099d7
    if( CompareISOLatin1(str, "label_position_unspecified") == 0 ||
Packit b099d7
        CompareISOLatin1(str, "unspecified") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_UNSPECIFIED;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "label_position_left") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "left") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_LEFT;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "label_position_right") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "right") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_RIGHT;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "label_position_top") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "top") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_TOP;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "label_position_bottom") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "bottom") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_BOTTOM;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "label_position_center") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "CENTER") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XiLABEL_POSITION_CENTER;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XtDisplayStringConversionWarning(dpy, from->addr, XmRLabelPosition);
Packit b099d7
	return( False );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    done(unsigned char, result);
Packit b099d7
}
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CvtStringToXiAlignment(dpy, args, arg_cnt, from, to, data)
Packit b099d7
 * Description:
Packit b099d7
 *	This function converts a string representation of the representation
Packit b099d7
 *	type XmRXnAlignment to an actual value.
Packit b099d7
 * Input:
Packit b099d7
 *	dpy     : Display   - unused
Packit b099d7
 *	args    : XrmValue* - unused
Packit b099d7
 *	arg_cnt : Cardinal  - unused
Packit b099d7
 *	from    : XrmValue* - contains the string representation of the value
Packit b099d7
 *	to      : XrmValue* - returns the actual value
Packit b099d7
 *	data    : XtPointer - unused
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the conversion was successful else False.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
CvtStringToXiAlignment(Display *dpy, XrmValue *args, Cardinal *arg_cnt,
Packit b099d7
		       XrmValue *from, XrmValue *to, XtPointer data)
Packit b099d7
Packit b099d7
{
Packit b099d7
    unsigned char result = XmALIGNMENT_CENTER;
Packit b099d7
    String        str = (String) (from->addr);
Packit b099d7
Packit b099d7
    if( CompareISOLatin1(str, "alignment_unspecified") == 0 ||
Packit b099d7
        CompareISOLatin1(str, "unspecified") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmALIGNMENT_UNSPECIFIED;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "alignment_beginning") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "beginning") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmALIGNMENT_BEGINNING;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "alignment_center") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "center") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmALIGNMENT_CENTER;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "alignment_end") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "end") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmALIGNMENT_END;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XtDisplayStringConversionWarning(dpy, from->addr, XmRXmAlignment);
Packit b099d7
	return( False );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    done(unsigned char, result);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CvtStringToFillStyle(dpy, args, arg_cnt, from, to, data)
Packit b099d7
 * Description:
Packit b099d7
 *	This function converts a string representation of the representation
Packit b099d7
 *	type XmRFillStyle to an actual value.
Packit b099d7
 * Input:
Packit b099d7
 *	dpy     : Display   - unused
Packit b099d7
 *	args    : XrmValue* - unused
Packit b099d7
 *	arg_cnt : Cardinal  - unused
Packit b099d7
 *	from    : XrmValue* - contains the string representation of the value
Packit b099d7
 *	to      : XrmValue* - returns the actual value
Packit b099d7
 *	data    : XtPointer - unused
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the conversion was successful else False.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
CvtStringToFillStyle(Display *dpy, XrmValue *args, Cardinal *arg_cnt,
Packit b099d7
		     XrmValue *from, XrmValue *to, XtPointer data)
Packit b099d7
{
Packit b099d7
    unsigned char result = XmFILL_UNSPECIFIED;
Packit b099d7
    String        str = (String) (from->addr);
Packit b099d7
Packit b099d7
    if( CompareISOLatin1(str, "fill_unspecified") == 0 ||
Packit b099d7
        CompareISOLatin1(str, "unspecified") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmFILL_UNSPECIFIED;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "fill_flush") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "flush") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmFILL_FLUSH;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "fill_ragged") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "ragged") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmFILL_RAGGED;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XtDisplayStringConversionWarning(dpy, from->addr, XmRFillStyle);
Packit b099d7
	return( False );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    done(unsigned char, result);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CvtStringToDistribution(dpy, args, arg_cnt, from, to, data)
Packit b099d7
 * Description:
Packit b099d7
 *	This function converts a string representation of the representation
Packit b099d7
 *	type XmRDistribution to an actual value.
Packit b099d7
 * Input:
Packit b099d7
 *	dpy     : Display   - unused
Packit b099d7
 *	args    : XrmValue* - unused
Packit b099d7
 *	arg_cnt : Cardinal  - unused
Packit b099d7
 *	from    : XrmValue* - contains the string representation of the value
Packit b099d7
 *	to      : XrmValue* - returns the actual value
Packit b099d7
 *	data    : XtPointer - unused
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the conversion was successful else False.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean
Packit b099d7
CvtStringToDistribution(Display *dpy, XrmValue *args, Cardinal *arg_cnt,
Packit b099d7
			XrmValue *from, XrmValue *to, XtPointer data)
Packit b099d7
{
Packit b099d7
    unsigned char result = XmDISTRIBUTE_TIGHT;
Packit b099d7
    String        str = (String) (from->addr);
Packit b099d7
Packit b099d7
    if( CompareISOLatin1(str, "distribute_tight") == 0 ||
Packit b099d7
        CompareISOLatin1(str, "tight") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmDISTRIBUTE_TIGHT;
Packit b099d7
    }
Packit b099d7
    else if( CompareISOLatin1(str, "distribute_spread") == 0 ||
Packit b099d7
	     CompareISOLatin1(str, "spread") == 0 )
Packit b099d7
    {
Packit b099d7
	result = XmDISTRIBUTE_SPREAD;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XtDisplayStringConversionWarning(dpy, from->addr, XmRDistribution);
Packit b099d7
	return( False );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    done(unsigned char, result);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	VerifyResources(request, current, new_w)
Packit b099d7
 * Description:
Packit b099d7
 *	This function verifies the values for the Column's resource in
Packit b099d7
 *	"new_w" resetting them to the previous or default values if an
Packit b099d7
 *	invalid resource value was set.
Packit b099d7
 * Input:
Packit b099d7
 *	request	: XmColumnWidget - the requested setting for the widget
Packit b099d7
 *	current : XmColumnWidget - the current setting for the widget
Packit b099d7
 *	new_w     : XmColumnWidget - the setting for the widget
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
VerifyResources(XmColumnWidget request, XmColumnWidget current, 
Packit b099d7
		XmColumnWidget new_w)
Packit b099d7
{
Packit b099d7
    Boolean  reset;
Packit b099d7
Packit b099d7
    if( BBPart(new_w)->label_font_list == NULL )
Packit b099d7
    {
Packit b099d7
	BBPart(new_w)->label_font_list =
Packit b099d7
	    XmeGetDefaultRenderTable((Widget) new_w, XmLABEL_FONTLIST);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    reset = False;
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
    switch( XmColumn_default_label_position(new_w) )
Packit b099d7
    {
Packit b099d7
    case XiLABEL_POSITION_CENTER:
Packit b099d7
    case XiLABEL_POSITION_LEFT:
Packit b099d7
    case XiLABEL_POSITION_RIGHT:
Packit b099d7
    case XiLABEL_POSITION_TOP:
Packit b099d7
    case XiLABEL_POSITION_BOTTOM:
Packit b099d7
	break;
Packit b099d7
    case XiLABEL_POSITION_UNSPECIFIED:
Packit b099d7
	XmeWarning((Widget) new_w),
Packit b099d7
			"The illegal resource value \"XiLABEL_POSITION_UNSPECIFIED\" was assigned to the resource XmNDefaultLabelPosition");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning((Widget) new_w,
Packit b099d7
			"An illegal resource value was assigned to the resource XmNDefaultLabelPosition");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }    
Packit b099d7
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XmColumn_default_label_position(new_w) =
Packit b099d7
	    (current != NULL
Packit b099d7
	     ? XmColumn_default_label_position(current)
Packit b099d7
	     : DEFAULT_POSITION);
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    reset = False;
Packit b099d7
    switch( XmColumn_default_label_alignment(new_w) )
Packit b099d7
    {
Packit b099d7
    case XmALIGNMENT_BEGINNING:
Packit b099d7
    case XmALIGNMENT_CENTER:
Packit b099d7
    case XmALIGNMENT_END:
Packit b099d7
	break;
Packit b099d7
    case XmALIGNMENT_UNSPECIFIED:
Packit b099d7
	XmeWarning((Widget) new_w,
Packit b099d7
			"The illegal resource value \"XmALIGNMENT_UNSPECIFIED\" was assigned to the resource XmNdefaultEntryLabelAlignment");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning((Widget) new_w,
Packit b099d7
			"An illegal resource value was assigned to the resource XmNdefaultEntryLabelAlignment");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XmColumn_default_label_alignment(new_w) =
Packit b099d7
	    (current != NULL
Packit b099d7
	     ? XmColumn_default_label_alignment(current)
Packit b099d7
	     : DEFAULT_ALIGNMENT);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    reset = False;
Packit b099d7
    switch( XmColumn_orientation(new_w) )
Packit b099d7
    {
Packit b099d7
    case XmHORIZONTAL:
Packit b099d7
    case XmVERTICAL:
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning((Widget) new_w,
Packit b099d7
			"An illegal resource value was assigned to the resource XmNorientation");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XmColumn_orientation(new_w) =
Packit b099d7
	    (current != NULL
Packit b099d7
	     ? XmColumn_orientation(current)
Packit b099d7
	     : DEFAULT_ORIENTATION);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	Layout(cw, child, child_size, col_width, col_height)
Packit b099d7
 * Description:
Packit b099d7
 *	This is simply a launcher routine.  This routine passes control
Packit b099d7
 *	to the appropriate layout routine depending on the orientation
Packit b099d7
 *	of the column.
Packit b099d7
 * Input:
Packit b099d7
 *	cw         : XmColumnWidget -   the column to layout
Packit b099d7
 *	child      : Widget            - A childs whose geometry is specified
Packit b099d7
 *	child_size : XtWidgetGeometry* - the specified child geometry
Packit b099d7
 *	col_width  : int               - a specified width for the column
Packit b099d7
 *	col_height : int               - a specified height for the column
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
Layout(XmColumnWidget cw, Widget child, XtWidgetGeometry *child_size,
Packit b099d7
       int col_width, int col_height)
Packit b099d7
{
Packit b099d7
    if (XmColumn_orientation(cw) == XmHORIZONTAL)
Packit b099d7
    {
Packit b099d7
	HorizontalLayout(cw, child, child_size, col_width, col_height);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	VerticalLayout(cw, child, child_size, col_width, col_height);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	HorizontalLayout(cw, child, child_size, col_witdh, col_height)
Packit b099d7
 * Description:
Packit b099d7
 *	This routine handles the horizontal layout for the column widget
Packit b099d7
 * Input:
Packit b099d7
 *	cw         : XmColumnWidget -   the column to layout
Packit b099d7
 *	child      : Widget            - A childs whose geometry is specified
Packit b099d7
 *	child_size : XtWidgetGeometry* - the specified child geometry
Packit b099d7
 *	col_width  : int               - a specified width for the column
Packit b099d7
 *	col_height : int               - a specified height for the column
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
HorizontalLayout(XmColumnWidget cw, Widget child,
Packit b099d7
		 XtWidgetGeometry *child_size, int col_width, int col_height)
Packit b099d7
{
Packit b099d7
    /* Do the Horizontal Layout, Baby! */
Packit b099d7
    WidgetList	kids = cw->composite.children, kid;
Packit b099d7
    Widget	label;
Packit b099d7
    Cardinal	i, kidCnt = cw->composite.num_children;
Packit b099d7
    Position	x, y;
Packit b099d7
    int		cWidth, cBorder, cbWidth, lWidth, valid, space;
Packit b099d7
    Dimension	fillHeight;
Packit b099d7
    int		ispace = (int)XmColumn_item_spacing(cw);
Packit b099d7
    int 	kidSpace;
Packit b099d7
    
Packit b099d7
    if( col_width < 0 ) col_width = XtWidth(cw);
Packit b099d7
    if( col_height < 0 ) col_height = XtHeight(cw);
Packit b099d7
Packit b099d7
    fillHeight = col_height - 2 * (cw->manager.shadow_thickness +
Packit b099d7
				   BBPart(cw)->margin_height);
Packit b099d7
Packit b099d7
    
Packit b099d7
    for( i = 0, kid = kids, lWidth = 0, cbWidth = 0, valid = 0,
Packit b099d7
	 space = 0, kidSpace = 0; i < kidCnt; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	XiC(*kid)->position.x = XiC(*kid)->position.y = 0;
Packit b099d7
	if( *kid == child )
Packit b099d7
	{
Packit b099d7
	    XiC(*kid)->position.width = child_size->width;
Packit b099d7
	    XiC(*kid)->position.height = child_size->height;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XiC(*kid)->position.width = XiC(*kid)->request_width;
Packit b099d7
	    XiC(*kid)->position.height = XiC(*kid)->request_height;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if( !XiValidChild(*kid) ) continue;
Packit b099d7
	valid++;
Packit b099d7
Packit b099d7
	if( *kid == child )
Packit b099d7
	    cbWidth += child_size->width + 2*child_size->border_width;
Packit b099d7
	else
Packit b099d7
	    cbWidth += XiC(*kid)->request_width + 2*XtBorderWidth(*kid);
Packit b099d7
Packit b099d7
	if( !XiC(*kid)->show_label ) continue;
Packit b099d7
Packit b099d7
	space += XmColumn_label_spacing(cw);
Packit b099d7
	kidSpace++;
Packit b099d7
Packit b099d7
	label = XiC(*kid)->label_widget;
Packit b099d7
	if( label == child )
Packit b099d7
		lWidth += child_size->width;
Packit b099d7
	else
Packit b099d7
		lWidth += XiC(label)->request_width;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    x = cw->manager.shadow_thickness + BBPart(cw)->margin_width;
Packit b099d7
    if( valid > 0 && (x + lWidth + space + cbWidth + ispace*(valid-1) + x  > col_width ) )
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * First try to shrink labelSpacing, then itemSpacing, otherwise clip.
Packit b099d7
	 */
Packit b099d7
	int have = (col_width - 2 * x),
Packit b099d7
	    want = lWidth + space + ispace*(valid-1) + cbWidth,
Packit b099d7
	    diff = want - have;
Packit b099d7
Packit b099d7
	if ( space - diff > 1)
Packit b099d7
		{
Packit b099d7
		space -= diff;
Packit b099d7
		}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		if (0 != space)
Packit b099d7
			space = kidSpace;
Packit b099d7
	    	want = lWidth + space + ispace*(valid-1) + cbWidth;	
Packit b099d7
	    	diff = want - have;
Packit b099d7
Packit b099d7
		if (ispace*(valid-1) - diff > 1)
Packit b099d7
			ispace = (ispace*(valid-1)-diff)/(valid-1);
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
			if (0 != ispace)
Packit b099d7
				ispace = 1;	
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    if (0==kidSpace) kidSpace = 1; 
Packit b099d7
    space /= kidSpace;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Calculating the widths for the various kids is a one shot, so lets
Packit b099d7
     * first walk through the kids and calculate all the width.
Packit b099d7
     */
Packit b099d7
    for( kid = kids, i = 0; i < kidCnt; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	int mySpace;
Packit b099d7
	if( !XiValidChild(*kid) ) continue;
Packit b099d7
	
Packit b099d7
	label = XiC(*kid)->label_widget;
Packit b099d7
	XiC(label)->position.width = XtWidth(label);
Packit b099d7
        if( XiC(*kid)->show_label )
Packit b099d7
		{
Packit b099d7
		lWidth = XtWidth(label);
Packit b099d7
		mySpace = space;
Packit b099d7
		}
Packit b099d7
	else 
Packit b099d7
		{
Packit b099d7
		lWidth = 0;
Packit b099d7
		mySpace = 0;
Packit b099d7
		}
Packit b099d7
	if (LayoutIsRtoLM(cw))
Packit b099d7
	    XiC(label)->position.x = col_width - x - lWidth;
Packit b099d7
	else
Packit b099d7
	    XiC(label)->position.x = x;
Packit b099d7
Packit b099d7
	/* First, let's calculate the kid's X-position */
Packit b099d7
	if( *kid == child )
Packit b099d7
		cWidth = XiC(*kid)->position.width = child_size->width;
Packit b099d7
	else
Packit b099d7
		cWidth = XiC(*kid)->position.width = XiC(*kid)->request_width;
Packit b099d7
	if (LayoutIsRtoLM(cw))
Packit b099d7
	    XiC(*kid)->position.x = col_width - (x + lWidth + space) - cWidth;
Packit b099d7
	else
Packit b099d7
	    XiC(*kid)->position.x = x + lWidth + space;
Packit b099d7
	if( child == *kid )
Packit b099d7
	    cBorder = child_size->border_width;
Packit b099d7
	else
Packit b099d7
	    cBorder = XtBorderWidth(*kid);
Packit b099d7
	x += lWidth + mySpace + cWidth + ispace + 2*cBorder; 
Packit b099d7
Packit b099d7
	/* Now, let's calculate the kid's Y-position */
Packit b099d7
	y = cw->manager.shadow_thickness + BBPart(cw)->margin_height;
Packit b099d7
Packit b099d7
	XiC(label)->position.y += y;
Packit b099d7
	XiC(*kid)->position.y += y;
Packit b099d7
Packit b099d7
	/* If XmNfillStyle == XmFILL_FLUSH, adjust height to same as column */
Packit b099d7
	if (XiFill(*kid) == XmFILL_FLUSH)
Packit b099d7
	{
Packit b099d7
	    XiC(label)->position.height = fillHeight;
Packit b099d7
	    XiC(*kid)->position.height = fillHeight;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( child == NULL )
Packit b099d7
    {
Packit b099d7
	for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
	{
Packit b099d7
	    if( !XiValidChild(*kid) ) continue;
Packit b099d7
Packit b099d7
	    label = XiC(*kid)->label_widget;
Packit b099d7
Packit b099d7
	    if( XiC(*kid)->show_label ) {
Packit b099d7
	      XtConfigureWidget(label, XiC(label)->position.x,
Packit b099d7
				XiC(label)->position.y,
Packit b099d7
				XiC(label)->position.width,
Packit b099d7
				XiC(*kid)->position.height, 0);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    XtConfigureWidget(*kid, XiC(*kid)->position.x,
Packit b099d7
			      XiC(*kid)->position.y,
Packit b099d7
			      XiC(*kid)->position.width,
Packit b099d7
			      XiC(*kid)->position.height,
Packit b099d7
			      XtBorderWidth(*kid));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	VerticalLayout(cw, child, child_size, col_witdh, col_height)
Packit b099d7
 * Description:
Packit b099d7
 *	This routine handles the vertical layout for the column widget
Packit b099d7
 * Input:
Packit b099d7
 *	cw         : XmColumnWidget -   the column to layout
Packit b099d7
 *	child      : Widget            - A childs whose geometry is specified
Packit b099d7
 *	child_size : XtWidgetGeometry* - the specified child geometry
Packit b099d7
 *	col_width  : int               - a specified width for the column
Packit b099d7
 *	col_height : int               - a specified height for the column
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
VerticalLayout(XmColumnWidget cw, Widget child, XtWidgetGeometry *child_size,
Packit b099d7
	       int col_width, int col_height)
Packit b099d7
{
Packit b099d7
    WidgetList kids = cw->composite.children, kid;
Packit b099d7
    Widget     label;
Packit b099d7
    Cardinal   i, kidCnt = cw->composite.num_children, j;
Packit b099d7
    Position   x, y;
Packit b099d7
    int        cWidth, cMaxWidth, cMinWidth, cHeight, cBorder, cbWidth, cbHeight,
Packit b099d7
               lWidth, lHeight, cnt, hExtra, hEach =0 , hLeft = 0, valid, space;
Packit b099d7
    Dimension  width, height;
Packit b099d7
    Boolean    change, stretch;
Packit b099d7
Packit b099d7
    if( col_width < 0 ) col_width = XtWidth(cw);
Packit b099d7
    if( col_height < 0 ) col_height = XtHeight(cw);
Packit b099d7
Packit b099d7
    CalcSize(cw, NULL, NULL, False, &width, &height);
Packit b099d7
    for( i = 0, kid = kids, lWidth = 0, cMinWidth = 0, cMaxWidth = 0, cnt = 0, valid = 0,
Packit b099d7
	 space = 0; i < kidCnt; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	XiC(*kid)->position.x = XiC(*kid)->position.y = 0;
Packit b099d7
	if( *kid == child )
Packit b099d7
	{
Packit b099d7
	    XiC(*kid)->position.width = child_size->width;
Packit b099d7
	    XiC(*kid)->position.height = child_size->height;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XiC(*kid)->position.width = XiC(*kid)->request_width;
Packit b099d7
	    XiC(*kid)->position.height = XiC(*kid)->request_height;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if( !XiValidChild(*kid) ) continue;
Packit b099d7
	valid++;
Packit b099d7
Packit b099d7
	if( *kid == child )
Packit b099d7
	{
Packit b099d7
	    cbWidth = child_size->width + 2*child_size->border_width;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{	
Packit b099d7
	    cbWidth = XiC(*kid)->request_width + 2*XtBorderWidth(*kid);
Packit b099d7
	}
Packit b099d7
	if( cMinWidth == 0 )
Packit b099d7
	{
Packit b099d7
	    cMinWidth = cbWidth;
Packit b099d7
	}
Packit b099d7
	else if( cbWidth < cMinWidth )
Packit b099d7
	{
Packit b099d7
	    cMinWidth = cbWidth;
Packit b099d7
	}
Packit b099d7
	if( cMaxWidth == 0 )
Packit b099d7
	{
Packit b099d7
	    cMaxWidth = cbWidth;
Packit b099d7
	}
Packit b099d7
	else if( cbWidth > cMaxWidth )
Packit b099d7
	{
Packit b099d7
	    cMaxWidth = cbWidth;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if( XiC(*kid)->stretchable ) ++cnt;
Packit b099d7
Packit b099d7
	if( !XiC(*kid)->show_label ) continue;
Packit b099d7
Packit b099d7
	space = XmColumn_label_spacing(cw);
Packit b099d7
	label = XiC(*kid)->label_widget;
Packit b099d7
	
Packit b099d7
	if( child == label )
Packit b099d7
	{
Packit b099d7
	    if( (int)child_size->width > lWidth )
Packit b099d7
	    {
Packit b099d7
		lWidth = child_size->width;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    if( (int)XiC(label)->request_width > lWidth )
Packit b099d7
	    {
Packit b099d7
		lWidth = XiC(label)->request_width;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    x = cw->manager.shadow_thickness + BBPart(cw)->margin_width;
Packit b099d7
    if( valid > 0 && (x + lWidth + space + cMaxWidth + x > col_width ) )
Packit b099d7
    {
Packit b099d7
	int have = (col_width - 2 * x),
Packit b099d7
	    want = lWidth + space + cMaxWidth,
Packit b099d7
	    diff = want - have;
Packit b099d7
Packit b099d7
	/* Try to subtract from the label space first; if we can't do it (it
Packit b099d7
	** may be 0 right now),
Packit b099d7
	** then the data fields will shrink until they are the size of the
Packit b099d7
	** smallest field, and after that the labels will shrink.
Packit b099d7
	** The shadow and margin aren't affected.
Packit b099d7
	*/
Packit b099d7
	if ( space - diff > 1)
Packit b099d7
		space -= diff;
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
		if (0 != space)
Packit b099d7
			space = 1;
Packit b099d7
	    	want = lWidth + space + cMinWidth;
Packit b099d7
	    	diff = want - have;
Packit b099d7
Packit b099d7
		if (diff > 0)
Packit b099d7
		{
Packit b099d7
			if( lWidth - diff > 1 )
Packit b099d7
			    lWidth -= diff;
Packit b099d7
			else
Packit b099d7
			    lWidth = 1;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Calculating the widths for the various kids is a one shot, so lets
Packit b099d7
     * first walk through the kids and calculate all the width.
Packit b099d7
     */
Packit b099d7
    for( kid = kids, i = 0; i < kidCnt; ++i, ++kid )
Packit b099d7
    {
Packit b099d7
	if( !XiValidChild(*kid) ) continue;
Packit b099d7
	
Packit b099d7
	label = XiC(*kid)->label_widget;
Packit b099d7
	cBorder = XtBorderWidth(*kid);
Packit b099d7
	if (LayoutIsRtoLM(cw))
Packit b099d7
	    XiC(label)->position.x = col_width - x - lWidth;
Packit b099d7
	else
Packit b099d7
	    XiC(label)->position.x = x;
Packit b099d7
	XiC(label)->position.width = lWidth;
Packit b099d7
Packit b099d7
	/* cbWidth is whatever is left over */
Packit b099d7
	cbWidth = col_width - 
Packit b099d7
		((int)cw->manager.shadow_thickness +
Packit b099d7
		    (int)BBPart(cw)->margin_width +
Packit b099d7
			x + lWidth + space);
Packit b099d7
	if( cbWidth < 1 ) cbWidth = 1;
Packit b099d7
	cWidth = cbWidth - 2*cBorder;
Packit b099d7
	if( cWidth < 1 ) cWidth = 1;
Packit b099d7
	/* cWidth is now the value to use for XmFILL_FLUSH */
Packit b099d7
	if( XiFill(*kid) == XmFILL_RAGGED )
Packit b099d7
	{
Packit b099d7
	    if( child == *kid )
Packit b099d7
	    {
Packit b099d7
		if( (int) child_size->width < cWidth )
Packit b099d7
		{
Packit b099d7
		    cWidth = child_size->width;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		if( (int) XiC(*kid)->request_width < cWidth )
Packit b099d7
		{
Packit b099d7
		    cWidth = XiC(*kid)->request_width;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (LayoutIsRtoLM(cw))
Packit b099d7
	    XiC(*kid)->position.x = col_width - (x + lWidth + space + cWidth);
Packit b099d7
	else
Packit b099d7
	    XiC(*kid)->position.x = x + lWidth + space;
Packit b099d7
	XiC(*kid)->position.width = cWidth;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Now that we have calculated the x position and the width of
Packit b099d7
     * each of the children lets now try to calculate the y position
Packit b099d7
     * and the height.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    space = XmColumn_item_spacing(cw);
Packit b099d7
    hExtra = col_height - height;
Packit b099d7
    /* but first make a quick check on reducing the itemSpacing */
Packit b099d7
    if (hExtra < 0) 
Packit b099d7
	{
Packit b099d7
	if (valid)
Packit b099d7
		{
Packit b099d7
		int totalItemSpacing = (valid - 1) * space;
Packit b099d7
		if (totalItemSpacing + hExtra > 0)
Packit b099d7
			space = (totalItemSpacing + hExtra)/(valid-1);
Packit b099d7
		else
Packit b099d7
			space = 1;
Packit b099d7
		}
Packit b099d7
	hExtra = 0;	/* or very close to it */
Packit b099d7
	}
Packit b099d7
    for( j = 0; j < 2; ++j )
Packit b099d7
    {
Packit b099d7
	do {
Packit b099d7
	    y = cw->manager.shadow_thickness +
Packit b099d7
		BBPart(cw)->margin_height;
Packit b099d7
Packit b099d7
	    if( j != 0 )
Packit b099d7
	    {
Packit b099d7
		cnt = valid;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if( cnt > 0 )
Packit b099d7
	    {
Packit b099d7
		hEach = hExtra / cnt;
Packit b099d7
		hLeft = hExtra % cnt;
Packit b099d7
	    }
Packit b099d7
	    else if( cnt == 0 )
Packit b099d7
	    {
Packit b099d7
		hEach = 0;
Packit b099d7
		hLeft = hExtra;
Packit b099d7
	    }
Packit b099d7
	    change = False;
Packit b099d7
Packit b099d7
	    for( kid = kids, i = 0; i < kidCnt; ++i, ++kid )
Packit b099d7
	    {
Packit b099d7
		if( !XiValidChild(*kid) ) continue;
Packit b099d7
		
Packit b099d7
		label = XiC(*kid)->label_widget;
Packit b099d7
		cHeight = XiC(*kid)->position.height;
Packit b099d7
		
Packit b099d7
		if( j == 0 || hExtra > 0 )
Packit b099d7
		{
Packit b099d7
		    stretch = XiC(*kid)->stretchable;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    stretch = True;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		if( stretch )
Packit b099d7
		{
Packit b099d7
		    if( hExtra < 0 && cHeight > 1 )
Packit b099d7
		    {
Packit b099d7
			if( hEach != 0 )
Packit b099d7
			{
Packit b099d7
			    int tmp = -hEach;
Packit b099d7
Packit b099d7
			    change = True;
Packit b099d7
			    if( tmp < cHeight )
Packit b099d7
			    {
Packit b099d7
				hExtra += tmp;
Packit b099d7
				cHeight -= tmp;
Packit b099d7
			    }
Packit b099d7
			    else
Packit b099d7
			    {
Packit b099d7
				tmp = cHeight - 1;
Packit b099d7
				hExtra += tmp;
Packit b099d7
				cHeight = 1;
Packit b099d7
			    }
Packit b099d7
			}
Packit b099d7
			
Packit b099d7
			if( hLeft != 0 && cHeight > 1 )
Packit b099d7
			{
Packit b099d7
			    change = True;
Packit b099d7
			    hLeft++;
Packit b099d7
			    hExtra++;
Packit b099d7
			    cHeight--;
Packit b099d7
			}
Packit b099d7
		    }
Packit b099d7
		    else if( hExtra > 0 )
Packit b099d7
		    {
Packit b099d7
			change = True;
Packit b099d7
			cHeight += hEach;
Packit b099d7
			hExtra -= hEach;
Packit b099d7
Packit b099d7
			if( hLeft > 0 )
Packit b099d7
			{
Packit b099d7
			    cHeight++;
Packit b099d7
			    hLeft--;
Packit b099d7
			    hExtra--;
Packit b099d7
			}
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
Packit b099d7
		if( cHeight < 1 ) cHeight = 1;
Packit b099d7
		if( child == *kid )
Packit b099d7
		{
Packit b099d7
		    cBorder = child_size->border_width;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    cBorder = XtBorderWidth(*kid);
Packit b099d7
		}
Packit b099d7
Packit b099d7
		if( XiC(*kid)->show_label )
Packit b099d7
		{
Packit b099d7
		    if( child == label )
Packit b099d7
		    {
Packit b099d7
			lHeight = child_size->height;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			lHeight = XiC(label)->request_height;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    lHeight = 1;
Packit b099d7
		}
Packit b099d7
		cbHeight = cHeight + 2 * cBorder;
Packit b099d7
Packit b099d7
		if( cbHeight > lHeight || stretch )
Packit b099d7
		{
Packit b099d7
		    lHeight = cbHeight;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    cHeight = lHeight - 2*cBorder;
Packit b099d7
		    if( cHeight < 1 ) cHeight = 1;
Packit b099d7
		    cbHeight = cHeight + 2*cBorder;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		XiC(label)->position.y = y;
Packit b099d7
		XiC(label)->position.height = lHeight;
Packit b099d7
Packit b099d7
		XiC(*kid)->position.y = y;
Packit b099d7
		XiC(*kid)->position.height = cHeight;
Packit b099d7
Packit b099d7
		if( child == *kid )
Packit b099d7
		{
Packit b099d7
		    cBorder = child_size->border_width;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    cBorder = XtBorderWidth(*kid);
Packit b099d7
		}
Packit b099d7
		y += XiC(*kid)->position.height + (2 * cBorder) + space;
Packit b099d7
	    }
Packit b099d7
	} while( hExtra != 0 && change );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If we get here and we still have some extra space we want to see
Packit b099d7
     * if the user wants to distribute the space between children or
Packit b099d7
     * not.
Packit b099d7
     */
Packit b099d7
    if( XmColumn_distribution(cw) == XmDISTRIBUTE_SPREAD &&
Packit b099d7
        hExtra > 0 )
Packit b099d7
    {
Packit b099d7
	if( valid == 1 )
Packit b099d7
	{
Packit b099d7
	    hEach = hExtra / 2;
Packit b099d7
	    XiC(*kids)->position.y += hEach;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    if( valid > 1 )
Packit b099d7
	    {
Packit b099d7
		valid--;
Packit b099d7
		hEach = hExtra / valid;
Packit b099d7
		hLeft = hExtra % valid;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		hEach = 0;
Packit b099d7
		hLeft = hExtra;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    y = cw->manager.shadow_thickness +
Packit b099d7
		BBPart(cw)->margin_height;
Packit b099d7
	    for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
	    {
Packit b099d7
		if( !XiValidChild(*kid) ) continue;
Packit b099d7
Packit b099d7
		if( i > 0 )
Packit b099d7
		{
Packit b099d7
		    XiC(*kid)->position.y = y;
Packit b099d7
		    XiC(XiC(*kid)->label_widget)->position.y = y;
Packit b099d7
		}
Packit b099d7
		space = XmColumn_item_spacing(cw) + hEach;
Packit b099d7
		if( hLeft > 0 ) {
Packit b099d7
		    space++;
Packit b099d7
		    hLeft--;
Packit b099d7
		}
Packit b099d7
		if( child == *kid )
Packit b099d7
		{
Packit b099d7
		    cBorder = child_size->border_width;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    cBorder = XtBorderWidth(*kid);
Packit b099d7
		}
Packit b099d7
		y += XiC(*kid)->position.height + (2 * cBorder) +
Packit b099d7
		    space;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if( child == NULL )
Packit b099d7
    {
Packit b099d7
	for( i = 0, kid = kids; i < kidCnt; ++i, ++kid )
Packit b099d7
	{
Packit b099d7
	    if( !XiValidChild(*kid) ) continue;
Packit b099d7
Packit b099d7
	    label = XiC(*kid)->label_widget;
Packit b099d7
Packit b099d7
	    if( XiC(*kid)->show_label )
Packit b099d7
	    {
Packit b099d7
		XtConfigureWidget(label, XiC(label)->position.x,
Packit b099d7
				  XiC(label)->position.y,
Packit b099d7
				  XiC(label)->position.width,
Packit b099d7
				  XiC(*kid)->position.height, 0);
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	    XtConfigureWidget(*kid,  XiC(*kid)->position.x,
Packit b099d7
			      XiC(*kid)->position.y,
Packit b099d7
			      XiC(*kid)->position.width,
Packit b099d7
			      XiC(*kid)->position.height,
Packit b099d7
			      XtBorderWidth(*kid));
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	VerifyConstraint(request, current, set)
Packit b099d7
 * Description:
Packit b099d7
 *	This function verifies the values for the Column child's constraint
Packit b099d7
 *	resources in "set" resetting them to the previous or default
Packit b099d7
 *	values if an invalid resource value was set.
Packit b099d7
 * Input:
Packit b099d7
 *	request	: Widget - the requested setting for the widget
Packit b099d7
 *	current : Widget - the current setting for the widget
Packit b099d7
 *	set     : Widget - the setting for the widget
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
VerifyConstraints(Widget request, Widget current, Widget set)
Packit b099d7
{
Packit b099d7
    Boolean  reset;
Packit b099d7
Packit b099d7
#if 0	/* POSITION HANDLING */
Packit b099d7
    reset = False;
Packit b099d7
    switch( XiC(set)->label_position )
Packit b099d7
    {
Packit b099d7
    case XiLABEL_POSITION_CENTER:
Packit b099d7
    case XiLABEL_POSITION_LEFT:
Packit b099d7
    case XiLABEL_POSITION_RIGHT:
Packit b099d7
    case XiLABEL_POSITION_TOP:
Packit b099d7
    case XiLABEL_POSITION_BOTTOM:
Packit b099d7
    case XiLABEL_POSITION_UNSPECIFIED:
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning(set,
Packit b099d7
			"An illegal resource value was assigned to the resource XmNentryLabelPosition");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XiC(set)->label_position = (current != NULL
Packit b099d7
				   ? XiC(current)->label_position
Packit b099d7
				   : XiLABEL_POSITION_UNSPECIFIED);
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    reset = False;
Packit b099d7
    switch( XiC(set)->label_alignment )
Packit b099d7
    {
Packit b099d7
    case XmALIGNMENT_BEGINNING:
Packit b099d7
    case XmALIGNMENT_CENTER:
Packit b099d7
    case XmALIGNMENT_END:
Packit b099d7
    case XmALIGNMENT_UNSPECIFIED:
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning(set,
Packit b099d7
		"An illegal resource value was assigned to the resource XmNentryLabelAlignment");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XiC(set)->label_alignment = (current != NULL
Packit b099d7
				    ? XiC(current)->label_alignment
Packit b099d7
				    : XmALIGNMENT_UNSPECIFIED);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    reset = False;
Packit b099d7
    switch( XiC(set)->fill_style )
Packit b099d7
    {
Packit b099d7
    case XmFILL_UNSPECIFIED:
Packit b099d7
    case XmFILL_FLUSH:
Packit b099d7
    case XmFILL_RAGGED:
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	XmeWarning(set,
Packit b099d7
		"An illegal resource value was assigned to the resource XmNfillStyle");
Packit b099d7
	reset = True;
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
    if( reset )
Packit b099d7
    {
Packit b099d7
	XiC(set)->fill_style = (current != NULL
Packit b099d7
			       ? XiC(current)->fill_style
Packit b099d7
			       : XmFILL_UNSPECIFIED);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CalcSize(cw, child, child_size, query, width, height)
Packit b099d7
 * Description:
Packit b099d7
 *	This function calculates and returns the prefered size for the
Packit b099d7
 *	column.
Packit b099d7
 * Input:
Packit b099d7
 *	cw         : XmColumnWidget    - the column widget
Packit b099d7
 *	child      : Widget            - a widget whose geometry is specified
Packit b099d7
 *	child_size : XtWidgetGeometry* - the specified child's geometry
Packit b099d7
 *	query      : Boolean           - query the kids?
Packit b099d7
 *	width      : Dimension*        - return the desired width
Packit b099d7
 *	height	   : Dimension*	       - return the desired height
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
CalcSize(XmColumnWidget cw, Widget child, XtWidgetGeometry *child_size,
Packit b099d7
	 Boolean query, Dimension *width, Dimension *height)
Packit b099d7
{
Packit b099d7
  int              _width = 0, _height = 0, cnt = 0;
Packit b099d7
  Cardinal         i, kidCnt = cw->composite.num_children;
Packit b099d7
  WidgetList       kid, kids = cw->composite.children;
Packit b099d7
  Widget           label;
Packit b099d7
  Dimension        cWidth, cHeight, cBorder, cSum = 0, lWidth, lHeight;
Packit b099d7
  Dimension        lSum = 0, space = 0, hSumSpace = 0;
Packit b099d7
  XtWidgetGeometry wants;
Packit b099d7
Packit b099d7
  for (i = 0, kid = kids; i < kidCnt; ++i, ++kid)
Packit b099d7
    {
Packit b099d7
      if (!XiValidChild(*kid)) continue;
Packit b099d7
      
Packit b099d7
      if (XiC(*kid)->show_label)
Packit b099d7
	{
Packit b099d7
	  space = XmColumn_label_spacing(cw);
Packit b099d7
	  hSumSpace += XmColumn_label_spacing(cw);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      /* 
Packit b099d7
       * Check for the child widgets preferred geometry.
Packit b099d7
       * if the prefered geometry is greater than the requested
Packit b099d7
       * geometry, then set the query geometry to "True".
Packit b099d7
       * Doing this, column widget will take care of improper 
Packit b099d7
       * size settings on the compound children widgets (CR03821)
Packit b099d7
       */
Packit b099d7
      query = False;
Packit b099d7
      XtQueryGeometry(*kid, NULL, &wants);
Packit b099d7
      if (wants.width > XiC(*kid)->request_width || \
Packit b099d7
	  wants.height >  XiC(*kid)->request_height) 
Packit b099d7
	{
Packit b099d7
	  query = True;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (*kid == child && child_size != NULL)
Packit b099d7
	{
Packit b099d7
	  cWidth = child_size->width;
Packit b099d7
	  cHeight = child_size->height;
Packit b099d7
	  cBorder = child_size->border_width;
Packit b099d7
	} else if (query) 
Packit b099d7
	  {
Packit b099d7
	    XtQueryGeometry(*kid, NULL, &wants);
Packit b099d7
	    
Packit b099d7
	    if (wants.request_mode & CWWidth)
Packit b099d7
	      {
Packit b099d7
		cWidth = wants.width;
Packit b099d7
		XiC(*kid)->request_width = wants.width;
Packit b099d7
	      }
Packit b099d7
	    else
Packit b099d7
	      {
Packit b099d7
		cWidth = XiC(*kid)->request_width;
Packit b099d7
	      }
Packit b099d7
	    
Packit b099d7
	    if (wants.request_mode & CWHeight)
Packit b099d7
	      {
Packit b099d7
		cHeight = wants.height;
Packit b099d7
		XiC(*kid)->request_height = wants.height;
Packit b099d7
	      }
Packit b099d7
	    else
Packit b099d7
	      {
Packit b099d7
		cHeight = XiC(*kid)->request_height;
Packit b099d7
	      }
Packit b099d7
	    
Packit b099d7
	    if (wants.request_mode & CWBorderWidth)
Packit b099d7
	      {
Packit b099d7
		cBorder = wants.border_width;
Packit b099d7
	      }
Packit b099d7
	    else
Packit b099d7
	      {
Packit b099d7
		cBorder = XtBorderWidth(*kid);
Packit b099d7
	      }
Packit b099d7
	  }
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  cWidth = XiC(*kid)->request_width;
Packit b099d7
	  cHeight = XiC(*kid)->request_height;
Packit b099d7
	  cBorder = XtBorderWidth(*kid);
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      cWidth += (2 * cBorder);
Packit b099d7
      cHeight += (2 * cBorder);
Packit b099d7
      if (XtIsManaged((label = XiC(*kid)->label_widget)))
Packit b099d7
	{
Packit b099d7
	  if (label == child && child_size != NULL)
Packit b099d7
	    {
Packit b099d7
	      lWidth = child_size->width;
Packit b099d7
	      lHeight = child_size->height;
Packit b099d7
	    }
Packit b099d7
	  else if (query)
Packit b099d7
	    {
Packit b099d7
	      XtQueryGeometry(label, NULL, &wants);
Packit b099d7
	      
Packit b099d7
	      if (wants.request_mode & CWWidth)
Packit b099d7
		{
Packit b099d7
		  lWidth = wants.width;
Packit b099d7
		}
Packit b099d7
	      else
Packit b099d7
		{
Packit b099d7
		  lWidth = XiC(label)->request_width;
Packit b099d7
		}
Packit b099d7
	      
Packit b099d7
	      if (wants.request_mode & CWHeight)
Packit b099d7
		{
Packit b099d7
		  lHeight = wants.height;
Packit b099d7
		}
Packit b099d7
	      else
Packit b099d7
		{
Packit b099d7
		  lHeight = XiC(label)->request_height;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	  else
Packit b099d7
	    {
Packit b099d7
	      lWidth = XiC(label)->request_width;
Packit b099d7
	      lHeight = XiC(label)->request_height;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      else
Packit b099d7
	{
Packit b099d7
	  lWidth = lHeight = 0;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      if (XmColumn_orientation(cw) == XmVERTICAL)
Packit b099d7
	{
Packit b099d7
	  if (lWidth > lSum) lSum = lWidth;
Packit b099d7
	  if (cWidth > cSum) cSum = cWidth;
Packit b099d7
	  
Packit b099d7
	  _height += (lHeight > cHeight ? lHeight : cHeight);
Packit b099d7
	}
Packit b099d7
      else	/* XmHORIZONTAL Layout */
Packit b099d7
	{
Packit b099d7
	  /* Choose the maximum height */
Packit b099d7
	  if (_height < (int)cHeight) _height = cHeight;
Packit b099d7
	  if (_height < (int)lHeight) _height = lHeight;
Packit b099d7
	  
Packit b099d7
	  _width += lWidth + cWidth;
Packit b099d7
	}
Packit b099d7
      
Packit b099d7
      cnt++;
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (cnt > 1) --cnt;
Packit b099d7
  
Packit b099d7
  if (XmColumn_orientation(cw) == XmVERTICAL)
Packit b099d7
    {
Packit b099d7
      _width = lSum + cSum + space +
Packit b099d7
	2 * (cw->manager.shadow_thickness +
Packit b099d7
	     BBPart(cw)->margin_width);
Packit b099d7
      
Packit b099d7
      _height += (cnt * XmColumn_item_spacing(cw) +
Packit b099d7
		  2 * (cw->manager.shadow_thickness +
Packit b099d7
		       BBPart(cw)->margin_height));
Packit b099d7
    }
Packit b099d7
  else	/* XmHORIZONTAL Layout */
Packit b099d7
    {
Packit b099d7
      _width += (hSumSpace +
Packit b099d7
		 2 * (cw->manager.shadow_thickness +
Packit b099d7
		      BBPart(cw)->margin_width)) + cnt*XmColumn_item_spacing(cw);
Packit b099d7
      
Packit b099d7
      _height += 2 * (cw->manager.shadow_thickness +
Packit b099d7
		      BBPart(cw)->margin_height);
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  if (_width < 1) _width = 1;
Packit b099d7
  if (_height < 1) _height = 1;
Packit b099d7
  
Packit b099d7
  if (width != NULL) *width = _width;
Packit b099d7
  if (height != NULL) *height = _height;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CompareGeometry(geom1, geom2)
Packit b099d7
 * Description:
Packit b099d7
 *	This function compares to XtWidgetGeometry structure to see if
Packit b099d7
 *	the are equal.
Packit b099d7
 * Input:
Packit b099d7
 *	geom1 : XtWidgetGeometry* - a geometry spec
Packit b099d7
 *	geom2 : XtWidgetGeometry* - another geometry spec
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the geometry structures are equal, else False
Packit b099d7
 */
Packit b099d7
static Boolean
Packit b099d7
CompareGeometry(XtWidgetGeometry *geom1, XtWidgetGeometry *geom2)
Packit b099d7
{
Packit b099d7
    Boolean result;
Packit b099d7
Packit b099d7
    result = (geom1 == NULL || geom2 == NULL) ||
Packit b099d7
	(geom1->request_mode != geom2->request_mode) ||
Packit b099d7
	(geom1->request_mode & CWX && geom1->x != geom2->x) ||
Packit b099d7
	(geom1->request_mode & CWY && geom1->y != geom2->y)  ||
Packit b099d7
	(geom1->request_mode & CWWidth && geom1->width != geom2->width) ||
Packit b099d7
	(geom1->request_mode & CWHeight && geom1->height != geom2->height) ||
Packit b099d7
	(geom1->request_mode & CWBorderWidth &&
Packit b099d7
	 geom1->border_width != geom2->border_width);
Packit b099d7
Packit b099d7
    return( !result );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	CompareGeometryToWidget(geom, widget)
Packit b099d7
 * Description:
Packit b099d7
 *	Compares a geometry spec to a widget's actual geometry.
Packit b099d7
 * Input:
Packit b099d7
 *	geom   : XtWidgetGeometry* - the geometry
Packit b099d7
 *	widget : Widget            - the widget
Packit b099d7
 * Output:
Packit b099d7
 *	Boolean - True if the widget equals the geom spec, else False.
Packit b099d7
 */
Packit b099d7
static Boolean
Packit b099d7
CompareGeometryToWidget(XtWidgetGeometry *geom, Widget widget)
Packit b099d7
{
Packit b099d7
    Boolean result;
Packit b099d7
Packit b099d7
    result = (geom == NULL || widget == NULL) ||
Packit b099d7
	(geom->request_mode == 0) ||
Packit b099d7
	(geom->request_mode & CWX && geom->x != XtX(widget)) ||
Packit b099d7
        (geom->request_mode & CWY && geom->y != XtY(widget)) ||
Packit b099d7
        (geom->request_mode & CWWidth && geom->width != XtWidth(widget)) ||
Packit b099d7
        (geom->request_mode & CWHeight &&
Packit b099d7
	 geom->height != XtHeight(widget)) ||
Packit b099d7
        (geom->request_mode & CWBorderWidth &&
Packit b099d7
	 geom->border_width != XtBorderWidth(widget));
Packit b099d7
Packit b099d7
    return( !result );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * XmRCallProc routine for checking label_font_list before setting it to NULL
Packit b099d7
 * If constrainit's "check_set_render_table" is True, then function has 
Packit b099d7
 * been called twice on same widget, thus resource needs to be set NULL, 
Packit b099d7
 * otherwise leave it alone.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
CheckSetEntryLabelRenderTable(Widget wid, int offs, XrmValue *value)
Packit b099d7
{
Packit b099d7
  XmColumnConstraintPart* cc = XiC(wid);
Packit b099d7
Packit b099d7
  /* Check if been here before */
Packit b099d7
  if (cc->check_set_render_table)
Packit b099d7
      value->addr = NULL;
Packit b099d7
  else {
Packit b099d7
      cc->check_set_render_table = True;
Packit b099d7
      value->addr = (char*)&(cc->label_font_list);
Packit b099d7
  }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * XmRCallProc routine for checking label_font_list before setting it to NULL
Packit b099d7
 * If column's "check_set_render_table" is True, then function has 
Packit b099d7
 * been called twice on same widget, thus resource needs to be set NULL, 
Packit b099d7
 * otherwise leave it alone.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
CheckSetDefaultEntryLabelRenderTable(Widget wid, int offs, XrmValue *value)
Packit b099d7
{
Packit b099d7
  XmBulletinBoardPart* bb = BBPart(wid);
Packit b099d7
  XmColumnWidget c = (XmColumnWidget)wid;
Packit b099d7
Packit b099d7
  /* Check if been here before */
Packit b099d7
  if (c->column.check_set_render_table)
Packit b099d7
      value->addr = NULL;
Packit b099d7
  else {
Packit b099d7
      c->column.check_set_render_table = True;
Packit b099d7
      value->addr = (char*)&(bb->label_font_list);
Packit b099d7
  }
Packit b099d7
Packit b099d7
}
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmColumnLabelDestroyedCallback(widget, client, cbdata)
Packit b099d7
 * Description:
Packit b099d7
 *	This callback is called when a label that is associated with a field
Packit b099d7
 *	is destoyed.  The purpose of this callback is to inform the column
Packit b099d7
 *	when this happens to it does not try to do bad things.
Packit b099d7
 * Input:
Packit b099d7
 *	widget : Widget    - the widget being destroyed
Packit b099d7
 *	client : XtPointer - the widget that this label is associated with
Packit b099d7
 *	cbdata : XtPointer - unused.
Packit b099d7
 * Output:
Packit b099d7
 *	None.
Packit b099d7
 */
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
XmColumnLabelDestroyedCallback(Widget widget, XtPointer client,
Packit b099d7
			       XtPointer cbdata)
Packit b099d7
{
Packit b099d7
    Widget field = (Widget) client;
Packit b099d7
Packit b099d7
    XiC(field)->label_widget = NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void Get_entryLabelString (Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    (*value) = (XtArgVal) XmStringCopy(XiC(widget)->label_string);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function:
Packit b099d7
 *	XmCreateColumn(parent, name, arg_list, arg_cnt);
Packit b099d7
 * Description:
Packit b099d7
 *	Creates an unmanaged instance of an XmColumn and returns its
Packit b099d7
 *	widget id.
Packit b099d7
 * Input:
Packit b099d7
 *	parent   : Widget   - the parent of the new instance.
Packit b099d7
 *	name     : String   - the name of the new instance.
Packit b099d7
 *	arg_list : ArgList  - the arguments to create the instance with.
Packit b099d7
 *	arg_cnt  : Cardinal - the number of arguments in the list
Packit b099d7
 *	
Packit b099d7
 * Output:
Packit b099d7
 *	Widget - the widget id of the new instance.
Packit b099d7
 */
Packit b099d7
Widget
Packit b099d7
XmCreateColumn(Widget parent, String name, ArgList arg_list, Cardinal arg_cnt)
Packit b099d7
{
Packit b099d7
    return( XtCreateWidget(name, xmColumnWidgetClass, parent, arg_list,
Packit b099d7
			   arg_cnt) );
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateColumn(
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
                         xmColumnWidgetClass,
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
XmVaCreateManagedColumn(
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
                         xmColumnWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}