/*
 * Motif
 *
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
 *
 * These libraries and programs are free software; you can
 * redistribute them and/or modify them under the terms of the GNU
 * Lesser General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * These libraries and programs are distributed in the hope that
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with these librararies and programs; if not, write
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA 02110-1301 USA
 * 
 */

#ifndef _XmHierarchyP_h
#define _XmHierarchyP_h

#if defined(VMS) || defined(__VMS)
#include <X11/apienvset.h>
#endif

/************************************************************
*	INCLUDE FILES
*************************************************************/
#include <Xm/ManagerP.h>
#include <Xm/ExtP.h>
#include <Xm/Hierarchy.h>

/************************************************************
*	TYPEDEFS AND DEFINES
*************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

#define IS_MAPPED	(1L << 1)
#define IS_COMPRESSED   (1L << 2)
#define PARENT_GONE	(1L << 3)
#define IS_SELECTED	(1L << 4)

/************************************************************
*	MACROS
*************************************************************/

/************************************************************
*	GLOBAL DECLARATIONS
*************************************************************/

typedef struct _HierNodeInfo {
    /*
     * Public (Resource) data.
     */

    XmHierarchyNodeState state;	/* State of the node. */
    Widget parent;		/* parent of this child. */
    Widget insert_before;	/* Sibling to insert this node before;
				   NULL will place it at the end. */
    Pixmap open_folder, close_folder; /* Images for open/close buttons. */

    /*
     * Private data.
     */

    Widget widget;		/* Back pointer to this node's widget. */
    Widget open_close_button;	/* The open or close button. */

    struct _HierarchyConstraintRec ** children;       /* norm children. */
    Cardinal num_children;	/* number of each type of children. */
    Cardinal alloc_attrs, alloc;   /* amount of allocated space for each */

    unsigned char status;	/* 8 status bits. */
} HierNodeInfo;

typedef struct _HierarchyConstraintRec {
    XmManagerConstraintPart manager;
    HierNodeInfo hierarchy;
} HierarchyConstraintRec, XmHierarchyConstraintRec, *HierarchyConstraints;

typedef void	(*XmHierarchyNodeProc)(HierarchyConstraints);
typedef void	(*XmHierarchyExtraNodeProc)(Widget, HierarchyConstraints);
typedef void	(*XmHierarchyBuildTableProc)(Widget, 
					     HierarchyConstraints, Cardinal *);
typedef void	(*XmHierarchyResetButtonProc)(Widget, HierarchyConstraints);
    
typedef struct {
    /* Class function for changing node state. */
    XmHierarchyNodeProc		change_node_state;
    /* map or unmap a given node. */
    XmHierarchyNodeProc 	map_node;
    XmHierarchyNodeProc		unmap_node;
    /* Unmaps all the extra nodes. */
    XmHierarchyExtraNodeProc	unmap_all_extra_nodes;
    /* Builds the node table. */
    XmHierarchyBuildTableProc	build_node_table;
    /* Correctly sets the state of the open/close button. */
    XmHierarchyResetButtonProc	reset_open_close_button;
    /* Toggles state of a node. */
    XtCallbackProc 		toggle_node_state;
    /* Just in case we need it later. */
    XtPointer 			extension;	
} HierarchyClassPart;

typedef struct _XmHierarchyClassRec {
    CoreClassPart		core_class;
    CompositeClassPart		composite_class;
    ConstraintClassPart		constraint_class;
    XmManagerClassPart		manager_class;
    HierarchyClassPart          hierarchy_class;
} XmHierarchyClassRec;

externalref XmHierarchyClassRec xmHierarchyClassRec;

typedef struct _HierarchyPart {
    /* resources */

    Boolean auto_close;		/* Auto-close children when parent is closed?*/
    Boolean refigure_mode;	/* Do refigures? */

    Dimension h_margin;		/* The horizontal margin. */
    Dimension v_margin;		/* The vertical margin. */
    Pixmap open_folder, close_folder; /* Images for open/close buttons. */

    XtCallbackList node_state_callback;	/* Called when the node button is
					   clicked */
    XtCallbackList node_state_changed_callback;	/* Called when the node state
						   changes */
    XtCallbackList node_state_beg_end_callback; /* Called when beginning
						     or ending a set of node
						     state changes */

    /* private state */

    HierarchyConstraintRec ** node_table;
    HierarchyConstraints top_node; 
    Cardinal num_nodes, alloc_nodes;
    Pixmap def_open_folder, def_close_folder; /* Default folder button Images*/

    XtWorkProcId work_proc_id;  /* work proc id for the move nodes wp */
} HierarchyPart;

