/*
======================================================================
======================================================================
Copyright 1989 by the Massachusetts Institute of Technology

Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of M.I.T. not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
M.I.T. makes no representations about the suitability of
this software for any purpose.  It is provided "as is"
without express or implied warranty.
======================================================================
Argus was created by:

	Brian Gardner	bgardner@ATHENA.MIT.EDU
	Tobin Mintz     thm@ATHENA.MIT.EDU
	Richard Pito	rap@ATHENA.MIT.EDU
	Jeff Siegal	jbs@ATHENA.MIT.EDU
	Wendy Mackay    mackay@ATHENA.MIT.EDU

======================================================================
Created by:
   Richard Pito   rap@ATHENA.MIT.EDU

Description:
   Display code the the ruleeditor.  Controls major displaying, displaying
   of the actions and logical groupings (associations).
Bugs:
  There is a wrather insidious bug concerning menu accelerators in the IF
  menu.  If you compile this file with -DWITH_ACC=1 you will get menu
  accelarators for the add and delete items in the IF menu.  If you do this,
  however, it is possible to enter a state in the rule editor when the tab
  keys will not move the focus and even when you move the focus directly by
  clicking on something with the left mouse button, it won't accept keyboard
  input.  To get out of this state, popup and then down again any option
  menu (including either the IF or THEN) menu.  I have left menu
  accelerators for these items out because this is hardly intuitive and
  would be difficult to explain to the naive user.

  Ther is also one more insidious bug which I have not had time to track
  down.  If the user selects the argument of an only action in the THEn part
  of the rule, then deletes the actions (leaving no actions left) and then
  pops up the THEN menu, then pops it down again (without selecting
  anything) an X protocol error ensues.
======================================================================
======================================================================
*/

#include "assert.h"   /* must be first for use eith hc2 */
#include "ArgPack.h"
#include "Mintrins.h"
#include "alfonts.h"
#include "alpop.h"
#include "alxms.h"
#include "childpack.h"
#include "d2.h"
#include "d2args.h"
#include "darray.h"
#include "debug.h"
#include "menupack.h"
#include "rem.h"
#include "widgets.h"
#include "xstuff.h"
#include "ed.h"
#include "RMFBuffer.h"
#include "rebox.h"
#include "d2field.h"
#include "MTreg.h"
#include "text.h"
#include <Mu.h>
#include <Xm/BulletinB.h>
#include <Xm/PanedW.h>
#include <Xm/Separator.h>
#include <Xm/DialogS.h>
#include <Xm/ToggleBG.h>
#include <Xm/ToggleB.h>
#include <X11/Xlib.h>

#define ADD_MENU_ITEM_PREFIX_TEXT  "add a "
#define ADD_MENU_ITEM_POSTFIX_TEXT " field"

#define ADD_TEXT_FIELD_STRING      "add a text field"
#define ADD_EASY_ACCESS_FIELD_STRING "add an easy access field"
#define ADD_COMPLEX_FIELD_STRING     "add a complex field"
#define DELETE_SELECTED_ITEM_STRING  "delete selected item"
#define OR_BOX_STRING            "group fields with OR"
#define AND_BOX_STRING           "group fields with AND"
#define NOT_BOX_STRING           "group fields with NOT"

#define THEN_MENU_NOT_ACTIVE_STRING "then menu not active"
#define IF_MENU_NOT_ACTIVE_STRING   "if menu not active"

#define ADD_ACTION_STRING       "add an action"
#define DELETE_ACTION_STRING    "delete selected action(s)"
#define ADD_ARGUMENT_STRING     "add an argument"
#define DELETE_ARGUMENT_STRING  "delete selected argument"

#define HELP_STRING             "help"
#define GENERAL_HELP_STRING     "general help"
#define MOVING_HELP_STRING      "help on moving around the rule editor"
#define COMMON_HELP_STRING      "common questions and answers"
#define IF_HELP_STRING          "help on IF part (predicate) of rule"
#define COMPONENT_HELP_STRING   "help on message components"
#define FTYPE_HELP_STRING       "help on field types"
#define THEN_HELP_STRING        "help on THEN part (actions) of rule "
#define PRINTING_HELP_STRING    "help on the Print command"
#define EXAMPLES_HELP_STRING    "examples"

#define CLICK_ON_THEN_BAR       "click on then bar"
#define CLICK_ON_THEN_BAR_HELP  "click on then bar HELP"
#define CLICK_ON_ASSOC_BAR       "click on assoc bar"
#define CLICK_ON_ASSOC_BAR_HELP  "click on assoc bar HELP"
#define CLICK_ON_ASSOC       "click on assoc"
#define CLICK_ON_ASSOC_HELP  "click on assoc HELP"

#define ADD_ACCLERATOR_PREFIX   "Meta <Key>"
#define ADD_TEXT_ACCELERATOR     "Meta <Key>t"
#define DELETE_ACCELERATOR      "Meta <Key>d"
#define ADD_OR_ACCELERATOR      "Meta <Key>o"
#define ADD_AND_ACCELERATOR     "Meta <Key>a"
#define ADD_NOT_ACCELERATOR     "Meta <Key>n"
#define ADD_COMPLEX_ACCELERATOR "Meta <Key>c"

#define ADD_TEXT_PREFIX  "Meta-"
#define ADD_TEXT_TEXT    "Meta-t"
#define DELETE_TEXT      "Meta-d"
#define ADD_OR_TEXT      "Meta-o"
#define ADD_AND_TEXT     "Meta-a"
#define ADD_NOT_TEXT     "Meta-n"
#define ADD_COMPLEX_TEXT "Meta-c"

#define box_string(b) ((b==ALRAT_AND) ? "AND" : \
		       ((b==ALRAT_OR) ? "OR" : \
			((b==ALRAT_NOT) ? "NOT" : "** INVALID BOX TYPE **")))

Widget d2_create_framed_rc PROTOTYPE((Widget,char*,ArgPack));
NORET  d2_dummy PROTOTYPE(());
NORET  d2_Action_make_menu PROTOTYPE((REAction));
NORET  d2_Action_make_args PROTOTYPE((REAction));
NORET d2_Fill_TopTB PROTOTYPE((reid,Widget));
NORET d2_Fill_BotTB PROTOTYPE((reid,Widget));
NORET d2_Fill_Work PROTOTYPE((reid,Widget));
NORET d2_Fill_If_work_buttons PROTOTYPE((reid,Widget));
NORET d2_Fill_If_work PROTOTYPE((reid,Widget));
NORET d2_Fill_Then_work PROTOTYPE((reid,Widget));
NORET d2_Fill_Then_work_buttons PROTOTYPE((reid,Widget));
NORET d2_Simple_complex_fill PROTOTYPE((reid,Widget));
Widget d2_create_framed_form PROTOTYPE((Widget,ArgPack,ArgPack,char*));
NORET d2_Assoc_add_focus PROTOTYPE((REAssoc,Widget));
NORET d2_Assoc_select_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Assoc_click_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Assoc_bar_add_focus PROTOTYPE((REAssoc,Widget));
NORET d2_Assoc_bar_select_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Assoc_bar_click_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Verb_select_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Then_bar_select_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Then_bar_click_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_Action_add_focus PROTOTYPE((REAction));
NORET d2_Argument_select_CB PROTOTYPE((Widget,REArgument,caddr_t));
NORET d2_Then_update_arg_buttons PROTOTYPE((reid));
NORET d2_Fields_print PROTOTYPE ((int,REMember));
NORET d2_Message_type_create PROTOTYPE ((reid,Widget));
NORET d2_Action_menu_map_CB PROTOTYPE((Widget,REAction,caddr_t));
MenuPack   d2_If_buttons_help_menu PROTOTYPE((reid,char*,Darray));
NORET d2_Then_menu_map_CB  PROTOTYPE((Widget,reid,caddr_t));
NORET d2_RuleName_select_CB PROTOTYPE((Widget,reid,caddr_t));
NORET d2_MessageType_add_focus PROTOTYPE((reid,Widget));
NORET d2_MT_select_E PROTOTYPE((Widget,XEvent*,char**,int*));
NORET d2_ThenMenu_set PROTOTYPE((reid,int));
NORET d2_IfMenu_set PROTOTYPE((reid,int));

XtActionsRec d2_Actions[]={
  { "ed_Select_bar_E", ed_Select_bar_E },
};
#define d2_Actions_count          1

char* d2_Assoc_bar_event="<FocusIn>";


XtActionsRec d2_MTActions[]={
  { "d2_MT_select_E", d2_MT_select_E },
};
#define d2_MTActionsCount          1

char* d2_MTFocusEvent="<FocusIn>:d2_MT_select_E() ManagerFocusIn()";

      /*============================================================*/
/*			ASSOCIATION ACTIONS & EVENTS     */
      /*============================================================*/
  
XtActionsRec d2_AssocActions[]={
  { "d2_Assoc_select_E", d2_Assoc_select_E },
  { "d2_Assoc_click_E", d2_Assoc_click_E },
};
#define d2_AssocActionsCount          2
char* d2_AssocFocusEvent=
  "<FocusIn>:d2_Assoc_select_E() PrimitiveFocusIn()\n\
   <Btn1Down>,<Btn1Up>:d2_Assoc_click_E() PrimitiveFocusIn()";


XtActionsRec d2_AssocBarActions[]={
  { "d2_Assoc_bar_select_E", d2_Assoc_bar_select_E },
  { "d2_Assoc_bar_click_E", d2_Assoc_bar_click_E },
};
#define d2_AssocBarActionsCount       2
char* d2_AssocBarFocusEvent=
  "<FocusIn>:d2_Assoc_bar_select_E() PrimitiveFocusIn()\n\
   <Btn1Down>,<Btn1Up>:d2_Assoc_bar_click_E() PrimitiveFocusIn()";


XtActionsRec d2_ThenBarActions[]={
  { "d2_Then_bar_select_E", d2_Then_bar_select_E },
  { "d2_Then_bar_click_E", d2_Then_bar_click_E },
};
#define d2_ThenBarActionsCount       2
char* d2_ThenBarFocusEvent=
  "<FocusIn>:d2_Then_bar_select_E() PrimitiveFocusIn()\n\
   <Btn1Down>,<Btn1Up>:d2_Then_bar_click_E() PrimitiveFocusIn()";


XtActionsRec d2_ActionActions[]={
  { "d2_Verb_select_E", d2_Verb_select_E },
};
#define d2_ActionActionsCount       1
char* d2_VerbFocusEvent=
  "<FocusIn>:d2_Verb_select_E() ManagerFocusIn()";


