#ifndef MTEP_H
#define MTEP_H

#include "mte.h"
#include "darray.h"
#include "bool.h"
#include "mteintrinsics.h"
#include "FieldType.h"
#include "FTreg.h"
#include "menupack.h"

#ifdef __STDC__
typedef enum MteFFromWhere_enum { MTE_FIELD_FROM_MT, MTE_FIELD_FROM_USER } MteFFromWhere;
#else
typedef int MteFFromWhere;
#define MTE_FIELD_FROM_MT 0
#define MTE_FIELD_FROM_USER 1
#endif

typedef struct MteField_str {
  Widget    ContainerW;
  char      *key;
  Widget    KeyW;
  unsigned  KeyLength;
  AlFieldType FieldType;
  char      *fieldTypeName;
  MenuPack  FTMenu;
  Widget    FTMenuW;
  Widget    FTW;
  MteFFromWhere FromWhere;
} *MteField;

typedef struct MteFTret_str {
  MteGR GR;
  char *fieldType;
  MteField Field;
} *MteFTret;

struct MteGR_str {
  MteFromWhere FromWhere;
  AlMsgType MT;
  Darray Fields;    /* of MteFields */
  Bool Modified;
  MteSaveFunc SaveFunc;
  MteQuitFunc QuitFunc;
  int argc;
  char **argv;
  Widget OuterW, ShellW;
  Widget ContainerW;
  Darray FTrets;   /* list of all FTrets so we can free mem on quit */
  Bool Instantiated;
  AlMsgType ParentMT;
  char *fullName, *name;
  Bool ReadOnly;
  char* saveFileName;
  VOIDP ClientData;
  AlFieldType DefaultFT;
};

#ifdef __STDC__
NORET     Mte_instantiate(MteGR);
MteField  MteField_create(MteGR,char*,AlFieldType,MteFFromWhere);
MteFTret  MteFTret_create(MteGR,char*,MteField);
MenuPack  MteField_make_FTmenu(MteGR,MteField);
NORET     Mte_fill_container(MteGR);
NORET     Mte_add_field(MteGR,MteField,Widget);
NORET     Mte_fill_bottom_tb(MteGR,Widget);
NORET     MteFTret_destroy(MteFTret);
NORET     Mte_fill_ttb(MteGR,Widget);
#else
NORET     Mte_instantiate();
MteField  MteField_create();
MteFTret  MteFTret_create();
MenuPack  MteField_make_FTmenu();
NORET     Mte_fill_container();
NORET     Mte_add_field();
NORET     Mte_fill_bottom_tb();
NORET     MteFTret_destroy();
NORET     Mte_fill_ttb();
#endif

#endif
