/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */
/*-----------------------------------------*/
/*																		*/
/* Name:		<Xfe/Chrome.c>											*/
/* Description:	XfeChrome widget source.								*/
/* Author:		Ramiro Estrugo <ramiro@netscape.com>					*/
/*																		*/
/*----------------------------------------------------------------------*/


#include <Xfe/ChromeP.h>

/* Possible children classes */
#include <Xfe/Label.h>
#include <Xfe/Button.h>
#include <Xfe/Cascade.h>

#include <Xm/Separator.h>
#include <Xm/DrawingA.h>
#include <Xm/MainW.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>

#define MESSAGE1 "Widget is not an XfeChrome."
#define MESSAGE2 "The XmNmenuBar widget cannot be changed."
#define MESSAGE3 "The XmNtoolBox widget cannot be changed."
#define MESSAGE4 "The XmNdashBoard widget cannot be changed."
#define	MESSAGE5 "The same widget occurs in more than one view position."

#define IS_MENU_BAR(w)		(_XfeIsAlive(w) && XmIsRowColumn(w))
#define IS_TOOL_BOX(w)		(_XfeIsAlive(w) && XfeIsToolBox(w))
#define IS_DASH_BOARD(w)	(_XfeIsAlive(w) && XfeIsDashBoard(w))

#define SHOW_BOTTOM_VIEW(cp)	(_XfeChildIsShown((cp)->bottom_view))
#define SHOW_CENTER_VIEW(cp)	(_XfeChildIsShown((cp)->center_view))
#define SHOW_DASH_BOARD(cp)		(_XfeChildIsShown((cp)->dash_board))
#define SHOW_LEFT_VIEW(cp)		(_XfeChildIsShown((cp)->left_view))
#define SHOW_MENU_BAR(cp)		(_XfeChildIsShown((cp)->menu_bar))
#define SHOW_RIGHT_VIEW(cp)		(_XfeChildIsShown((cp)->right_view))
#define SHOW_TOOL_BOX(cp)		(_XfeChildIsShown((cp)->tool_box))
#define SHOW_TOP_VIEW(cp)		(_XfeChildIsShown((cp)->top_view))

/*----------------------------------------------------------------------*/
/*																		*/
/* Core class methods													*/
/*																		*/
/*----------------------------------------------------------------------*/
static void 	Initialize			(Widget,Widget,ArgList,Cardinal *);
static void 	Destroy				(Widget);
static Boolean	SetValues			(Widget,Widget,Widget,ArgList,Cardinal *);