typedef struct _XmHierarchyRec {
    CorePart		core;
    CompositePart	composite;
    ConstraintPart	constraint;
    XmManagerPart	manager;
    HierarchyPart	hierarchy;
} XmHierarchyRec;

/*
 * These are necessary because the XmResolvePartOffset macros assume a
 * certain naming convention
 */
typedef HierarchyPart XmHierarchyPart;
typedef HierNodeInfo  XmHierarchyConstraintPart;

#define XmHierarchy_auto_close(w) (((XmHierarchyWidget)(w))->hierarchy.auto_close)
#define XmHierarchy_refigure_mode(w) (((XmHierarchyWidget)(w))->hierarchy.refigure_mode)
#define XmHierarchy_h_margin(w) (((XmHierarchyWidget)(w))->hierarchy.h_margin)
#define XmHierarchy_v_margin(w) (((XmHierarchyWidget)(w))->hierarchy.v_margin)
#define XmHierarchy_open_folder(w) (((XmHierarchyWidget)(w))->hierarchy.open_folder)
#define XmHierarchy_close_folder(w) (((XmHierarchyWidget)(w))->hierarchy.close_folder)
#define XmHierarchy_node_state_callback(w) (((XmHierarchyWidget)(w))->hierarchy.node_state_callback)
#define XmHierarchy_node_state_changed_callback(w) (((XmHierarchyWidget)(w))->hierarchy.node_state_changed_callback)
#define XmHierarchy_node_state_beg_end_callback(w) (((XmHierarchyWidget)(w))->hierarchy.node_state_beg_end_callback)
#define XmHierarchy_node_table(w) (((XmHierarchyWidget)(w))->hierarchy.node_table)
#define XmHierarchy_top_node(w) (((XmHierarchyWidget)(w))->hierarchy.top_node)
#define XmHierarchy_num_nodes(w) (((XmHierarchyWidget)(w))->hierarchy.num_nodes)
#define XmHierarchy_alloc_nodes(w) (((XmHierarchyWidget)(w))->hierarchy.alloc_nodes)
#define XmHierarchy_def_open_folder(w) (((XmHierarchyWidget)(w))->hierarchy.def_open_folder)
#define XmHierarchy_def_close_folder(w) (((XmHierarchyWidget)(w))->hierarchy.def_close_folder)
#define XmHierarchy_work_proc_id(w) (((XmHierarchyWidget)(w))->hierarchy.work_proc_id)

#define XmHierarchyC_state(constraints) ((constraints)->hierarchy.state)
#define XmHierarchyC_parent(constraints) ((constraints)->hierarchy.parent)
#define XmHierarchyC_insert_before(constraints) ((constraints)->hierarchy.insert_before)
#define XmHierarchyC_open_folder(constraints) ((constraints)->hierarchy.open_folder)
#define XmHierarchyC_close_folder(constraints) ((constraints)->hierarchy.close_folder)
#define XmHierarchyC_widget(constraints) ((constraints)->hierarchy.widget)
#define XmHierarchyC_open_close_button(constraints) ((constraints)->hierarchy.open_close_button)
#define XmHierarchyC_children(constraints) ((constraints)->hierarchy.children)
#define XmHierarchyC_num_children(constraints) ((constraints)->hierarchy.num_children)
#define XmHierarchyC_alloc_attrs(constraints) ((constraints)->hierarchy.alloc_attrs)
#define XmHierarchyC_alloc(constraints) ((constraints)->hierarchy.alloc)
#define XmHierarchyC_status(constraints) ((constraints)->hierarchy.status)

#define XtInheritChangeNodeState       ((XmHierarchyNodeProc)_XtInherit)
#define XtInheritUnmapAllExtraNodes    ((XmHierarchyExtraNodeProc)_XtInherit)
#define XtInheritUnmapNode 	       ((XmHierarchyNodeProc)_XtInherit)
#define XtInheritMapNode 	       ((XmHierarchyNodeProc)_XtInherit)
#define XtInheritBuildNodeTable        ((XmHierarchyBuildTableProc)_XtInherit)
#define XtInheritResetOpenCloseButton  ((XmHierarchyResetButtonProc)_XtInherit)
#define XtInheritToggleNodeState       ((XtCallbackProc)_XtInherit)

/************************************************************
*	EXTERNAL DECLARATIONS
*************************************************************/


/************************************************************
*	STATIC DECLARATIONS
*************************************************************/

#ifdef __cplusplus
}	/* Closes scope of 'extern "C"' declaration */
#endif

#if defined(VMS) || defined(__VMS)
#include <X11/apienvrst.h>
#endif

#endif /* _HierarchyP_h */
