#include "assert.h"   /* must be first for use eith hc2 */
#include "global.h"
#include "memory.h"
#include "rem.h"
#include "df.h"
#include "RMFBuffer.h"
#include "d2args.h"
#include "bool.h"
#include "alxms.h"
#include "rap.h"

#define FT_INITED (1<<0)
Darray      FieldTypeNames_GR;
AlFieldType DefaultFT_GR;

#define RU_INITED (1<<1)
Darray      VerbNames_GR;
Darray      Verbs_GR;

#define RL_INIT (1<<2)
Darray      FieldTypePresOrder_GR; 
Darray      VerbPresOrder_GR; 
Registry    ShowOpOnTheseFieldTypes_GR;
Darray      EasyAccessFieldTypes_GR;

#define MT_INIT (1<<3)
Darray    MsgTypeNames_GR;

int ShadowThickness_GR=(-1);

MenuPack   VerbsHelpMenu_GR=NULL;      /* a submenu of the verbs as help */
MenuPack   PredicateHelpMenu_GR=NULL;  /* the predicate help menu */


RMFBuffer reid_Add_translation PROTOTYPE((RMFBuffer,char*,char*,int));
RMFBuffer reid_Add_simple PROTOTYPE((RMFBuffer,char*,int));

/*--------------------------------------------------*/
reid reid_Create(dis,Rule,SaveFunc,QuitFunc,argc,argv,
		 title,Graphic,UserData,borderP,iconP)
     Display *dis;
     AlRule Rule;
     ReSaveFunc* SaveFunc;
     ReQuitFunc* QuitFunc;
     int* argc;
     char** argv;
     char *title;
     XImage* Graphic;
     VOIDP UserData;
     Pixmap borderP, iconP;
{
  reid rei;
  char reidadd[50];
  rei=(reid)Memory_allocate(sizeof(struct reid_str));

  /*------------------------------ Client Application stuff */
  rei->Rule=Rule;
  rei->display=dis;
  rei->SaveFunc=SaveFunc;
  rei->QuitFunc=QuitFunc;
  rei->argc=argc;
  rei->argv=argv;
  rei->title=RapStr_duplicate(title);
  rei->Graphic=Graphic;
  rei->UserData=UserData;
  rei->Fonts=NULL;
  rei->Strings=Alxms_create_registry();
  rei->if_field_spacing=(-1);
  rei->if_field_height=(-1);
  rei->if_field_inner_height=(-1);
  rei->if_field_width=rei->app_width=rei->app_height=(-1);
  rei->app_work_width=rei->app_buttons_width=(-1);
  rei->if_key_width=(-1);
  rei->if_value_width=(-1);
  rei->fe=NULL;

  /*----------------------------- Display 2 (d2) Globals */
  rei->IfW=NULL;
  rei->ThenW=NULL;
  rei->Actions=Darray_create();
  rei->ShellW=NULL;
  rei->DoingW=NULL;
  rei->OuterW=NULL;
  rei->IfButtonsW=NULL;
  rei->ThenButtonsW=NULL;
  rei->SimpleW=NULL;
  rei->ComplexW=NULL;
  rei->OnSimple=Bool_TRUE;
  rei->NormalW=NULL;
  rei->NoviceW=NULL;
  rei->ExpertW=NULL;
  rei->BottomTBW=NULL;
  rei->ThenBarW=NULL;
    /* then menu */
  rei->ActionAddW=NULL;
  rei->ActionDeleteW=NULL;
  rei->ArgumentAddW=NULL;
  rei->ArgumentDeleteW=NULL;

  rei->TextFieldAddW=NULL;
  rei->ComplexFieldAddW=NULL;
  rei->IfDeleteW=NULL;
  rei->EasyAccessFTsWs=Darray_create();

  rei->ThenHelpW=NULL;
  rei->IfHelpW=NULL;
  rei->MessageTypeW=NULL;
  rei->RuleNameW=NULL;
  rei->ThenAddMenuW=NULL;

  if (AlProfile_has_value(ALPROF_DEFAULT_RE_MODE)==Bool_TRUE) {
    char *value=AlProfile_get_CP_val(ALPROF_DEFAULT_RE_MODE);
    if (strcasecmp(value,"simple")==0)
      rei->Mode=RE_MODE_SIMPLE;
    else if (strcasecmp(value,"complex")==0)
      rei->Mode=RE_MODE_COMPLEX;
    else {
      Al_warning1("Ruleeditor: value for profile component RuleeditorDefaultMode: '%s' is invalid, using simple mode instead.\n",value);
      rei->Mode=RE_MODE_SIMPLE;
    }
  }
  else
    rei->Mode=RE_MODE_SIMPLE;

  rei->PredicateMenuW=NULL;
  rei->ThenMenuW=NULL;
  rei->PredicateMenupane=NULL;
  rei->ThenMenupane=NULL;
  rei->AppContext=NULL;

  rei->TopC=NULL; rei->BotC=NULL; rei->TopP=NULL; rei->BotP=NULL;
  /*---------------------------- Rule (ru) globals */
  rei->TopLevelMember=NULL;
  rei->message_type=NULL;
  rei->MTField=NULL;
  
  /*---------------------------- Editing (ed) globals */
  rei->WidgetKillList=NULL;
  rei->DisableEdit=Bool_FALSE;
  rei->Modified=Bool_FALSE;
  rei->Selected=NULL;
  rei->SelectedType=RE_SELECT_NONE;
  rei->borderP=borderP;
  rei->iconP=iconP;
  return(rei);
}  