/*----------------------------------------------------------------------*/
/*																		*/
/* Constraint class methods												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void		ConstraintInitialize(Widget,Widget,ArgList,Cardinal *);
static Boolean	ConstraintSetValues	(Widget,Widget,Widget,ArgList,Cardinal *);

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeManager class methods												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void		PreferredGeometry	(Widget,Dimension *,Dimension *);
static Boolean	AcceptChild			(Widget);
static Boolean	InsertChild			(Widget);
static Boolean	DeleteChild			(Widget);
static void		LayoutChildren		(Widget);

/*----------------------------------------------------------------------*/
/*																		*/
/* Misc XfeChrome functions												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void		LayoutBottomView	(Widget);
static void		LayoutCenterView	(Widget);
static void		LayoutDashBoard		(Widget);
static void		LayoutLeftView		(Widget);
static void		LayoutMenuBar		(Widget);
static void		LayoutRightView		(Widget);
static void		LayoutToolBox		(Widget);
static void		LayoutTopView		(Widget);
								   
/*----------------------------------------------------------------------*/
/*																		*/
/* Constraint resource callprocs										*/
/*																		*/
/*----------------------------------------------------------------------*/
static void		DefaultChromeChildType			(Widget,int,XrmValue *);

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeChrome resources													*/
/*																		*/
/*----------------------------------------------------------------------*/
static XtResource resources[] = 	
{					
    /* Resources */
	{ 
		XmNmenuBar,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . menu_bar),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNtoolBox,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . tool_box),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNcenterView,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . center_view),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNtopView,
		XmCWidget,
		XmCWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . top_view),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNbottomView,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . bottom_view),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNleftView,
		XmCWidget,
		XmCWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . left_view),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNrightView,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . right_view),
		XmRImmediate, 
		(XtPointer) NULL
    },
	{ 
		XmNdashBoard,
		XmCWidget,
		XmRWidget,
		sizeof(Widget),
		XtOffsetOf(XfeChromeRec , xfe_chrome . dash_board),
		XmRImmediate, 
		(XtPointer) NULL
    },
    { 
		XmNspacing,
		XmCSpacing,
		XmRHorizontalDimension,
		sizeof(Dimension),
		XtOffsetOf(XfeChromeRec , xfe_chrome . spacing),
		XmRImmediate, 
		(XtPointer) 1
    },

    /* Force all the margins to 0 */
    { 
		XmNmarginBottom,
		XmCMarginBottom,
		XmRVerticalDimension,
		sizeof(Dimension),
		XtOffsetOf(XfeChromeRec , xfe_manager . margin_bottom),
		XmRImmediate, 
		(XtPointer) 0
    },
    { 
		XmNmarginLeft,
		XmCMarginLeft,
		XmRHorizontalDimension,
		sizeof(Dimension),
		XtOffsetOf(XfeChromeRec , xfe_manager . margin_left),
		XmRImmediate, 
		(XtPointer) 0
    },
    { 
		XmNmarginRight,
		XmCMarginRight,
		XmRHorizontalDimension,
		sizeof(Dimension),
		XtOffsetOf(XfeChromeRec , xfe_manager . margin_right),
		XmRImmediate, 
		(XtPointer) 0
    },
    { 
		XmNmarginTop,
		XmCMarginTop,
		XmRVerticalDimension,
		sizeof(Dimension),
		XtOffsetOf(XfeChromeRec , xfe_manager . margin_top),
		XmRImmediate, 
		(XtPointer) 0
    },
};   

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeChrome synthetic resources										*/
/*																		*/
/*----------------------------------------------------------------------*/
static XmSyntheticResource synthetic_resources[] =
{
   { 
       XmNspacing,
       sizeof(Dimension),
       XtOffsetOf(XfeChromeRec , xfe_chrome . spacing),
       _XmFromHorizontalPixels,
       _XmToHorizontalPixels 
   },
};

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeChrome constraint resources										*/
/*																		*/
/*----------------------------------------------------------------------*/
static XtResource constraint_resources[] = 
{
    { 
		XmNchromeChildType,
		XmCChromeChildType,
		XmRChromeChildType,
		sizeof(unsigned char),
		XtOffsetOf(XfeChromeConstraintRec , xfe_chrome . chrome_child_type),
		XmRCallProc,
		(XtPointer) DefaultChromeChildType
    },
};   