/*--------------------------------------------------*/
NORET d2_Fields_print(id,member)
     int id;
     REMember member;
{
#ifdef RE_PRINT_FIELDS
  unsigned i,l;
  if (member==NULL) return;
  if (member->Type==ALRMT_FIELD) {
    REField field;
    field=member->object.Field;
    printf("%s -> %d\n",field->Key,field->ClassMenu);
  }
  else {
    REAssoc assoc=member->object.Assoc;
    printf("<<< %d ------- %s ---------->>>", id, box_string(assoc->Type));
    l=Darray_len(assoc->Contents);
    for (i=0;i<l;i++)
      d2_Fields_print(id,(REMember)Darray_get(assoc->Contents,(unsigned)i));
  }
#endif
}

/*--------------------------------------------------*/
NORET d2_Message_type_create(rei,TopRCW)
     reid rei;
     Widget TopRCW;
{
  ArgPack AP;
  int i,l;
  MenuPack MTMenu;
  Widget button;
  char* name;

  MTMenu=MenuPack_create_option_xm(rei->OuterW,"message-type-menu",
				   Alxms_create(rei->Strings,
						"Message type:",
						ALFONTS_MINOR_HEADING));
  AP=ArgPack_duplicate_args(d2_field_option_menu);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNtopWidget,        (XtArgVal) TopRCW );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNmarginWidth,  (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNborderWidth,  (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNshadowThickness, (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNhighlightThickness, (XtArgVal) 0 );
  MenuPack_option_set_args(MTMenu,AP);
  l=Darray_len(MsgTypeNames_GR);
  for (i=0;i<l;i++) {
    name=Darray_get(MsgTypeNames_GR,(unsigned)i);
    MenuPack_add_option(name,MTMenu,ed_AddMT_CB,
			(caddr_t)RapPack_create2((VOIDP)name,
						 (VOIDP)rei),
			(ArgPack)NULL);
  }
  MenuPack_add_separator(MTMenu,(ArgPack)NULL);
  MenuPack_add_option(MT_UNDEFINED_STRING,MTMenu,ed_AddMT_CB,
		      (caddr_t)RapPack_create2((VOIDP)MT_UNDEFINED_STRING,
					       (VOIDP)rei),
		      (ArgPack)NULL);
  
  MenuPack_make_menu(MTMenu);
  ArgPack_delete(AP);
  rei->MessageTypeW=MenuPack_get_top_level_manager(MTMenu);

  d2_MessageType_add_focus(rei,rei->MessageTypeW);
  
  if (rei->message_type!=NULL)  {
    if (AlMTreg_get_obj_with_name(rei->message_type)==NULL) {
      MenuPack_set_as_default(MTMenu,MT_UNDEFINED_STRING);
      Memory_free(rei->message_type);
      rei->message_type=NULL;
    }
    else
      MenuPack_set_as_default(MTMenu,rei->message_type);
  }
  else
    MenuPack_set_as_default(MTMenu,MT_UNDEFINED_STRING);

  button=MenuPack_option_get_button(MTMenu);
  Alxt_SetArg(button,XmNtraversalOn, (XtArgVal) TRUE );
  Alxt_SetArg(button,XmNshadowThickness, (XtArgVal) ShadowThickness_GR );
}

/*--------------------------------------------------*/
NORET d2_create(rei)
     reid rei;
{
  Widget WorkW;
  Widget TopRCW, TopSepW;
  Widget FrameW;
  Widget nameFormW, nameLabelW;
  ArgPack AP;
  char *ruleName;
  int d2_work_width, d2_work_height;

  AlFonts_init();

  d2_Fields_print(1,rei->TopLevelMember);

  AP=ArgPack_duplicate_args(d2_shell);
  rei->ShellW=XtAppCreateShell("ruleeditor","Argus",
			       vendorShellWidgetClass,
			       rei->display,
			       ArgPack_the_args(AP), ArgPack_num_args(AP) );
  ArgPack_delete(AP);

  MuInitialize(rei->ShellW);

  rei->AppContext=XtWidgetToApplicationContext(rei->ShellW);

  rebox_init(rei->AppContext); 
  
  d2_Fields_print(301,rei->TopLevelMember);


  /*
   * Initialize parts of rei
   */
  AP=ArgPack_duplicate_args(d2_outer);
  FrameW=XmCreateFrame(rei->ShellW,"outer-frame",
		       ArgPack_the_args(AP), ArgPack_num_args(AP) );
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_outer);
  if (rei->borderP!=NULL)
    ArgPack_add_arg(AP, XmNborderPixmap,    (XtArgVal) rei->borderP );
  else
    ArgPack_add_arg(AP, XmNborderWidth,    (XtArgVal) 0 );
  rei->OuterW=XmCreateForm(FrameW,"outer-form",
			   ArgPack_the_args(AP), ArgPack_num_args(AP) );
  ArgPack_delete(AP);

  rei->app_width=(int)Alxt_get_widget_feature(rei->OuterW,XmNwidth);
  rei->app_height=(int)Alxt_get_widget_feature(rei->OuterW,XmNheight);

  RE_debug2("w=%d, h=%d\n",rei->app_width, rei->app_height); 
  /*  
   * DO SOME INITIALIZATIONS     
   */
  AlUI_Initialize(rei->OuterW);

  rei->Fonts=AlFonts_get(rei->ShellW);

  /*
   *
   *  CREATE THE TOP LABEL
   *
   */

  AP=ArgPack_duplicate_args(d2_top_rc);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  TopRCW=XmCreateRowColumn(rei->OuterW,"top-rc",
			   ArgPack_the_args(AP),
			   ArgPack_num_args(AP));
  XtManageChild(TopRCW);
  ArgPack_delete(AP);

  d2_Fill_TopTB(rei,TopRCW);

  /* I had tried getting the shadow thickness from the RuleNameW above but I */
  /* always got an incredibly large number.  So I am forced to deal with */
  /* this kludge. I need this because I have to set the shadowthickness of */
  /* the buttons of the many option menus I have.  They do not seem to */
  /* inherit resources.  Probably becuase they don't specify a name for them */
  /* when they make them. */
  ShadowThickness_GR=(int)75;

  /*
   * CREATE THE MESSAGE TYPE WIDGET
   */
  d2_Message_type_create(rei,TopRCW);

  d2_Fields_print(2,rei->TopLevelMember);

  /*
   * CREATE THE RULE NAME WIDGET 
   */
  AP=ArgPack_duplicate_args(d2_outer);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNtopWidget,        (XtArgVal) rei->MessageTypeW );
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_OPPOSITE_WIDGET );
  ArgPack_add_arg(AP, XmNleftWidget,        (XtArgVal) rei->MessageTypeW );
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal) XmATTACH_OPPOSITE_WIDGET);
  ArgPack_add_arg(AP, XmNrightWidget,        (XtArgVal) rei->MessageTypeW );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  nameFormW=XmCreateForm(rei->OuterW,"name-form",
			 ArgPack_the_args(AP), ArgPack_num_args(AP) );
  XtManageChild(nameFormW);
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_top_l1);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Rule name:  ",
							     ALFONTS_TEXT));
  nameLabelW=XtCreateManagedWidget("name-label",
				   xmLabelWidgetClass,
				   nameFormW,
				   ArgPack_the_args(AP),
				   ArgPack_num_args(AP));
  ArgPack_delete(AP);

  ruleName=AlRule_get_name(rei->Rule);
  AP=ArgPack_duplicate_args(d2_field_edit);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNleftWidget, (XtArgVal) nameLabelW );
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal) XmATTACH_FORM);
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNcursorPosition,(XtArgVal)  strlen(ruleName));
  ArgPack_add_arg(AP, XmNvalue, (XtArgVal) ruleName);
  ArgPack_add_arg(AP, XmNresizeWidth, (XtArgVal) TRUE  );
  ArgPack_add_arg(AP, XmNresizable, (XtArgVal) FALSE  );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  
		  AlFonts_get_specific_fonts(rei->OuterW, ALFONTS_TEXT_MASK));
  rei->RuleNameW=XtCreateManagedWidget("rule-name",
				       xmTextWidgetClass,
				       nameFormW,
				       ArgPack_the_args(AP),
				       ArgPack_num_args(AP));
  ArgPack_delete(AP);
  XtAddCallback(rei->RuleNameW,XmNfocusCallback,
		d2_RuleName_select_CB,
		rei);
  XtAddCallback(rei->RuleNameW,XmNvalueChangedCallback,
		d2_KeyModify_CB,
		rei);
  RE_debug1("ST=%d\n",Alxt_get_widget_feature(rei->RuleNameW,
					      XmNshadowThickness));
  RE_debug1("ST=%d\n",Alxt_get_widget_feature(rei->MessageTypeW, 
					      XmNshadowThickness)); 
  
  /*
   * CREATE A SEPERATOR WIDGET  */
  AP=ArgPack_create();
  ArgPack_add_arg(AP, XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS );
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNtopWidget,        (XtArgVal) nameFormW );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  TopSepW=XmCreateSeparator(rei->OuterW,"top-seperator",
			    ArgPack_the_args(AP),
			    ArgPack_num_args(AP));
  XtManageChild(TopSepW);
  ArgPack_delete(AP);

  /*
   * FILL THE BOTTOM TITLE BAR SO RESIOZING WILL WORK CORRECTLY
   */
  AP=ArgPack_duplicate_args(d2_bottom_form);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_NONE );
  rei->BottomTBW=XmCreateForm(rei->OuterW,"bottom-form",
			      ArgPack_the_args(AP), ArgPack_num_args(AP) );
  ArgPack_delete(AP);

  d2_Fill_BotTB(rei,rei->BottomTBW);
  XtManageChild(rei->BottomTBW);

