/*
 * Copyright 1990 by Baylor College of Medicine ALL RIGHTS RESERVED. 
 *
 * This program is subject to a license agreement between 
 * Baylor College of Medicine and MIT. Any use inconsistent with
 * said license and any use by persons other than the faculty, 
 * students and staff at MIT or any use on a computer not operated 
 * as part of the Athena Computing Environment (ACE) is expressly 
 * prohibited.
 */
#ifndef _BROWSERPUB_
#define _BROWSERPUB_

#define XmNtreeListChanged "treeListChanged"
#define XmCTreeListChanged "TreeListChanged"

#define XmNsingleSelectionCallback "singleSelectionCallback"
#define XmCSingleSelectionCallback "SingleSelectionCallback"

#define XmNmultipleSelectionCallback "multipleSelectionCallback"
#define XmCMultipleSelectionCallback "MultipleSelectionCallback"

#define XmNdoubleClickCallback "doubleClickCallback"
#define XmCDoubleClickCallback "DoubleClickCallback"

#define XmNcheckForChildrenCallback "checkForChildrenCallback"
#define XmCCheckForChildrenCallback "CheckForChildrenCallback"

#define XmNgetChildrenCallback "getChildrenCallback"
#define XmCGetChildrenCallback "GetChildrenCallback"

#define XmNdoubleClickDelay "doubleClickDelay"
#define XmCDoubleClickDelay "DoubleClickDelay"

#define XmNdestroyNodeCallback "destroyNodeCallback"
#define XmCDestroyNodeCallback "DestroyNodeCallback"

#define XmNbrowserStyle "browserStyle"
#define XmCBrowserStyle "BrowserStyle"

#define XmNinquireChildrenCallback "inquireChildrenCallback"
#define XmCInquireChildrenCallback "InquireChildrenCallback"

#define XmNgetChildrenCallback "getChildrenCallback"
#define XmCGetChildrenCallback "GetChildrenCallback"

#define XmNbrowserPolicy "browserPolicy"
#define XmCBrowserPolicy "BrowserPolicy"

#define XmNverticalSpacing "verticalSpacing"
#define XmCVerticalSpacing "VerticalSpacing"

#define XmNhorizontalSpacing "horizontalSpacing"
#define XmCHorizontalSpacing "HorizontalSpacing"

#define XmNoutlineIndention "outlineIndention"
#define XmCOutlineIndention "OutlineIndention"

#define XmNchildMarker "childMarker"
#define XmCChildMarker "ChildMarker"

#define XtNfont "font"
#define XtCfont "Font"

#define XmNrootNode "rootNode"
#define XmCrootNode "RootNode"

#define XmNshowNodeTag "showNodeTag"
#define XmCShowNodeTag "ShowNodeTag"

#define XtRNode "Node"

/* browser styles */
#define XmBROWSER_OUTLINE   1
#define XmBROWSER_GRAPHICAL 2

/* browser selection policy */
#define XmBROWSER_SINGLE    1
#define XmBROWSER_MULTIPLE  2

/* callback reasons */
#define XmCR_SINGLE              1
#define XmCR_DOUBLE              2
#define XmCR_CHECK_FOR_CHILDREN  3
#define XmCR_GET_CHILDREN        4
#define XmCR_DESTROY_NODE        5

typedef struct _XmBrowserCallback XmBrowserCallback;

typedef struct _XmBrowserCallback
{
	void (*callback)();
	XtPointer data;
	XmBrowserCallback *next;
};

typedef struct _NodePart *NodeCore;
typedef struct _Tree Tree;

typedef struct _Node
{
	NodeCore core;
	Tree *tree;
	char *node_title;
	char *node_tag;
	XtPointer user_data;
} Node;

typedef struct _Tree
{
	char *name;          /* name of the browser tree */
	Node *root;          /* the root node of the browser tree */
	Tree *next;          /* pointer to the next tree */
	XmBrowserCallback *single_callback;
	XmBrowserCallback *double_callback;
	XmBrowserCallback *destroy_callback;
	XmBrowserCallback *check_callback;
	XmBrowserCallback *get_children_callback;
};

typedef struct _XmBrowserCallbackStruct
{
	int reason;           /* reasone for callback */
	Node *node;           /* node currently selected */
	XEvent *event;        /* event which caused selection */
	Boolean has_children; /* logical for checking for children */
} XmBrowserCallbackStruct;

extern WidgetClass browserWidgetClass;

typedef struct _BrowserClassRec *BrowserWidgetClass;
typedef struct _BrowserRec      *BrowserWidget;

/* public functions */
Node *XmBrowserAddNode();
void XmBrowserDeleteNode();
void XmBrowserDeselectAll();
Node *XmBrowserParent();
Node *XmBrowserNextSibling();
Node *XmBrowserGetRootNode();
Node *XmBrowserSearchTree();
Tree *XmBrowserCreateTree();
void XmBrowserCallCallbacks();
void XmBrowserAddCallback();
Tree *XmBrowserGetTreeList();

#endif /* _BROWSERPUB_ */
