#include "res.h"
#include "rem.h"
#include "ArgPack.h"
#include "childpack.h"
#include "menupack.h"
#include "end.h"
#include "xstuff.h" 
#include "rule.h"
#include "registry.h"
#include "biregistry.h"
#include "ruleset.h"
#include "d1.h"
#include "ru.h"
#include "d1Args.h"
#include "widgets.h"
#include "rl.h"
#include "ed.h"
#include "assert.h"
#include "rs.h"
#include "mt.h"
#include "useful.h"
#include "al.h"
#include "rebox.h"
#include "xstuff.h"

/*
XtActionsRec TActionTable[]={
  { "traverseUp", MoveUp },
  { "traverseDown", MoveDown },
  { "traverseLeft", MoveLeft },
  { "traverseRight", MoveRight },
};

char *TTranslations=
  "Meta<Key>i:traverseUp()\n
  "Meta<Key>k:traverseDown()\n
  "Meta<Key>j:traverseLeft()\n
  "Meta<Key>l:traverseRight()";
*/
XtActionsRec TextActionTable[]={
  { "return", d1_DoNothing }
};

char *TextTranslationTable=
  "Ctrl<Key>m:return()";

XtTranslations TextTranslations;

   
/*--------------------------------------------------*/
void d1_create(rei)
reid rei;
{
  int *argc=rei->argc;
  char **argv=rei->argv;
  static Widget TopW, ShellW, OuterW, TopTBW, IfW, If2W, ThenW, BotTBW,bl1;
  Widget IfLabelW, ThenLabelW, ThenLocW, FirstOuterW;
  ArgPack AP;
  char *Doing;

  rei->Then_Contents=Darray_create();

  if (rei->InitTK==Bool_TRUE)  {
    TopW=XtInitialize("ruleeditor","LEns", NULL, NULL, 
		      argc, argv);
  }
 
/*---- add actions */
  XtAddActions(rl_Actions,RL_NUMBER_OF_ACTIONS);
  
/*---- Application shell and its form widget */
  AP=ArgPack_duplicate_args(d1_ShellArgs);
  rei->ShellW=XtCreateApplicationShell("shell1",
				  topLevelShellWidgetClass,
				  ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d1_OuterArgs);
  OuterW=XtCreateManagedWidget("d1_OuterW",
			       formWidgetClass,
			       rei->ShellW,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AlUI_Initialize(OuterW);
  XtAddActions(TextActionTable,1);
  TextTranslations=XtParseTranslationTable(TextTranslationTable);

  AP=ArgPack_duplicate_args(d1_TopTBArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						      (int)BIG_LABEL_FONT));
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  TopTBW=XtCreateManagedWidget("d1_TopTBW",
			       XwtitlebarWidgetClass,
			       OuterW,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d1_DoingArgs);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) rei->title);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						    (int)MENU_VARIABLES_FONT));
  rei->DoingW=XtCreateManagedWidget("RE: doing what",
				  labelWidgetClass,
				  TopTBW,
				  ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

    
  AP=ArgPack_duplicate_args(d1_BlackLineArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) TopTBW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNforeground,
		  (XtArgVal)Alxt_get_widget_feature(rei->DoingW,
						    XtNbackground));
  ArgPack_add_arg(AP,XtNbackground,
		  (XtArgVal)Alxt_get_widget_feature(rei->DoingW,
						    XtNforeground));
  ArgPack_add_arg(AP,XtNwidth,
		  (XtArgVal)(10+(int)Alxt_get_widget_feature(OuterW,
							     XtNwidth)));
  bl1=XtCreateManagedWidget("d1_bl1",
			    labelWidgetClass,
			    OuterW,
			    ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d1_AreaLabelArgs);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) "If");
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						      (int)BIG_LABEL_FONT));
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) bl1);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  IfLabelW=XtCreateManagedWidget("IF_label",
				 labelWidgetClass,
				 OuterW,
				 ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  /*
   *  IF
   */

  AP=ArgPack_duplicate_args(d1_IfArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) IfLabelW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  rei->IfW=XtCreateManagedWidget("d1_IfW",
			    formWidgetClass,
			    OuterW,
			    ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d1_FillIf(rei);


  AP=ArgPack_duplicate_args(d1_AreaLabelArgs);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) "Then");
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						      (int)BIG_LABEL_FONT));
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) rei->IfW);
  ThenLabelW=XtCreateManagedWidget("ThenF",
			labelWidgetClass,
			OuterW,
			ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  /*
   *    THEN 
   */

  AP=ArgPack_duplicate_args(d1_ThenColumn1Args);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) ThenLabelW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  rei->ThenW=XtCreateManagedWidget("d1_ThenW_son1",
			      formWidgetClass,
			      OuterW,
			      ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d1_FillThen(rei);

  AP=ArgPack_duplicate_args(d1_BotTBArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) rei->ThenW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  BotTBW=XtCreateManagedWidget("d1_BotTBW",
			       XwtitlebarWidgetClass,
			       OuterW,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d1_FillBTBar(rei,BotTBW);

  rei->OuterW=OuterW;
  rebox_prepare_client(rei->OuterW);
  XtRealizeWidget(rei->ShellW);
  rebox_add_client(rei->OuterW,ed_Boxer_CB,rei);
  AlUI_AttachCursor(rei->ShellW,RE_GLOBAL_CURSOR);
}

/*--------------------------------------------------*/
void d1_FillIf(rei)
reid rei;
{
  REMember REm;

  REm=rei->TopLevelMember;
  if (REm->Type==ALRMT_FIELD)
    d1_If_AddField(rei,REm,REF_FROM_TEMPLATE);
  else
    d1_If_AddAssoc(rei,REm);
}

/*--------------------------------------------------*/
void d1_If_AddField(rei,REm,TT)
reid rei;
REMember REm;
int TT;
{
  Widget  A1W, NextW, ParentW, AltsMenuW, FTMenuW, SW, IFCW;
  ArgPack AP;
  REField REPreviousField, REf;
  REMember remt;
  ChildPack CP1, CP3;
  char *FieldClassName;
  int ValueX, AltsMenuX, KeyX, vbl;

  rl_Get_surrounding_widgets(rei,REm,&A1W,&NextW,&ParentW);

  REf=REm->object.Field;

  CP1=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_If_containerArgs);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) A1W);
  REf->ContainerW=XtCreateWidget("field_container",
				 formWidgetClass,
				 ParentW,
				 ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP1,REf->ContainerW);
  ArgPack_delete(AP);
  
  AP=ArgPack_duplicate_args(d1_MenuBoxArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  REf->FTMenuW=XtCreateManagedWidget("FT_menuForm",
				   boxWidgetClass,
				   REf->ContainerW,
				   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  CP3=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_MenuRasterArgs);
  ArgPack_add_arg(AP,XtNbackgroundPixmap, (XtArgVal) d1_get_menu_pixmap(rei));
  FTMenuW=XtCreateWidget("FTMenuSRaster",
			 labelWidgetClass,
			 REf->FTMenuW,
			 ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP3,FTMenuW); 
  ArgPack_delete(AP);
  MenuPack_attach_to_widget(REf->FTMenu,FTMenuW);
  REf->FTMenuLabelW=FTMenuW;
  MenuPack_make_menu(REf->FTMenu);
  FieldClassName=(char *)Biregistry_rev_get(NameToFC_GR,(VOIDP)REf->Type);
  SW=MenuPack_get_widget(REf->FTMenu,FieldClassName);
  if (SW!=NULL)  {
    Alxt_SetArg(SW,XtNsetMark,(XtArgVal)TRUE);
    if (REf->FromWhere==REF_FROM_TEMPLATE)
      Alxt_SetArg(SW,XtNsensitive,(XtArgVal) FALSE);
  }
  else
    Al_warning1("warning: couldn't find field class %s\n",FieldClassName);
  XtManageChildren(ChildPack_get_wlist(CP3),ChildPack_get_count(CP3));
  ChildPack_destroy(CP3);

  if (TT==REF_FROM_TEMPLATE) {
    AP=ArgPack_duplicate_args(d1_PredKeyArgs);
    ArgPack_add_arg(AP,XtNlabel,(XtArgVal) REf->Key);
    ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) REf->FTMenuW);
    REf->KeyW=XtCreateManagedWidget("Field_key",
				    labelWidgetClass,
				    REf->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  else  {
    AP=ArgPack_duplicate_args(d1_PredKeyEditArgs);
    ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) REf->FTMenuW);
    ArgPack_add_arg(AP,XtNinsertPosition,(XtArgVal) strlen(REf->Key));
    ArgPack_add_arg(AP, XtNstring, (XtArgVal) REf->Key);
    ArgPack_add_arg(AP, XtNlength, (XtArgVal) REf->MaxKeyLength);
    REf->KeyW=XtCreateManagedWidget("Field_key",
				    asciiStringWidgetClass,
				    REf->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
    ArgPack_delete(AP);

    XtOverrideTranslations(REf->KeyW,
			  XtParseTranslationTable(REf->predKeyTranslations));
    XtOverrideTranslations(REf->KeyW,
			   XtParseTranslationTable(rei->ModifyRuleTTable));
  }    

  AP=ArgPack_duplicate_args(d1_MenuBoxArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) REf->KeyW );
  ArgPack_add_arg(AP,XtNhorizDistance, (XtArgVal) 4);
  REf->AltsMenuW=XtCreateManagedWidget("FT_AltsmenuForm",
				       boxWidgetClass,
				       REf->ContainerW,
				       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  CP3=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_MenuRasterArgs);
  ArgPack_add_arg(AP,XtNbackgroundPixmap, (XtArgVal) d1_get_menu_pixmap(rei));
  REf->AltsMenuAttachW=XtCreateWidget("FTMenuSRaster",
				      labelWidgetClass,
				      REf->AltsMenuW,
       			      ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP3,REf->AltsMenuAttachW);
  ArgPack_delete(AP);
  MenuPack_attach_to_widget(REf->AltsMenu,REf->AltsMenuAttachW);
  MenuPack_make_menu(REf->AltsMenu);
  SW=MenuPack_get_widget(REf->AltsMenu,REf->FieldType);
  if (SW!=NULL)  {
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XtNsetMark,(XtArgVal) TRUE);
    XtSetValues(SW,ArgPack_the_args(AP),ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  else
    printf("warning: couldn't find field type %s\n",REf->FieldType);
  SW=MenuPack_get_widget(REf->AltsMenu,REf->FieldOp);
  if (SW!=NULL)  {
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XtNsetMark,(XtArgVal) TRUE);
    XtSetValues(SW,ArgPack_the_args(AP),ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  else
    printf("warning: couldn't find field operator %s\n",REf->FieldOp);

  XtManageChildren(ChildPack_get_wlist(CP3),ChildPack_get_count(CP3));
  ChildPack_destroy(CP3);

  vbl=strlen(REf->ValueBuffer);
  AP=ArgPack_duplicate_args(d1_PredValueArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) REf->AltsMenuW);
  ArgPack_add_arg(AP,XtNinsertPosition,(XtArgVal) vbl);
  ArgPack_add_arg(AP,XtNdisplayPosition, (XtArgVal) 0);
  ArgPack_add_arg(AP, XtNstring, (XtArgVal) REf->ValueBuffer);
  ArgPack_add_arg(AP, XtNlength, (XtArgVal) REf->MaxValueBufferLength);
  /*  ArgPack_add_arg(AP, XtNtranslations, (XtArgVal) */
  /*  PredValueTranslations_GR); */
  REf->ValueW=XtCreateManagedWidget("Field_value",
				    asciiStringWidgetClass,
				    REf->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP); {
    XtTranslations t;
    t=XtParseTranslationTable(rei->ModifyRuleTTable);
    XtOverrideTranslations(REf->ValueW,t);
  }
  
  XtOverrideTranslations(REf->ValueW,
			 XtParseTranslationTable(REf->predValTranslations));
  
  RE_debug("added valuueW.\n");
  AP=ArgPack_create();
  ArgPack_add_arg(AP,XtNresizable,(XtArgVal) TRUE);
  XtSetValues(rei->IfW,ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  XtManageChildren(ChildPack_get_wlist(CP1),ChildPack_get_count(CP1));
  ChildPack_destroy(CP1);

}

/*--------------------------------------------------*/
void d1_If_AddAssoc(rei,REm)
reid rei;
REMember REm;
{
  REAssoc REa=REm->object.Assoc;  /* !!! need error checking here */
  unsigned i;
  REMember TempREm, remt;
  Widget PrevW, NextW, ParentW;
  ArgPack AP;
  
  assert(REm->Type==ALRMT_ASSOC);

  if (REm!=REm->object.Assoc->rei->TopLevelMember) {
    rl_Get_surrounding_widgets(rei,REm,&PrevW,&NextW,&ParentW);
    AP=ArgPack_duplicate_args(d1_AssocArgs);
    ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) PrevW);
    REm->object.Assoc->ContainerW=XtCreateManagedWidget("assoc_container",
							formWidgetClass,
							ParentW,
							ArgPack_the_args(AP),
							ArgPack_num_args(AP));
    ArgPack_delete(AP);
    {
      AlRAType t=REm->object.Assoc->Type;
      AP=ArgPack_duplicate_args(d1_AssocLabelArgs); 
      ArgPack_add_arg(AP,XtNlabel,(XtArgVal) 
		      ((t==ALRAT_AND) ? "AND" :
		      ((t==ALRAT_OR) ? "OR" : "NOT")));
      ArgPack_add_arg(AP,XtNfont, (XtArgVal) 
		      AlUI_GetFont(ParentW,
				   (int)CONTROL_BUTTONS_FONT));
      REm->object.Assoc->LabelW=XtCreateManagedWidget("assoc_labeel",
						      labelWidgetClass,
					    REm->object.Assoc->ContainerW,
						      ArgPack_the_args(AP),
						      ArgPack_num_args(AP));
      ArgPack_delete(AP);
    }
  }
  for (i=0;i<Darray_len(REa->Contents);i++) {
    TempREm=(REMember)Darray_get(REa->Contents,i);
    if (TempREm->Type==ALRMT_ASSOC) 
      d1_If_AddAssoc(rei,TempREm);
    else if (TempREm->Type==ALRMT_FIELD)
      d1_If_AddField(rei,TempREm,REF_FROM_TEMPLATE);
    else
      Al_fatal_error("file=d1.c ^^^1: bad REMember\n");
  }
}