/*
  * CREATE THE BODY AND BOTTOM LABEL WORK AREAS
*/
  AP=ArgPack_duplicate_args(d2_work_paned);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNbottomWidget, (XtArgVal) rei->BottomTBW );
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_width);
  ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) TopSepW);
  WorkW=XmCreatePanedWindow(rei->OuterW,"work-paned",
			    ArgPack_the_args(AP),
			    ArgPack_num_args(AP));
  ArgPack_delete(AP);


  d2_Fields_print(3,rei->TopLevelMember);

  XtManageChild(WorkW);
  XtManageChild(rei->OuterW);
  XtManageChild(FrameW);

  d2_work_width=(int)Alxt_get_widget_feature(WorkW,XmNwidth);
  d2_work_height=(int)Alxt_get_widget_feature(WorkW,XmNheight);

  RE_debug2("ww=%d, wh=%d\n",d2_work_width, d2_work_height);

  d2_Fill_Work(rei,WorkW);

  Alxt_SetArg(nameFormW,XmNheight, (XtArgVal) rei->if_field_height);

  rebox_init(rei->AppContext);
  rebox_prepare_client(rei->IfW);  

  XtRealizeWidget(rei->ShellW);

  rebox_post_realize_client(rei->IfW);

  rei->SelectedType=RE_SELECT_NONE;

  /* set up the tab groups for the screen */
  d2_Set_tab_groups(rei);

  /* the real calklback data will get set in ed_AddBox_CB, here just NULL */
  rebox_add_client(rei->IfW,(ReboxCallback)ed_Boxer_CB,(VOIDP)NULL);  

  MuSetStandardCursor(rei->ShellW);
  /* AlUI_AttachCursor(rei->ShellW,RE_GLOBAL_CURSOR); */
}

/*
  ArgPack_add_arg(AP,XmN, (XtArgVal) );
  ArgPack_add_arg(AP,XmN, (XtArgVal) );
  ArgPack_add_arg(AP,XmN, (XtArgVal) );
*/

NORET d2_dummy(a,b,c,d)
int a,b,c,d;
{
  printf("%d,%d  to  %d,%d\n",a,b,c,d);
}


/*--------------------------------------------------*/
NORET d2_MessageType_add_focus(rei,w)
     reid rei;
     Widget w;
{
  XtTranslations Translations;

  XtAppAddActions(rei->AppContext,d2_MTActions,d2_MTActionsCount); 
  Translations=XtParseTranslationTable(d2_MTFocusEvent);
  
  Alxt_SetArg(w, XmNuserData,(XtArgVal) rei);
  XtOverrideTranslations(w,Translations);
}


/*--------------------------------------------------*/
NORET d2_MT_select_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  reid rei;

  RE_debug("message type menu selected \n");
  rei=(reid)Alxt_get_widget_feature(w,XmNuserData);
  rei->SelectedType=RE_SELECT_MESSAGE_TYPE;
  rei->Selected=(VOIDP)NULL;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_RuleName_select_CB(w,rei,wd)
     Widget w;
     reid rei;
     caddr_t wd;
{
  rei->Selected=(VOIDP)rei->RuleNameW;
  rei->SelectedType=RE_SELECT_NAME;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_Fill_TopTB(rei,TopRCW)
reid rei;
Widget TopRCW;
{
  ArgPack AP;
  Widget TopLabel1W;
  
  AP=ArgPack_duplicate_args(d2_top_l1);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) 
		  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Rule Editor",
					     ALFONTS_MAJOR_HEADING));
  TopLabel1W=XtCreateManagedWidget("top-label",
				   xmLabelWidgetClass,
				   TopRCW,
				   ArgPack_the_args(AP),
				   ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_top_l1);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) 
		  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     rei->title,
						 ALFONTS_MINOR_HEADING));
  rei->DoingW=XtCreateManagedWidget("doing-what",
				    xmLabelWidgetClass,
				    TopRCW,
				    ArgPack_the_args(AP),
				    ArgPack_num_args(AP));
  ArgPack_delete(AP);
}

/*--------------------------------------------------*/
NORET d2_Fill_BotTB(rei,BottomRCW)
     reid rei;
     Widget BottomRCW;
{
  ArgPack AP;
  Widget SaveW, QuitW, HelpW, HelpCascadeW, HelpFW;
  MenuPack menu;

  AP=ArgPack_duplicate_args(d2_bottom_buttons);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) 
		  rei->Fonts);
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
			  ((rei->borderP==NULL) ? "Save" : "Update Rule"),
							     ALFONTS_BUTTONS));
  SaveW=XtCreateManagedWidget("command-save-button",
			      xmPushButtonWidgetClass,
			      BottomRCW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  XtAddCallback(SaveW,XmNactivateCallback,
		ed_Done_CB,
		rei);
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_bottom_buttons);
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNleftWidget,  (XtArgVal) SaveW );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
			  ((rei->borderP==NULL) ? "Quit" : "Finished"),
							     ALFONTS_BUTTONS));
  QuitW=XtCreateManagedWidget("command-quit-button",
			      xmPushButtonWidgetClass,
			      BottomRCW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  XtAddCallback(QuitW,XmNactivateCallback,
		ed_Abort_CB,
		rei);
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_bottom_buttons);
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNleftWidget,  (XtArgVal) QuitW );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Print",
							     ALFONTS_BUTTONS));
  QuitW=XtCreateManagedWidget("command-print-button",
			      xmPushButtonWidgetClass,
			      BottomRCW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  XtAddCallback(QuitW,XmNactivateCallback,
		ed_Print_CB,
		rei); 
  ArgPack_delete(AP);


  AP=ArgPack_duplicate_args(d2_outer);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNresizable, (XtArgVal) TRUE ); 
  HelpFW=XmCreateFrame(BottomRCW,
		       "command-help-frame",
		       ArgPack_the_args(AP),
		       ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_menubar);
  ArgPack_add_arg(AP, XmNresizable, (XtArgVal) TRUE ); 
  ArgPack_add_arg(AP, XmNpacking, (XtArgVal) XmPACK_NONE ); 
  HelpW=XmCreateMenuBar(HelpFW,
			"command-help-menu",
			ArgPack_the_args(AP),
			ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_buttons);
  ArgPack_add_arg(AP,XmNlabelType, (XtArgVal) XmSTRING);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Help",
							     ALFONTS_BUTTONS));
  HelpCascadeW=XtCreateManagedWidget("command-help-button",
				     xmCascadeButtonWidgetClass,
				     HelpW,
				     ArgPack_the_args(AP),
				     ArgPack_num_args(AP));
  ArgPack_delete(AP); 

  menu=MenuPack_create_pulldown(HelpW,HelpCascadeW,"help-menu");

  MenuPack_add_option(GENERAL_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)GENERAL_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(MOVING_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)MOVING_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(COMMON_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)COMMON_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option(IF_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)IF_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(THEN_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)THEN_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option(COMPONENT_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)COMPONENT_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(FTYPE_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)FTYPE_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option(PRINTING_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)PRINTING_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(EXAMPLES_HELP_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)EXAMPLES_HELP_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_make_menu(menu);

  XtManageChild(HelpW);
  XtManageChild(HelpFW);
}

/*--------------------------------------------------*/
NORET d2_Fill_Work(rei,WorkW)
reid rei;
Widget WorkW;
{
  ArgPack AP;
  Widget IfWorkW, ThenWorkW, label;
  Widget IfWCW,TWCW;
  Widget if_work_scroll, SCW,
         then_work_scroll;

/*
  *  CREATE THE **IF** PART
*/
  AP=ArgPack_duplicate_args(d2_work_form_container);
  ArgPack_add_arg(AP, XmNallowResize, (XtArgVal) TRUE );
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_width );
  IfWCW=XmCreateForm(WorkW,"if-work-outer-container",
		     ArgPack_the_args(AP),
		     ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_area_labels);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "IF",
					     ALFONTS_MINOR_HEADING));
  label=XtCreateManagedWidget("if-label",
			      xmLabelGadgetClass,
			      IfWCW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  ArgPack_delete(AP);  

  /*
   * CREATE SCROLLING IF BUTTONS AREA
   */

  AP=ArgPack_duplicate_args(d2_menubar);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE ); 
  ArgPack_add_arg(AP, XmNpacking, (XtArgVal) XmPACK_COLUMN ); 
  rei->IfButtonsW=XmCreateMenuBar(IfWCW,
				  "if-work-buttons",
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_menubar);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );  
  ArgPack_add_arg(AP, XmNrightWidget,  (XtArgVal) rei->IfButtonsW );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE ); 
  ArgPack_add_arg(AP, XmNradioBehavior, (XtArgVal) FALSE ); 
  ArgPack_add_arg(AP, XmNradioAlwaysOne, (XtArgVal) FALSE ); 
  ArgPack_add_arg(AP, XmNorientation, (XtArgVal) XmHORIZONTAL );
  SCW=XmCreateRowColumn(IfWCW,
			"if-sc-radio-box",
			ArgPack_the_args(AP),
			ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  d2_Simple_complex_fill(rei,SCW);
  XtManageChild(SCW);
  
  d2_Fill_If_work_buttons(rei,rei->IfButtonsW);
  XtManageChild(rei->IfButtonsW);

  /*
   * get the width of the buttons, used with the width of the whole
   * application (rei->app_width) we calculate the width of the work area
   * (rei->work_width). */
  rei->app_buttons_width=(int)Alxt_get_widget_feature(rei->IfButtonsW,
						      XmNwidth);
  RE_debug1("app buttons width=%d\n",rei->app_buttons_width);
  /* !!! major kluidge.  this 300 should be replaces with a count of the */
  /* border widths of the various widgets which make up the width of the */
  /* work part. */
  rei->app_work_width=rei->app_width-300;
  RE_debug1("app work width=%d\n",rei->app_work_width); 

  rei->if_field_spacing=(int)Alxt_get_widget_feature(rei->IfButtonsW,
						     XmNspacing);


  /*
   * CREATE SCROLLING IF WORK AREA
   */
  AP = ArgPack_duplicate_args(d2_scroll);
  ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal)XmATTACH_WIDGET);
  ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) rei->IfButtonsW );
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal) XmATTACH_FORM);
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_FORM);
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_work_width);
  if_work_scroll = XmCreateScrolledWindow(IfWCW, "if-scrolled-work",
					  ArgPack_the_args(AP),
					  ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal)  rei->app_work_width ); 
  ArgPack_add_arg(AP, XmNresizePolicy, (XtArgVal)  XmRESIZE_ANY ); 
  ArgPack_add_arg(AP, XmNresizable, (XtArgVal)  TRUE ); 
  IfWorkW=XmCreateForm(if_work_scroll,"if-work",
		       ArgPack_the_args(AP),
		       ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d2_Fields_print(11,rei->TopLevelMember);

  d2_Fill_If_work(rei,IfWorkW); 

  XtManageChild(IfWorkW);
  XmScrolledWindowSetAreas(if_work_scroll, (Widget)NULL, (Widget)NULL, 
			   IfWorkW);
  XtManageChild(if_work_scroll);
  XtManageChild(IfWCW);

  
  /*
   *  THEN
   */
  
  AP=ArgPack_duplicate_args(d2_work_form_container);
  ArgPack_add_arg(AP, XmNallowResize, (XtArgVal) TRUE );
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_width );
  TWCW=XmCreateForm(WorkW,
		    "then-work-outer-container",
		    ArgPack_the_args(AP),
		    ArgPack_num_args(AP));
  ArgPack_delete(AP);
    

  AP=ArgPack_duplicate_args(d2_area_labels);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNfontList, (XtArgVal)   rei->Fonts);
  ArgPack_add_arg(AP, XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "THEN",
						      ALFONTS_MINOR_HEADING));
  label=XtCreateManagedWidget("then-label",
			      xmLabelGadgetClass,
			      TWCW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  ArgPack_delete(AP);


  /* 
   * CREATE THE THEN BUTTONS 
   */
  AP=ArgPack_duplicate_args(d2_menubar);
  ArgPack_add_arg(AP, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNleftAttachment,   (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(AP, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE ); 
  ArgPack_add_arg(AP, XmNpacking, (XtArgVal) XmPACK_COLUMN ); 
  rei->ThenButtonsW=XmCreateMenuBar(TWCW,
				    "then-work-buttons",
				    ArgPack_the_args(AP),
				    ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d2_Fill_Then_work_buttons(rei,rei->ThenButtonsW); 

  XtManageChild(rei->ThenButtonsW);

  /* 
   * CREATE THE SCROLLING THEN WORK AREA 
   */
  AP = ArgPack_duplicate_args(d2_scroll);
  ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET);
  ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) rei->ThenButtonsW);
  ArgPack_add_arg(AP, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM);
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal) XmATTACH_FORM);
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_FORM);
  /* ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_work_width); */
  then_work_scroll = XmCreateScrolledWindow(TWCW,
					    "then-scrolled-work",
					    ArgPack_the_args(AP),
					    ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal)  rei->app_work_width ); 
  ArgPack_add_arg(AP, XmNresizePolicy, (XtArgVal)  XmRESIZE_ANY ); 
  ArgPack_add_arg(AP, XmNresizable, (XtArgVal)  TRUE ); 
  ThenWorkW=XmCreateForm(then_work_scroll,"then-work",
			 ArgPack_the_args(AP),
			 ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d2_Fill_Then_work(rei,ThenWorkW); 

  XtManageChild(ThenWorkW);
  XmScrolledWindowSetAreas(then_work_scroll, (Widget)NULL, (Widget)NULL, 
			   ThenWorkW);
  XtManageChild(then_work_scroll);
  XtManageChild(TWCW);
}