/*----------------------------------------------------------------------*/
/*																		*/
/* Widget Class Record Initialization                                   */
/*																		*/
/*----------------------------------------------------------------------*/
_XFE_WIDGET_CLASS_RECORD(chrome,Chrome) =
{
    {
		(WidgetClass) &xfeManagerClassRec,		/* superclass			*/
		"XfeChrome",							/* class_name			*/
		sizeof(XfeChromeRec),					/* widget_size			*/
		NULL,									/* class_initialize		*/
		NULL,									/* class_part_initialize*/
		FALSE,									/* class_inited			*/
		Initialize,								/* initialize			*/
		NULL,									/* initialize_hook		*/
		XtInheritRealize,						/* realize				*/
		NULL,									/* actions				*/
		0,										/* num_actions			*/
		resources,                              /* resources			*/
		XtNumber(resources),                    /* num_resources		*/
		NULLQUARK,                              /* xrm_class			*/
		TRUE,                                   /* compress_motion		*/
		XtExposeCompressMaximal,                /* compress_exposure	*/
		TRUE,                                   /* compress_enterleave	*/
		FALSE,                                  /* visible_interest		*/
		Destroy,								/* destroy				*/
		XtInheritResize,                        /* resize				*/
		XtInheritExpose,						/* expose				*/
		SetValues,                              /* set_values			*/
		NULL,                                   /* set_values_hook		*/
		XtInheritSetValuesAlmost,				/* set_values_almost	*/
		NULL,									/* get_values_hook		*/
		NULL,                                   /* access_focus			*/
		XtVersion,                              /* version				*/
		NULL,                                   /* callback_private		*/
		XtInheritTranslations,					/* tm_table				*/
		XtInheritQueryGeometry,					/* query_geometry		*/
		XtInheritDisplayAccelerator,            /* display accelerator	*/
		NULL,                                   /* extension			*/
    },
    
    /* Composite Part */
    {
		_XfeLiberalGeometryManager,				/* geometry_manager		*/
		XtInheritChangeManaged,					/* change_managed		*/
		XtInheritInsertChild,					/* insert_child			*/
		XtInheritDeleteChild,					/* delete_child			*/
		NULL									/* extension			*/
    },

    /* Constraint Part */
    {
		constraint_resources,					/* constraint res		*/
		XtNumber(constraint_resources),			/* num constraint res	*/
		sizeof(XfeChromeConstraintRec),			/* constraint size		*/
		ConstraintInitialize,					/* init proc			*/
		NULL,									/* destroy proc			*/
		ConstraintSetValues,					/* set values proc		*/
		NULL,                                   /* extension			*/
    },

    /* XmManager Part */
    {
		XtInheritTranslations,					/* tm_table				*/
		synthetic_resources,					/* syn resources		*/
		XtNumber(synthetic_resources),			/* num syn_resources	*/
		NULL,									/* syn resources		*/
		0,										/* num syn_resources	*/
		XmInheritParentProcess,                 /* parent_process		*/
		NULL,                                   /* extension			*/
    },
    
    /* XfeManager Part 	*/
    {
		XfeInheritBitGravity,					/* bit_gravity			*/
		PreferredGeometry,						/* preferred_geometry	*/
		XfeInheritMinimumGeometry,				/* minimum_geometry		*/
		XfeInheritUpdateRect,					/* update_rect			*/
		AcceptChild,							/* accept_child			*/
		InsertChild,							/* insert_child			*/
		DeleteChild,							/* delete_child			*/
		NULL,									/* change_managed		*/
		NULL,									/* prepare_components	*/
		NULL,									/* layout_components	*/
		LayoutChildren,							/* layout_children		*/
		NULL,									/* draw_background		*/
		XfeInheritDrawShadow,					/* draw_shadow			*/
		NULL,									/* draw_components		*/
		False,									/* count_layable_children*/
		NULL,									/* child_is_layable		*/
		NULL,									/* extension			*/
    },

    /* XfeChrome Part */
    {
		NULL,									/* extension			*/
    },
};

/*----------------------------------------------------------------------*/
/*																		*/
/* xfeChromeWidgetClass declaration.									*/
/*																		*/
/*----------------------------------------------------------------------*/
_XFE_WIDGET_CLASS(chrome,Chrome);

