#ifndef RL_H
#define RL_H 1

#include "Mintrins.h"
#include "darray.h"
#include "menupack.h"
#include "verb.h"
#include "rule.h"
#include "biregistry.h"
#include "bool.h"
#include "sysdep.h"
#include "FieldType.h"
#include "global.h"

#define KEY_LENGTH            75
#define ARGUMENT_LENGTH       500
#define VALUE_LENGTH          200

#define MT_UNDEFINED_STRING "<undefined>"
#define MT_KEY_STRING "Message-Type:"

typedef struct {
    int  firstPos;
    int  length;
    char *ptr;
    Atom format;
    } XtTextBlock, *XtTextBlockPtr;

typedef struct REMember_str {
  AlRMType Type;
  union {
    struct REField_str *Field;
    struct REAssoc_str *Assoc;
  } object;
  struct REMember_str *father;
} *REMember;

typedef struct REAssoc_str {
  Darray         Contents; /* of REMembers */
  reid           rei;        /* !!! this should be put intop the REmember */
  REMember       container;
  AlRAType       Type;
  Widget         ContainerW;
  Widget         InnerContainerW;
  Widget         LabelW;
  Widget         BarW;
  MenuPack       Menu;
} *REAssoc;

#ifdef __STDC__
typedef enum FromWhere_en { REF_FROM_TEMPLATE, REF_FROM_USER } REFromWhere;
#else
typedef int REFromWhere;
#define REF_FROM_TEMPLATE 0
#define REF_FROM_USER     1
#endif

typedef struct REField_str {
  reid           rei;
  REMember       container;
  REFromWhere    FromWhere;
  AlRFType       Type;
  Bool           IsState;    /*  in editing this is desired state of field */
  AlFieldType    FieldTypeObject;
  char *         FieldClass;
  char *         FieldType;
  char *         FieldOp;
  char *         defaultFieldOp;
  MenuPack       OpMenu; 
  MenuPack       ClassMenu;
  MenuPack       TypeMenu;
  MenuPack       KeyMenu;
  Bool           KeyIsMenu;  /* always current state, regardless of desired*/
  Bool           ShowOp;
  Widget         KeyW, OtherKeyW;
  Widget         ValueW;
  Widget         OpW, SelectW;
  Widget         ContainerW;
  Widget         LeftContainerW, RightContainerW, ClassW, TypeW;
  int            MaxValueBufferLength; /* size of the buffer */
  char           *Value;
  char           *Key;
  int            MaxKeyLength;         /* size of the buffer */
  Bool           ExistanceOp;
  char           *ValueBufferSave;  /* used by the existance mechanism */
  char           MyAddress[17];  /* this is used to identify this object */
				 /* when making X event callbacks. */
  char*          predValTranslations; /* a special list of translations for*/
                                /* predicate value widget. */
  char*          predKeyTranslations; /* same list but for the key, only */
				      /* used when they key is editable, */
				      /* used to ensure that colons follow */
				      /* all field names. */
  Bool           ValueIsParsable;
  ReMode         Mode;
  ReMode         VisibleMode;
} *REField;

typedef struct FieldRet_str {
  char * name;
  REField  Field;
} *FieldRet;

typedef struct FTOpRet_str {
  char * fieldOp;
  REField Field;
} *FTOpRet;

typedef struct REArgument_str {
  struct REAction_str* action;
  char   *Arg;
  Widget ArgW;
} *REArgument;

typedef struct REAction_str {
  reid      rei;
  AlVerb    Verb;
  char *    VerbName;
  Widget    MenuW, VerbW;
  Widget    ContainerW;
  Darray    Arguments;
  MenuPack  Menu;
} *REAction;

typedef struct REVerbRet_str {
  char      *name;
  REAction  Action;
} *REVerbRet;

typedef struct REArgRet_str {
  REArgument arg;
  REAction action;
} *REArgRet;

#define ARGUMENT_ADD_FUNCTION_MENU_NAME "Add Argument To End"
#define ARGUMENT_DEL_FUNCTION_MENU_NAME "Delete This Argument"

extern void       rl_Init PROTOTYPE((reid));
extern REMember   rl_REMember_create PROTOTYPE((AlRMType, VOIDP, REMember));
extern REMember   rl_REMember_create_at_index PROTOTYPE((AlRMType,VOIDP, 
							 REMember, int));