/*--------------------------------------------------*/
MenuPack   d2_If_buttons_help_menu(rei,TextFTName,EANames)
     reid rei;
     char* TextFTName; /* the field type name of the 'add text field' option*/
     Darray EANames;
{
  int i,l;
  MenuPack menu=MenuPack_create_cascade(NULL,"if-help-menu");
  MenuPack_add_option(ADD_TEXT_FIELD_STRING,menu,
		      ed_Help_CB, (caddr_t)
		      RapPack_create5((VOIDP)ADD_TEXT_FIELD_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  l=Darray_len(EANames);
  for (i=0;i<l;i++) {
    MenuPack_add_option(Darray_get(EANames,i),menu,
			ed_Help_CB,(caddr_t)
			RapPack_create5((VOIDP)ADD_EASY_ACCESS_FIELD_STRING,
					(VOIDP)NULL,
					(VOIDP)rei,
					(VOIDP)NULL,(VOIDP)NULL),
			(ArgPack)NULL);
  }
  MenuPack_add_option(ADD_COMPLEX_FIELD_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)ADD_COMPLEX_FIELD_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option(DELETE_SELECTED_ITEM_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)DELETE_SELECTED_ITEM_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option(OR_BOX_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)OR_BOX_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(AND_BOX_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)AND_BOX_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_option(NOT_BOX_STRING,menu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)NOT_BOX_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  return(menu);
}

/*--------------------------------------------------*/
char* d2_Acc_get(i)
     int i;
{
  char s[5], *ret;
  RMFBuffer buff=RMFBuffer_create(ADD_ACCLERATOR_PREFIX,10);
  i++;
  sprintf(s,"%d",i);
  RMFBuffer_append(buff,s);
  ret=RMFBuffer_copy_of_buff(buff);
  RMFBuffer_destroy(buff);
  return(ret);
}

/*--------------------------------------------------*/
char* d2_Acc_get_text(i)
     int i;
{
  char s[5], *ret;
  RMFBuffer buff=RMFBuffer_create(ADD_TEXT_PREFIX,10);
  i++;
  sprintf(s,"%d",i);
  RMFBuffer_append(buff,s);
  ret=RMFBuffer_copy_of_buff(buff);
  RMFBuffer_destroy(buff);
  return(ret);
}

/*--------------------------------------------------*/
NORET d2_Fill_If_work_buttons(rei,mbW)
     reid rei;
     Widget mbW;
{
  ArgPack AP;
  Widget AddW;
  MenuPack mp;
  Darray EANames=Darray_create();
  char* eaname, *addTextFTName, *accel, *atext;
  int i,l;

  AP=ArgPack_duplicate_args(d2_buttons);
  ArgPack_add_arg(AP,XmNlabelType, (XtArgVal) XmPIXMAP);
  ArgPack_add_arg(AP,XmNlabelPixmap, (XtArgVal) Alxt_get_menu_pixmap(mbW));
  AddW=XtCreateManagedWidget("edit-add-button",
			     xmCascadeButtonWidgetClass,
			     mbW,
			     ArgPack_the_args(AP),
			     ArgPack_num_args(AP));
  ArgPack_delete(AP); 

  {
    int i,l;
    char* ftname;
    RMFBuffer Bstring;

    mp=MenuPack_create_pulldown(mbW,AddW,"if-add-menu");
    
    rei->PredicateMenuW=AddW;
    
    addTextFTName=NULL;
    if (AlProfile_has_value(ALPROF_ADD_TEXT_FIELD_TYPE)==Bool_TRUE) {
      addTextFTName=AlProfile_get_CP_val(ALPROF_ADD_TEXT_FIELD_TYPE);
      if (AlFTreg_exists_string(addTextFTName)==Bool_FALSE) {
	Al_warning1("Ruleeditor: invalid field type in profile component AddTextFieldType: %s.\n",addTextFTName);
	addTextFTName=NULL;
      }
    }
    if (addTextFTName==NULL) {
      Darray FTs=Darray_create();
      AlFTreg_get_all_field_types(FTs);
      if (Darray_len(FTs)==0)
	Al_fatal_error("Ruleeditor: unable to get default field types.\n");
      addTextFTName=AlFTreg_obj_to_string((AlFieldType)Darray_get(FTs,0));
      Al_warning1("             Using default field type %s instead.\n",
		  addTextFTName);
      Darray_destroy(FTs);
    }

    assert(addTextFTName);
    RE_debug1("addTextFTName=%s\n",addTextFTName); 
    
    AP=ArgPack_create();
    ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
#ifdef WITH_ACC
    ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) ADD_TEXT_ACCELERATOR );
    ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		    Alxms_create(rei->Strings, ADD_TEXT_TEXT,
				 ALFONTS_TEXT));
#endif
    MenuPack_add_option(ADD_TEXT_FIELD_STRING,mp,
			ed_Field_add_simple_CB,
			(caddr_t)RapPack_create2((VOIDP)rei,
						 (VOIDP)addTextFTName),
			(ArgPack)AP);
    ArgPack_delete(AP); 

    l=Darray_len(EasyAccessFieldTypes_GR);
    for (i=0;i<l;i++) {
      ftname=(char*)Darray_get(EasyAccessFieldTypes_GR,(unsigned)i);
      ftname=RapStr_strip_surrounding_space(ftname);
      Bstring=RMFBuffer_create(ADD_MENU_ITEM_PREFIX_TEXT,(unsigned)30);
      RMFBuffer_append(Bstring,ftname);
      RMFBuffer_append(Bstring,ADD_MENU_ITEM_POSTFIX_TEXT);
      eaname=RMFBuffer_copy_of_buff(Bstring);
      Darray_addh(EANames,eaname);

      AP=ArgPack_create();
      ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
#ifdef WITH_ACC
      accel= d2_Acc_get(i);
      atext= d2_Acc_get_text(i);
      ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal)accel );
      ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		      Alxms_create(rei->Strings,atext, 
				   ALFONTS_TEXT));
#endif
      MenuPack_add_option(eaname,mp,
			  ed_Field_add_simple_CB,
			  (caddr_t)RapPack_create2((VOIDP)rei,(VOIDP)ftname),
			  (ArgPack)AP);
      RMFBuffer_destroy(Bstring);
      ArgPack_delete(AP); 
    }
  }
  AP=ArgPack_create();
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
#ifdef WITH_ACC
  ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) ADD_COMPLEX_ACCELERATOR );
  ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		  Alxms_create(rei->Strings, ADD_COMPLEX_TEXT, ALFONTS_TEXT));
#endif
  MenuPack_add_option(ADD_COMPLEX_FIELD_STRING,mp,ed_Field_add_complex_CB,
		      (caddr_t)rei,
		      AP);
  ArgPack_delete(AP); 

  MenuPack_add_separator(mp,(ArgPack)NULL);


  AP=ArgPack_create();
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
#ifdef WITH_ACC
  ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) DELETE_ACCELERATOR );
  ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		  Alxms_create(rei->Strings, DELETE_TEXT, ALFONTS_TEXT));