/*----------------------------------------------------------------------*/
/*																		*/
/* Constraint resource callprocs										*/
/*																		*/
/*----------------------------------------------------------------------*/
static void
DefaultChromeChildType(Widget child,int offset,XrmValue * value)
{
	Widget					w = _XfeParent(child);
	XfeChromePart *			cp = _XfeChromePart(w);
    static unsigned char	chrome_child_type;

	/* menu_bar */
	if (IS_MENU_BAR(child))
	{
		chrome_child_type = XmCHROME_MENU_BAR;
	}
	/* tool_box */
	else if (IS_TOOL_BOX(child))
	{
		chrome_child_type = XmCHROME_TOOL_BOX;
	}
	/* dash_board */
	else if (IS_DASH_BOARD(child))
	{
		chrome_child_type = XmCHROME_DASH_BOARD;
	}
	/* center_view */
	else if (!_XfeIsAlive(cp->center_view))
	{
		chrome_child_type = XmCHROME_CENTER_VIEW;
	}
	/* top_view */
	else if (!_XfeIsAlive(cp->top_view))
	{
		chrome_child_type = XmCHROME_TOP_VIEW;
	}
	/* bottom_view */
	else if (!_XfeIsAlive(cp->bottom_view))
	{
		chrome_child_type = XmCHROME_BOTTOM_VIEW;
	}
	/* left_view */
	else if (!_XfeIsAlive(cp->left_view))
	{
		chrome_child_type = XmCHROME_LEFT_VIEW;
	}
	/* right_view */
	else if (!_XfeIsAlive(cp->right_view))
	{
		chrome_child_type = XmCHROME_RIGHT_VIEW;
	}

    value->addr = (XPointer) &chrome_child_type;
    value->size = sizeof(chrome_child_type);
}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*																		*/
/* Core Class methods													*/
/*																		*/
/*----------------------------------------------------------------------*/
static void
Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
{
    XfeChromePart *		cp = _XfeChromePart(nw);

    /* Finish of initialization */
    _XfeManagerChainInitialize(rw,nw,xfeChromeWidgetClass);
}
/*----------------------------------------------------------------------*/
static void
Destroy(Widget w)
{
    XfeChromePart *		cp = _XfeChromePart(w);

}
/*----------------------------------------------------------------------*/
static Boolean
SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
{
    XfeChromePart *		np = _XfeChromePart(nw);
    XfeChromePart *		op = _XfeChromePart(ow);
    int					i, j;
    static size_t	    viewOffsets[] = {
		XtOffsetOf(XfeChromePart , center_view),
		XtOffsetOf(XfeChromePart , top_view),
		XtOffsetOf(XfeChromePart , bottom_view),
		XtOffsetOf(XfeChromePart , left_view),
		XtOffsetOf(XfeChromePart , right_view),
    };

	/* spacing */
	if (np->spacing != op->spacing)
	{
		_XfemConfigFlags(nw) |= XfeConfigLayout;
	}

	/* menu_bar */
	if (np->menu_bar != op->menu_bar)
	{
		np->menu_bar = op->menu_bar;

		_XfeWarning(nw,MESSAGE2);
	}

	/* tool_box */
	if (np->tool_box != op->tool_box)
	{
		np->tool_box = op->tool_box;

		_XfeWarning(nw,MESSAGE3);
	}

	/* dash_board */
	if (np->dash_board != op->dash_board)
	{
		np->dash_board = op->dash_board;

		_XfeWarning(nw,MESSAGE4);
	}

    /* check the views */

#define	WidgetAtOffset(str, offs)	(*(Widget*)((char*)(str) + (offs)))

    for (i = 0; i < XtNumber(viewOffsets); i++)
    {
        Widget newWidget = WidgetAtOffset(np, viewOffsets[i]);
        if (newWidget != WidgetAtOffset(op, viewOffsets[i]))
        {
            /* widget at postion i was changed */

            _XfemConfigFlags(nw) |= XfeConfigLayout;

            for (j = 0; j < XtNumber(viewOffsets); j++)
            {
                if (j == i)
                {
                    continue;
                }

                if (newWidget != NULL &&
                    newWidget == WidgetAtOffset(np, viewOffsets[j]))
                {
                    /*
                     * The new widget for element position i is also
                     * present in position j.
                     *
                     * If there's a change at position j, this is an
                     * error.  If position j was not changed, silently
                     * move the widget from position j to i.
                     */

                    if (newWidget != WidgetAtOffset(op, viewOffsets[j]))
                    {
                        _XfeWarning(nw, MESSAGE5);
                    }

                    WidgetAtOffset(np, viewOffsets[j]) = NULL;
                }
            }
        }
    }

#undef	WidgetAtOffset

    return _XfeManagerChainSetValues(ow,rw,nw,xfeChromeWidgetClass);
}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*																		*/
/* Constraint class methods												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void
ConstraintInitialize(Widget rc,Widget nc,ArgList av,Cardinal * ac)
{
  	Widget						w = _XfeParent(nc);
	XfeChromeConstraintPart *	cp = _XfeChromeConstraintPart(nc);

    /* Make sure the chrome child type is ok */
    XfeRepTypeCheck(nc,XmRChromeChildType,&cp->chrome_child_type,
					XmCHROME_IGNORE);

	/* Finish constraint initialization */
	_XfeConstraintChainInitialize(rc,nc,xfeChromeWidgetClass);
}
/*----------------------------------------------------------------------*/
static Boolean
ConstraintSetValues(Widget oc,Widget rc,Widget nc,ArgList av,Cardinal * ac)
{
	Widget						w = XtParent(nc);
 	XfeChromeConstraintPart *	ncp = _XfeChromeConstraintPart(nc);
 	XfeChromeConstraintPart *	ocp = _XfeChromeConstraintPart(oc);

	/* chrome_child_type */
	if (ncp->chrome_child_type != ocp->chrome_child_type)
	{
		/* Make sure the new chrome child type is ok */
		XfeRepTypeCheck(nc,XmRChromeChildType,&ncp->chrome_child_type,
						XmCHROME_IGNORE);
	}

	/* Finish constraint set values */
	return _XfeConstraintChainSetValues(oc,rc,nc,xfeChromeWidgetClass);
}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeManager class methods												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void
PreferredGeometry(Widget w,Dimension * width,Dimension * height)
{
    XfeChromePart *		cp = _XfeChromePart(w);
	Dimension			max_width = 0;
	Dimension			max_height = 0;

	*width  = _XfemOffsetLeft(w) + _XfemOffsetRight(w);
	*height = _XfemOffsetTop(w)  + _XfemOffsetBottom(w);

	/* center_view */
	if (SHOW_CENTER_VIEW(cp))
	{
		max_width = _XfeWidth(cp->center_view);
		max_height = _XfeHeight(cp->center_view);
	}

	/* bottom_view */
	if (SHOW_BOTTOM_VIEW(cp))
	{
		max_width = XfeMax(max_width,_XfeWidth(cp->bottom_view));
		
		*height += _XfeHeight(cp->bottom_view);
	}

	/* top_view */
	if (SHOW_TOP_VIEW(cp))
	{
		max_width = XfeMax(max_width,_XfeWidth(cp->top_view));
		
		*height += _XfeHeight(cp->top_view);
	}

	/* menu_bar */
	if (SHOW_MENU_BAR(cp))
	{
		max_width = XfeMax(max_width,_XfeWidth(cp->menu_bar));
		
		*height += _XfeHeight(cp->menu_bar);
	}

	/* tool_box */
	if (SHOW_TOOL_BOX(cp))
	{
		max_width = XfeMax(max_width,_XfeWidth(cp->tool_box));
		
		*height += _XfeHeight(cp->tool_box);
	}

	/* dash_board */
	if (SHOW_DASH_BOARD(cp))
	{
		max_width = XfeMax(max_width,_XfeWidth(cp->dash_board));
		
		*height += _XfeHeight(cp->dash_board);
	}

	/* left_view */
	if (SHOW_LEFT_VIEW(cp))
	{
		*width += _XfeWidth(cp->left_view);
		
		max_height = XfeMax(max_height,_XfeHeight(cp->left_view));
	}

	/* right_view */
	if (SHOW_RIGHT_VIEW(cp))
	{
		*width += _XfeWidth(cp->right_view);
		
		max_height = XfeMax(max_height,_XfeHeight(cp->right_view));
	}

	*width += max_width;
	*height += max_height;


    /*
     * HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY
     *
     * This is a complete HACK.  Hardcode the dimensions to 640x480
     * until I write some clever code to compute dimensions from
     * resources, command line, children preferred geometries, and
     * other magical things.
     *
     * HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY HACKERY
     */
    if (*width <= 2)
    {
      *width = 600;
    }
    
    if (*height <= 2)
    {
      *height = 480;
    }
}
/*----------------------------------------------------------------------*/
static Boolean
AcceptChild(Widget child)
{
	Widget				w = XtParent(child);
	XfeChromePart *		cp = _XfeChromePart(w);
	Boolean				accept = True;

	/* menu_bar */
	if (IS_MENU_BAR(child))
	{
		accept = !cp->menu_bar;
	}
	/* tool_box */
	else if (IS_TOOL_BOX(child))
	{
		accept = !cp->tool_box;
	}
	/* dash_board */
	else if (IS_DASH_BOARD(child))
	{
		accept = !cp->dash_board;
	}
	/* view / top_view / bottom_view */
	else if (!cp->center_view ||
			 !cp->top_view ||
			 !cp->bottom_view ||
			 !cp->left_view ||
			 !cp->right_view)
	{
		accept = True;
	}

	return accept;
}
/*----------------------------------------------------------------------*/
static Boolean
InsertChild(Widget child)
{
	Widget				w = XtParent(child);
	XfeChromePart *		cp = _XfeChromePart(w);
	Boolean				layout = False;

	/* menu_bar */
	if (IS_MENU_BAR(child))
	{
		cp->menu_bar = child;

		layout = True;
	}
	/* tool_box */
	else if (IS_TOOL_BOX(child))
	{
		cp->tool_box = child;

		layout = True;
	}
	/* dash_board */
	else if (IS_DASH_BOARD(child))
	{
		cp->dash_board = child;

		layout = True;
	}
	/* center_view */
	else if (!cp->center_view)
	{
		cp->center_view = child;

		layout = True;
	}
	/* top_view */
	else if (!cp->top_view)
	{
		cp->top_view = child;

		layout = True;
	}
	/* bottom_view */
	else if (!cp->bottom_view)
	{
		cp->bottom_view = child;

		layout = True;
	}
	/* left_view */
	else if (!cp->left_view)
	{
		cp->left_view = child;

		layout = True;
	}
	/* right_view */
	else if (!cp->right_view)
	{
		cp->right_view = child;

		layout = True;
	}

	return layout;
}
/*----------------------------------------------------------------------*/
static Boolean
DeleteChild(Widget child)
{
	Widget				w = XtParent(child);
	XfeChromePart *		cp = _XfeChromePart(w);

	/* menu_bar */
	if (child == cp->menu_bar)
	{
		cp->menu_bar = NULL;
	}
	/* tool_box */
	else if (child == cp->tool_box)
	{
		cp->tool_box = NULL;
	}
	/* dash_board */
	else if (child == cp->dash_board)
	{
		cp->dash_board = NULL;
	}
	/* center_view */
	else if (child == cp->center_view)
	{
		cp->center_view = NULL;
	}
	/* top_view */
	else if (child == cp->top_view)
	{
		cp->top_view = NULL;
	}
	/* bottom_view */
	else if (child == cp->bottom_view)
	{
		cp->bottom_view = NULL;
	}
	/* left_view */
	else if (child == cp->left_view)
	{
		cp->left_view = NULL;
	}
	/* right_view */
	else if (child == cp->right_view)
	{
		cp->right_view = NULL;
	}
	
	return True;
}
/*----------------------------------------------------------------------*/
static void
LayoutChildren(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);

	/* menu_bar */
	if (SHOW_MENU_BAR(cp))
	{
		LayoutMenuBar(w);
	}

	/* tool_box */
	if (SHOW_TOOL_BOX(cp))
	{
		LayoutToolBox(w);
	}

	/* dash_board */
	if (SHOW_DASH_BOARD(cp))
	{
		LayoutDashBoard(w);
	}

	/* top_view */
	if (SHOW_TOP_VIEW(cp))
	{
		LayoutTopView(w);
	}

	/* left_view */
	if (SHOW_LEFT_VIEW(cp))
	{
		LayoutLeftView(w);
	}

	/* bottom_view */
	if (SHOW_BOTTOM_VIEW(cp))
	{
		LayoutBottomView(w);
	}

	/* right_view */
	if (SHOW_RIGHT_VIEW(cp))
	{
		LayoutRightView(w);
	}

	/* center_view */
	if (SHOW_CENTER_VIEW(cp))
	{
		LayoutCenterView(w);
	}
}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*																		*/
/* Misc XfeChrome functions												*/
/*																		*/
/*----------------------------------------------------------------------*/
static void
LayoutMenuBar(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);

	assert( SHOW_MENU_BAR(cp) );

	/* Place the menu bar on the very top and occupy the full width */
	_XfeConfigureWidget(cp->menu_bar,
						_XfemRectX(w),
						_XfemRectY(w),
						_XfemRectWidth(w),
						_XfeHeight(cp->menu_bar));
}
/*----------------------------------------------------------------------*/
static void
LayoutToolBox(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);

	assert( SHOW_TOOL_BOX(cp) );

	/* Menu bar is shown */
	if (SHOW_MENU_BAR(cp))
	{
		/* Place the tool box right after the menu bar */
		_XfeConfigureWidget(cp->tool_box,

							_XfemRectX(w),
							
							_XfeY(cp->menu_bar) +
							_XfeHeight(cp->menu_bar),
							
							_XfemRectWidth(w),

							_XfeHeight(cp->tool_box));
	}
	/* Menu bar is not shown */
	else
	{
		/* Place the tool box on the very top */
		_XfeConfigureWidget(cp->tool_box,

							_XfemRectX(w),
							
							_XfemRectY(w),
							
							_XfemRectWidth(w),

							_XfeHeight(cp->tool_box));
	}

}
/*----------------------------------------------------------------------*/
static void
LayoutDashBoard(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);

	assert( SHOW_DASH_BOARD(cp) );

	/* Make sure the dash board looks right */
	XtVaSetValues(cp->dash_board,
				  XmNusePreferredWidth,		False,
				  XmNusePreferredHeight,	True,
				  NULL);

	/* Place the dash board the very bottom and occupy the full width */
	_XfeConfigureWidget(cp->dash_board,

						_XfemRectX(w),
						
						_XfeHeight(w) - 
						_XfemOffsetBottom(w) -
						_XfeHeight(cp->dash_board),

						_XfemRectWidth(w),

						_XfeHeight(cp->dash_board));

}
/*----------------------------------------------------------------------*/
static void
LayoutTopView(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);
	Widget			top = NULL;
	Widget			bottom = NULL;
	int				y;
	int				x;
	int				width;
	int				height;

	assert( SHOW_TOP_VIEW(cp) );

	/* tool_box is shown */
	if (SHOW_TOOL_BOX(cp))
	{
		top = cp->tool_box;
	}
	/* menu_bar is shown */
	else if (SHOW_MENU_BAR(cp))
	{
		top = cp->menu_bar;
	}

	if (_XfeIsAlive(top))
	{
		y = _XfeY(top) + _XfeHeight(top) + cp->spacing;
	}
	else
	{
		y = _XfemRectY(w);
	}

	/* left_view is shown */
	if (SHOW_LEFT_VIEW(cp))
	{
		x = _XfemRectX(w) + _XfeWidth(cp->left_view);

		width = _XfemRectWidth(w) - _XfeWidth(cp->left_view);
	}
	else
	{
		x = _XfemRectX(w);

		width = _XfemRectWidth(w);
	}
	
	/* right_view is shown */
	if (SHOW_RIGHT_VIEW(cp))
	{
		width -= _XfeWidth(cp->right_view);
	}

	height = _XfeHeight(cp->top_view);
	
	/* Place the top_view */
	_XfeConfigureWidget(cp->top_view,x,y,width,height);
}
/*----------------------------------------------------------------------*/
static void
LayoutBottomView(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);
	Widget			top = NULL;
	Widget			bottom = NULL;
	int				y;
	int				x;
	int				width;
	int				height;

	assert( SHOW_BOTTOM_VIEW(cp) );

	/* dash_board is shown */
	if (SHOW_DASH_BOARD(cp))
	{
		bottom = cp->dash_board;
	}

	if (_XfeIsAlive(bottom))
	{
		y = _XfeY(bottom) - cp->spacing;
	}
	else
	{
		y = _XfeHeight(w) - _XfemOffsetBottom(w);
	}

	y -= _XfeHeight(cp->bottom_view);

	/* left_view is shown */
	if (SHOW_LEFT_VIEW(cp))
	{
		x = _XfemRectX(w) + _XfeWidth(cp->left_view);

		width = _XfemRectWidth(w) - _XfeWidth(cp->left_view);
	}
	else
	{
		x = _XfemRectX(w);

		width = _XfemRectWidth(w);
	}
	
	/* right_view is shown */
	if (SHOW_RIGHT_VIEW(cp))
	{
		width -= _XfeWidth(cp->right_view);
	}

	height = _XfeHeight(cp->bottom_view);

	/* Place the bottom_view */
	_XfeConfigureWidget(cp->bottom_view,x,y,width,height);
}
/*----------------------------------------------------------------------*/
static void
LayoutCenterView(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);
	Widget			top = NULL;
	Widget			bottom = NULL;
	int				y;
	int				y2;
	int				x;
	int				width;
	int				height;

	assert( SHOW_CENTER_VIEW(cp) );

	/* top_view is shown */
	if (SHOW_TOP_VIEW(cp))
	{
		top = cp->top_view;
	}
	/* tool_box is shown */
	else if (SHOW_TOOL_BOX(cp))
	{
		top = cp->tool_box;
	}
	/* menu_bar is shown */
	else if (SHOW_MENU_BAR(cp))
	{
		top = cp->menu_bar;
	}

	/* bottom_view is shown */
	if (SHOW_BOTTOM_VIEW(cp))
	{
		bottom = cp->bottom_view;
	}
	/* dash_board is shown */
	else if (SHOW_DASH_BOARD(cp))
	{
		bottom = cp->dash_board;
	}

	if (_XfeIsAlive(top))
	{
		y = _XfeY(top) + _XfeHeight(top) + cp->spacing;
	}
	else
	{
		y = _XfemRectY(w);
	}

	if (_XfeIsAlive(bottom))
	{
		y2 = _XfeY(bottom) - cp->spacing;
	}
	else
	{
		y2 = _XfeHeight(w) - _XfemOffsetBottom(w);
	}

	/* left_view is shown */
	if (SHOW_LEFT_VIEW(cp))
	{
		x = _XfemRectX(w) + _XfeWidth(cp->left_view);

		width = _XfemRectWidth(w) - _XfeWidth(cp->left_view);
	}
	else
	{
		x = _XfemRectX(w);

		width = _XfemRectWidth(w);
	}
	
	/* right_view is shown */
	if (SHOW_RIGHT_VIEW(cp))
	{
		width -= _XfeWidth(cp->right_view);
	}

	height = y2 - y;

	/* Place the center_view */
	_XfeConfigureWidget(cp->center_view,x,y,width,height);
}
/*----------------------------------------------------------------------*/
static void
LayoutLeftView(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);
	Widget			top = NULL;
	Widget			bottom = NULL;
	Position		y1;
	Position		y2;

	assert( SHOW_LEFT_VIEW(cp) );