/*--------------------------------------------------*/
void d1_FillThen(rei)
reid rei;
{
  REAction REac;
  unsigned i;
  for (i=0;i<Darray_len(rei->Actions);i++) {
    REac=(REAction)Darray_get(rei->Actions,i);
    d1_AddAction(rei,REac);
  }
}
/*--------------------------------------------------*/
void d1_AddAction(rei,REac)
reid rei;
REAction REac;
{
  Widget  A1W, A2W, A3W, A4W, Menu2W, Menu1W, SW;
  ArgPack AP;
  REAction REPreviousAc;
  REArgument REArg, PrevArg;
  ChildPack CP1,CP3;
  unsigned i, n, EditWindowHeight;
  int EditMenuOffset;
  char *VerbName;

  if (Darray_len(rei->Then_Contents)!=0) {
    REPreviousAc=(REAction)Darray_get(rei->Then_Contents,
				      Darray_len(rei->Then_Contents)-1);
    assert (REPreviousAc);
    A1W=REPreviousAc->ContainerW;
  }
  else
    A1W=NULL;
  
  /*
   *  First Column
   */
  CP1=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_ThenC1Args);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) A1W);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  REac->ContainerW=XtCreateWidget("ac_container",
					formWidgetClass,
					rei->ThenW,
					ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP1,REac->ContainerW);
  ArgPack_delete(AP);
  
  AP=ArgPack_duplicate_args(d1_MenuBoxArgs);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  REac->MenuW=XtCreateManagedWidget("THEn_menuForm",
				    boxWidgetClass,
				    REac->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  CP3=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_MenuRasterArgs);
  ArgPack_add_arg(AP,XtNbackgroundPixmap, (XtArgVal) d1_get_menu_pixmap(rei));
  Menu1W=XtCreateWidget("FTMenuSRaster",
			 labelWidgetClass,
			 REac->MenuW,
			 ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP3,Menu1W);
  ArgPack_delete(AP);
  MenuPack_attach_to_widget(REac->Menu,Menu1W);
  MenuPack_make_menu(REac->Menu);
  XtManageChildren(ChildPack_get_wlist(CP3),ChildPack_get_count(CP3));
  ChildPack_destroy(CP3);

  SW=MenuPack_get_widget(REac->Menu,REac->VerbName);
  if (SW!=NULL) {
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XtNsetMark,(XtArgVal) TRUE);
    XtSetValues(SW,ArgPack_the_args(AP),ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  else
    printf("Making verb Menu 1:couldn't find verb %s in menu.\n",
	   REac->VerbName);

  AP=ArgPack_duplicate_args(d1_ThenKey1Args);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) REac->VerbName);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) REac->MenuW);
  REac->VerbW=XtCreateManagedWidget("Acrion_verb",
				    labelWidgetClass,
				    REac->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  /*
   *  Second Column
   */
  PrevArg=NULL;
  for (i=0;i<Darray_len(REac->Arguments);i++) {
    REArg=(REArgument)Darray_get(REac->Arguments,i);
    d1_Argument_create(rei,REArg,PrevArg,REac);
    PrevArg=REArg;
  }
  XtManageChildren(ChildPack_get_wlist(CP1),ChildPack_get_count(CP1));
  ChildPack_destroy(CP1);
  ed_UpdateAltsMenuSensitivity(REac);

  Darray_addh(rei->Then_Contents,REac);
}    
/*
    if (EditWindowHeight==0) {
      EditWindowHeight=(unsigned)GetWidgetFeature(REArg->ArgW,XtNheight);
      printf(".EWH=%d\n",EditWindowHeight);
      EditMenuOffset=EditWindowHeight-MENU_BUTTON_H;
      if (EditMenuOffset<0) EditMenuOffset=0;
    }
*/