#endif
  MenuPack_add_option(DELETE_SELECTED_ITEM_STRING,mp,ed_Delete_CB,
		      (caddr_t)rei,
		      AP);
  ArgPack_delete(AP); 

  MenuPack_add_separator(mp,(ArgPack)NULL);


  AP=ArgPack_create();
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) ADD_OR_ACCELERATOR );
  ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		  Alxms_create(rei->Strings, ADD_OR_TEXT, ALFONTS_TEXT));
  MenuPack_add_option(OR_BOX_STRING,mp,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_OR,(VOIDP)rei),
		      AP);
  ArgPack_delete(AP); 

  AP=ArgPack_create();
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) ADD_AND_ACCELERATOR );
  ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		  Alxms_create(rei->Strings, ADD_AND_TEXT, ALFONTS_TEXT));
  MenuPack_add_option(AND_BOX_STRING,mp,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_AND,(VOIDP)rei),
		      AP);
  ArgPack_delete(AP); 

  AP=ArgPack_create();
  ArgPack_add_arg(AP,XmNaccelerator, (XtArgVal) ADD_NOT_ACCELERATOR );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNacceleratorText, (XtArgVal) 
		  Alxms_create(rei->Strings, ADD_NOT_TEXT, ALFONTS_TEXT));
  MenuPack_add_option(NOT_BOX_STRING,mp,ed_AddBox_CB,
		      (caddr_t)RapPack_create2((VOIDP)ALRAT_NOT,(VOIDP)rei),
		      AP);
  ArgPack_delete(AP); 
  
  MenuPack_add_separator(mp,(ArgPack)NULL);

  MenuPack_add_sub_menu("Help",mp,
			d2_If_buttons_help_menu(rei,
						addTextFTName,EANames)); 

  MenuPack_make_menu(mp);

  rei->TextFieldAddW=MenuPack_get_widget(mp,ADD_TEXT_FIELD_STRING);
  rei->ComplexFieldAddW=MenuPack_get_widget(mp,ADD_COMPLEX_FIELD_STRING);
  rei->IfDeleteW=MenuPack_get_widget(mp,DELETE_SELECTED_ITEM_STRING);

  l=Darray_len(EANames);
  for (i=0;i<l;i++)
    Darray_addh(rei->EasyAccessFTsWs,
		MenuPack_get_widget(mp,Darray_get(EANames,i)));

  rei->PredicateMenupane=MenuPack_get_top_level_manager(mp);

}

/*--------------------------------------------------*/
NORET d2_Simple_complex_fill(rei,SCW)
     reid rei;
     Widget SCW;
{
  ArgPack AP;

  /*
   * MAKE THE SIMPLE COMPLEX BUTTONS
   */

  AP=ArgPack_duplicate_args(d2_buttons);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Simple",
							     ALFONTS_BUTTONS));
  rei->SimpleW=XtCreateManagedWidget("edit-simple-button",
				     xmPushButtonWidgetClass,
				     SCW,
				     ArgPack_the_args(AP),
				     ArgPack_num_args(AP));

  XtAddCallback(rei->SimpleW,
		XmNactivateCallback,
		ed_Change_CB,
		RapPack_create2(rei,RE_MODE_SIMPLE));
  ArgPack_delete(AP); 

  AP=ArgPack_duplicate_args(d2_buttons);
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "Complex",
							     ALFONTS_BUTTONS));
  rei->ComplexW=XtCreateManagedWidget("edit-complex-button",
				      xmPushButtonWidgetClass,
				      SCW,
				      ArgPack_the_args(AP),
				      ArgPack_num_args(AP));
  
  XtAddCallback(rei->ComplexW,
		XmNactivateCallback,
		ed_Change_CB,
		RapPack_create2((VOIDP)rei,(VOIDP)RE_MODE_COMPLEX));
  ArgPack_delete(AP); 
  
  /*
    * make the height of each field equal to the height of each of the
    * pushbuttons to the left of it, also make the spacing the same so that
    * they line up.  These resources will be used when creating a field in
    * d2_Addfield.
    */
  rei->if_field_height=(int)Alxt_get_widget_feature(rei->ComplexW,
						    XmNheight);
  /*3*/ RE_debug1("if_field_height=%d\n",rei->if_field_height); 
}

/*--------------------------------------------------*/
NORET d2_Fill_If_work(rei,workW)
reid rei;
Widget workW;
{
  rei->IfW=workW;
  d2_FillIf(rei); 
}




/*--------------------------------------------------*/
NORET d2_Fill_Then_work_buttons(rei,mbW)
     reid rei;
     Widget mbW;
{
  ArgPack AP;
  MenuPack menu, verbsmenu, helpmenu;
  Widget menuW;

  AP=ArgPack_duplicate_args(d2_buttons);
  ArgPack_add_arg(AP,XmNlabelType, (XtArgVal) XmPIXMAP);
  ArgPack_add_arg(AP,XmNlabelPixmap, (XtArgVal) Alxt_get_menu_pixmap(mbW));
  menuW=XtCreateManagedWidget("edit-add-button",
			      xmCascadeButtonWidgetClass,
			      mbW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  ArgPack_delete(AP); 
				
  menu=MenuPack_create_pulldown(mbW,menuW,"then-menu");

  rei->ThenMenuW=menuW;

  verbsmenu=MenuPack_create_cascade(NULL,"then-add-verbs-menu");
  rl_Verbs_add_to_menu(verbsmenu,ed_Action_add_CB,rei);
  MenuPack_add_separator(verbsmenu,(ArgPack)NULL);
  MenuPack_add_sub_menu("Help",verbsmenu,VerbsHelpMenu_GR);
  MenuPack_add_sub_menu(ADD_ACTION_STRING,menu,verbsmenu);

  MenuPack_add_option(DELETE_ACTION_STRING,
		      menu,
		      ed_Action_delete_CB,
		      (caddr_t)rei,
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_option( ADD_ARGUMENT_STRING,
		      menu,
		      ed_Argument_add_CB,
		      (caddr_t)rei,
		      (ArgPack)NULL);

  MenuPack_add_option( DELETE_ARGUMENT_STRING,
		      menu,
		      ed_Argument_delete_CB,
		      (caddr_t)rei,
		      (ArgPack)NULL);

  /* 
   * add the help at the bottom of the menu 
   */
  helpmenu=MenuPack_create_cascade(NULL,"then-help-menu");

  MenuPack_add_option(ADD_ACTION_STRING,helpmenu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)ADD_ACTION_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);
  MenuPack_add_option(DELETE_ACTION_STRING,helpmenu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)DELETE_ACTION_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);
  MenuPack_add_option(ADD_ARGUMENT_STRING,helpmenu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)ADD_ARGUMENT_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);
  MenuPack_add_option(DELETE_ARGUMENT_STRING,helpmenu,
		      ed_Help_CB,(caddr_t)
		      RapPack_create5((VOIDP)DELETE_ARGUMENT_STRING,
				      (VOIDP)NULL,
				      (VOIDP)rei,
				      (VOIDP)NULL,(VOIDP)NULL),
		      (ArgPack)NULL);

  MenuPack_add_separator(menu,(ArgPack)NULL);

  MenuPack_add_sub_menu("Help",menu,helpmenu);

  MenuPack_make_menu(menu);
  
  rei->ThenMenupane=MenuPack_get_top_level_manager(menu);

  /* this functionality is added because at this point in time I am unable */
  /* to force focus to a widget.  This is a problem since when this menu */
  /* unmaps Motif will reestablish keyboard focus to a particular widget */
  /* which may be on the widgetKillList (i.e. unmanaged and unmapped) which */
  /* causes a segmentation violation. My wrather kludgy solution is to */
  /* destroy all those widgets (and hence have motif remove them from its */
  /* tab groups and focusable widgets) before the menu can popdown */
  XtAddCallback(rei->ThenMenupane,XmNmapCallback,
		d2_Then_menu_map_CB,
		rei);

  rei->ActionAddW=MenuPack_get_widget(menu,ADD_ACTION_STRING);
  rei->ActionDeleteW=MenuPack_get_widget(menu,DELETE_ACTION_STRING);
  rei->ArgumentAddW=MenuPack_get_widget(menu,ADD_ARGUMENT_STRING);
  rei->ArgumentDeleteW=MenuPack_get_widget(menu,DELETE_ARGUMENT_STRING);
}


/*--------------------------------------------------*/
NORET d2_Then_menu_map_CB(w,rei,wd)
     Widget w;
     reid rei;
     caddr_t wd;
{
  d2_Then_update_arg_buttons(rei);
  ed_ClearWidgetKillList(rei);
}