#if 0
	/* tool_box is shown */
	if (SHOW_TOOL_BOX(cp))
	{
		top = cp->tool_box;
	}
	/* menu_bar is shown */
	else if (SHOW_MENU_BAR(cp))
	{
		top = cp->menu_bar;
	}

	if (_XfeIsAlive(top))
	{
		y1 = _XfeY(top) + _XfeHeight(top) + cp->spacing;
	}
	else
	{
		y1 = _XfemRectY(w);
	}

	/* Place the top_view */
	_XfeConfigureWidget(cp->top_view,
						
						_XfemRectX(w),
							
						y1,
							
						_XfemRectWidth(w),

						_XfeHeight(cp->top_view));

#endif

}
/*----------------------------------------------------------------------*/
static void
LayoutRightView(Widget w)
{
    XfeChromePart *	cp = _XfeChromePart(w);
	Widget			top = NULL;
	Widget			bottom = NULL;
	Position		y1;
	Position		y2;

	assert( SHOW_RIGHT_VIEW(cp) );

#if 0
	/* tool_box is shown */
	if (SHOW_TOOL_BOX(cp))
	{
		top = cp->tool_box;
	}
	/* menu_bar is shown */
	else if (SHOW_MENU_BAR(cp))
	{
		top = cp->menu_bar;
	}

	if (_XfeIsAlive(top))
	{
		y1 = _XfeY(top) + _XfeHeight(top) + cp->spacing;
	}
	else
	{
		y1 = _XfemRectY(w);
	}

	/* Place the top_view */
	_XfeConfigureWidget(cp->top_view,
						
						_XfemRectX(w),
							
						y1,
							
						_XfemRectWidth(w),

						_XfeHeight(cp->top_view));

#endif

}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
/*																		*/
/* XfeChrome Public Methods												*/
/*																		*/
/*----------------------------------------------------------------------*/
Widget
XfeCreateChrome(Widget pw,char * name,Arg * av,Cardinal ac)
{
	return XtCreateWidget(name,xfeChromeWidgetClass,pw,av,ac);
}
/*----------------------------------------------------------------------*/
/* extern */ Widget
XfeChromeGetComponent(Widget chrome,unsigned char component)
{
    XfeChromePart *		cp = _XfeChromePart(chrome);
	Widget				cw = NULL;

	switch(component)
	{
	case XmCHROME_MENU_BAR:
		cw = cp->menu_bar;
		break;

	case XmCHROME_TOOL_BOX:
		cw = cp->tool_box;
		break;

	case XmCHROME_TOP_VIEW:
		cw = cp->top_view;
		break;

	case XmCHROME_CENTER_VIEW:
		cw = cp->center_view;
		break;

	case XmCHROME_BOTTOM_VIEW:
		cw = cp->bottom_view;
		break;

	case XmCHROME_DASH_BOARD:
		cw = cp->dash_board;
		break;
	}

	return cw;
}
/*----------------------------------------------------------------------*/