/*--------------------------------------------------*/
/* The A2W is the attach widget for the menu.  The A3W si the attach widget */
 /* for the arguments ascii widget. */
/*----------------------------------------*/
void d1_Argument_create(rei,REArg,PrevArg,REac)
reid rei;
REArgument REArg, PrevArg;
REAction REac;
{
  ArgPack AP;
  ChildPack CP3;
  Widget Menu2W, A2W, A3W;
  unsigned EditMenuOffset;

  if (PrevArg!=NULL) {
    A2W=PrevArg->MenuW;
    A3W=PrevArg->ArgW;
    EditMenuOffset=8;
  }
  else {
    A2W=NULL;
    A3W=NULL;
    EditMenuOffset=2;
  }

  AP=ArgPack_duplicate_args(d1_MenuBoxArgs);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) A2W);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) REac->VerbW);
  ArgPack_add_arg(AP,XtNvertDistance,(XtArgVal) EditMenuOffset);
  ArgPack_add_arg(AP,XtNhorizDistance, (XtArgVal) 4);
  REArg->MenuW=XtCreateManagedWidget("ArgssmenuForm",
				     boxWidgetClass,
				     REac->ContainerW,
				     ArgPack_the_args(AP),
				     ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  CP3=ChildPack_create();
  AP=ArgPack_duplicate_args(d1_MenuRasterArgs);
  ArgPack_add_arg(AP,XtNbackgroundPixmap, (XtArgVal) d1_get_menu_pixmap(rei));
  Menu2W=XtCreateWidget("FTMenuSRaster",
			labelWidgetClass,
			REArg->MenuW,
			ArgPack_the_args(AP),ArgPack_num_args(AP));
  ChildPack_add(CP3,Menu2W);
  ArgPack_delete(AP);
  MenuPack_attach_to_widget(REArg->Menu,Menu2W);
  MenuPack_make_menu(REArg->Menu);
  XtManageChildren(ChildPack_get_wlist(CP3),ChildPack_get_count(CP3));
  ChildPack_destroy(CP3);
  
  AP=ArgPack_duplicate_args(d1_ThenValueArgs);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) A3W);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) REArg->MenuW);
  if (PrevArg!=NULL)
    ArgPack_add_arg(AP,XtNvertDistance,(XtArgVal) 2);
  ArgPack_add_arg(AP,XtNinsertPosition,(XtArgVal) REArg->InitialArgLength);
  ArgPack_add_arg(AP, XtNstring, (XtArgVal) REArg->Arg);
  ArgPack_add_arg(AP, XtNlength, (XtArgVal) REArg->MaxArgLength);
  ArgPack_add_arg(AP, XtNtranslations, (XtArgVal)
		  XtParseTranslationTable(rei->ModifyRuleTTable));
  REArg->ArgW=XtCreateManagedWidget("tre",
				    asciiStringWidgetClass,
				    REac->ContainerW,
				    ArgPack_the_args(AP),ArgPack_num_args(AP));