/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*--------------------------------------------------*/
NORET d2_FillIf(rei)
reid rei;
{
  REMember REm;

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

/*--------------------------------------------------*/
NORET d2_If_AddField(rei,REm,TT)
reid rei;
REMember REm;
int TT;
{
  Widget  A1W, NextW, ParentW;
  REField REf=REm->object.Field;

  d2_Fields_print(100,rei->TopLevelMember);

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

  /*3*/ RE_debug1("a1=%x\n",A1W); 
  if (A1W==NULL) {
    if (REf->container->father->object.Assoc->BarW!=NULL)
      A1W=REf->container->father->object.Assoc->BarW;
    else 
      A1W=NULL;
  }

  d2_Field_create(REf,ParentW,A1W);

  XtManageChild(REf->ContainerW);

  if (NextW!=NULL) {
    Alxt_SetArg(NextW,XmNtopAttachment,(XtArgVal)XmATTACH_WIDGET);
    Alxt_SetArg(NextW,XmNtopWidget,(XtArgVal) REf->ContainerW);
  }

  if (rei->if_field_width==(-1))
    rei->if_field_width=(int)Alxt_get_widget_feature(REf->ContainerW,
						     XmNwidth);
  d2_Fields_print(101,rei->TopLevelMember);
}

/*--------------------------------------------------*/
NORET d2_If_AddAssoc(rei,REm)
     reid rei;
     REMember REm;
{
  REAssoc REa=REm->object.Assoc;  /* !!! need error checking here */
  int i,l;
  REMember TempREm;
  Widget assocW;

  assocW=d2_Assoc_make(rei,REm);
  
  l=Darray_len(REa->Contents);
  for (i=0;i<l;i++) {
    TempREm=(REMember)Darray_get(REa->Contents,(unsigned)i);
    if (TempREm->Type==ALRMT_ASSOC) 
      d2_If_AddAssoc(rei,TempREm);
    else if (TempREm->Type==ALRMT_FIELD)
      d2_If_AddField(rei,TempREm,REF_FROM_TEMPLATE);
    else
      Al_fatal_error("file=d1.c ^^^1: bad REMember\n");
  }
  if (assocW!=NULL)
    XtManageChild(assocW);
}

/*--------------------------------------------------*/
Widget d2_Assoc_make(rei,member)
     reid rei;
     REMember member;
{
  REAssoc assoc=member->object.Assoc;
  Widget PrevW, NextW, ParentW;
  ArgPack AP;
 
  assert(member->Type==ALRMT_ASSOC);
  rl_Get_surrounding_widgets(rei,member,&PrevW,&NextW,&ParentW);
  if (member!=assoc->rei->TopLevelMember) {
    AP=ArgPack_duplicate_args(d2_assoc_frame);
    if (PrevW!=NULL) {
      ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal)    XmATTACH_WIDGET );
      ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal)   PrevW );
    }
    else
      ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal)    XmATTACH_FORM );
    if (rei->if_field_width!=(-1)) 
      ArgPack_add_arg(AP,XmNwidth,(XtArgVal) rei->if_field_width);
    assoc->ContainerW=XmCreateFrame(ParentW,"assoc-frame",
				    ArgPack_the_args(AP),
				    ArgPack_num_args(AP));
    ArgPack_delete(AP);


    if (NextW!=NULL) {
      Alxt_SetArg(NextW,XmNtopAttachment,(XtArgVal) XmATTACH_WIDGET);
      Alxt_SetArg(NextW,XmNtopWidget,(XtArgVal) assoc->ContainerW);
    }

    AP=ArgPack_duplicate_args(d2_assoc);
    if (rei->if_field_width!=(-1)) 
      ArgPack_add_arg(AP,XmNwidth,(XtArgVal) rei->if_field_width);
    assoc->InnerContainerW=
      XtCreateManagedWidget("assoc-container",
			    xmFormWidgetClass,
			    assoc->ContainerW,
			    ArgPack_the_args(AP),
			    ArgPack_num_args(AP));
    ArgPack_delete(AP);
    {
      AlRAType t=assoc->Type;
      AP=ArgPack_duplicate_args(d2_area_labels); 
      ArgPack_add_arg(AP,XmNleftAttachment, (XtArgVal) XmATTACH_FORM);
      ArgPack_add_arg(AP,XmNrightAttachment, (XtArgVal) XmATTACH_FORM);
      ArgPack_add_arg(AP,XmNfontList, (XtArgVal) rei->Fonts);
      ArgPack_add_arg(AP,XmNlabelString, (XtArgVal) 
		      Alxms_create(rei->Strings,
				   ( (t==ALRAT_AND ? "AND" :
				      (t==ALRAT_OR ? "OR" : "NOT")) ),
				   ALFONTS_BUTTONS));
      assoc->LabelW=
	XtCreateManagedWidget("assoc-label",
			      xmLabelWidgetClass,
			      assoc->InnerContainerW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
      ArgPack_delete(AP);

      d2_Assoc_add_focus(assoc,assoc->LabelW);

      AP=ArgPack_duplicate_args(d2_assoc_bar); 
      ArgPack_add_arg(AP,XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET);
      ArgPack_add_arg(AP,XmNtopWidget, (XtArgVal) assoc->LabelW);
      assoc->BarW=XmCreateLabel(assoc->InnerContainerW,
				"assoc-bar",
				ArgPack_the_args(AP),
				ArgPack_num_args(AP));
      XtManageChild(assoc->BarW);
      d2_Assoc_bar_add_focus(assoc,assoc->BarW);
      ArgPack_delete(AP);
    }
  }
  else {
    AP=ArgPack_duplicate_args(d2_assoc_bar); 
    ArgPack_add_arg(AP,XmNtopAttachment, (XtArgVal) XmATTACH_FORM);
    assoc->BarW=XmCreateLabel(ParentW,
			      "assoc-bar",
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
    XtManageChild(assoc->BarW);
    d2_Assoc_bar_add_focus(assoc,assoc->BarW);
    ArgPack_delete(AP);
  }
  return(assoc->ContainerW);
}

/*--------------------------------------------------*/
NORET d2_Assoc_add_focus(assoc,w)
     REAssoc assoc;
     Widget w;
{
  reid rei=assoc->rei;
  static XtTranslations Translations=NULL;

  if (Translations==NULL) {
    XtAppAddActions(rei->AppContext,d2_AssocActions,d2_AssocActionsCount); 
    Translations=XtParseTranslationTable(d2_AssocFocusEvent);
  }

  Alxt_SetArg(w, XmNuserData,(XtArgVal) assoc);
  XtOverrideTranslations(w,Translations);
}

/*--------------------------------------------------*/
NORET d2_Assoc_select_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  REAssoc assoc;
  reid rei;

  assoc=(REAssoc)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug1("assoc e on box %s\n", box_string(assoc->Type));
  rei=assoc->rei;
  rei->SelectedType=RE_SELECT_BOX;
  rei->Selected=assoc;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_Assoc_click_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  REAssoc assoc;
  reid rei;

  assoc=(REAssoc)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug1("assoc BAR click box %s\n", box_string(assoc->Type));
  rei=assoc->rei;
  MuSetWaitCursor(rei->ShellW);
  AlPop_Query(ALPOP_INFO,
	      AlText_get(RE_TEXT_FILE,CLICK_ON_ASSOC),
	      AlText_get(RE_TEXT_FILE,CLICK_ON_ASSOC_HELP),
	      assoc->BarW,
	      ALPOP_HANG_BELOW,
	      rei->display,
	      ALPOP_OK | ALPOP_HELP);
  MuSetStandardCursor(rei->ShellW);
}

/*--------------------------------------------------*/
NORET d2_Assoc_bar_add_focus(assoc,w)
     REAssoc assoc;
     Widget w;
{
  reid rei=assoc->rei;
  static XtTranslations Translations=NULL;

  if (Translations==NULL) {
    XtAppAddActions(rei->AppContext,d2_AssocBarActions,
		    d2_AssocBarActionsCount); 
    Translations=XtParseTranslationTable(d2_AssocBarFocusEvent);
  }
  
  Alxt_SetArg(w, XmNuserData,(XtArgVal) assoc);
  XtOverrideTranslations(w,Translations);
}

/*--------------------------------------------------*/
NORET d2_Assoc_bar_select_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  REAssoc assoc;
  reid rei;

  assoc=(REAssoc)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug1("assoc BAR e on box %s\n", box_string(assoc->Type)); 
  rei=assoc->rei;
  rei->SelectedType=RE_SELECT_BAR;
  rei->Selected=assoc;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_Assoc_bar_click_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  REAssoc assoc;
  reid rei;

  assoc=(REAssoc)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug1("assoc BAR click box %s\n", box_string(assoc->Type));
  rei=assoc->rei;
  MuSetWaitCursor(rei->ShellW);
  AlPop_Query(ALPOP_INFO,
	      AlText_get(RE_TEXT_FILE,CLICK_ON_ASSOC_BAR),
	      AlText_get(RE_TEXT_FILE,CLICK_ON_ASSOC_BAR_HELP),
	      assoc->BarW,
	      ALPOP_HANG_BELOW,
	      rei->display,
	      ALPOP_OK | ALPOP_HELP);
  MuSetStandardCursor(rei->ShellW);

  /*
    rei->SelectedType=RE_SELECT_BAR;
    rei->Selected=assoc;
    d2_Buttons_update(rei);
    */
}


/*
 *
 *   THEN PART ROUTINES ----------------------------------------
 *
 */


/*--------------------------------------------------*/
NORET d2_Then_bar_select_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  reid rei;
  rei=(reid)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug("THEN BAR FOCUS\n");

  rei->SelectedType=RE_SELECT_THEN_BAR;
  rei->Selected=rei;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_Then_bar_click_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  reid rei;
  rei=(reid)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug("THEN BAR CLICK\n");

  MuSetWaitCursor(rei->ShellW);
  AlPop_Query(ALPOP_INFO,
	      AlText_get(RE_TEXT_FILE,CLICK_ON_THEN_BAR),
	      AlText_get(RE_TEXT_FILE,CLICK_ON_THEN_BAR_HELP),
	      rei->ThenBarW,
	      ALPOP_HANG_BELOW,
	      rei->display,
	      ALPOP_OK | ALPOP_HELP);
  MuSetStandardCursor(rei->ShellW);
  /*
    {
    XFocusInEvent INevent;
    XFocusOutEvent OUTevent;
    
    OUTevent.type=FocusOut;
    OUTevent.serial=0;
    OUTevent.send_event=FALSE;
    OUTevent.display=rei->display;
    OUTevent.window=XtWindow(rei->ShellW);
    OUTevent.mode=NotifyUngrab;
    OUTevent.detail=NotifyPointer;
    XtDispatchEvent((XEvent*)&OUTevent);

    INevent.type=FocusIn;
    INevent.serial=0;
    INevent.send_event=FALSE;
    INevent.display=rei->display;
    INevent.window=XtWindow(rei->ThenBarW);
    INevent.mode=NotifyGrab;
    INevent.detail=NotifyPointer;
    XtDispatchEvent((XEvent*)&INevent);
    }

    rei->SelectedType=RE_SELECT_THEN_BAR;
    rei->Selected=rei;
    d2_Buttons_update(rei);
    */

}

/*--------------------------------------------------*/
NORET d2_Fill_Then_work(rei,workW)
     reid rei;
     Widget workW;
{
  REAction action;
  int i,l;
  ArgPack AP;
  static XtTranslations Translations=NULL;
  rei->ThenW=workW;

  AP=ArgPack_duplicate_args(d2_assoc_bar); 
  ArgPack_add_arg(AP,XmNtopAttachment, (XtArgVal) XmATTACH_FORM);
  rei->ThenBarW=XmCreateLabel(rei->ThenW,
			      "assoc-bar",
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
  XtManageChild(rei->ThenBarW);

  if (Translations==NULL) {
    XtAppAddActions(rei->AppContext,d2_ThenBarActions,
		    d2_ThenBarActionsCount); 
    Translations=XtParseTranslationTable(d2_ThenBarFocusEvent);
  }
  
  Alxt_SetArg(rei->ThenBarW, XmNuserData,(XtArgVal) rei);
  XtOverrideTranslations(rei->ThenBarW,Translations);
  
  l=Darray_len(rei->Actions);
  for (i=0;i<l;i++) {
    action=(REAction)Darray_get(rei->Actions,(unsigned)i);
    d2_Action_add(rei,action);
  }
}

/*--------------------------------------------------*/
void d2_Action_add(rei,action)
     reid rei;
     REAction action;
{
  Widget PreviousW, NextW;
  ArgPack AP;
  
  rl_Actions_get_surrounding_widgets(rei,action,&PreviousW,&NextW);

  AP=ArgPack_duplicate_args(d2_field_form);
  if (PreviousW==NULL)
    ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_FORM );
  else {
    ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET );
    ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) PreviousW );
  }
  ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );  
  ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->app_work_width );  
  ArgPack_add_arg(AP, XmNtopOffset, (XtArgVal) rei->if_field_spacing ); 
  action->ContainerW=XmCreateForm(rei->ThenW,
				  "action-container",
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));
  ArgPack_delete(AP);

  d2_Action_make_menu(action);
  d2_Action_make_args(action);

  if (NextW!=NULL) {
    Alxt_SetArg(NextW,XmNtopAttachment,(XtArgVal) XmATTACH_WIDGET);
    Alxt_SetArg(NextW,XmNtopWidget,(XtArgVal) action->ContainerW);
  }

  XtManageChild(action->ContainerW);

  d2_Action_add_focus(action);
}

