Blame lib/Xm/PanedW.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$TOG: PanedW.c /main/24 1999/07/13 07:46:01 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY  */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <ctype.h>
Packit b099d7
#include <X11/cursorfont.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/PanedWP.h>
Packit b099d7
#include <Xm/SeparatoG.h>
Packit b099d7
#include <Xm/SashP.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "MessagesI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
Packit b099d7
typedef enum {FirstPane='U', LastPane='L'} Direction;
Packit b099d7
Packit b099d7
#define MESSAGE4	_XmMMsgPanedW_0000
Packit b099d7
#define MESSAGE5	_XmMMsgPanedW_0001
Packit b099d7
#define MESSAGE6	_XmMMsgPanedW_0002
Packit b099d7
#define MESSAGE8	_XmMMsgPanedW_0004
Packit b099d7
#define MESSAGE9	_XmMMsgPanedW_0005
Packit b099d7
Packit b099d7
#define PaneInfo(w)	((XmPanedWindowConstraintPtr)(w)->core.constraints)
Packit b099d7
#define IsPane(w)	(PaneInfo(w)->panedw.isPane)
Packit b099d7
#define PaneIndex(w)	(PaneInfo(w)->panedw.position)
Packit b099d7
#define PanePosIndex(w)	(PaneInfo(w)->panedw.position_index)
Packit b099d7
Packit b099d7
/*****************************************************************/
Packit b099d7
/* Code used for carrying the orientation code is a clean way.
Packit b099d7
   Do not manipulate width, height, or x and y anymore, but
Packit b099d7
   a major and minor dimension and an independant position */
Packit b099d7
Packit b099d7
#define Horizontal(pw) ((pw)->paned_window.orientation == XmHORIZONTAL)
Packit b099d7
Packit b099d7
Packit b099d7
/* since we cannot change the instance record field name, for binary 
Packit b099d7
   compatibility,  we have to macro those as well */
Packit b099d7
#define PaneDMajor(w)	(PaneInfo(w)->panedw.dheight)
Packit b099d7
#define PaneDPos(w)	(PaneInfo(w)->panedw.dy)
Packit b099d7
#define PaneOldDPos(w)	(PaneInfo(w)->panedw.olddy)
Packit b099d7
Packit b099d7
#define PaneStartPos(w)	(w->paned_window.starty)
Packit b099d7
#define PaneFirst(w)	(w->paned_window.top_pane)
Packit b099d7
#define PaneLast(w)	(w->paned_window.bottom_pane)
Packit b099d7
#define PaneFirstDMajor(w) (w->paned_window.top_pane->panedw.dheight)
Packit b099d7
#define PaneLastDMajor(w)  (w->paned_window.bottom_pane->panedw.dheight)
Packit b099d7
Packit b099d7
Packit b099d7
/* then come all the new paradigm of major/minor dimension */
Packit b099d7
Packit b099d7
#define Major(pw, w, h) ((Horizontal(pw))?w:h)
Packit b099d7
#define Minor(pw, w, h) (Major(pw,h,w))
Packit b099d7
Packit b099d7
#define MajorMargin(pw) (Major(pw, (pw)->paned_window.margin_width,\
Packit b099d7
			    (pw)->paned_window.margin_height))
Packit b099d7
#define MinorMargin(pw) (Major(pw, (pw)->paned_window.margin_height,\
Packit b099d7
			    (pw)->paned_window.margin_width))
Packit b099d7
Packit b099d7
#define MajorSize(pw) (Major(pw, (pw)->core.width, (pw)->core.height))
Packit b099d7
#define MinorSize(pw) (Major(pw, (pw)->core.height, (pw)->core.width))
Packit b099d7
Packit b099d7
#define MajorChildSize(pw, child) (Major(pw, \
Packit b099d7
                       (child)->core.width, (child)->core.height))
Packit b099d7
#define MinorChildSize(pw, child) (Major(pw, \
Packit b099d7
                       (child)->core.height, (child)->core.width))
Packit b099d7
Packit b099d7
#define MajorChildPos(pw, child) (Major(pw, (child)->core.x, (child)->core.y))
Packit b099d7
Packit b099d7
#define MajorReq(pw, request) (Major(pw, (request)->width, (request)->height))
Packit b099d7
#define MinorReq(pw, request) (Major(pw, (request)->height, (request)->width))
Packit b099d7
Packit b099d7
#define MajorAssign(pw,x,v) if (Horizontal(pw)) (x).width = v; else (x).height = v
Packit b099d7
#define MinorAssign(pw,x,v) if (Horizontal(pw)) (x).height = v; else (x).width = v
Packit b099d7
Packit b099d7
Packit b099d7
/*****************************************************************/
Packit b099d7
Packit b099d7
Packit b099d7
  
Packit b099d7
#define XmBLOCK	10  /* used for the list of managed children */
Packit b099d7
Packit b099d7
#define DEFAULT_SASH_INDENT_LTOR       -10
Packit b099d7
#define DEFAULT_SASH_INDENT_RTOL        10
Packit b099d7
Packit b099d7
/* Enumerated values used for HandleSash action, whose parameters
Packit b099d7
   are processing using reptype. */