/* Don't ask mw why but in this case I had to move this to the translations */
 /* resource above for it to work correctly. (??)
   XtOverrideTranslations(REArg->ArgW,
			 XtParseTranslationTable(rei->ModifyRuleTTable)); */
  ArgPack_delete(AP);
}

/*--------------------------------------------------*/
void d1_FillBTBar(rei,w)
reid rei;
Widget w;
{
  Widget AddMTW, AbortW, DoneW, AddActionW, AddFieldW, AddBoxW;
  ArgPack AP;
  char *name;

  MenuPack mp,mp2,mp3,mp4;
  unsigned i;

  AP=ArgPack_duplicate_args(d1_AbortArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						 (int)CONTROL_BUTTONS_FONT));
  AbortW=XtCreateManagedWidget("BTB_Abort",
			       commandWidgetClass,
			       w,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  XtAddCallback(AbortW,XtNcallback,ed_Abort_CB,rei);
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d1_DoneArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						  (int)CONTROL_BUTTONS_FONT));
  AbortW=XtCreateManagedWidget("BTB_Done",
			       commandWidgetClass,
 			       w,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  XtAddCallback(AbortW,XtNcallback,ed_Done_CB,rei);
  ArgPack_delete(AP);


  AP=ArgPack_duplicate_args(d1_AddActionArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						  (int)CONTROL_BUTTONS_FONT));
  AddActionW=XtCreateManagedWidget("BTB_AddAction",
				   commandWidgetClass,
				   w,
				   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  mp=MenuPack_create(AddActionW,"Available Verbs");
  for (i=0;i<Darray_len(VerbPresOrder_GR);i++) {
    name=Darray_get(VerbPresOrder_GR,i);
    MenuPack_add_option(name,mp,ed_AddVerb_CB,
			(caddr_t)RapPack_create2((VOIDP)name,(VOIDP)rei));
  }
  MenuPack_make_menu(mp);
  MenuPack_destroy(mp);

  AP=ArgPack_duplicate_args(d1_AddFieldArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						  (int)CONTROL_BUTTONS_FONT));
  AddFieldW=XtCreateManagedWidget("BTB_AddFiewld",
				  commandWidgetClass,
				  w,
				  ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  mp3=MenuPack_create(AddFieldW,"Available Field Types");
  for (i=0;i<Darray_len(FieldTypePresOrder_GR);i++) {
    name=Darray_get(FieldTypePresOrder_GR,i);
    MenuPack_add_option(name,mp3,ed_AddField_CB,
			(caddr_t)RapPack_create2((VOIDP)name,(VOIDP)rei));
  }
  MenuPack_make_menu(mp3);
  MenuPack_destroy(mp3);



  AP=ArgPack_duplicate_args(d1_AddBoxArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) 
		  AlUI_GetFont(rei->ShellW,(int)CONTROL_BUTTONS_FONT));
  AddBoxW=XtCreateManagedWidget("BTB_AddBox",
				commandWidgetClass,
				w,
				ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  mp4=MenuPack_create(AddBoxW,"Available Box Types");
  MenuPack_add_option("OR",mp4,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_OR,(VOIDP)rei));
  MenuPack_add_option("AND",mp4,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_AND,(VOIDP)rei));
  MenuPack_add_option("NOT",mp4,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_NOT,(VOIDP)rei));
  MenuPack_make_menu(mp4);
  MenuPack_destroy(mp4);


  AP=ArgPack_duplicate_args(d1_AddMTArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(rei->ShellW,
						  (int)CONTROL_BUTTONS_FONT));
  AddMTW=XtCreateManagedWidget("BTB_AddMT",
			       commandWidgetClass,
			       w,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  mp2=MenuPack_create(AddMTW,"Available Message Types");
  for (i=0;i<Darray_len(MsgTypeNames_GR);i++) {
    name=Darray_get(MsgTypeNames_GR,i);
    MenuPack_add_option(name,mp2,ed_AddMT_CB,
			(caddr_t)RapPack_create2((VOIDP)name,
					(VOIDP)rei));
  }
  MenuPack_make_menu(mp2);
  MenuPack_destroy(mp2);
}