/*--------------------------------------------------*/
NORET d2_Action_make_menu(action)
     REAction action;
{
  ArgPack AP;
  Widget MenuPane;

  AP=ArgPack_duplicate_args(d2_action_menu);
  ArgPack_add_arg(AP, XmNmarginWidth,  (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNmarginHeight,  (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNshadowThickness, (XtArgVal) 0 );
  ArgPack_add_arg(AP, XmNhighlightThickness, (XtArgVal) 0 );
  MenuPack_attach_to_widget(action->Menu,action->ContainerW);
  MenuPack_option_set_args(action->Menu,AP);
  MenuPack_make_menu(action->Menu);
  action->MenuW=MenuPack_get_top_level_manager(action->Menu);
  action->VerbW=MenuPack_option_get_button(action->Menu);
  Alxt_SetArg(action->MenuW,XmNheight, (XtArgVal)
	      action->rei->if_field_height );
  Alxt_SetArg(action->VerbW,XmNtraversalOn, (XtArgVal) TRUE );
  Alxt_SetArg(action->VerbW,XmNshadowThickness, (XtArgVal) 
	      ShadowThickness_GR );
  MenuPack_set_as_default(action->Menu,action->VerbName);

  MenuPane=MenuPack_get_menupane(action->Menu);

  XtAddCallback(MenuPane,XmNmapCallback,
		d2_Action_menu_map_CB,
		action);
  ArgPack_delete(AP);

  /* d2_Field_shrink_option_menu(action->MenuW); */
}


/*--------------------------------------------------*/
NORET d2_Action_add_focus(action)
     REAction action;
{
  reid rei=action->rei;
  static XtTranslations VTranslations=NULL;

  if (VTranslations==NULL) {
    XtAppAddActions(rei->AppContext,d2_ActionActions,
		    d2_ActionActionsCount); 
    VTranslations=XtParseTranslationTable(d2_VerbFocusEvent);
  }
  
  Alxt_SetArg(action->MenuW, XmNuserData,(XtArgVal) action);
  XtOverrideTranslations(action->MenuW,VTranslations);
}

/*--------------------------------------------------*/
NORET d2_Action_menu_map_CB(w,action,cadda)
     Widget w;
     REAction action;
     caddr_t cadda;
{  
  reid rei=action->rei;
  RE_debug("action menu map\n");
  rei->SelectedType=RE_SELECT_ACTION;
  rei->Selected=(VOIDP)action;
}

/*--------------------------------------------------*/
NORET d2_Verb_select_E(w,xe,parms,np)
     Widget w;
     XEvent *xe;
     char** parms;
     int *np;
{
  REAction action;
  reid rei;

  action=(REAction)Alxt_get_widget_feature(w,XmNuserData);
  RE_debug1("select action %s\n", action->VerbName);
  rei=action->rei;
  rei->SelectedType=RE_SELECT_ACTION;
  rei->Selected=action;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
NORET d2_Action_make_args(action)
     REAction action;
{
  int i,l;

  l=Darray_len(action->Arguments);
  for (i=0;i<l;i++) 
    d2_Argument_add(action,(REArgument)Darray_get(action->Arguments,(unsigned)i));
}

/*--------------------------------------------------*/
NORET d2_Argument_add(action,arg)
     REAction action;
     REArgument arg;
{
  ArgPack AP;
  Widget PreviousW, NextW;
  reid rei=action->rei;

  rl_Arguments_get_surrounding_widgets(action,arg,&PreviousW,&NextW);

  RE_debug1("adding arg %s\n",arg->Arg);

  AP=ArgPack_duplicate_args(d2_field_edit);
  if (PreviousW!=NULL) {
    ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal)  XmATTACH_WIDGET );
    ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal)  PreviousW );
  }
  else {
    ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal)  XmATTACH_FORM );
  }
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal)  XmATTACH_WIDGET );
  ArgPack_add_arg(AP, XmNleftWidget, (XtArgVal)  action->MenuW  );
  ArgPack_add_arg(AP, XmNmaxLength, (XtArgVal) ARGUMENT_LENGTH );
  ArgPack_add_arg(AP, XmNrightAttachment, (XtArgVal)  XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNvalue, (XtArgVal)  arg->Arg);
  ArgPack_add_arg(AP, XmNresizeWidth, (XtArgVal) TRUE  );
  ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );
  ArgPack_add_arg(AP,XmNfontList, (XtArgVal)  
		  AlFonts_get_specific_fonts(rei->OuterW, ALFONTS_TEXT_MASK));
  if (rei->if_value_width!=(-1))
    ArgPack_add_arg(AP, XmNwidth, (XtArgVal) rei->if_value_width );
  arg->ArgW=XtCreateManagedWidget("action-arg",
				  xmTextWidgetClass,
				  action->ContainerW,
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));

  XtAddCallback(arg->ArgW,XmNfocusCallback,
		d2_Argument_select_CB,
		arg);
  XtAddCallback(arg->ArgW,XmNvalueChangedCallback,
		d2_KeyModify_CB,
		rei);
  ArgPack_delete(AP);

  if (PreviousW!=NULL) 
    Alxt_SetArg(PreviousW, XmNbottomAttachment, (XtArgVal)  XmATTACH_NONE );

  if (NextW!=NULL) {
    Alxt_SetArg(arg->ArgW, XmNbottomAttachment, (XtArgVal)  XmATTACH_NONE );
    Alxt_SetArg(NextW, XmNtopAttachment, (XtArgVal)  XmATTACH_WIDGET );
    Alxt_SetArg(NextW, XmNtopWidget, (XtArgVal)  PreviousW );
  }
  else
    Alxt_SetArg(arg->ArgW, XmNbottomAttachment, (XtArgVal)  XmATTACH_FORM );

  {
    int full;
    full=Darray_len(action->Arguments)*rei->if_field_height;
    RE_debug1("full=%d\n",full);
    if (full!=0)
      Alxt_SetArg(action->ContainerW,XmNheight,(XtArgVal)full);
  }
}

/*--------------------------------------------------*/
NORET d2_Argument_select_CB(w,arg,wd)
     Widget w;
     REArgument arg;
     caddr_t wd;
{
  reid rei=arg->action->rei;
  
  RE_debug1("selected argument %s\n",XmTextGetString(arg->ArgW));
  rei->Selected=(VOIDP)arg;
  rei->SelectedType=RE_SELECT_ARGUMENT;
  d2_Buttons_update(rei);
}

/*--------------------------------------------------*/
void d2_KeyModify_CB(w,rei,VP)
Widget w;
reid rei;
caddr_t VP;
{
  rei->Modified=Bool_TRUE;
}

/*--------------------------------------------------*/
/* we remove the tab groups in the reverse order that we created them in to */
 /* avoid the focus chase problem which arises when we remove them in the */
 /* same order we made them in, that is: as a tab group ius removed, motif */
 /* sets the tab to the next widget in the tab group list, but we then */
 /* remove the tab of that widget, and so on so we get a 'chase'. */
/*----------------------------------------*/
/*
NORET d2_If_remove_tab_groups(rem)
REMember rem;
{
  REAssoc rea;
  REField ref;
  int i,l;
  ReMode mode;

  if (rem->Type==ALRMT_ASSOC) {
    rea=rem->object.Assoc;
    l=Darray_len(rea->Contents);
    for (i=l-1;i>=0;i--)
      d2_If_remove_tab_groups((REMember)Darray_get(rea->Contents,(unsigned)i));
    if (rea->BarW!=NULL)
      XmRemoveTabGroup(rea->BarW);
    if (rea->LabelW!=NULL)
      XmRemoveTabGroup(rea->LabelW);
  }
  else {
    ref=rem->object.Field;
    mode=ref->VisibleMode;
    RE_debug1("mode=%d\n",mode);
    if (mode==RE_MODE_COMPLEX && ref->ClassW!=NULL)
      XmRemoveTabGroup(ref->ClassW);
    if (mode==RE_MODE_COMPLEX && ref->TypeW!=NULL)
      XmRemoveTabGroup(ref->TypeW);
    XmRemoveTabGroup(ref->KeyW);
    if ((ref->ShowOp==Bool_TRUE || mode==RE_MODE_COMPLEX) && 
	ref->OpW!=NULL) {
      XmRemoveTabGroup(ref->OpW);
    }
    XmRemoveTabGroup(ref->ValueW);
  }
}
*/

/*--------------------------------------------------*/
NORET d2_If_remove_tab_groups(rem)
REMember rem;
{
  REAssoc rea;
  REField ref;
  int i,l;
  ReMode mode;

  if (rem->Type==ALRMT_ASSOC) {
    rea=rem->object.Assoc;
    if (rea->LabelW!=NULL)
      XmRemoveTabGroup(rea->LabelW);
    if (rea->BarW!=NULL)
      XmRemoveTabGroup(rea->BarW);
    l=Darray_len(rea->Contents);
    for (i=0;i<l;i++)
      d2_If_remove_tab_groups((REMember)Darray_get(rea->Contents,(unsigned)i));
  }
  else {
    ref=rem->object.Field;
    mode=ref->VisibleMode;
    RE_debug1("mode=%d\n",mode);
    if (mode==RE_MODE_COMPLEX && ref->ClassW!=NULL)
      XmRemoveTabGroup(ref->ClassW);
    if (mode==RE_MODE_COMPLEX && ref->TypeW!=NULL)
      XmRemoveTabGroup(ref->TypeW);
    XmRemoveTabGroup(ref->KeyW);
    if ((ref->ShowOp==Bool_TRUE || mode==RE_MODE_COMPLEX) && 
	ref->OpW!=NULL) {
      XmRemoveTabGroup(ref->OpW);
    }
    XmRemoveTabGroup(ref->ValueW);
  }
}
/*--------------------------------------------------*/
NORET d2_If_set_tab_groups(rem)
REMember rem;
{
  REAssoc rea;
  REField ref;
  int i,l;
  ReMode mode;

  if (rem->Type==ALRMT_ASSOC) {
    rea=rem->object.Assoc;
    if (rea->LabelW!=NULL)
      XmAddTabGroup(rea->LabelW);
    if (rea->BarW!=NULL)
      XmAddTabGroup(rea->BarW);
    l=Darray_len(rea->Contents);
    for (i=0;i<l;i++)
      d2_If_set_tab_groups((REMember)Darray_get(rea->Contents,(unsigned)i));
  }
  else {
    ref=rem->object.Field;
    mode=ref->VisibleMode;
    RE_debug1("mode=%d\n",mode);
    if (mode==RE_MODE_COMPLEX && ref->ClassW!=NULL)
      XmAddTabGroup(ref->ClassW);
    if (mode==RE_MODE_COMPLEX && ref->TypeW!=NULL)
      XmAddTabGroup(ref->TypeW);
    XmAddTabGroup(ref->KeyW);
    if ((ref->ShowOp==Bool_TRUE || mode==RE_MODE_COMPLEX) && 
	ref->OpW!=NULL) {
      XmAddTabGroup(ref->OpW);
    }
    XmAddTabGroup(ref->ValueW);
  }
}