extern NORET      rl_REMember_destroy PROTOTYPE((REMember));
extern int        rl_REMember_get_index PROTOTYPE((REMember));
extern NORET      rl_REMember_clear_for_screen PROTOTYPE((REMember));
extern REField    rl_REField_create PROTOTYPE((reid,AlRFType,
					       char*,char*,char*,char*,
					       REFromWhere));
extern NORET      rl_REField_clear_for_screen PROTOTYPE((REField));
extern MenuPack   rl_MakeOpMenu PROTOTYPE((REField));
extern MenuPack   rl_MakeClassMenu PROTOTYPE((REField));
extern MenuPack   rl_MakeTypeMenu PROTOTYPE((REField));
extern REAssoc 	  rl_REAssoc_create PROTOTYPE((reid,AlRAType));
extern MenuPack   rl_REAssoc_MakeMenu PROTOTYPE((REAssoc));
extern NORET      rl_REAssoc_clear_for_screen PROTOTYPE((REAssoc));
extern REArgument rl_REArgument_create PROTOTYPE((reid,char*,REAction));
extern NORET      rl_REArgument_destroy PROTOTYPE((REArgument));
extern REAction   rl_REAction_create PROTOTYPE((reid,char*,Darray));
extern NORET      rl_REAction_destroy PROTOTYPE((REAction));
extern MenuPack   rl_REAssoc_MakeMenu PROTOTYPE((REAssoc));
extern MenuPack   rl_REAction_MakeMenu PROTOTYPE((reid,REAction,REArgument));
extern REMember   rl_TranslateToRE PROTOTYPE((reid,AlRuleMember));
extern REMember   rl_TranslateFieldToRE PROTOTYPE((reid,AlRuleMember,
						   REMember));
extern REMember   rl_TranslateAssocToRE PROTOTYPE((reid,AlRuleMember,
						   REMember));
extern Darray 	  rl_TranslateActionsToRE PROTOTYPE((reid,Darray));
extern Darray 	  rl_TranslateActionsFromRE PROTOTYPE((reid,Darray));
extern AlRuleMember  rl_TranslateFromRE PROTOTYPE((reid,REMember));
extern AlRuleMember  rl_TranslateFieldFromRE PROTOTYPE((reid,REMember,
							AlRuleMember));
extern AlRuleMember  rl_TranslateAssocFromRE PROTOTYPE((reid,REMember,
							AlRuleMember));
extern REField	  rl_REField_duplicate PROTOTYPE((reid,REField));
extern Darray     rl_Darray_remove_ptr PROTOTYPE((Darray,VOIDP));
extern Darray     rl_Darray_insert PROTOTYPE((Darray,VOIDP,int));
extern void       rl_SelectFieldOp_CB PROTOTYPE((Widget,caddr_t,caddr_t));
extern Bool       rl_Field_op_is_valid PROTOTYPE((AlFieldType,char*));
extern void       rl_Monitor_field_key PROTOTYPE((Widget,XEvent*,
						  String*,Cardinal*));
extern void       rl_Monitor_value_key PROTOTYPE((Widget,XEvent*,
						  String*,Cardinal*));
extern void       rl_Modified_rule PROTOTYPE((Widget,XEvent*,
					      String*,Cardinal*));
extern char *     rl_REField_make_translation PROTOTYPE((char*,char*,char*));
extern char *     rl_REField_augment_translations PROTOTYPE((char*,char*,
							     char*,char*));
extern Pixmap     rl_get_pixmap PROTOTYPE((reid,unsigned));
extern void       rl_Parse_field_and_update PROTOTYPE((REField));
extern char *     rl_Key_rj_and_add_colon PROTOTYPE((char*,int,int*));
extern Widget     rl_Get_widget_from_member PROTOTYPE((REMember));
extern NORET      rl_Get_surrounding_widgets PROTOTYPE((reid,REMember,
							Widget*,Widget*,
							Widget*));
extern NORET      rl_Get_surrounding_members PROTOTYPE((reid,REMember,
							REMember*,REMember*,
							REMember*));
extern NORET      rl_Verbs_add_to_menu PROTOTYPE((MenuPack,
						  XtCallbackProc,VOIDP));
extern NORET      rl_Actions_get_surrounding_widgets PROTOTYPE((reid,
								REAction,
								Widget*,
								Widget*));
extern NORET      rl_Arguments_get_surrounding_widgets PROTOTYPE((REAction,
								  REArgument,
								  Widget*,
								  Widget*));

#endif