/*--------------------------------------------------*/
void d1_KeyModVerify_CB(w,REf,VP)
Widget w;
REField REf;
VOIDP VP;
{
/*
  if (REf->IsState==Bool_TRUE)
    VP->doit=FALSE;
*/
}
  
/*
XtActionsRec TEActionTable[]={
  { "SelectAssoc", SelectAssoc },
};

char *TETranslations=
  "<Btn1Down>:SelectAssoc()";


*/
void d1_DoNothing(w,x,s,i)
Widget w;
XEvent *x;
char *s;
int i;
{
}

/*--------------------------------------------------*/
Pixel d1_get_fg_pix(rei)
reid rei;
{
  static Pixel ForePix;
  static Bool Inited=Bool_FALSE;
  ArgPack AP;
  if (Inited==Bool_FALSE) {
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XtNforeground,(XtArgVal) &ForePix);
    XtGetValues(rei->ShellW,ArgPack_the_args(AP), ArgPack_num_args(AP));
    ArgPack_delete(AP);
    Inited=Bool_TRUE;
  }
  return(ForePix);
}
/*--------------------------------------------------*/
Pixel d1_get_bg_pix(rei)
reid rei;
{
  static Pixel BackPix;
  static Bool Inited=Bool_FALSE;
  ArgPack AP;
  if (Inited==Bool_FALSE) {
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XtNbackground,(XtArgVal) &BackPix);
    XtGetValues(rei->ShellW,ArgPack_the_args(AP), ArgPack_num_args(AP));
    ArgPack_delete(AP);
    Inited=Bool_TRUE;
  }
  return(BackPix);
}

/*--------------------------------------------------*/
Pixmap d1_get_menu_pixmap(rei)
reid rei;
{
  static Pixmap MenuPM=NULL;
  Screen *screen;
  Display *display;
  int ScreenNumber;

  display=XtDisplay(rei->ShellW);
  screen=XtScreen(rei->ShellW);
  ScreenNumber=XDefaultScreen(display);
  MenuPM=XCreatePixmapFromBitmapData(display,
				       RootWindowOfScreen(screen),
				       button_bits,
				       MENU_BUTTON_W,
				       MENU_BUTTON_H,
				       XBlackPixel(display,ScreenNumber),
				       XWhitePixel(display,ScreenNumber),
				       DefaultDepthOfScreen(screen));
  return(MenuPM);
}

/*--------------------------------------------------*/
VOIDP GetWidgetFeature(W,Feature)
Widget W;
char *Feature;
{
  ArgPack AP;
  long ReturnVal;
  AP=ArgPack_create();
  ArgPack_add_arg(AP,Feature,(XtArgVal)&ReturnVal);
  XtGetValues(W,ArgPack_the_args(AP),ArgPack_num_args(AP));
  return((VOIDP)ReturnVal);
}