/*--------------------------------------------------*/
NORET d2_Then_set_tab_groups(rei)
     reid rei;
{
  int i,l,j,k;
  Darray d=rei->Actions;
  REAction action;
  REArgument arg;
  XmAddTabGroup(rei->ThenBarW);
  l=Darray_len(d);
  for (i=0;i<l;i++) {
    action=(REAction)Darray_get(d,(unsigned)i);
    assert(action->MenuW);
    XmAddTabGroup(action->MenuW);
    k=Darray_len(action->Arguments);
    for (j=0;j<k;j++) {
      arg=(REArgument)Darray_get(action->Arguments,(unsigned)j);
      assert(arg->ArgW);
      XmAddTabGroup(arg->ArgW);
    }
  }
}
/*--------------------------------------------------*/
NORET d2_Then_remove_tab_groups(rei)
     reid rei;
{
  int i,l,j,k;
  Darray d=rei->Actions;
  REAction action;
  REArgument arg;
  XmRemoveTabGroup(rei->ThenBarW);
  l=Darray_len(d);
  for (i=0;i<l;i++) {
    action=(REAction)Darray_get(d,(unsigned)i);
    assert(action->MenuW);
    XmRemoveTabGroup(action->MenuW);
    k=Darray_len(action->Arguments);
    for (j=0;j<k;j++) {
      arg=(REArgument)Darray_get(action->Arguments,(unsigned)j);
      assert(arg->ArgW);
      XmRemoveTabGroup(arg->ArgW);
    }
  }
}

/*--------------------------------------------------*/
/*
NORET d2_Then_remove_tab_groups(rei)
  reid rei;
{
  int i,l,j,k;
  Darray d=rei->Actions;
  REAction action;
  REArgument arg;
  XmRemoveTabGroup(rei->ThenBarW);
  l=Darray_len(d);
  for (i=l-1;i>=0;i--) {
    action=(REAction)Darray_get(d,(unsigned)i);
    assert(action->MenuW);
    k=Darray_len(action->Arguments);
    for (j=k-1;j>=0;j--) {
      arg=(REArgument)Darray_get(action->Arguments,(unsigned)j);
      assert(arg->ArgW);
      XmRemoveTabGroup(arg->ArgW);
    }
    XmRemoveTabGroup(action->MenuW);
  }
}
*/
/*--------------------------------------------------*/
NORET d2_Remove_tab_groups(rei)
     reid rei;
{
  XmRemoveTabGroup(rei->MessageTypeW);
  XmRemoveTabGroup(rei->RuleNameW);
  d2_If_remove_tab_groups(rei->TopLevelMember);
  d2_Then_remove_tab_groups(rei);
}

/*--------------------------------------------------*/
NORET d2_Set_tab_groups(rei)
  reid rei;
{
  XmAddTabGroup(rei->MessageTypeW);
  XmAddTabGroup(rei->RuleNameW);
  d2_If_set_tab_groups(rei->TopLevelMember);
  d2_Then_set_tab_groups(rei);
}

/*--------------------------------------------------*/
NORET d2_Refresh_tab_groups(rei)
     reid rei;
{
  d2_Remove_tab_groups(rei);
  d2_Set_tab_groups(rei);


  /* the following two chunks of code are an attempt to get around a bug in */
  /* the motif menu accelerators (well, I know its a bug but I couldn't say */
  /* I know exactly where its origins are).  If the user deletes or adds a */
  /* field using the menu accelerators, and then I redo the tab groups with */
  /* the function d2_Refresh_tab_groups() the focus gets messed up. */
  /*
  {
    ArgPack AP;
    static Widget AppShellW=NULL;
    if (AppShellW==NULL) {
      Widget w;
      AP=ArgPack_create();
      ArgPack_add_arg(AP,XmNwidth,(XtArgVal)100);
      ArgPack_add_arg(AP,XmNheight,(XtArgVal)100);
      ArgPack_add_arg(AP,XmNx,(XtArgVal)1);
      ArgPack_add_arg(AP,XmNy,(XtArgVal)1);
      ArgPack_add_arg(AP,XmNoverrideRedirect,(XtArgVal) TRUE);
      AppShellW=XtCreatePopupShell("Argus-kludge-popup",
				   vendorShellWidgetClass,
				   rei->ThenBarW,
				   ArgPack_the_args(AP), 
				   ArgPack_num_args(AP) );
      ArgPack_delete(AP);

      AP=ArgPack_duplicate_args(d2_assoc_bar); 
      w=XmCreateLabel(AppShellW,
		      "kludge-popup-widget",
		      ArgPack_the_args(AP),
		      ArgPack_num_args(AP));
      XtManageChild(w);
      ArgPack_delete(AP);
    }
    XtPopup(AppShellW,XtGrabExclusive);
    XtPopdown(AppShellW);
  }
  */
}

/*--------------------------------------------------*/
NORET d2_IfMenu_set(rei,to)
     reid rei;
     int to;
{
  int i,l;
  XtSetSensitive(rei->TextFieldAddW,to);
  XtSetSensitive(rei->ComplexFieldAddW,to);
  XtSetSensitive(rei->IfDeleteW,to);

  l=Darray_len(rei->EasyAccessFTsWs);
  for (i=0;i<l;i++) 
    XtSetSensitive(Darray_get(rei->EasyAccessFTsWs,(unsigned)i),
		   to);
}


/*--------------------------------------------------*/
NORET d2_ThenMenu_set(rei,to)
     reid rei;
     int to;
{
  XtSetSensitive(rei->ArgumentAddW,to);
  XtSetSensitive(rei->ArgumentDeleteW,to);
  XtSetSensitive(rei->ActionAddW,to);
  XtSetSensitive(rei->ActionDeleteW,to);
}

/*--------------------------------------------------*/
NORET d2_Then_update_arg_buttons(rei)
     reid rei;
{
  int exists, minn, maxx;
  REAction action;

  switch(rei->SelectedType) {
  case RE_SELECT_ARGUMENT: {
    REArgument arg=rei->Selected;
    action=arg->action;
    break;
    }
    
  case RE_SELECT_ACTION: 
    action=(REAction)rei->Selected;
    break;
    
  default:
    XtSetSensitive(rei->ArgumentDeleteW,FALSE);
    XtSetSensitive(rei->ArgumentAddW,FALSE);
    return;
    break;
  }
  
  exists=Darray_len(action->Arguments);
  minn=AlVerb_min_args(action->Verb);
  maxx=AlVerb_max_args(action->Verb);
  
  if (exists>minn)
    XtSetSensitive(rei->ArgumentDeleteW,TRUE);
  else
    XtSetSensitive(rei->ArgumentDeleteW,FALSE);
  
  if (exists<maxx)
    XtSetSensitive(rei->ArgumentAddW,TRUE);
  else
    XtSetSensitive(rei->ArgumentAddW,FALSE);
}


/*--------------------------------------------------*/
NORET d2_Buttons_update(rei)
     reid rei;
{
  /* do the simple/complex buttons */
  /* this code has been removed because it confused users how the simple and */
  /* complex buttons would change highlight status when things were done */
  /* around the rule editor */
  /*
  switch (rei->SelectedType) {
  case RE_SELECT_FIELD: 
    {
      REField field=(REField)rei->Selected;
      if (field->VisibleMode==RE_MODE_COMPLEX) {
	XtSetSensitive(rei->ComplexW,FALSE);
	XtSetSensitive(rei->SimpleW,TRUE); 
      }
      else {
	XtSetSensitive(rei->ComplexW,TRUE);
	XtSetSensitive(rei->SimpleW,FALSE); 
      }
    }
    break;

  case RE_SELECT_BOX:
  case RE_SELECT_BAR:
    {
      XtSetSensitive(rei->SimpleW,TRUE);
      XtSetSensitive(rei->ComplexW,TRUE); 
    }
    break;

  default:
    XtSetSensitive(rei->SimpleW,FALSE);
    XtSetSensitive(rei->ComplexW,FALSE); 
    break;
  }
  */

  /* do the major menus */
  switch (rei->SelectedType) {
  case RE_SELECT_FIELD: 
  case RE_SELECT_BOX:
  case RE_SELECT_BAR:
    d2_IfMenu_set(rei,TRUE);
    d2_ThenMenu_set(rei,FALSE);
    break;

  case RE_SELECT_ARGUMENT:
  case RE_SELECT_ACTION:
  case RE_SELECT_THEN_BAR:
    d2_IfMenu_set(rei,FALSE);
    d2_ThenMenu_set(rei,TRUE);
    break;

  case RE_SELECT_NAME:
  case RE_SELECT_MESSAGE_TYPE:
  case RE_SELECT_NONE:
    d2_IfMenu_set(rei,FALSE);
    d2_ThenMenu_set(rei,FALSE);
    return;
    break;
    
  default:
    assert(0); 
    break;
  }

  /* do the then menu */
  switch(rei->SelectedType) {
  case RE_SELECT_ARGUMENT:
    d2_Then_update_arg_buttons(rei);
    break;
    
  case RE_SELECT_ACTION:
    d2_Then_update_arg_buttons(rei);
    break;

  default:
    XtSetSensitive(rei->ArgumentDeleteW,FALSE);
    XtSetSensitive(rei->ArgumentAddW,FALSE);
    break;
  }
}