static Bool RE_Inited=Bool_FALSE;


/*--------------------------------------------------*/
NORET reid_GlobalInit()
{
  char *ftn;
  if (RE_Inited==Bool_FALSE) {
    /*-------------------- Field Type stuff */
    FieldTypeNames_GR=Darray_create();
    AlFTreg_get_all_field_types(FieldTypeNames_GR);
    if (Darray_len(FieldTypeNames_GR)<1)
      Al_fatal_error("ruleeditor: No Field Types available.\n");
    ftn=df_Get(DEFAULT_FT_NAME);
    if (AlFTreg_exists_string(ftn)==Bool_FALSE)
      ftn=(char*)Darray_get(FieldTypeNames_GR,(unsigned)0);
    DefaultFT_GR=AlFTreg_string_to_obj(ftn);

    ShowOpOnTheseFieldTypes_GR=Registry_create(Registry_strcmp,
					       Registry_strhash);
    if (AlProfile_has_value(ALPROF_FTS_THAT_SHOW_OPS)==Bool_TRUE) 
      RapList_parse_into_registry(ShowOpOnTheseFieldTypes_GR,
                	  AlProfile_get_CP_val(ALPROF_FTS_THAT_SHOW_OPS));
    
    EasyAccessFieldTypes_GR=Darray_create();
    if (AlProfile_has_value(ALPROF_EASY_ACCESS_FTS)==Bool_TRUE) 
      RapList_parse_into_darray(EasyAccessFieldTypes_GR,
				AlProfile_get_CP_val(ALPROF_EASY_ACCESS_FTS));


    /*-------------------- Msg type Stuff */
    MsgTypeNames_GR=Darray_create();
    AlMTreg_get_all_msg_type_names(MsgTypeNames_GR);

    /*-------------------- Verb Stuff */
    Verbs_GR=Darray_create();
    VerbNames_GR=Darray_create();
    AlVerbReg_get_verbs(VerbNames_GR,Verbs_GR);

    RE_Inited=Bool_TRUE;
  }
}

/*--------------------------------------------------*/
RMFBuffer reid_Add_translation(old,trans1,function,suppress)
RMFBuffer old;
char *trans1, *function;
int suppress;
{
  if (suppress!=0) {
    RMFBuffer_append_char(old,'\n');
  }
  RMFBuffer_append(old,trans1);
  RMFBuffer_append_char(old,' ');
  RMFBuffer_append(old,function);
  return(old);
}

/*--------------------------------------------------*/
RMFBuffer reid_Add_simple(old,trans1,suppress)
RMFBuffer old;
char *trans1;
int suppress;
{
  if (suppress!=0) {
    RMFBuffer_append_char(old,'\n');
  }
  RMFBuffer_append(old,trans1);
  return(old);
}

