#ifndef GLOBAL_H
#define GLOBAL_H 1
#include "FieldType.h"
#include "darray.h"
#include "rule.h"
#include "registry.h"
#include "biregistry.h"
#include "ruleset.h"
#include "xstuff.h" 
#include "verbs.h"
#include "verb.h"
#include "menupack.h"
#include "Mintrins.h"

#define RE_TEXT_FILE "ruleeditor.txt"
#define RE_GENERAL_HELP_STRING "ruleeditor general help"
#define RE_HELP_POSTFIX " HELP"
#define VERBS_HELP_STRING "verbs general help"

#ifdef __STDC__
typedef enum ReMode_enum {RE_MODE_SIMPLE, 
			    RE_MODE_COMPLEX, 
			    RE_MODE_NORMAL } ReMode;
typedef enum ReSelectType_enum { RE_SELECT_NONE,
				   RE_SELECT_FIELD,
				   RE_SELECT_BOX,
				   RE_SELECT_ACTION,
				   RE_SELECT_THEN_BAR,
				   RE_SELECT_BAR,
				   RE_SELECT_ARGUMENT,
				   RE_SELECT_MESSAGE_TYPE,
				   RE_SELECT_NAME } ReSelectType;
#else
typedef int ReMode;
#define RE_MODE_SIMPLE  0
#define RE_MODE_COMPLEX 1
#define RE_MODE_NORMAL  2
typedef int ReSelectType;
#define RE_SELECT_NONE     0
#define RE_SELECT_FIELD    1
#define RE_SELECT_BOX      2
#define RE_SELECT_ACTION   3
#define RE_SELECT_THEN_BAR 4
#define RE_SELECT_BAR      5
#define RE_SELECT_ARGUMENT 6
#define RE_SELECT_MESSAGE_TYPE 7
#define RE_SELECT_NAME         8

#endif

#define ReMode_or(a,b) ((a==RE_MODE_COMPLEX || b==RE_MODE_COMPLEX) ?  RE_MODE_COMPLEX : RE_MODE_SIMPLE)

typedef struct reid_str {
  AlRule        Rule;
  Display*      display;
  void          (*SaveFunc)();
  void          (*QuitFunc)();
  int*          argc;
  char**        argv;
  char *        title;
  XImage*       Graphic;
  VOIDP         UserData;
  Registry      Strings;
  XmFontList    Fonts;

/*----------------------------- Display 2 (d2) Globals */
  Widget        IfW;
  Widget        ThenW;
  Widget        ShellW;
  Widget        DoingW;
  Widget        OuterW;
  Widget        IfButtonsW, ThenButtonsW, BottomTBW;  /* need for setting */
						      /* tab groups */
  Widget        SimpleW, ComplexW, NormalW, NoviceW, ExpertW;
  Widget        ThenBarW;
  Widget        ArgumentAddW, ArgumentDeleteW, ActionAddW, ActionDeleteW;

  /* iF MENU */
  Widget        TextFieldAddW, ComplexFieldAddW, IfDeleteW;
  /* a darray of the easy access field type widgets in the IF menu */
  Darray        EasyAccessFTsWs;

  Widget        ThenHelpW, IfHelpW;
  Widget        MessageTypeW, RuleNameW, ThenAddMenuW;
  Widget        PredicateMenuW, ThenMenuW;
  Widget        PredicateMenupane, ThenMenupane;
  Bool          OnSimple;
  Pixel         TopC, BotC;
  Pixmap        TopP, BotP;
  ReMode        Mode;
  XtAppContext  AppContext;
  int           if_field_spacing, if_key_width, if_value_width;
  int           if_field_height, if_field_width, if_field_inner_height;
  int           app_work_width, app_buttons_width;
  int           app_width, app_height;

  struct FieldEdit_str * fe;
/*---------------------------- Rule (ru) globals */
  struct REMember_str   *TopLevelMember;
  Darray                Actions;
  char*                 message_type;
  struct REField_str    *MTField;

/*---------------------------- Editing (ed) globals */
  Darray        WidgetKillList;
  Bool          DisableEdit;
  Bool          Modified;
  VOIDP         Selected;
  ReSelectType  SelectedType;
  Pixmap        borderP, iconP;
} *reid;


extern Darray     VerbNames_GR;
extern Darray     Verbs_GR;
extern Darray     FieldTypeNames_GR;
extern Darray     VerbPresOrder_GR; 
extern AlFieldType DefaultFT_GR;
extern Darray     MsgTypeNames_GR;

extern Registry   ShowOpOnTheseFieldTypes_GR;
extern Darray     EasyAccessFieldTypes_GR;
extern Darray     FieldTypePresOrder_GR; 
extern MenuPack   VerbsHelpMenu_GR;
extern MenuPack   PredicateHelpMenu_GR;

extern int        ShadowThickness_GR;
#include "rem.h"

#ifdef __STDC__
reid reid_Create(Display*,AlRule,
		 void(*)(reid,AlRule,VOIDP),
		 void(*)(reid,VOIDP),
		 int*,char**,
		 char*,XImage*,VOIDP,Pixmap,Pixmap);
NORET reid_GlobalInit();
#else
reid reid_Create();
NORET reid_GlobalInit();
#endif

#endif