Packit b099d7
enum { _START, _MOVE, _COMMIT, _KEY };
Packit b099d7
enum { _DEFAULT_INCR, _LARGE_INCR };
Packit b099d7
enum { _UP, _DOWN, _RIGHT, _LEFT, _FIRST, _LAST };
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ReManageChildren( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
static int NeedsAdjusting( 
Packit b099d7
                        register XmPanedWindowWidget pw) ;
Packit b099d7
static XtGeometryResult AdjustPanedWindowMajor( 
Packit b099d7
                        XmPanedWindowWidget pw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int newdim,
Packit b099d7
#else
Packit b099d7
                        Dimension newdim,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
                        Dimension *reply_dim) ;
Packit b099d7
static void ResetDMajors( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
static void RefigureLocations( 
Packit b099d7
                        register XmPanedWindowWidget pw,
Packit b099d7
                        int c_index,
Packit b099d7
                        Direction dir,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int rflag,
Packit b099d7
			int sflag) ;
Packit b099d7
#else
Packit b099d7
                        Boolean rflag,
Packit b099d7
                        Boolean sflag) ;
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
static void CommitNewLocations( 
Packit b099d7
                        XmPanedWindowWidget pw,
Packit b099d7
                        Widget instigator) ;
Packit b099d7
static void RefigureLocationsAndCommit( 
Packit b099d7
                        XmPanedWindowWidget pw,
Packit b099d7
                        int c_index,
Packit b099d7
                        Direction dir,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int rflag) ;
Packit b099d7
#else
Packit b099d7
                        Boolean rflag) ;
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
static void DrawTrackLines( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
static void EraseTrackLines( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
static void ProcessKeyEvent( 
Packit b099d7
                        XtPointer client_data,
Packit b099d7
                        XtIntervalId *id) ;
Packit b099d7
static void HandleSash( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer callData) ;
Packit b099d7
static XtGeometryResult GeometryManager( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *reply) ;
Packit b099d7
static void SashIndentDefault(Widget widget,
Packit b099d7
			      int offset,
Packit b099d7
			      XrmValue *value );
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget request,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void ConstraintInit( 
Packit b099d7
                        Widget request,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void Realize( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtValueMask *p_valueMask,
Packit b099d7
                        XSetWindowAttributes *attributes) ;
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static Cardinal InsertOrder( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void InsertChild( 
Packit b099d7
                        register Widget w) ;
Packit b099d7
static void ChangeManaged( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void Resize( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget cw,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean PaneSetValues( 
Packit b099d7
                        Widget old,
Packit b099d7
                        Widget request,
Packit b099d7
                        Widget new_w,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void ConstraintDestroy( 
Packit b099d7
                        Widget w) ;
Packit b099d7
static void AdjustGC( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
static void GetFlipGC( 
Packit b099d7
                        XmPanedWindowWidget pw) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Paned Window Resources
Packit b099d7
 *
Packit b099d7
 ****************************************************************/
Packit b099d7
#define Offset(field) XtOffsetOf( struct _XmPanedWindowRec, paned_window.field)
Packit b099d7
Packit b099d7
static XtResource resources[] = {
Packit b099d7
    {XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
       Offset(margin_width), XmRImmediate, (XtPointer) 3},
Packit b099d7
Packit b099d7
    {XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
       Offset(margin_height), XmRImmediate, (XtPointer) 3},
Packit b099d7
Packit b099d7
/* need to change the XmR to something dynamic: XmRPanedWMajorDimension,
Packit b099d7
   that checks eh orientation first */
Packit b099d7
    {XmNspacing, XmCSpacing, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
       Offset(spacing), XmRImmediate, (XtPointer) 8},
Packit b099d7
Packit b099d7
    {XmNrefigureMode, XmCBoolean, XmRBoolean, sizeof(Boolean),
Packit b099d7
       Offset(refiguremode), XmRImmediate, (XtPointer) TRUE},
Packit b099d7
Packit b099d7
    {XmNseparatorOn, XmCSeparatorOn, XmRBoolean, sizeof(Boolean),
Packit b099d7
       Offset(separator_on), XmRImmediate, (XtPointer) TRUE},
Packit b099d7
Packit b099d7
/* need to change the XmR to something dynamic XmRPanedWMinorDimension */
Packit b099d7
    {XmNsashIndent, XmCSashIndent, XmRHorizontalPosition, sizeof(Position),
Packit b099d7
       Offset(sash_indent), XmRCallProc, (XtPointer) SashIndentDefault},
Packit b099d7
Packit b099d7
    {XmNsashWidth, XmCSashWidth, XmRHorizontalDimension, sizeof(Dimension),
Packit b099d7
       Offset(sash_width), XmRImmediate, (XtPointer) 10},
Packit b099d7
Packit b099d7
    {XmNsashHeight, XmCSashHeight, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
       Offset(sash_height), XmRImmediate, (XtPointer) 10},
Packit b099d7
Packit b099d7
    {XmNsashShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
Packit b099d7
       sizeof(Dimension), Offset(sash_shadow_thickness), XmRCallProc,
Packit b099d7
       (XtPointer) _XmSetThickness},
Packit b099d7
Packit b099d7
    {XtNinsertPosition, XtCInsertPosition, XtRFunction, sizeof(XtOrderProc),
Packit b099d7
       XtOffsetOf(XmPanedWindowRec, composite.insert_position),
Packit b099d7
       XtRImmediate, (XtPointer) InsertOrder},
Packit b099d7
Packit b099d7
    {XmNorientation, XmCOrientation, XmROrientation, 
Packit b099d7
       sizeof(unsigned char),  Offset(orientation), 
Packit b099d7
       XmRImmediate, (XtPointer) XmVERTICAL
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Definition for resources that need special processing in get values */
Packit b099d7
Packit b099d7
static XmSyntheticResource get_resources[] =
Packit b099d7
{
Packit b099d7
   { XmNmarginWidth, 
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(margin_width),
Packit b099d7
     XmeFromHorizontalPixels,
Packit b099d7
     XmeToHorizontalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNmarginHeight,
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(margin_height),
Packit b099d7
     XmeFromVerticalPixels,
Packit b099d7
     XmeToVerticalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNspacing,
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(spacing),
Packit b099d7
/* need to change to something dynamic FromPanedWMajorPixels, and
Packit b099d7
   ToPanedWMajorPixels, that check orientation first  */
Packit b099d7
     XmeFromVerticalPixels,
Packit b099d7
     XmeToVerticalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNsashIndent,
Packit b099d7
     sizeof(Position),
Packit b099d7
     Offset(sash_indent),
Packit b099d7
/* need to change to FromPanedWMinorPixels, and  ToPanedWMinorPixels */
Packit b099d7
     XmeFromVerticalPixels,
Packit b099d7
     XmeToVerticalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNsashWidth,
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(sash_width),
Packit b099d7
     XmeFromHorizontalPixels,
Packit b099d7
     XmeToHorizontalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNsashHeight,
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(sash_height),
Packit b099d7
     XmeFromVerticalPixels,
Packit b099d7
     XmeToVerticalPixels
Packit b099d7
   },
Packit b099d7
Packit b099d7
   { XmNsashShadowThickness,
Packit b099d7
     sizeof(Dimension),
Packit b099d7
     Offset(sash_shadow_thickness),
Packit b099d7
     XmeFromHorizontalPixels,
Packit b099d7
     XmeToHorizontalPixels
Packit b099d7
   },
Packit b099d7
};
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Paned Window Constraint Resources For Its Constraint Record
Packit b099d7
 *
Packit b099d7
 ****************************************************************/
Packit b099d7
Packit b099d7
#define Offset(field) XtOffsetOf( struct _XmPanedWindowConstraintRec, panedw.field)
Packit b099d7
Packit b099d7
static XtResource constraint_resources[] = {
Packit b099d7
    {XmNallowResize, XmCBoolean, XmRBoolean, sizeof(Boolean),
Packit b099d7
	 Offset(allow_resize), XmRImmediate, (XtPointer) FALSE},
Packit b099d7
/* need to change the XmR to XmRPanedWMajorDimension */
Packit b099d7
    {XmNpaneMinimum, XmCPaneMinimum, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
         Offset(min), XmRImmediate, (XtPointer) 1},
Packit b099d7
    {XmNpaneMaximum, XmCPaneMaximum, XmRVerticalDimension, sizeof(Dimension),
Packit b099d7
         Offset(max), XmRImmediate, (XtPointer) 1000},
Packit b099d7
Packit b099d7
    {XmNskipAdjust, XmCBoolean, XmRBoolean, sizeof(Boolean),
Packit b099d7
         Offset(skip_adjust), XmRImmediate, (XtPointer) FALSE},
Packit b099d7
    {XmNpositionIndex, XmCPositionIndex, XmRShort, sizeof(short),
Packit b099d7
         Offset(position_index), XmRImmediate, (XtPointer) XmLAST_POSITION},
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Definition for constraint resources that need special */
Packit b099d7
/* processing in get values                              */
Packit b099d7
Packit b099d7
static XmSyntheticResource get_constraint_resources[] =
Packit b099d7
{
Packit b099d7
    {  XmNpaneMinimum,
Packit b099d7
       sizeof(Dimension),
Packit b099d7
       Offset(min),
Packit b099d7
/* need to change to FromPanedWMajorPixels and ToPanedWMajorPixels */
Packit b099d7
       XmeFromVerticalPixels,
Packit b099d7
       XmeToVerticalPixels
Packit b099d7
    },
Packit b099d7
Packit b099d7
    {  XmNpaneMaximum,
Packit b099d7
       sizeof(Dimension),
Packit b099d7
       Offset(max),
Packit b099d7
/* need to change to FromPanedWMajorPixels and ToPanedWMajorPixels */
Packit b099d7
       XmeFromVerticalPixels,
Packit b099d7
       XmeToVerticalPixels
Packit b099d7
    },
Packit b099d7
Packit b099d7
};
Packit b099d7
Packit b099d7
#undef Offset
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Description:  PanedWindow full class record
Packit b099d7
 *   -----------
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
externaldef(xmpanedwindowclassrec) XmPanedWindowClassRec xmPanedWindowClassRec =
Packit b099d7
{
Packit b099d7
   {	 					/* core class fields   */
Packit b099d7
      (WidgetClass) &xmManagerClassRec,		/* superclass          */
Packit b099d7
      "XmPanedWindow",				/* class name          */
Packit b099d7
      sizeof(XmPanedWindowRec),			/* size                */
Packit b099d7
      NULL,					/* class initialize    */
Packit b099d7
      ClassPartInitialize,			/* class_part_inite    */
Packit b099d7
      FALSE,					/* class_inited        */
Packit b099d7
      Initialize,				/* initialize          */
Packit b099d7
      NULL,					/* initialize_hook     */
Packit b099d7
      Realize,					/* realize             */
Packit b099d7
      NULL,          				/* actions             */
Packit b099d7
      0,                			/* num_actions         */
Packit b099d7
      resources,				/* resourses           */
Packit b099d7
      XtNumber(resources),			/* resource_count      */
Packit b099d7
      NULLQUARK,				/* xrm_class           */
Packit b099d7
      TRUE,					/* compress_motion     */
Packit b099d7
      XtExposeCompressMaximal,			/* compress_exposure   */
Packit b099d7
      TRUE,					/* compress_enter/lv   */
Packit b099d7
      FALSE,					/* visible_interest    */
Packit b099d7
      Destroy,					/* destroy             */
Packit b099d7
      Resize,					/* resize              */
Packit b099d7
      XmeRedisplayGadgets,			/* expose              */
Packit b099d7
      SetValues,				/* set_values          */
Packit b099d7
      NULL,					/* set_values_hook     */
Packit b099d7
      XtInheritSetValuesAlmost,			/* set_values_almost   */
Packit b099d7
      NULL,					/* get_values_hook     */
Packit b099d7
      NULL,					/* accept_focus        */
Packit b099d7
      XtVersion,				/* version             */
Packit b099d7
      NULL, 					/* callback_private    */
Packit b099d7
      XtInheritTranslations,			/* tm_table            */
Packit b099d7
      NULL,					/* Query Geometry proc */
Packit b099d7
      NULL,					/* display accelerator */
Packit b099d7
      NULL,					/* extension           */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {						/* composite class fields */
Packit b099d7
      GeometryManager,				/* geometry_manager       */
Packit b099d7
      ChangeManaged,				/* change_managed         */
Packit b099d7
      InsertChild,				/* insert_child           */
Packit b099d7
      XtInheritDeleteChild,			/* delete_child           */
Packit b099d7
      NULL,					/* extension              */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {						/* constraint class fields */
Packit b099d7
      constraint_resources,			/* subresourses            */
Packit b099d7
      XtNumber(constraint_resources),		/* subresource_count       */
Packit b099d7
      sizeof(XmPanedWindowConstraintRec),	/* constraint_size         */
Packit b099d7
      ConstraintInit,				/* initialize              */
Packit b099d7
      ConstraintDestroy,			/* destroy                 */
Packit b099d7
      PaneSetValues,				/* set_values              */
Packit b099d7
      NULL,					/* extension               */
Packit b099d7
  }, 
Packit b099d7
Packit b099d7
  {						/* manager_class fields   */
Packit b099d7
      XtInheritTranslations,	 		/* translations      	  */
Packit b099d7
      get_resources,				/* get resources      	  */
Packit b099d7
      XtNumber(get_resources),			/* num get_resources 	  */
Packit b099d7
      get_constraint_resources,			/* get_cont_resources     */
Packit b099d7
      XtNumber(get_constraint_resources),	/* num_get_cont_resources */
Packit b099d7
      XmInheritParentProcess,                   /* parent_process         */
Packit b099d7
      NULL, 					/* extension              */
Packit b099d7
  }, 
Packit b099d7
Packit b099d7
  {						/* paned_window_class fields */
Packit b099d7
      NULL, 					/* extension                 */
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmpanedwindowwidgetclass) WidgetClass xmPanedWindowWidgetClass =
Packit b099d7
					   (WidgetClass) &xmPanedWindowClassRec;
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  SashIndentDefault
Packit b099d7
 *     Set up the default sash indentation
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
SashIndentDefault(Widget widget,
Packit b099d7
		  int offset,	/* unused */
Packit b099d7
		  XrmValue *value )
Packit b099d7
{
Packit b099d7
  static Position indent;
Packit b099d7
Packit b099d7
  value->addr = (XPointer) &indent;
Packit b099d7
Packit b099d7
  if (LayoutIsRtoLM(widget))
Packit b099d7
    indent = (Position) DEFAULT_SASH_INDENT_RTOL;
Packit b099d7
  else
Packit b099d7
    indent = (Position) DEFAULT_SASH_INDENT_LTOR;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassPartInitialize
Packit b099d7
 *     Set up the fast subclassing for the widget.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
  _XmFastSubclassInit (wc, XmPANED_WINDOW_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Initialize
Packit b099d7
 *     The main widget instance initialization routine.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget request,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
  XmPanedWindowWidget pw = (XmPanedWindowWidget) new_w;
Packit b099d7
Packit b099d7
 /* Protect against empty widgets */
Packit b099d7
  pw->paned_window.pane_count = 0;
Packit b099d7
  pw->paned_window.managed_children =
Packit b099d7
                          (WidgetList) XtMalloc(XmBLOCK*sizeof(Widget));
Packit b099d7
  pw->paned_window.num_slots = XmBLOCK;
Packit b099d7
  pw->paned_window.num_managed_children = 0;
Packit b099d7
  PaneStartPos(pw) = 0;
Packit b099d7
  PaneFirst(pw) = NULL;
Packit b099d7
  PaneLast(pw) = NULL;
Packit b099d7
  pw->paned_window.flipgc = NULL;
Packit b099d7
  pw->paned_window.increment_count = 0;
Packit b099d7
  pw->paned_window.resize_at_realize = True;
Packit b099d7
  pw->paned_window.timer = 0 ;
Packit b099d7
Packit b099d7
/*************************************************************
Packit b099d7
 * NOTE: that sash_indent is made to conform to a correct size
Packit b099d7
 * during changed managed time/layout time.  Since the size of
Packit b099d7
 * the window may change we won't require that 
Packit b099d7
 * abs(sash_indent) <= width of a pane.
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
  pw -> paned_window.recursively_called = FALSE;
Packit b099d7
Packit b099d7
  /* DON'T ALLOW HEIGHT/WIDTH TO BE 0, OR X DOESN'T HANDLE THIS WELL */
Packit b099d7
 
Packit b099d7
  if (pw->core.width == 0) pw->core.width = 10;
Packit b099d7
  if (pw->core.height == 0) pw->core.height = 10;
Packit b099d7
Packit b099d7
  /* Check orientation value */
Packit b099d7
  if(!XmRepTypeValidValue(XmRID_ORIENTATION, 
Packit b099d7
			  pw->paned_window.orientation, (Widget) pw)) {
Packit b099d7
      pw->paned_window.orientation = XmVERTICAL;
Packit b099d7
  }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Realize
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    Create our window, set NW gravity (Realize), set up
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
Realize(
Packit b099d7
        Widget w,
Packit b099d7
        XtValueMask *p_valueMask,
Packit b099d7
        XSetWindowAttributes *attributes )
Packit b099d7
{
Packit b099d7
    register XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
Packit b099d7
    WidgetList children = pw->paned_window.managed_children;
Packit b099d7
    int num_children = pw->paned_window.num_managed_children;
Packit b099d7
    Widget *childP;
Packit b099d7
    Mask valueMask = *p_valueMask;
Packit b099d7
Packit b099d7
    valueMask |= CWBitGravity | CWDontPropagate;
Packit b099d7
    attributes->bit_gravity = NorthWestGravity;
Packit b099d7
    attributes->do_not_propagate_mask = ButtonPressMask|
Packit b099d7
	ButtonReleaseMask|KeyPressMask|KeyReleaseMask|PointerMotionMask;
Packit b099d7
Packit b099d7
    XtCreateWindow (w, InputOutput, CopyFromParent, valueMask, attributes);
Packit b099d7
Packit b099d7
    GetFlipGC(pw);
Packit b099d7
Packit b099d7
    /* one last time, in case we grew to try to return an
Packit b099d7
     * XtGeometryAlmost for a child, but the child decided not to grow 
Packit b099d7
     * or in case some child grew itself and we didn't hear about it.
Packit b099d7
     */
Packit b099d7
    if (pw->paned_window.resize_at_realize) {
Packit b099d7
	XtWidgetProc resize;
Packit b099d7
Packit b099d7
	_XmProcessLock();
Packit b099d7
	resize = pw->core.widget_class->core_class.resize;
Packit b099d7
	_XmProcessUnlock();
Packit b099d7
Packit b099d7
	(*resize)( (Widget) pw );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    ReManageChildren(pw);
Packit b099d7
Packit b099d7
    children = pw->paned_window.managed_children;
Packit b099d7
    num_children = pw->paned_window.num_managed_children;
Packit b099d7
Packit b099d7
    /* now we have to make sure all the sashs are on above their
Packit b099d7
     * panes, which means that we have to realize all our children
Packit b099d7
     * here and now.  If we realize from the beginning of the list,
Packit b099d7
     * then the sashs (which are at the end) will be Above by default. */
Packit b099d7
Packit b099d7
    for (childP = children; childP - children < num_children; childP++)
Packit b099d7
	    XtRealizeWidget( *childP );
Packit b099d7
Packit b099d7
} /* Realize */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Destroy
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
Destroy(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
    XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
Packit b099d7
Packit b099d7
    if (pw->paned_window.timer)
Packit b099d7
	XtRemoveTimeOut(pw->paned_window.timer);
Packit b099d7
Packit b099d7
    if (pw->paned_window.flipgc != NULL) {
Packit b099d7
       XtReleaseGC(w, pw->paned_window.flipgc);
Packit b099d7
       pw->paned_window.flipgc = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XtFree( (char *) pw->paned_window.managed_children);
Packit b099d7
Packit b099d7
} /* Destroy */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Resize
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
Resize(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmPanedWindowWidget pw = (XmPanedWindowWidget) wid ;
Packit b099d7
    RefigureLocationsAndCommit( pw, pw->paned_window.pane_count - 1, 
Packit b099d7
			       LastPane, True);
Packit b099d7
} /* Resize */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ConstraintDestroy
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    Destroy the sash of any pane which is being destroyed.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
ConstraintDestroy(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
   if (!XtIsRectObj(w)) return;
Packit b099d7
Packit b099d7
   /* 
Packit b099d7
    * If this is an ordinary pane,  delete its sash (if it has one)
Packit b099d7
    * and separator (if it has one) and then invoke the standard
Packit b099d7
    * inherited delete child routines.
Packit b099d7
    */
Packit b099d7
   if (XtIsRectObj(w) && IsPane(w))
Packit b099d7
   {
Packit b099d7
        if (PaneInfo(w)->panedw.sash != NULL)
Packit b099d7
          XtDestroyWidget(PaneInfo(w)->panedw.sash);
Packit b099d7
Packit b099d7
        if (PaneInfo(w)->panedw.separator != NULL)
Packit b099d7
          XtDestroyWidget(PaneInfo(w)->panedw.separator);
Packit b099d7
Packit b099d7
 	/* the destroyed child has already been removed from the list of
Packit b099d7
 	** children, so update the other panes so that their positions match
Packit b099d7
 	** their positionIndex values (no need to be clever and update only 
Packit b099d7
 	** those that change)
Packit b099d7
 	*/
Packit b099d7
 	{
Packit b099d7
 	XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
Packit b099d7
	if (!(pw->core.being_destroyed))
Packit b099d7
 	  { 	
Packit b099d7
	      int i;
Packit b099d7
	      for (i = 0; 
Packit b099d7
		   (i < pw->composite.num_children) 
Packit b099d7
		       && IsPane(pw->composite.children[i]); 
Packit b099d7
		   i++)
Packit b099d7
		  PanePosIndex(pw->composite.children[i]) = i;
Packit b099d7
	  }
Packit b099d7
 	}
Packit b099d7
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  void AdjustGC(pw)
Packit b099d7
 *          XmPanedWindowWidget  pw;
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *   Set up the clip regions so the track lines do not draw on
Packit b099d7
 *   top of the sashes.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
AdjustGC(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
    XRectangle clip_rect;
Packit b099d7
    register int i;
Packit b099d7
    Region sash_region, clip_region;
Packit b099d7
    if (pw->composite.num_children > 0) {
Packit b099d7
    	sash_region = XCreateRegion();
Packit b099d7
    	clip_region = XCreateRegion();
Packit b099d7
Packit b099d7
    	/* find all the managed sashes and add their area to the sash region */
Packit b099d7
    	for (i = 0; i < pw->composite.num_children; i++)
Packit b099d7
    	{
Packit b099d7
        	if (XmIsSash(pw->composite.children[i]) &&
Packit b099d7
            		XtIsManaged(pw->composite.children[i])) {
Packit b099d7
    	   	clip_rect.width = pw->composite.children[i]->core.width;
Packit b099d7
    	   	clip_rect.height = pw->composite.children[i]->core.height;
Packit b099d7
    	   	clip_rect.x = pw->composite.children[i]->core.x;
Packit b099d7
    	   	clip_rect.y = pw->composite.children[i]->core.y;
Packit b099d7
	   	XUnionRectWithRegion(&clip_rect, sash_region, sash_region);
Packit b099d7
        	}
Packit b099d7
    	}
Packit b099d7
Packit b099d7
    	/* set up the initial clip region */
Packit b099d7
    	clip_rect.width = pw->core.width;
Packit b099d7
    	clip_rect.height = pw->core.height;
Packit b099d7
    	clip_rect.x = 0;
Packit b099d7
    	clip_rect.y = 0;
Packit b099d7
    	XUnionRectWithRegion(&clip_rect, clip_region, clip_region);
Packit b099d7
Packit b099d7
    	/* remove the sash regions from the clip region */
Packit b099d7
    	XSubtractRegion(clip_region, sash_region, clip_region);
Packit b099d7
	
Packit b099d7
    	/* set the clip region, so the track
Packit b099d7
	   lines won't be draw on the sashes */
Packit b099d7
    	XSetRegion(XtDisplay(pw), pw->paned_window.flipgc, clip_region);
Packit b099d7
Packit b099d7
    	/* remove the clip regions */
Packit b099d7
    	XDestroyRegion(sash_region);
Packit b099d7
    	XDestroyRegion(clip_region);
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  void GetFlipGC(pw)
Packit b099d7
 *          XmPanedWindowWidget  pw;
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *   Create a GC which can be used to draw/erase track lines when the
Packit b099d7
 *   the size of the panes is being changed.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
GetFlipGC(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
    unsigned long valuemask = GCForeground | GCSubwindowMode | GCFunction;
Packit b099d7
    unsigned long dynamicMask = GCClipMask;
Packit b099d7
    XGCValues	values;
Packit b099d7
Packit b099d7
    values.foreground = pw->core.background_pixel ^ pw->manager.foreground;
Packit b099d7
    values.subwindow_mode = IncludeInferiors;
Packit b099d7
    values.function = GXxor;
Packit b099d7
    pw->paned_window.flipgc = XtAllocateGC((Widget)pw, 0, valuemask, &values,
Packit b099d7
					   dynamicMask, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  ReManageChildren
Packit b099d7
 *	This procedure will be called by the ChangeManged procedure 
Packit b099d7
 *	It will reassemble the currently managed children into the 
Packit b099d7
 *      "paned_window.managed_children" list.
Packit b099d7
 *  One day I think I'm gonna remove this stuff... dd
Packit b099d7
 ********************************************************************/
Packit b099d7
static void 
Packit b099d7
ReManageChildren(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
   int i;
Packit b099d7
Packit b099d7
   pw->paned_window.num_managed_children = 0;
Packit b099d7
Packit b099d7
   for (i = 0; i < pw->composite.num_children; i++)
Packit b099d7
   {
Packit b099d7
       if (XtIsManaged(pw->composite.children[i]))
Packit b099d7
       {
Packit b099d7
	    if ((pw->paned_window.num_managed_children+1) >
Packit b099d7
				 pw->paned_window.num_slots)
Packit b099d7
            {
Packit b099d7
	       pw->paned_window.num_slots += XmBLOCK;
Packit b099d7
	       pw->paned_window.managed_children = (WidgetList)
Packit b099d7
		  XtRealloc ((char *) pw->paned_window.managed_children,
Packit b099d7
			     (pw->paned_window.num_slots * sizeof(Widget)));
Packit b099d7
            }
Packit b099d7
	    pw->paned_window.managed_children
Packit b099d7
	            [pw->paned_window.num_managed_children++] =
Packit b099d7
		       pw->composite.children[i];
Packit b099d7
       }
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  NeedsAdjusting (pw)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Calculate the major size needed to fully display this paned window.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static int 
Packit b099d7
NeedsAdjusting(
Packit b099d7
        register XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
   int needed, i;
Packit b099d7
Packit b099d7
   needed = 0;
Packit b099d7
   for (i = 0; i < pw->paned_window.pane_count; i++) {
Packit b099d7
     needed += PaneDMajor(pw->paned_window.managed_children[i]) +
Packit b099d7
                 2 * pw->paned_window.managed_children[i]->core.border_width +
Packit b099d7
                 pw->paned_window.spacing;
Packit b099d7
   }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Get rid of extra spacing from previous 'for' loop and add in
Packit b099d7
   * major margin at the top and bottom of the panedw window
Packit b099d7
   */
Packit b099d7
   if (pw->paned_window.pane_count > 0)
Packit b099d7
       needed += 2 * MajorMargin(pw) - pw->paned_window.spacing;
Packit b099d7
Packit b099d7
   return (needed != MajorSize(pw)) ? needed : 0 ;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  AdjustPanedWindowMajor
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Request a new size for the paned window from its parent.
Packit b099d7
 *     If the requested new dim is less than 1, then ask for size of 1.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
AdjustPanedWindowMajor(
Packit b099d7
        XmPanedWindowWidget pw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int newdim,
Packit b099d7
#else
Packit b099d7
        Dimension newdim,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
        Dimension *reply_dim )
Packit b099d7
{
Packit b099d7
    Dimension replyWidth, replyHeight;
Packit b099d7
    XtGeometryResult result = XtGeometryNo;
Packit b099d7
Packit b099d7
    if (newdim < 1) newdim = 1;
Packit b099d7
    switch (XtMakeResizeRequest((Widget)pw, 
Packit b099d7
				Major(pw, newdim, pw->core.width),
Packit b099d7
				Major(pw, pw->core.height, newdim),
Packit b099d7
 			        &replyWidth, &replyHeight))
Packit b099d7
    {
Packit b099d7
      case XtGeometryYes:
Packit b099d7
          *reply_dim = newdim;
Packit b099d7
          result = XtGeometryYes;
Packit b099d7
          break;
Packit b099d7
Packit b099d7
      case XtGeometryAlmost:
Packit b099d7
          XtMakeResizeRequest((Widget)pw, replyWidth, replyHeight, NULL, NULL);
Packit b099d7
          *reply_dim = Major(pw, replyWidth, replyHeight);
Packit b099d7
          result = XtGeometryAlmost;
Packit b099d7
          break;
Packit b099d7
Packit b099d7
      case XtGeometryNo:
Packit b099d7
      default:
Packit b099d7
          *reply_dim = MajorSize(pw);
Packit b099d7
          result = XtGeometryNo;
Packit b099d7
          break;
Packit b099d7
    }
Packit b099d7
    return(result);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ResetDMajors
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Set the desired size field in the constraint record for each
Packit b099d7
 *     pane.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
ResetDMajors(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    for (i=0, childP = pw->paned_window.managed_children; 
Packit b099d7
          i < pw->paned_window.pane_count;  childP++, i++)
Packit b099d7
             PaneDMajor(*childP) = MajorChildSize(pw, *childP);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  RefigureLocations
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *   This is the workhorse routine which actually computes where the children
Packit b099d7
 *   are going to be placed.  It honors any Min/Max constraints placed on a
Packit b099d7
 *   pane as well as honoring the direction to do the refiguring.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
RefigureLocations(
Packit b099d7
        register XmPanedWindowWidget pw,
Packit b099d7
        int c_index,
Packit b099d7
        Direction dir,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int rflag,
Packit b099d7
        int sflag )
Packit b099d7
#else
Packit b099d7
        Boolean rflag,
Packit b099d7
        Boolean sflag )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    WidgetList children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    int _dir = (dir == FirstPane) ? 1 : -1;
Packit b099d7
    int spacing;
Packit b099d7
    XmPanedWindowConstraintPart * pane;
Packit b099d7
    register Widget *childP;
Packit b099d7
    Position pos;
Packit b099d7
    int sizeused;
Packit b099d7
    int cdir, i;
Packit b099d7
    int pass;
Packit b099d7
Packit b099d7
    if (num_panes == 0 || !pw->paned_window.refiguremode)
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    spacing = pw->paned_window.spacing;
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * ENFORCE THE MIN/MAX CONSTRAINTS; ALSO KEEP TRACK OF THE 
Packit b099d7
    * TOTAL SIZE NEEDED TO DISPLAY VPANED WINDOW BASED ON 
Packit b099d7
    * DESIRED SIZES OF PANES.
Packit b099d7
    */
Packit b099d7
   sizeused = 0;
Packit b099d7
   for (childP = children, i = 0; i < num_panes; childP++, i++) 
Packit b099d7
     {
Packit b099d7
       pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
Packit b099d7
       if (PaneDMajor(*childP) < pane->min) PaneDMajor(*childP) = pane->min;
Packit b099d7
       else if (PaneDMajor(*childP) > pane->max) PaneDMajor(*childP) = pane->max;
Packit b099d7
Packit b099d7
       sizeused += PaneDMajor(*childP) + spacing + 2 * (*childP)->core.border_width;
Packit b099d7
Packit b099d7
     }
Packit b099d7
   /*
Packit b099d7
    * Get rid of extra spacing from previous 'for' loop and add in
Packit b099d7
    * margin height at the top and bottom of the paned window
Packit b099d7
    */
Packit b099d7
    sizeused += 2*MajorMargin(pw) - spacing;
Packit b099d7
Packit b099d7
    childP = children + c_index;
Packit b099d7
    if (dir == FirstPane && c_index != num_panes - 1) childP++;
Packit b099d7
    cdir = _dir;
Packit b099d7
   /* allow at most 3 passes through the panes to adjust the heights */
Packit b099d7
    for (pass = 0; sizeused != MajorSize(pw) &&
Packit b099d7
		             pass < (9 * num_panes); pass++) {
Packit b099d7
	pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
	if ((!pane->skip_adjust || sflag) || cdir != _dir) {
Packit b099d7
	    int old = PaneDMajor(*childP);
Packit b099d7
	    if (sizeused < MajorSize(pw))
Packit b099d7
	        PaneDMajor(*childP)+= MajorSize(pw) - sizeused;
Packit b099d7
	    else
Packit b099d7
	        if (sizeused - MajorSize(pw) < PaneDMajor(*childP) &&
Packit b099d7
                    PaneDMajor(*childP) - (sizeused - MajorSize(pw)) > 1)
Packit b099d7
		    PaneDMajor(*childP) -= sizeused - MajorSize(pw);
Packit b099d7
	        else
Packit b099d7
		    PaneDMajor(*childP) = 1;
Packit b099d7
	    if (PaneDMajor(*childP) < pane->min) PaneDMajor(*childP) = pane->min;
Packit b099d7
	    if (PaneDMajor(*childP) > pane->max) PaneDMajor(*childP) = pane->max;
Packit b099d7
	    sizeused += (PaneDMajor(*childP) - old);
Packit b099d7
	}
Packit b099d7
	childP+= cdir;
Packit b099d7
 /*
Packit b099d7
  * WE GET INTO THE NEXT WHILE LOOP WHEN WE HAVE EXHAUSTED OUR
Packit b099d7
  * LIST OF CHILDREN AND WE STILL NEED TO REDISTRIBUTE A CHANGE IN
Packit b099d7
  * SIZE, NOW WE WILL TRY TO CHANGE DIRECTION AND SEE IF THERE
Packit b099d7
  * IS A PANE BACK WHERE WE STARTED FROM THAT CAN ABSORB THE
Packit b099d7
  * SHORTAGE/OVERAGE
Packit b099d7
  */
Packit b099d7
	while ((childP < children) || ((childP - children) >= num_panes)) {
Packit b099d7
	    cdir = -cdir;
Packit b099d7
	    if (cdir == _dir) {
Packit b099d7
    		pos = MajorMargin(pw);
Packit b099d7
    		for (childP = children, i = 0; i < num_panes; childP++, i++) {
Packit b099d7
       			PaneDPos(*childP) = pos;
Packit b099d7
       			pos += PaneDMajor(*childP) + spacing +
Packit b099d7
                             2 * (*childP)->core.border_width;
Packit b099d7
    		}
Packit b099d7
    		pos += MajorMargin(pw) - spacing;
Packit b099d7
                /* if not resizing, make sure the sum of the pane 
Packit b099d7
                   heights are not greater than the vpane height */
Packit b099d7
                if (!rflag){
Packit b099d7
                   if (pos > MajorSize(pw)) {
Packit b099d7
                       childP = children + c_index;
Packit b099d7
                       pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
                       if (PaneDMajor(*childP) > (pos - MajorSize(pw)))
Packit b099d7
                         PaneDMajor(*childP) = (PaneDMajor(*childP) - 
Packit b099d7
                                               (pos - MajorSize(pw))); 
Packit b099d7
                       else
Packit b099d7
                         PaneDMajor(*childP) = 1;
Packit b099d7
                        
Packit b099d7
                   } else {
Packit b099d7
                       return;
Packit b099d7
                   }
Packit b099d7
                } else
Packit b099d7
                   return;
Packit b099d7
             }
Packit b099d7
	     childP = children + c_index + cdir;
Packit b099d7
Packit b099d7
       /* HANDLE SPECIAL CASE */
Packit b099d7
           if ((c_index == 0) && (cdir < 0)) childP++;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    pos = MajorMargin(pw);
Packit b099d7
    for (childP = children, i = 0; i < num_panes; childP++, i++) {
Packit b099d7
       PaneDPos(*childP) = pos;
Packit b099d7
       pos += PaneDMajor(*childP) + spacing +
Packit b099d7
            2 * (*childP)->core.border_width;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  CommitNewLocations
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    Use the core width/height,  It also raises the sash for the
Packit b099d7
 *    pane, and prevents the sash from disappearing from the screen.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
CommitNewLocations(
Packit b099d7
        XmPanedWindowWidget pw,
Packit b099d7
	Widget instigator)
Packit b099d7
{
Packit b099d7
    WidgetList children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    register Widget *childP;
Packit b099d7
    XWindowChanges changes;
Packit b099d7
    int i, offset, sepPos;
Packit b099d7
    int minor_dim, major_dim ;
Packit b099d7
Packit b099d7
    changes.stack_mode = Above;
Packit b099d7
Packit b099d7
    offset = MinorMargin(pw);
Packit b099d7
Packit b099d7
    for (childP = children, i = 0; i < num_panes; childP++, i++) {
Packit b099d7
	register XmPanedWindowConstraintPart * pane =
Packit b099d7
                                 &(PaneInfo(*childP)->panedw);
Packit b099d7
	register Widget sash = pane->sash;
Packit b099d7
	register Widget separator = pane->separator;
Packit b099d7
Packit b099d7
        if (sash)  /* IF THIS IS NOT NULL */
Packit b099d7
	{
Packit b099d7
	     int tmp = MinorSize(pw) - 2 * ((*childP)->core.border_width +
Packit b099d7
					  MinorMargin(pw)) ;
Packit b099d7
	     if (tmp <= 0) tmp = 1;
Packit b099d7
Packit b099d7
	     if (*childP != instigator) {
Packit b099d7
		 XmeConfigureObject(*childP, 
Packit b099d7
				    Major(pw, PaneDPos(*childP), offset),
Packit b099d7
				    Major(pw, offset, PaneDPos(*childP)),
Packit b099d7
				    Major(pw, PaneDMajor(*childP), tmp),
Packit b099d7
				    Major(pw, tmp, PaneDMajor(*childP)),
Packit b099d7
				    (*childP)->core.border_width);
Packit b099d7
	     }
Packit b099d7
	     if (separator)
Packit b099d7
	     {
Packit b099d7
		 sepPos = MajorChildPos(pw, *childP) + MajorChildSize(pw, *childP) + 
Packit b099d7
		   2 * (*childP)->core.border_width +
Packit b099d7
		     pw->paned_window.spacing/2 - MajorChildSize(pw, separator)/2 -
Packit b099d7
		       separator->core.border_width;
Packit b099d7
Packit b099d7
		 XmeConfigureObject(separator, 
Packit b099d7
				    Major(pw, sepPos, separator->core.x), 
Packit b099d7
				    Major(pw, separator->core.y,  sepPos),
Packit b099d7
				    Major(pw, separator->core.width, pw->core.width),
Packit b099d7
				    Major(pw, pw->core.height, separator->core.height),
Packit b099d7
				    separator->core.border_width);
Packit b099d7
           }
Packit b099d7
Packit b099d7
	   /* Move and Display the Sash */
Packit b099d7
           if (pw->paned_window.sash_indent < 0)
Packit b099d7
  	        minor_dim = MinorSize(pw) + pw->paned_window.sash_indent
Packit b099d7
		           - MinorChildSize(pw, sash) - sash->core.border_width*2;
Packit b099d7
           else
Packit b099d7
                minor_dim = pw->paned_window.sash_indent;
Packit b099d7
Packit b099d7
Packit b099d7
            /* PREVENT SASH FROM DISAPPEARING FROM SCREEN */
Packit b099d7
           if ((minor_dim > (MinorSize(pw) - MinorChildSize(pw, sash))) || 
Packit b099d7
              (minor_dim < 0))
Packit b099d7
                minor_dim = 0;
Packit b099d7
   
Packit b099d7
           major_dim = MajorChildPos(pw, *childP) + MajorChildSize(pw, *childP) + 
Packit b099d7
                       2 * (*childP)->core.border_width +
Packit b099d7
                       pw->paned_window.spacing/2 - MajorChildSize(pw, sash)/2 - 
Packit b099d7
		       sash->core.border_width;
Packit b099d7
Packit b099d7
	   /* This should match XmeConfigureObject, except that we're
Packit b099d7
	    * also insuring the sash is Raised in the same request */
Packit b099d7
Packit b099d7
	   sash->core.x = changes.x = Major(pw, major_dim, minor_dim);
Packit b099d7
	   sash->core.y = changes.y = Major(pw, minor_dim, major_dim);
Packit b099d7
Packit b099d7
	   if (XtIsRealized(pane->sash))
Packit b099d7
	       XConfigureWindow( XtDisplay(pane->sash), XtWindow(pane->sash),
Packit b099d7
			         CWX | CWY | CWStackMode, &changes );
Packit b099d7
         } else {
Packit b099d7
	    if (*childP != instigator) {
Packit b099d7
		int tmp = MinorSize(pw) - 2*(pw->core.border_width +
Packit b099d7
					   MinorMargin(pw)) ;
Packit b099d7
		if (tmp <= 0) tmp = 1;
Packit b099d7
		XmeConfigureObject( *childP, 
Packit b099d7
				   Major(pw, PaneDPos(*childP), offset),
Packit b099d7
				   Major(pw, offset, PaneDPos(*childP)),
Packit b099d7
				   Major(pw, PaneDMajor(*childP), tmp), 
Packit b099d7
				   Major(pw, tmp, PaneDMajor(*childP)), 
Packit b099d7
				   (*childP)->core.border_width);
Packit b099d7
	   }
Packit b099d7
         }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  RefigureLocationsAndCommit 
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    A utility call that does the call to calculate the pane layout 
Packit b099d7
 *    and then move the panes to their new locations.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
RefigureLocationsAndCommit(
Packit b099d7
        XmPanedWindowWidget pw,
Packit b099d7
        int c_index,
Packit b099d7
        Direction dir,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int rflag )
Packit b099d7
#else
Packit b099d7
        Boolean rflag )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
    if (pw->paned_window.refiguremode) {
Packit b099d7
	RefigureLocations(pw, c_index, dir, rflag, False);
Packit b099d7
	CommitNewLocations(pw, NULL);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  DrawTrackLines
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Erase any old track lines (point are kept in the pane's constraint
Packit b099d7
 *     record--olddPos field) and then draw new track lines across the top
Packit b099d7
 *     of all panes (except the first).  These lines will be interactively 
Packit b099d7
 *     moved (by other routines) to respond to the user's request to resize 
Packit b099d7
 *     panes within the VPane Manager.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
DrawTrackLines(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    XmPanedWindowConstraintPart * pane;
Packit b099d7
    Widget *children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    Dimension sep_size;
Packit b099d7
    int offset;
Packit b099d7
Packit b099d7
    for (childP = children + 1; childP - children < num_panes; childP++) {
Packit b099d7
        pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
        sep_size =
Packit b099d7
		 pane->separator ? MajorChildSize(pw, pane->separator): 2;
Packit b099d7
Packit b099d7
	if (PaneOldDPos(*childP) != PaneDPos(*childP)) {
Packit b099d7
	    offset =  PaneOldDPos(*childP) - (pw->paned_window.spacing +
Packit b099d7
                      sep_size) / 2;
Packit b099d7
            XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc, 
Packit b099d7
		      Major(pw, offset, 0), 
Packit b099d7
		      Major(pw, 0, offset),
Packit b099d7
		      Major(pw, offset, pw->core.width),
Packit b099d7
		      Major(pw, pw->core.height, offset));
Packit b099d7
	    offset = PaneDPos(*childP) - (pw->paned_window.spacing +
Packit b099d7
                      sep_size) / 2;
Packit b099d7
            XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc,
Packit b099d7
		      Major(pw, offset, 0), 
Packit b099d7
		      Major(pw, 0, offset),
Packit b099d7
		      Major(pw, offset, pw->core.width),
Packit b099d7
		      Major(pw, pw->core.height, offset));
Packit b099d7
	    PaneOldDPos(*childP) = PaneDPos(*childP);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  EraseTrackLines
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *   After the user has stopped adjusting the pane sizes, erase the last
Packit b099d7
 *   set of track lines (remember that DrawTrackLines erases old track
Packit b099d7
 *   lines before drawing new ones).
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
EraseTrackLines(
Packit b099d7
        XmPanedWindowWidget pw )
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    XmPanedWindowConstraintPart * pane;
Packit b099d7
    Widget *children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    Dimension sep_size;
Packit b099d7
    int offset;
Packit b099d7
Packit b099d7
    for (childP = children + 1; childP - children < num_panes; childP++) {
Packit b099d7
        pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
        sep_size = pane->separator ? MajorChildSize(pw, pane->separator): 2;
Packit b099d7
	offset = PaneOldDPos(*childP) - (pw->paned_window.spacing +
Packit b099d7
                  sep_size) / 2;
Packit b099d7
	XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc, 
Packit b099d7
		  Major(pw, offset, 0), Major(pw, 0, offset),
Packit b099d7
		  Major(pw, offset, pw->core.width),
Packit b099d7
		  Major(pw, pw->core.height, offset));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessKeyEvent
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    This function processes a batch of key pressed events
Packit b099d7
 *    so that a sash movement action via the keyboard doesn't
Packit b099d7
 *    get too far behind the key event actions. 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
ProcessKeyEvent(
Packit b099d7
        XtPointer client_data,
Packit b099d7
        XtIntervalId *id )
Packit b099d7
{
Packit b099d7
    Widget w = (Widget) client_data;
Packit b099d7
    register XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
Packit b099d7
    register WidgetList children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    Widget *childP;
Packit b099d7
    XmPanedWindowConstraintPart * pane;
Packit b099d7
    short c_index;
Packit b099d7
    int diff;
Packit b099d7
Packit b099d7
    /* first mark the timeout as removed */
Packit b099d7
    pw->paned_window.timer = 0 ;
Packit b099d7
Packit b099d7
    PaneFirst(pw) = PaneLast(pw) = NULL;
Packit b099d7
Packit b099d7
    if (pw->paned_window.increment_count < 0) {
Packit b099d7
        /* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
Packit b099d7
           TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
Packit b099d7
	c_index = PaneIndex(PaneInfo(w)->panedw.sash);
Packit b099d7
        if (c_index < (num_panes-1)) c_index++;
Packit b099d7
Packit b099d7
	pane = &(PaneInfo(children[c_index])->panedw);
Packit b099d7
	while (pane->max == pane->min && c_index < num_panes - 1)
Packit b099d7
	     pane = &(PaneInfo(children[++c_index])->panedw);
Packit b099d7
 	PaneLast(pw) = PaneInfo(children[c_index]);
Packit b099d7
    } else {
Packit b099d7
        /* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
Packit b099d7
           TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
Packit b099d7
 	c_index = PaneIndex(PaneInfo(w)->panedw.sash);
Packit b099d7
Packit b099d7
	pane = &(PaneInfo(children[c_index])->panedw);
Packit b099d7
	while (pane->max == pane->min && c_index > 0)
Packit b099d7
             pane = &(PaneInfo(children[--c_index])->panedw);
Packit b099d7
	PaneFirst(pw) = PaneInfo(children[c_index]);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for (childP = children; childP - children < num_panes; childP++)
Packit b099d7
       PaneOldDPos(*childP) = -99;
Packit b099d7
Packit b099d7
    ResetDMajors( pw );
Packit b099d7
    diff = pw->paned_window.increment_count;
Packit b099d7
    if (PaneFirst(pw)) {
Packit b099d7
       /* make sure size don't go negative */
Packit b099d7
        if ((-diff) >= (int)PaneFirstDMajor(pw)) {
Packit b099d7
           /* can't add as much to other pane */
Packit b099d7
/*******************************************************************
Packit b099d7
            diff = -PaneFirstDMajor(pw) + 1;
Packit b099d7
*******************************************************************/
Packit b099d7
            PaneFirstDMajor(pw) = 1;
Packit b099d7
        }
Packit b099d7
        else
Packit b099d7
            PaneFirstDMajor(pw) += diff;
Packit b099d7
        RefigureLocationsAndCommit(pw, PaneIndex(PaneInfo(w)->panedw.sash),
Packit b099d7
                                   FirstPane, False);
Packit b099d7
    } else if (PaneLast(pw)) {
Packit b099d7
        if (diff >= (int)PaneLastDMajor(pw)) {
Packit b099d7
            PaneLastDMajor(pw) = 1;
Packit b099d7
        } else
Packit b099d7
            PaneLastDMajor(pw) -= diff;
Packit b099d7
        RefigureLocationsAndCommit(pw, PaneIndex(PaneInfo(w)->panedw.sash),
Packit b099d7
                                   LastPane, False);
Packit b099d7
    }
Packit b099d7
    pw->paned_window.increment_count = 0;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleSash
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    Selection Events on the sashes invoke this routine through 
Packit b099d7
 *    callbacks.  An adjustment of the size of the panes always involves
Packit b099d7
 *    2 panes (one to shrink and one to grow) if the type of sash grab is 
Packit b099d7
 *    "This Window Only" then both a top and bottom pane are selected (these
Packit b099d7
 *    are the panes which will be adjusted); if the grab type is "Upper Pane"
Packit b099d7
 *    then only a "top" pane is chosen and the correct "bottom"
Packit b099d7
 *    pane will be determined by the "RefigureLocations" routine.  If
Packit b099d7
 *    the grab type is "Lower" then only a "bottom" pane is chosen and the
Packit b099d7
 *    the correct "top" pane is found by the "RefigureLocations" routine.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
HandleSash(
Packit b099d7
        Widget w,
Packit b099d7
        XtPointer closure,
Packit b099d7
        XtPointer callData )
Packit b099d7
{
Packit b099d7
    SashCallData call_data = (SashCallData)callData;
Packit b099d7
    register XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
Packit b099d7
    register WidgetList children = pw->paned_window.managed_children;
Packit b099d7
    int num_panes = pw->paned_window.pane_count;
Packit b099d7
    short increment = 1;
Packit b099d7
    short c_index;
Packit b099d7
    int diff, pos, action_param, increment_param, direction_param;
Packit b099d7
    Widget *childP;
Packit b099d7
    XmPanedWindowConstraintPart * pane;
Packit b099d7
    
Packit b099d7
    if (call_data->num_params == 0)
Packit b099d7
    {
Packit b099d7
        XmeWarning( (Widget) pw, MESSAGE8);
Packit b099d7
        return;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    _XmConvertActionParamToRepTypeId((Widget) pw,
Packit b099d7
				     XmRID_PANED_WINDOW_SASH_ACTION_PARAMS,
Packit b099d7
				     call_data->params[0],
Packit b099d7
				     False, &action_param);
Packit b099d7
Packit b099d7
    switch (call_data->event->xany.type)
Packit b099d7
    {
Packit b099d7
      case ButtonPress:
Packit b099d7
      case ButtonRelease:
Packit b099d7
	pos = Major(pw, call_data->event->xbutton.x_root,
Packit b099d7
		    call_data->event->xbutton.y_root);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
      case KeyRelease:
Packit b099d7
	return;
Packit b099d7
	
Packit b099d7
      case KeyPress:
Packit b099d7
	if (call_data->num_params < 3)
Packit b099d7
	{
Packit b099d7
	    XmeWarning( (Widget) pw, MESSAGE8);
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/* Verify that we have a KEY action */
Packit b099d7
	if (action_param == _KEY)
Packit b099d7
	{
Packit b099d7
	    /* Validate the other two parameters */
Packit b099d7
	    if ((_XmConvertActionParamToRepTypeId((Widget) pw,
Packit b099d7
			     XmRID_PANED_WINDOW_SASH_INCREMENT_ACTION_PARAMS,
Packit b099d7
			     call_data->params[1],
Packit b099d7
			     False, &increment_param) == False) ||
Packit b099d7
		(_XmConvertActionParamToRepTypeId((Widget) pw,
Packit b099d7
			     XmRID_PANED_WINDOW_SASH_DIRECTION_ACTION_PARAMS,
Packit b099d7
			     call_data->params[2],
Packit b099d7
			     False, &direction_param) == False))
Packit b099d7
	      return;
Packit b099d7
	    
Packit b099d7
	    /* Have to track Up or Left */
Packit b099d7
	    if (direction_param == _UP || direction_param == _LEFT)
Packit b099d7
	    {
Packit b099d7
		if (increment_param == _LARGE_INCR)
Packit b099d7
		  increment = -10;
Packit b099d7
		else
Packit b099d7
		  increment = -1;
Packit b099d7
	    }
Packit b099d7
	    /* Have to track Down or Right */
Packit b099d7
	    else if (direction_param == _DOWN || direction_param == _RIGHT)
Packit b099d7
	    {
Packit b099d7
		if (increment_param == _LARGE_INCR)
Packit b099d7
		  increment = 10;
Packit b099d7
		else
Packit b099d7
		  increment = 1;
Packit b099d7
	    }
Packit b099d7
	    if (!pw->paned_window.increment_count) {
Packit b099d7
		pw->paned_window.increment_count = increment;
Packit b099d7
		pw->paned_window.timer =
Packit b099d7
		    XtAppAddTimeOut(XtWidgetToApplicationContext( (Widget) pw),
Packit b099d7
				XtGetMultiClickTime(XtDisplay(pw)),
Packit b099d7
				ProcessKeyEvent, (XtPointer) w);
Packit b099d7
	    }
Packit b099d7
	    else pw->paned_window.increment_count += increment;
Packit b099d7
	}
Packit b099d7
	return;
Packit b099d7
	
Packit b099d7
      case MotionNotify:
Packit b099d7
	pos = Major(pw, call_data->event->xmotion.x_root,
Packit b099d7
		    call_data->event->xmotion.y_root);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
      default:
Packit b099d7
	pos = PaneStartPos(pw);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    switch (action_param)
Packit b099d7
    {
Packit b099d7
      case _START:	/* Start adjustment */
Packit b099d7
	PaneFirst(pw) = PaneLast(pw) = NULL;
Packit b099d7
	
Packit b099d7
	/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
Packit b099d7
	   TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
Packit b099d7
	c_index = PaneIndex(PaneInfo(w)->panedw.sash);
Packit b099d7
	if (c_index < (num_panes-1)) c_index++;
Packit b099d7
	
Packit b099d7
	pane = &(PaneInfo(children[c_index])->panedw);
Packit b099d7
	while (pane->max == pane->min && c_index < num_panes - 1)
Packit b099d7
	  pane = &(PaneInfo(children[++c_index])->panedw);
Packit b099d7
	PaneLast(pw) = PaneInfo(children[c_index]);
Packit b099d7
	
Packit b099d7
	/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
Packit b099d7
	   TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
Packit b099d7
	c_index = PaneIndex(PaneInfo(w)->panedw.sash);
Packit b099d7
	
Packit b099d7
	pane = &(PaneInfo(children[c_index])->panedw);
Packit b099d7
	while (pane->max == pane->min && c_index > 0)
Packit b099d7
	  pane = &(PaneInfo(children[--c_index])->panedw);
Packit b099d7
	PaneFirst(pw) = PaneInfo(children[c_index]);
Packit b099d7
	
Packit b099d7
	PaneStartPos(pw) = pos;
Packit b099d7
	
Packit b099d7
	for (childP = children; childP - children < num_panes; childP++)
Packit b099d7
	  PaneOldDPos(*childP) = -99;
Packit b099d7
Packit b099d7
	if (pw->paned_window.flipgc)
Packit b099d7
	  AdjustGC(pw);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
      case _MOVE: 
Packit b099d7
	ResetDMajors( pw );
Packit b099d7
	diff = pos - PaneStartPos(pw);
Packit b099d7
	if (diff > 0 && PaneFirst(pw)) {
Packit b099d7
	    /* make sure size don't go negative */
Packit b099d7
	    if ((-diff) >= (int)PaneFirstDMajor(pw)) {
Packit b099d7
		/* can't add as much to other pane */
Packit b099d7
		/******************************************************
Packit b099d7
		  diff = -PaneFirstDMajor(pw) + 1;
Packit b099d7
		  *****************************************************/
Packit b099d7
		PaneFirstDMajor(pw) = 1;
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		PaneFirstDMajor(pw) += diff;
Packit b099d7
	    }
Packit b099d7
	    RefigureLocations(pw, PaneIndex(PaneInfo(w)->panedw.sash),
Packit b099d7
			      FirstPane, False, True);
Packit b099d7
	} else if (PaneLast(pw)) {
Packit b099d7
	    if (diff >= (int)PaneLastDMajor(pw)) {
Packit b099d7
		PaneLastDMajor(pw) = 1;
Packit b099d7
	    } else {
Packit b099d7
		PaneLastDMajor(pw) -= diff;
Packit b099d7
	    }
Packit b099d7
	    RefigureLocations(pw, PaneIndex(PaneInfo(w)->panedw.sash),
Packit b099d7
			      LastPane, False, True);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	DrawTrackLines(pw);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
	
Packit b099d7
      case _COMMIT:
Packit b099d7
	EraseTrackLines(pw);
Packit b099d7
	CommitNewLocations(pw, NULL);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
      default:
Packit b099d7
	XmeWarning( (Widget) pw, MESSAGE9);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 * GeometryManager
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *  The Geometry Manager only allows changes after Realize if
Packit b099d7
 *  allow_resize is True in the constraints record.  It
Packit b099d7
 *  only allows height changes, but offers the requested height
Packit b099d7
 *  as a compromise if both width and height changes were requested.
Packit b099d7
 *  As all good Geometry Managers should, we will return No if the
Packit b099d7
 *  request will have no effect; i.e. when the requestor is already
Packit b099d7
 *  of the desired geometry.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
GeometryManager(
Packit b099d7
        Widget w,
Packit b099d7
        XtWidgetGeometry *request,
Packit b099d7
        XtWidgetGeometry *reply )
Packit b099d7
{
Packit b099d7
    XmPanedWindowWidget pw = (XmPanedWindowWidget) w->core.parent;
Packit b099d7
    XtGeometryMask mask = request->request_mode;
Packit b099d7
    XtWidgetGeometry allowed, geo_desired, geo_reply;
Packit b099d7
    XmPanedWindowConstraintPart * pane = &(PaneInfo(w)->panedw);
Packit b099d7
    Boolean is_almost = FALSE ;
Packit b099d7
    register Widget *children;
Packit b099d7
    int i;
Packit b099d7
    Dimension childMinor, childBorderWidth, new_major, old_dmajor, tmp;
Packit b099d7
    int num_panes =0;
Packit b099d7
    register Widget *childP;
Packit b099d7
Packit b099d7
    /* First treat the special case resulting from a change in positionIndex */
Packit b099d7
    if (PanePosIndex(w) == XmLAST_POSITION) { 
Packit b099d7
                    /* as set in ConstraintSetValues */
Packit b099d7
       int i ;
Packit b099d7
Packit b099d7
       /* first reset the value of positionIndex to its real value */
Packit b099d7
       for (i = 0 ; i < pw->composite.num_children; i++)
Packit b099d7
         if (pw->composite.children[i] == w) {
Packit b099d7
             PanePosIndex(w) = i ;
Packit b099d7
             break ; 
Packit b099d7
         }
Packit b099d7
Packit b099d7
       /* then accept the desired change */
Packit b099d7
       if (IsX(request) && request->x >= 0) w->core.x = request->x;
Packit b099d7
       if (IsY(request) && request->y >= 0) w->core.y = request->y;
Packit b099d7
       if (IsHeight(request) && request->height > 0)
Packit b099d7
         w->core.height = request->height;
Packit b099d7
       if (IsWidth(request) && request->width > 0)
Packit b099d7
         w->core.width = request->width;
Packit b099d7
      return XtGeometryYes; 
Packit b099d7
    }
Packit b099d7
Packit b099d7
       /* yes for an internal kid */
Packit b099d7
    if (XmIsSash(w)) {
Packit b099d7
	if ((mask & CWX) && request->x >= 0) w->core.x = request->x;
Packit b099d7
        if ((mask & CWY) && request->y >= 0) w->core.y = request->y;
Packit b099d7
        if ((mask & CWHeight) && request->height > 0)
Packit b099d7
	   w->core.height = request->height;
Packit b099d7
        if ((mask & CWWidth) && request->width > 0)
Packit b099d7
	   w->core.width = request->width;
Packit b099d7
	return XtGeometryYes; 
Packit b099d7
    }
Packit b099d7
Packit b099d7
    old_dmajor = PaneDMajor(w);
Packit b099d7
Packit b099d7
    /* disallow resizes if flag for this pane says no */
Packit b099d7
    /* why this realized test ? */
Packit b099d7
    if (XtIsRealized((Widget)pw) && !pane->allow_resize)
Packit b099d7
      return XtGeometryNo;
Packit b099d7
Packit b099d7
    /* reject attempts that do not want to adjust height or width */
Packit b099d7
    /* issue : and borderwidth? */
Packit b099d7
    if (!(mask & (CWWidth | CWHeight)))
Packit b099d7
	return XtGeometryNo;
Packit b099d7
Packit b099d7
	/* mark with almost request that attemps to change position *and* 
Packit b099d7
       size (since we've already pass the previous test) */
Packit b099d7
    if (mask & (CWX | CWY)) is_almost = TRUE ; 
Packit b099d7
    
Packit b099d7
    /* check for queryonly */
Packit b099d7
    if ((mask & XtCWQueryOnly) || is_almost)
Packit b099d7
	geo_desired.request_mode = XtCWQueryOnly;
Packit b099d7
    else 
Packit b099d7
	geo_desired.request_mode = 0 ;
Packit b099d7
    
Packit b099d7
Packit b099d7
    if ((mask & Minor(pw, CWWidth, CWHeight))) {
Packit b099d7
      /* 
Packit b099d7
       * NOW RECOMPUTE THE LIST OF MANAGED CHILDREN.
Packit b099d7
       */
Packit b099d7
	ReManageChildren(pw);
Packit b099d7
	children = pw->paned_window.managed_children;
Packit b099d7
Packit b099d7
      /*
Packit b099d7
       * COUNT THE NUMBER OF PANES THAT ARE MANAGED.
Packit b099d7
       */
Packit b099d7
	childP = children;
Packit b099d7
	while ( (num_panes < pw->paned_window.num_managed_children) &&
Packit b099d7
                XtIsRectObj(*childP) &&
Packit b099d7
		IsPane(*childP))
Packit b099d7
		{
Packit b099d7
		     childP++;
Packit b099d7
                     num_panes++;
Packit b099d7
		}
Packit b099d7
Packit b099d7
	pw->paned_window.pane_count = num_panes;
Packit b099d7
Packit b099d7
      /* 
Packit b099d7
       * SET WIDTH OF PANED WINDOW EQUAL TO THAT OF WIDEST CHILD
Packit b099d7
       * seems useless...
Packit b099d7
       */
Packit b099d7
	childMinor = 0;
Packit b099d7
	childBorderWidth = 0;
Packit b099d7
	for (childP = children, i = 0; i < num_panes; childP++, i++)
Packit b099d7
	    {
Packit b099d7
		if ((MinorChildSize(pw, *childP) + (*childP)->core.border_width) >
Packit b099d7
		    childMinor + childBorderWidth) {
Packit b099d7
		    childMinor = MinorChildSize(pw, *childP) ;
Packit b099d7
		    childBorderWidth = (*childP)->core.border_width;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	if (childMinor < 1) childMinor = 1;
Packit b099d7
	
Packit b099d7
	/* only allowed to grow */
Packit b099d7
	if (MinorReq(pw, request) >= childMinor) {
Packit b099d7
Packit b099d7
	    MinorAssign(pw, geo_desired, MinorReq(pw, request) +
Packit b099d7
			2 * (childBorderWidth + MinorMargin(pw))) ;
Packit b099d7
	    geo_desired.request_mode |= Minor(pw, CWWidth, CWHeight);
Packit b099d7
Packit b099d7
	    switch (XtMakeGeometryRequest((Widget) pw, &geo_desired, 
Packit b099d7
					 &geo_reply))
Packit b099d7
	       {
Packit b099d7
	       case XtGeometryYes:           
Packit b099d7
		   MinorAssign(pw, allowed, MinorReq(pw, request)) ;
Packit b099d7
		   break;
Packit b099d7
Packit b099d7
	       case XtGeometryAlmost:
Packit b099d7
		   if (MinorReq(pw, &geo_reply) > 
Packit b099d7
		       2*(childBorderWidth + MinorMargin(pw)))
Packit b099d7
		       tmp = MinorReq(pw, &geo_reply) - 
Packit b099d7
			   2*(childBorderWidth + MinorMargin(pw));
Packit b099d7
		   else tmp = 1;
Packit b099d7
		   MinorAssign(pw, allowed, tmp);
Packit b099d7
		   if (MinorReq(pw, &allowed) < childMinor) {
Packit b099d7
		       MinorAssign(pw, allowed, childMinor) ;
Packit b099d7
		   }
Packit b099d7
		   is_almost = TRUE ;
Packit b099d7
		   break;
Packit b099d7
Packit b099d7
	       case XtGeometryNo:
Packit b099d7
               default:
Packit b099d7
		   MinorAssign(pw, allowed, MinorSize(pw) -
Packit b099d7
                                  2*(childBorderWidth + MinorMargin(pw)));
Packit b099d7
		   break;
Packit b099d7
	       }
Packit b099d7
	} else {
Packit b099d7
	    /* give the max possible and almost */
Packit b099d7
	    MinorAssign(pw, allowed, childMinor) ;
Packit b099d7
	    is_almost = TRUE ;
Packit b099d7
	}
Packit b099d7
		   
Packit b099d7
    } else { 
Packit b099d7
	/* kid not interested by Width, take its current size */
Packit b099d7
	MinorAssign(pw, allowed, MinorChildSize(pw, w));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* the whole stuff of individual requests, first Width and then Height 
Packit b099d7
       doesn't look correct in my opinion (what if parent has a
Packit b099d7
       constrainted ratio?), but I think we can live with it for now */
Packit b099d7
Packit b099d7
    /* just forget about the CWWidth setting and go for Height */
Packit b099d7
    if ((geo_desired.request_mode & XtCWQueryOnly) || is_almost)
Packit b099d7
	geo_desired.request_mode = XtCWQueryOnly;
Packit b099d7
Packit b099d7
    if (mask & Major(pw, CWWidth, CWHeight)) {
Packit b099d7
	/* try to almost the sucker */
Packit b099d7
	if (MajorReq(pw, request) < pane->min) {
Packit b099d7
	    MajorAssign(pw, allowed, pane->min); 
Packit b099d7
	    MajorAssign(pw, *request, pane->min); 
Packit b099d7
	    is_almost = TRUE ;
Packit b099d7
	    geo_desired.request_mode = XtCWQueryOnly;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (MajorReq(pw, request) > pane->max)  {
Packit b099d7
	    MajorAssign(pw, allowed, pane->max); 
Packit b099d7
	    MajorAssign(pw, *request, pane->max); 
Packit b099d7
	    is_almost = TRUE ;
Packit b099d7
	    geo_desired.request_mode = XtCWQueryOnly;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* try out the new size */
Packit b099d7
	ResetDMajors( pw );
Packit b099d7
	old_dmajor = PaneDMajor(w);
Packit b099d7
	PaneDMajor(w) = MajorReq(pw, request);
Packit b099d7
Packit b099d7
	if ((new_major = NeedsAdjusting(pw)) != 0) {
Packit b099d7
Packit b099d7
	    MajorAssign(pw, geo_desired, new_major);
Packit b099d7
	    geo_desired.request_mode |= Major(pw, CWWidth, CWHeight);
Packit b099d7
Packit b099d7
	    switch(XtMakeGeometryRequest((Widget) pw, &geo_desired, 
Packit b099d7
					 &geo_reply)) {
Packit b099d7
		case XtGeometryYes:           
Packit b099d7
		    MajorAssign(pw, allowed, MajorReq(pw, request));
Packit b099d7
		    break;
Packit b099d7
Packit b099d7
		case XtGeometryAlmost:
Packit b099d7
		    if ((new_major > MajorReq(pw, &geo_reply)) &&
Packit b099d7
			MajorReq(pw, request) > (new_major - MajorReq(pw, &geo_reply)))
Packit b099d7
			tmp = MajorReq(pw, request) - 
Packit b099d7
			    (new_major - MajorReq(pw, &geo_reply));
Packit b099d7
		    else 
Packit b099d7
			tmp = 1 ;
Packit b099d7
		    MajorAssign(pw, allowed, tmp); 
Packit b099d7
		    if (MajorReq(pw, &allowed) < pane->min) {
Packit b099d7
			MajorAssign(pw, allowed, pane->min);
Packit b099d7
		    }
Packit b099d7
		    if (MajorReq(pw, &allowed) > pane->max) {
Packit b099d7
			MajorAssign(pw, allowed, pane->max); 
Packit b099d7
		    }
Packit b099d7
		    is_almost = TRUE ;
Packit b099d7
		    break;
Packit b099d7
Packit b099d7
		case XtGeometryNo:
Packit b099d7
                default:
Packit b099d7
		    MajorAssign(pw, allowed, MajorChildSize(pw, w));
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	}
Packit b099d7
	else /* ok */{
Packit b099d7
	    MajorAssign(pw, allowed, MajorReq(pw, request));
Packit b099d7
	}
Packit b099d7
    } else {
Packit b099d7
	/* kid not interested by Height, take its current size */
Packit b099d7
	MajorAssign(pw, allowed, MajorChildSize(pw, w));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* now the conclusion:
Packit b099d7
       If it's not almosted yet (due to a position request) and if I got 
Packit b099d7
       what I've asked for or if I didn't ask anything in this dimension, 
Packit b099d7
       then it's a Yes. 
Packit b099d7
       If queryonly was specified, don't forget to just undo the change made. 
Packit b099d7
    */
Packit b099d7
    if ((!is_almost) &&
Packit b099d7
	(((mask & CWWidth) && (allowed.width == request->width)) ||
Packit b099d7
	 (!(mask & CWWidth))) && 
Packit b099d7
	(((mask & CWHeight) && (allowed.height == request->height)) ||
Packit b099d7
	 (!(mask & CWHeight)))) {
Packit b099d7
Packit b099d7
	if (!(mask & XtCWQueryOnly)) {
Packit b099d7
	    w->core.width = allowed.width;
Packit b099d7
	    w->core.height = allowed.height;
Packit b099d7
Packit b099d7
	    RefigureLocations(pw, PaneIndex(w), FirstPane, False, False);
Packit b099d7
	    if (Horizontal(pw)) {
Packit b099d7
		w->core.x = PaneDPos(w) ;
Packit b099d7
		w->core.y = pw->paned_window.margin_height ;
Packit b099d7
	    } else {
Packit b099d7
		w->core.y = PaneDPos(w) ;
Packit b099d7
		w->core.x = pw->paned_window.margin_width ;
Packit b099d7
	    }		
Packit b099d7
Packit b099d7
	    /* relayout all kids except instigator */
Packit b099d7
	    CommitNewLocations(pw, w );
Packit b099d7
	} else {
Packit b099d7
	    PaneDMajor(w) = old_dmajor;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	return XtGeometryYes ;
Packit b099d7
    }
Packit b099d7
	
Packit b099d7
    /* else we decide to reply Almost, so undo the change made
Packit b099d7
       and reply allowed */
Packit b099d7
Packit b099d7
    PaneDMajor(w) = old_dmajor;
Packit b099d7
    allowed.request_mode = CWWidth|CWHeight ;
Packit b099d7
    *reply = allowed;
Packit b099d7
    return XtGeometryAlmost;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Constraint Initialize
Packit b099d7
 *
Packit b099d7
 *  This routine is called to initialize the constraint record for
Packit b099d7
 *  every child inserted into the paned_window window.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
ConstraintInit(
Packit b099d7
        Widget request,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
  XmPanedWindowWidget pw = (XmPanedWindowWidget) XtParent(new_w);
Packit b099d7
  XmPanedWindowConstraintPart * pane = &(PaneInfo(new_w)->panedw);
Packit b099d7
  int size;
Packit b099d7
Packit b099d7
  if (!XtIsRectObj(new_w)) return;
Packit b099d7
  
Packit b099d7
  /* don't let sashes or separators get a non default position - which could
Packit b099d7
     easily happen with resource like  XmPanedWindow*kid*positionIndex: 0 */
Packit b099d7
  if (pw->paned_window.recursively_called)
Packit b099d7
      pane->position_index = XmLAST_POSITION ;
Packit b099d7
Packit b099d7
  size = MajorChildSize(pw, new_w);
Packit b099d7
Packit b099d7
  if (pane->min == 0)
Packit b099d7
    {
Packit b099d7
        XmeWarning( (Widget) pw, MESSAGE4);
Packit b099d7
     	pane->min = 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (pane->max == 0)
Packit b099d7
    {
Packit b099d7
        XmeWarning( (Widget) pw, MESSAGE5);
Packit b099d7
     	pane->max = pane->min + 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if (pane->min > pane->max)
Packit b099d7
    {
Packit b099d7
        XmeWarning( (Widget) pw, MESSAGE6);
Packit b099d7
     	pane->max = pane->min + 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /* ENFORCE MIN/MAX if child already managed */
Packit b099d7
  if (size < pane->min) size = pane->min;
Packit b099d7
  if (size > pane->max) size = pane->max;
Packit b099d7
Packit b099d7
  if (XtIsManaged(new_w))
Packit b099d7
    XmeConfigureObject(new_w, 
Packit b099d7
		       new_w->core.x, new_w->core.y,
Packit b099d7
		       Major(pw, size, new_w->core.width), 
Packit b099d7
		       Major(pw, new_w->core.height, size), 
Packit b099d7
		       new_w->core.border_width);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/***************************************************************************
Packit b099d7
 *
Packit b099d7
 * static Cardinal
Packit b099d7
 * InsertOrder (cw, args, p_num_args)
Packit b099d7
 *
Packit b099d7
 *   This function searches through the composite widget's list of children
Packit b099d7
 *   to find the correct insertion position for the new child.  If the
Packit b099d7
 *   new child is an ordinary child (not a subclass of XmSashWidget)
Packit b099d7
 *   the position returned will cause it to be inserted after the other
Packit b099d7
 *   ordinary children but before any Sashs; if the new child is a 
Packit b099d7
 *   sash the position returned will cause it to be inserted after
Packit b099d7
 *   the regular panes.  
Packit b099d7
 *
Packit b099d7
 *   This procedure also handles the positionIndex constraint resource.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static Cardinal 
Packit b099d7
InsertOrder(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
   CompositeWidget pw = (CompositeWidget) XtParent(w);
Packit b099d7
   Cardinal i=0 ;
Packit b099d7
Packit b099d7
   /* find the number of regular children */
Packit b099d7
   while ((i < pw->composite.num_children) && 
Packit b099d7
		IsPane(pw->composite.children[i]))
Packit b099d7
                i++;
Packit b099d7
Packit b099d7
   /* i is the maximum positionIndex allowed, 0 is the min */
Packit b099d7
   /* if a paned position has been specified - should not happen
Packit b099d7
      for sash and separator, since we tracked that in constraint init -
Packit b099d7
      and if it's a correct value, use it */
Packit b099d7
   if (PanePosIndex(w) != XmLAST_POSITION) {
Packit b099d7
       if ((PanePosIndex(w) >= 0) && (PanePosIndex(w) < i)) {
Packit b099d7
	   return PanePosIndex(w) ;
Packit b099d7
       }
Packit b099d7
   } /* all PanePosIndex will be res-et in InsertChild proc */
Packit b099d7
Packit b099d7
   return (i);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  InsertChild()
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
InsertChild(
Packit b099d7
        register Widget w )
Packit b099d7
{
Packit b099d7
   XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
Packit b099d7
   XmPanedWindowConstraintPart * pane = &(PaneInfo(w)->panedw);
Packit b099d7
   Arg args[10];
Packit b099d7
   int n,i;
Packit b099d7
   Widget *p ;
Packit b099d7
   XmNavigationType navType;
Packit b099d7
   XtWidgetProc insert_child;
Packit b099d7
Packit b099d7
   if (!XtIsRectObj(w)) return;
Packit b099d7
Packit b099d7
   /* 
Packit b099d7
    * Insert the child widget in the composite children list with an
Packit b099d7
    * insertion procedure exported from Manager.c, it, in turn, will
Packit b099d7
    * make use of the special insert procedure, InsertOrder, defined
Packit b099d7
    * above.  Essentially, ordinary panes are grouped together at the
Packit b099d7
    * beginning of the list of composite children, sashs are always 
Packit b099d7
    * put at the end of the list.
Packit b099d7
    */
Packit b099d7
Packit b099d7
   _XmProcessLock();
Packit b099d7
   insert_child = ((XmManagerWidgetClass)xmManagerWidgetClass)->
Packit b099d7
			composite_class.insert_child;
Packit b099d7
   _XmProcessUnlock();
Packit b099d7
   (*insert_child) (w);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * If we are creating a sash for an ordinary pane, then just
Packit b099d7
   * return here. However, before we do, set its "isPane" flag
Packit b099d7
   * to false, meaning that this is NOT a pane; if it is a 
Packit b099d7
   * pane then set its "isPane" flag to TRUE.
Packit b099d7
   */
Packit b099d7
   if (pw->paned_window.recursively_called)
Packit b099d7
    {
Packit b099d7
      pane->isPane = FALSE;
Packit b099d7
      pane->separator = NULL;
Packit b099d7
      pane->sash = NULL;
Packit b099d7
      return;
Packit b099d7
    }
Packit b099d7
    pane->isPane = TRUE;
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], Minor(pw, XmNwidth, XmNheight), MinorSize(pw)); n++;
Packit b099d7
    XtSetArg(args[n], XmNborderWidth, 0); n++;
Packit b099d7
    XtSetArg(args[n], XmNhighlightThickness, 0); n++;
Packit b099d7
    XtSetArg(args[n], XmNseparatorType, XmSHADOW_ETCHED_IN); n++;
Packit b099d7
    XtSetArg(args[n], XmNmargin, 0); n++;
Packit b099d7
    XtSetArg(args[n], XmNorientation,  
Packit b099d7
                      Minor(pw, XmHORIZONTAL, XmVERTICAL)); n++;
Packit b099d7
    XtSetArg(args[n], XmNnavigationType, (XtArgVal) XmNONE); n++;
Packit b099d7
    pw->paned_window.recursively_called = True;
Packit b099d7
    pane->separator = XtCreateWidget("Separator", xmSeparatorGadgetClass,
Packit b099d7
                                     (Widget)pw, args, n);
Packit b099d7
    pw->paned_window.recursively_called = False;
Packit b099d7
    PaneInfo(pane->separator)->panedw.separator = w;
Packit b099d7
Packit b099d7
   /* If we create a sash then have the pane's constraint rec point
Packit b099d7
    * to the sash, ignore the constraint rec of the sash (Yes, it 
Packit b099d7
    * gets one).  If we don't create a sash for the pane, just set
Packit b099d7
    * that field to NULL.   
Packit b099d7
    */
Packit b099d7
    n = 0;
Packit b099d7
    XtSetArg(args[n], XmNwidth, pw->paned_window.sash_width); n++;
Packit b099d7
    XtSetArg(args[n], XmNheight, pw->paned_window.sash_height); n++;
Packit b099d7
    XtSetArg(args[n], XmNshadowThickness, 
Packit b099d7
                pw->paned_window.sash_shadow_thickness); n++;
Packit b099d7
    XtSetArg(args[n], XmNunitType, (XtArgVal) XmPIXELS); n++;
Packit b099d7
    pw->paned_window.recursively_called = True;
Packit b099d7
    pane->sash = XtCreateWidget("Sash", xmSashWidgetClass, (Widget)pw, args, n);
Packit b099d7
    XtAddCallback(pane->sash, XmNcallback, HandleSash, (XtPointer)w);
Packit b099d7
    pw->paned_window.recursively_called = False;
Packit b099d7
Packit b099d7
    XtSetArg(args[0], XmNnavigationType, &navType);
Packit b099d7
    XtGetValues(w, args, 1);
Packit b099d7
    if(navType == XmNONE){
Packit b099d7
    	XtSetArg(args[0], XmNnavigationType, (XtArgVal) XmTAB_GROUP);
Packit b099d7
    	XtSetValues(w, args, 1);
Packit b099d7
    };
Packit b099d7
Packit b099d7
    PaneInfo(pane->sash)->panedw.sash = w;
Packit b099d7
Packit b099d7
    /* re-set the correct positionIndex values for everybody if 
Packit b099d7
     * the new kid has been inserted in the list instead of put at the end 
Packit b099d7
     */
Packit b099d7
    if (PanePosIndex(w) != pw->composite.num_children)
Packit b099d7
	for (i = 0, p = pw->composite.children; 
Packit b099d7
	     i < pw->composite.num_children; i++, p++) {
Packit b099d7
            PanePosIndex(*p) = i ;
Packit b099d7
        }
Packit b099d7
Packit b099d7
} /* InsertChild */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 * ChangeManaged
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
ChangeManaged(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
   register XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
Packit b099d7
   register Widget *childP;
Packit b099d7
   register int i;
Packit b099d7
   Widget *children;
Packit b099d7
   int num_children = pw->composite.num_children;
Packit b099d7
   Widget sash, separator;
Packit b099d7
   Dimension minor_dim = 0, major_dim = 0;
Packit b099d7
   Dimension childMinor, childBorderWidth, newMinor;
Packit b099d7
   Dimension needed;
Packit b099d7
   int num_panes = 0;
Packit b099d7
   XmPanedWindowConstraintPart * pane;
Packit b099d7
   XtGeometryResult result;
Packit b099d7
Packit b099d7
  /* 
Packit b099d7
   * THIS PREVENTS US FROM RE-ENTERING THIS CODE AS WE MANAGE/UNMANAGE
Packit b099d7
   * THE SASHES
Packit b099d7
   */
Packit b099d7
   if (pw->paned_window.recursively_called++)  return;
Packit b099d7
Packit b099d7
  /* 
Packit b099d7
   * NOW RECOMPUTE THE LIST OF MANAGED CHILDREN.
Packit b099d7
   */
Packit b099d7
   ReManageChildren(pw);
Packit b099d7
   children = pw->paned_window.managed_children;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * COUNT THE NUMBER OF PANES THAT ARE MANAGED.
Packit b099d7
   */
Packit b099d7
   childP = children;
Packit b099d7
   while ((num_panes < pw->paned_window.num_managed_children) &&
Packit b099d7
             XtIsRectObj(*childP) &&
Packit b099d7
	     IsPane(*childP))
Packit b099d7
		{
Packit b099d7
		  childP++;
Packit b099d7
                  num_panes++;
Packit b099d7
		}
Packit b099d7
Packit b099d7
   pw->paned_window.pane_count = num_panes;
Packit b099d7
Packit b099d7
Packit b099d7
  /* 
Packit b099d7
   * SET WIDTH OF PANED WINDOW EQUAL TO THAT OF WIDEST CHILD
Packit b099d7
   */
Packit b099d7
Packit b099d7
   childMinor = 0;
Packit b099d7
   childBorderWidth = 0;
Packit b099d7
   major_dim = 0;
Packit b099d7
   for (childP = children, i = 0; i < num_panes; childP++, i++)
Packit b099d7
   {
Packit b099d7
       pane = &(PaneInfo(*childP)->panedw);
Packit b099d7
       if (MinorChildSize(pw, *childP) + (*childP)->core.border_width > 
Packit b099d7
            childMinor + childBorderWidth) {
Packit b099d7
	   childMinor = MinorChildSize(pw, *childP);
Packit b099d7
	   childBorderWidth = (*childP)->core.border_width;
Packit b099d7
       }
Packit b099d7
Packit b099d7
       if (MajorChildSize(pw, *childP) < pane->min)
Packit b099d7
	 XmeConfigureObject(*childP, 
Packit b099d7
			    (*childP)->core.x, (*childP)->core.y,
Packit b099d7
			    Major(pw, pane->min, (*childP)->core.width), 
Packit b099d7
			    Major(pw, (*childP)->core.height, pane->min), 
Packit b099d7
			    (*childP)->core.border_width);
Packit b099d7
       if (MajorChildSize(pw, *childP) > pane->max)
Packit b099d7
	 XmeConfigureObject(*childP,
Packit b099d7
			    (*childP)->core.x, (*childP)->core.y,
Packit b099d7
			    Major(pw, pane->max, (*childP)->core.width), 
Packit b099d7
			    Major(pw, (*childP)->core.height, pane->max), 
Packit b099d7
			    (*childP)->core.border_width);
Packit b099d7
       major_dim += MajorChildSize(pw, *childP) + 2*(*childP)->core.border_width;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (childMinor < 1) childMinor = 1;
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * NOW SCAN THE COMPOSITE LIST OF CHILDREN, AND MAKE SURE
Packit b099d7
   * THAT THEIR MANAGEMENT SETTING REFLECTS THAT OF THEIR PANE.
Packit b099d7
   */
Packit b099d7
Packit b099d7
   for (childP = pw->composite.children, i = 0; 
Packit b099d7
                     i < num_children; childP++, i++) 
Packit b099d7
    {
Packit b099d7
      if (! IsPane(*childP)) break;  /* jump out of loop */
Packit b099d7
      sash = PaneInfo(*childP)->panedw.sash;
Packit b099d7
      separator = PaneInfo(*childP)->panedw.separator;
Packit b099d7
Packit b099d7
      /* Realize child now so it won't get realized and put on the 
Packit b099d7
         top of the stack, above the sash, when it is realized later */
Packit b099d7
      if (XtIsRealized((Widget)pw) && XtIsManaged(*childP))
Packit b099d7
          XtRealizeWidget(*childP);
Packit b099d7
Packit b099d7
      /* KEEP SOME RECORD OF DESIRED HEIGHT */
Packit b099d7
      PaneDMajor(*childP) = MajorChildSize(pw, *childP);
Packit b099d7
Packit b099d7
      newMinor = childMinor + 2*(childBorderWidth -
Packit b099d7
                                 (*childP)->core.border_width);
Packit b099d7
Packit b099d7
      if (XtIsManaged(*childP)) 
Packit b099d7
	XmeConfigureObject( *childP,
Packit b099d7
			   (*childP)->core.x, (*childP)->core.y,
Packit b099d7
			   Major(pw, (*childP)->core.width, newMinor), 
Packit b099d7
			   Major(pw, newMinor, (*childP)->core.height),
Packit b099d7
			   (*childP)->core.border_width);
Packit b099d7
       if ((XtIsManaged(*childP)) && (*childP != children[num_panes-1])) {
Packit b099d7
              if (separator && pw->paned_window.separator_on) {
Packit b099d7
                  if (!XtIsManaged(separator)) XtManageChild(separator);
Packit b099d7
  	          if (XtIsRealized(separator))
Packit b099d7
		    XRaiseWindow(XtDisplay(separator), XtWindow(separator));
Packit b099d7
	      }
Packit b099d7
Packit b099d7
              if (sash) {
Packit b099d7
                 if (PaneInfo(*childP)->panedw.min !=
Packit b099d7
	 	     PaneInfo(*childP)->panedw.max) {
Packit b099d7
                    if (!XtIsManaged(sash)) XtManageChild(sash);
Packit b099d7
  	            if (XtIsRealized(sash))
Packit b099d7
		       XRaiseWindow( XtDisplay(sash), XtWindow(sash) );
Packit b099d7
	         } else
Packit b099d7
                    if (XtIsManaged(sash)) XtUnmanageChild(sash);
Packit b099d7
              }
Packit b099d7
	} else {
Packit b099d7
            if (sash)
Packit b099d7
               if (XtIsManaged(sash)) XtUnmanageChild(sash);
Packit b099d7
            if (separator && pw->paned_window.separator_on)
Packit b099d7
               if (XtIsManaged(separator)) XtUnmanageChild(separator);
Packit b099d7
        }
Packit b099d7
     }
Packit b099d7
Packit b099d7
  /* NOW CHANGEMANAGED CAN BE ENTERED NORMALLY */
Packit b099d7
   pw->paned_window.recursively_called = False;
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * TRAVERSE MANAGED PANES AND SET THE POSITION FIELD IN THE CONSTRAINT
Packit b099d7
    * RECORD TO 0, 1, 2, 3, 4 ETC.
Packit b099d7
    */
Packit b099d7
   
Packit b099d7
   childP = pw->paned_window.managed_children;
Packit b099d7
   for (i = 0; i < pw->paned_window.pane_count; childP++)
Packit b099d7
      (PaneInfo(*childP))->panedw.position = i++;
Packit b099d7
Packit b099d7
   minor_dim = childMinor;
Packit b099d7
Packit b099d7
   if (major_dim < 1) major_dim = 1;
Packit b099d7
Packit b099d7
   minor_dim += 2*(MinorMargin(pw) + childBorderWidth);
Packit b099d7
   major_dim += pw->paned_window.spacing*((num_panes)?num_panes-1:0) +
Packit b099d7
             2*MajorMargin(pw);
Packit b099d7
Packit b099d7
   while ((result = XtMakeResizeRequest(w, 
Packit b099d7
					Major(pw, major_dim, minor_dim),
Packit b099d7
					Major(pw, minor_dim, major_dim),
Packit b099d7
					Major(pw, &major_dim, &minor_dim),
Packit b099d7
					Major(pw, &minor_dim, &major_dim))) 
Packit b099d7
	  == XtGeometryAlmost) /*EMPTY*/;
Packit b099d7
Packit b099d7
   if (result == XtGeometryYes || result == XtGeometryAlmost ||
Packit b099d7
       MajorChildSize(pw, w) == major_dim) {
Packit b099d7
      /* see if the major size of the Paned Window
Packit b099d7
         needs to be adjusted to fit all the panes */
Packit b099d7
      if ((needed = NeedsAdjusting(pw)) != 0)
Packit b099d7
         AdjustPanedWindowMajor(pw, needed, &major_dim);
Packit b099d7
   } else {
Packit b099d7
       pw->paned_window.resize_at_realize = False;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   ResetDMajors( pw );
Packit b099d7
   
Packit b099d7
   if (XtIsRealized((Widget)pw))
Packit b099d7
      RefigureLocationsAndCommit(pw, 0, FirstPane, False);
Packit b099d7
Packit b099d7
   XmeNavigChangeManaged((Widget)pw);
Packit b099d7
Packit b099d7
} /* ChangeManaged */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetValues
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
        Widget cw,
Packit b099d7
        Widget rw,
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmPanedWindowWidget oldpw = (XmPanedWindowWidget) cw ;
Packit b099d7
    XmPanedWindowWidget requestpw = (XmPanedWindowWidget) rw ;
Packit b099d7
    XmPanedWindowWidget newpw = (XmPanedWindowWidget) nw ;
Packit b099d7
    Boolean returnFlag = False;
Packit b099d7
    WidgetList children = newpw->composite.children;
Packit b099d7
    register Widget *childP;
Packit b099d7
    int num_children = newpw->composite.num_children;
Packit b099d7
    Arg sashargs[3];
Packit b099d7
    int i, minor_dim, major_dim;
Packit b099d7
    int n = 0;
Packit b099d7
Packit b099d7
   if (oldpw->core.background_pixel != newpw->core.background_pixel)
Packit b099d7
     {
Packit b099d7
       if (newpw->paned_window.flipgc != NULL) {
Packit b099d7
          XtReleaseGC(nw, newpw->paned_window.flipgc);
Packit b099d7
       }
Packit b099d7
       GetFlipGC(newpw);
Packit b099d7
       returnFlag = True;
Packit b099d7
     }        
Packit b099d7
Packit b099d7
   if (newpw->paned_window.sash_width == 0)
Packit b099d7
      newpw->paned_window.sash_width = oldpw->paned_window.sash_width;
Packit b099d7
Packit b099d7
   if (oldpw->paned_window.sash_width != newpw->paned_window.sash_width)
Packit b099d7
    {
Packit b099d7
       XtSetArg(sashargs[n], XmNwidth, newpw->paned_window.sash_width); n++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
   if (newpw->paned_window.sash_height == 0)
Packit b099d7
      newpw->paned_window.sash_height = oldpw->paned_window.sash_height;
Packit b099d7
Packit b099d7
   if (oldpw->paned_window.sash_height != newpw->paned_window.sash_height)
Packit b099d7
    {
Packit b099d7
       XtSetArg(sashargs[n], XmNheight, newpw->paned_window.sash_height); n++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
   if (oldpw->paned_window.sash_shadow_thickness != 
Packit b099d7
           newpw->paned_window.sash_shadow_thickness)
Packit b099d7
    {
Packit b099d7
       XtSetArg(sashargs[n], XmNshadowThickness, 
Packit b099d7
                newpw->paned_window.sash_shadow_thickness); n++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
   if (oldpw->paned_window.separator_on != newpw->paned_window.separator_on &&
Packit b099d7
       num_children > 2) {
Packit b099d7
      WidgetList sep_children;
Packit b099d7
      Cardinal num_separators = 0;
Packit b099d7
Packit b099d7
     /* This should be more than enough space */
Packit b099d7
      sep_children = (WidgetList) XtMalloc((num_children/3) * sizeof(Widget));
Packit b099d7
Packit b099d7
      for (childP = children, i = 0; i < num_children; childP++, i++) {
Packit b099d7
          if (IsPane(*childP)) {
Packit b099d7
             Widget separator = PaneInfo(*childP)->panedw.separator;
Packit b099d7
             if (separator) {
Packit b099d7
                sep_children[num_separators] = separator;
Packit b099d7
                num_separators++;
Packit b099d7
             }
Packit b099d7
          }
Packit b099d7
       }
Packit b099d7
      if (num_separators != 0) {
Packit b099d7
         if (newpw->paned_window.separator_on)
Packit b099d7
            XtManageChildren((WidgetList) sep_children, num_separators);
Packit b099d7
         else
Packit b099d7
            XtUnmanageChildren((WidgetList) sep_children, num_separators);
Packit b099d7
      }
Packit b099d7
         
Packit b099d7
      XtFree((char *)sep_children);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if(!XmRepTypeValidValue( XmRID_ORIENTATION,
Packit b099d7
			   newpw->paned_window.orientation, (Widget) newpw)){
Packit b099d7
       newpw->paned_window.orientation = oldpw->paned_window.orientation;
Packit b099d7
   }
Packit b099d7
   if (newpw->paned_window.orientation != oldpw->paned_window.orientation)
Packit b099d7
   {
Packit b099d7
      ChangeManaged( (Widget) newpw);
Packit b099d7
      returnFlag = True;
Packit b099d7
   }
Packit b099d7
Packit b099d7
	
Packit b099d7
   if (oldpw->paned_window.sash_indent != newpw->paned_window.sash_indent ||
Packit b099d7
       oldpw->paned_window.margin_width != newpw->paned_window.margin_width ||
Packit b099d7
       oldpw->paned_window.margin_height != newpw->paned_window.margin_height ||
Packit b099d7
       oldpw->paned_window.sash_width != newpw->paned_window.sash_width ||
Packit b099d7
       oldpw->paned_window.sash_height != newpw->paned_window.sash_height ||
Packit b099d7
       oldpw->paned_window.sash_shadow_thickness !=
Packit b099d7
				 newpw->paned_window.sash_shadow_thickness ||
Packit b099d7
       oldpw->paned_window.spacing != newpw->paned_window.spacing) {
Packit b099d7
Packit b099d7
      for (childP = children, i = 0; i < num_children; childP++, i++) {
Packit b099d7
          if (IsPane(*childP)) {
Packit b099d7
             register XmPanedWindowConstraintPart * pane =
Packit b099d7
                                    &(PaneInfo(*childP)->panedw);
Packit b099d7
             register Widget sash = pane->sash;
Packit b099d7
Packit b099d7
             if (sash)  /* IF THIS IS NOT NULL */
Packit b099d7
             {
Packit b099d7
                /* Send Down Changes to Sash */ 
Packit b099d7
	        assert(n <= XtNumber(sashargs));
Packit b099d7
                if (n != 0)  /* something is in the arglist */
Packit b099d7
                   XtSetValues((Widget)sash, sashargs, n); 
Packit b099d7
Packit b099d7
	        /* Move and Display the Sash */
Packit b099d7
                if (newpw->paned_window.sash_indent < 0)
Packit b099d7
  	           minor_dim = MinorSize(newpw) + 
Packit b099d7
		       newpw->paned_window.sash_indent - 
Packit b099d7
			   MinorChildSize(newpw, sash) - sash->core.border_width*2;
Packit b099d7
                 else
Packit b099d7
                   minor_dim = newpw->paned_window.sash_indent;
Packit b099d7
Packit b099d7
Packit b099d7
                 /* PREVENT SASH FROM DISAPPEARING FROM SCREEN */
Packit b099d7
                 if ((minor_dim > (MinorSize(newpw) - 
Packit b099d7
			       MinorChildSize(newpw, sash))) || (minor_dim < 0))
Packit b099d7
                    minor_dim= 0;
Packit b099d7
   
Packit b099d7
	         major_dim = MajorChildPos(newpw, *childP) + MajorChildSize(newpw, *childP) +
Packit b099d7
	             2 * (*childP)->core.border_width +
Packit b099d7
		     newpw->paned_window.spacing/2 - MajorChildSize(newpw, sash)/2 -
Packit b099d7
		     sash->core.border_width;
Packit b099d7
Packit b099d7
		 XmeConfigureObject(sash, 
Packit b099d7
				    Minor(newpw, minor_dim,major_dim),
Packit b099d7
				    Major(newpw, minor_dim,major_dim),
Packit b099d7
				    sash->core.width,
Packit b099d7
				    sash->core.height,
Packit b099d7
				    sash->core.border_width);
Packit b099d7
              }
Packit b099d7
          }
Packit b099d7
     }
Packit b099d7
	/* make the windows match the new locations */
Packit b099d7
	CommitNewLocations(newpw,NULL);
Packit b099d7
   }
Packit b099d7
   if (oldpw->paned_window.margin_width != newpw->paned_window.margin_width) {
Packit b099d7
      newpw->core.width = newpw->core.width + 
Packit b099d7
                          ((2 * newpw->paned_window.margin_width) -
Packit b099d7
                           (2 * oldpw->paned_window.margin_width));
Packit b099d7
      returnFlag = True;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if ((oldpw->paned_window.spacing != newpw->paned_window.spacing ||
Packit b099d7
	oldpw->paned_window.margin_height != newpw->paned_window.margin_height ||
Packit b099d7
       (requestpw->paned_window.refiguremode &&
Packit b099d7
				 !(oldpw->paned_window.refiguremode))) &&
Packit b099d7
       XtIsRealized((Widget)newpw)) {
Packit b099d7
       Dimension needed;
Packit b099d7
Packit b099d7
      if ((needed = NeedsAdjusting(newpw)) != 0) {
Packit b099d7
         newpw->core.height = needed;
Packit b099d7
         returnFlag = True;
Packit b099d7
      } 
Packit b099d7
   }
Packit b099d7
Packit b099d7
   return(returnFlag);
Packit b099d7
} /* SetValues */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  PaneSetValues
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
PaneSetValues(
Packit b099d7
        Widget old,
Packit b099d7
        Widget request,
Packit b099d7
        Widget new_w,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
   XmPanedWindowWidget pw = (XmPanedWindowWidget)new_w->core.parent;
Packit b099d7
   Arg sashargs[4];
Packit b099d7
   int i, count ;
Packit b099d7
   XmPanedWindowConstraintPart * old_pane = &(PaneInfo(old)->panedw);
Packit b099d7
   XmPanedWindowConstraintPart * new_pane = &(PaneInfo(new_w)->panedw);
Packit b099d7
   register Widget tmp;
Packit b099d7
   XtWidgetGeometry current ;
Packit b099d7
Packit b099d7
   if (!XtIsRectObj(new_w)) return(FALSE);
Packit b099d7
Packit b099d7
    if (PanePosIndex(old) != PanePosIndex(new_w)) {
Packit b099d7
Packit b099d7
      /* first check for a valid value */
Packit b099d7
       /* count the number of pane children : not sash and separator */
Packit b099d7
       i = 0 ;
Packit b099d7
       while ((i < pw->composite.num_children) &&
Packit b099d7
		IsPane(pw->composite.children[i])) 
Packit b099d7
		i++;
Packit b099d7
Packit b099d7
       /* special public value */
Packit b099d7
      if (PanePosIndex(new_w) == XmLAST_POSITION)
Packit b099d7
          PanePosIndex(new_w) = i - 1 ;
Packit b099d7
Packit b099d7
      if ((PanePosIndex(new_w) < 0) || (PanePosIndex(new_w) >= i)) {
Packit b099d7
          PanePosIndex(new_w) = PanePosIndex(old) ; /* warning ? */
Packit b099d7
      } else {
Packit b099d7
          int inc ;       /* change the configuration of the children list:
Packit b099d7
             put the requesting child at the new position and
Packit b099d7
             shift the others as needed (2 cases here) */
Packit b099d7
          tmp = pw->composite.children[PanePosIndex(old)] ;
Packit b099d7
          if (PanePosIndex(new_w) < PanePosIndex(old)) inc = -1 ; else inc = 1 ;
Packit b099d7
          
Packit b099d7
          for (i = PanePosIndex(old)  ; i != PanePosIndex(new_w) ; i+=inc) {
Packit b099d7
              pw->composite.children[i] = pw->composite.children[i+inc];
Packit b099d7
              PanePosIndex(pw->composite.children[i]) = i ;
Packit b099d7
          }
Packit b099d7
          pw->composite.children[PanePosIndex(new_w)] = tmp ;
Packit b099d7
          
Packit b099d7
	  /* save the current geometry of the child */
Packit b099d7
	  current.x = XtX(new_w) ;
Packit b099d7
	  current.y = XtY(new_w) ;
Packit b099d7
	  current.width = XtWidth(new_w) ;
Packit b099d7
	  current.height = XtHeight(new_w) ;
Packit b099d7
	  current.border_width = XtBorderWidth(new_w) ;
Packit b099d7
Packit b099d7
          /* re-layout, move the child and possibly change the pw size */
Packit b099d7
          if (XtIsRealized((Widget)pw)) ChangeManaged((Widget) pw) ;
Packit b099d7
Packit b099d7
          /* if we have changed the position/size of this child, next
Packit b099d7
             step after this setvalues chain is the geometry manager
Packit b099d7
             request. We need to tell the geometry manager that
Packit b099d7
             this request is to be always honored. As the positionIndex field
Packit b099d7
             itself is self-computable, we can use it to track this
Packit b099d7
             case. We set it to a magic value here, and in the geometry
Packit b099d7
             manager, we'll have to reset it to its correct value by
Packit b099d7
             re-computing it - adding a field in the instance is another way
Packit b099d7
             for doing that, clever but more expensive */
Packit b099d7
          if ((current.x != XtX(new_w)) ||
Packit b099d7
	      (current.y != XtY(new_w)) ||
Packit b099d7
	      (current.width != XtWidth(new_w)) ||
Packit b099d7
	      (current.height != XtHeight(new_w)) ||
Packit b099d7
	      (current.border_width != XtBorderWidth(new_w)))
Packit b099d7
	      PanePosIndex(new_w) = XmLAST_POSITION ;
Packit b099d7
      }
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (old_pane->min != new_pane->min || old_pane->max != new_pane->max)
Packit b099d7
    {
Packit b099d7
        
Packit b099d7
       if (new_pane->min < 1)
Packit b099d7
	{
Packit b099d7
           XmeWarning( (Widget) pw, MESSAGE4);
Packit b099d7
	   new_pane->min = old_pane->min;
Packit b099d7
	}
Packit b099d7
Packit b099d7
       if (new_pane->max < 1)
Packit b099d7
	{
Packit b099d7
           XmeWarning( (Widget) pw, MESSAGE5);
Packit b099d7
	   new_pane->max = old_pane->max;
Packit b099d7
	}
Packit b099d7
Packit b099d7
       if (new_pane->min > new_pane->max)
Packit b099d7
	{
Packit b099d7
           XmeWarning( (Widget) pw, MESSAGE6);
Packit b099d7
	   new_pane->min = old_pane->min;
Packit b099d7
	   new_pane->max = old_pane->max;
Packit b099d7
	}
Packit b099d7
Packit b099d7
       if ((new_pane->min == new_pane->max) && 
Packit b099d7
            (new_pane->sash != NULL))
Packit b099d7
      	{
Packit b099d7
           XtUnmanageChild(new_pane->sash);
Packit b099d7
      	} 
Packit b099d7
       else
Packit b099d7
      	{
Packit b099d7
           count =pw->paned_window.pane_count -1;
Packit b099d7
           if (new_pane->position != count) { 
Packit b099d7
              if (new_pane->separator == NULL) {
Packit b099d7
   		 pw->paned_window.recursively_called = True;
Packit b099d7
	         new_pane->separator = XtCreateWidget("separator", 
Packit b099d7
                                                     xmSeparatorGadgetClass,
Packit b099d7
                                                     (Widget)pw, NULL, 0);
Packit b099d7
   		 pw->paned_window.recursively_called = False;
Packit b099d7
Packit b099d7
                 if (XtIsRealized(new_w)) XtRealizeWidget(new_pane->separator);
Packit b099d7
         
Packit b099d7
	      }
Packit b099d7
              if (pw->paned_window.separator_on)
Packit b099d7
                       XtManageChild(new_pane->separator);
Packit b099d7
              if (new_pane->min != new_pane->max) {
Packit b099d7
                 if (new_pane->sash == NULL) {
Packit b099d7
		    Cardinal nargs = 0;
Packit b099d7
Packit b099d7
                    XtSetArg(sashargs[nargs], XmNwidth,
Packit b099d7
			     pw->paned_window.sash_width), nargs++;
Packit b099d7
                    XtSetArg(sashargs[nargs], XmNheight,
Packit b099d7
			     pw->paned_window.sash_height), nargs++;
Packit b099d7
                    XtSetArg(sashargs[nargs], XmNshadowThickness, 
Packit b099d7
                             pw->paned_window.sash_shadow_thickness), nargs++;
Packit b099d7
                    XtSetArg(sashargs[nargs], XmNunitType, 
Packit b099d7
			     (XtArgVal) XmPIXELS), nargs++;
Packit b099d7
		    assert(nargs <= XtNumber(sashargs));
Packit b099d7
   		    pw->paned_window.recursively_called = True;
Packit b099d7
	            new_pane->sash = 
Packit b099d7
		      XtCreateManagedWidget("sash", 
Packit b099d7
					    xmSashWidgetClass, (Widget)pw,
Packit b099d7
					    sashargs, nargs);
Packit b099d7
		    XtAddCallback(new_pane->sash, XmNcallback, 
Packit b099d7
				  HandleSash, (XtPointer)new_w);
Packit b099d7
   		    pw->paned_window.recursively_called = False;
Packit b099d7
Packit b099d7
                    if (XtIsRealized(new_w))  XtRealizeWidget(new_pane->sash);
Packit b099d7
          
Packit b099d7
	          } 
Packit b099d7
               }
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
       if (XtIsManaged(new_w) && XtIsRealized((Widget)pw))
Packit b099d7
       {
Packit b099d7
	  if (new_pane->min > MajorChildSize(pw, new_w)) 
Packit b099d7
          {
Packit b099d7
	      MajorAssign(pw, new_w->core, new_pane->min);
Packit b099d7
          }
Packit b099d7
	  if (new_pane->max < MajorChildSize(pw, new_w)) 
Packit b099d7
          {
Packit b099d7
	      MajorAssign(pw, new_w->core, new_pane->max);
Packit b099d7
          }
Packit b099d7
	  old_pane->min = new_pane->min;
Packit b099d7
	  old_pane->max = new_pane->max;
Packit b099d7
       }
Packit b099d7
Packit b099d7
       /* save the current geometry of the child  (CR 7671) */
Packit b099d7
       current.x = XtX(new_w) ;
Packit b099d7
       current.y = XtY(new_w) ;
Packit b099d7
       current.width = XtWidth(new_w) ;
Packit b099d7
       current.height = XtHeight(new_w) ;
Packit b099d7
       current.border_width = XtBorderWidth(new_w) ;
Packit b099d7
Packit b099d7
       /* re-layout, move the child and possibly change the pw size */
Packit b099d7
       if (XtIsRealized((Widget)pw)) ChangeManaged((Widget) pw) ;
Packit b099d7
Packit b099d7
       if ((current.x != XtX(new_w)) ||
Packit b099d7
	   (current.y != XtY(new_w)) ||
Packit b099d7
	   (current.width != XtWidth(new_w)) ||
Packit b099d7
	   (current.height != XtHeight(new_w)) ||
Packit b099d7
	   (current.border_width != XtBorderWidth(new_w)))
Packit b099d7
	   /* see above comment on LAST_POSITION */
Packit b099d7
	   PanePosIndex(new_w) = XmLAST_POSITION ; 
Packit b099d7
Packit b099d7
       return(True);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   return False;
Packit b099d7
} 
Packit b099d7
Packit b099d7
Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Widget XmCreatePanedWindow(parent, name, args, argCount)
Packit b099d7
 *      Widget 	parent;
Packit b099d7
 *      char 	*name;
Packit b099d7
 *      ArgList	args;
Packit b099d7
 *      int	argCount;
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *   A convenience routine to be used in creating a new PanedWindow
Packit b099d7
 *   manager widget.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Widget 
Packit b099d7
XmCreatePanedWindow(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal argCount )
Packit b099d7
{
Packit b099d7
    return (XtCreateWidget(name, xmPanedWindowWidgetClass,
Packit b099d7
                                   parent, args, argCount));
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreatePanedWindow(
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
                         xmPanedWindowWidgetClass,
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
XmVaCreateManagedPanedWindow(
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
                         xmPanedWindowWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}