#include <stdio.h>
#include <ctype.h>

#include "Xm/Form.h"
#include "Xm/Text.h"
#include "Xm/PanedW.h"

#include "ArgPack.h"
#include "menupack.h"
#include "alfonts.h"
#include "xstuff.h"
#include "darray.h"

#include "global.h"
#include "d2args.h"	/*** ! for now */
#include "d2.h"		/***/

#include "dpy.h"

NORET d2_KeyModify_CB PROTOTYPE((Widget,reid,caddr_t));
static long	d2_MAX_ATT = 0;
Bool	d2_INFOM = Bool_TRUE;

Widget
d2_create_buttons(form, rei)
Widget	form;
reid	rei;
{
	Widget	quitB,
		helpB,
		saveB,
		buttons;
	ArgPack	gen_argp = ArgPack_create(),
		q_argp = ArgPack_create(),
		h_argp = ArgPack_create(),
		s_argp = ArgPack_create();

	ArgPack_add_arg(gen_argp, XmNunitType, (XtArgVal)XmPIXELS);
	ArgPack_add_arg(gen_argp, XmNheight, (XtArgVal)60);

	ArgPack_add_arg(gen_argp, XmNresizePolicy, (XtArgVal)XmRESIZE_NONE);

	ArgPack_add_arg(gen_argp, XmNbottomAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(gen_argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(gen_argp, XmNrightAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(gen_argp, XmNresizable, (XtArgVal)FALSE);

	buttons = XmCreateForm(form, "Button Form",
			       ArgPack_the_args(gen_argp),
			       ArgPack_num_args(gen_argp));
	ArgPack_delete(gen_argp);

	gen_argp = ArgPack_duplicate_args(gen_button_res);
	ArgPack_add_arg(gen_argp, XmNfontList, (XtArgVal)rei->Fonts);

	q_argp = ArgPack_copy_and_append(q_argp, gen_argp);
	ArgPack_add_arg(q_argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(q_argp, XmNlabelString, 
			(XtArgVal)XmStringCreate("Quit", ALFONTS_BUTTONS));
	quitB = XmCreatePushButton(buttons, "quit-button",
				   ArgPack_the_args(q_argp),
				   ArgPack_num_args(q_argp));
	ArgPack_delete(q_argp);
	XtAddCallback(quitB, XmNactivateCallback, ed_Abort_CB, rei);

	h_argp = ArgPack_copy_and_append(h_argp, gen_argp);
	ArgPack_add_arg(h_argp, XmNleftAttachment, (XtArgVal)XmATTACH_WIDGET);
	ArgPack_add_arg(h_argp, XmNleftWidget, (XtArgVal)quitB);
	ArgPack_add_arg(h_argp, XmNlabelString, 
			(XtArgVal)XmStringCreate("Help", ALFONTS_BUTTONS));
	helpB = XmCreatePushButton(buttons, "help-button",
				   ArgPack_the_args(h_argp),
				   ArgPack_num_args(h_argp));
	ArgPack_delete(h_argp);

	s_argp = ArgPack_copy_and_append(s_argp, gen_argp);
	ArgPack_add_arg(s_argp, XmNrightAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(s_argp, XmNlabelString, 
			(XtArgVal)XmStringCreate("Save", ALFONTS_BUTTONS));
	saveB = XmCreatePushButton(buttons, "save-button",
				   ArgPack_the_args(s_argp),
				   ArgPack_num_args(s_argp));
	ArgPack_delete(s_argp);
	XtAddCallback(saveB, XmNactivateCallback, ed_Done_CB, rei);

	ArgPack_delete(gen_argp);
/**! Should probably do a ManageChildren ***/
	XtManageChild(quitB);
	XtManageChild(helpB);
	XtManageChild(saveB);
	XtManageChild(buttons);
	return buttons;
}

NORET
d2_create_value_key(form, REf)
Widget	form;
REField	REf;
{
	ArgPack	argp;

	argp=ArgPack_duplicate_args(d2_field_edit_mine);
	ArgPack_add_arg(argp, XmNmaxLength, (XtArgVal) REf->MaxValueBufferLength );
/***	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)   XmATTACH_WIDGET );
	if (REf->ShowOp==Bool_TRUE) 
		ArgPack_add_arg(argp, XmNleftWidget, (XtArgVal)   OpFrameW );
	else
		ArgPack_add_arg(argp, XmNleftWidget, (XtArgVal)   REf->KeyW );
*/
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNcursorPosition,(XtArgVal)  strlen(REf->ValueBuffer));
	ArgPack_add_arg(argp, XmNvalue, (XtArgVal)  REf->ValueBuffer);
	ArgPack_add_arg(argp, XmNresizeWidth, (XtArgVal) FALSE  );
/***/	ArgPack_add_arg(argp, XmNrightAttachment, (XtArgVal)XmATTACH_NONE);
	REf->ValueW=XmCreateText(form, "field-value",
				 ArgPack_the_args(argp),
				 ArgPack_num_args(argp));
	ArgPack_delete(argp);
	XtAddCallback(REf->ValueW,XmNfocusCallback,
		      ed_Select_field_CB,
		      REf);
	XmAddTabGroup(REf->ValueW); 
	XtManageChild(REf->ValueW);
}

NORET
d2_create_op_opt(form, REf)
Widget	form;
REField	REf;
{
	Widget	op_opt;
	ArgPack	argp;

	argp = ArgPack_duplicate_args(att_opt_res);
	ArgPack_add_arg(argp, XmNbottomWidget, (XtArgVal)REf->ValueW);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNrightAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNlabelString,
			(XtArgVal)XmStringCreate(REf->FieldOp,
						 XmSTRING_DEFAULT_CHARSET));
	op_opt = XmCreateLabel(form, "operator-menu-top",
			       ArgPack_the_args(argp),
			       ArgPack_num_args(argp));
	ArgPack_delete(argp);
/***	XmAddTabGroup(op_opt);
	Not clear what the above would be for a label of a menu
***/
	XtManageChild(op_opt);
}

Widget
d2_create_value_section(attach_left, REf)
Widget	attach_left;
REField	REf;
{
	Widget	value_sec,
		form = REf->ContainerW;
	ArgPack	argp;

	argp = ArgPack_duplicate_args(field_sec_res);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_WIDGET);
	ArgPack_add_arg(argp, XmNleftWidget, (XtArgVal)attach_left);
/***?	ArgPack_add_arg(argp, XmNrightAttachment, (XtArgVal)XmATTACH_FORM);*/
	ArgPack_add_arg(argp, XmNleftOffset, (XtArgVal)300);
	value_sec = XmCreateForm(form, "value-section",
				 ArgPack_the_args(argp),
				 ArgPack_num_args(argp));
	d2_create_value_key(value_sec, REf);
	if(d2_INFOM)
		d2_create_op_opt(value_sec, REf);

	ArgPack_delete(argp);
	XtManageChild(value_sec);
	return value_sec;
}

NORET
d2_create_attribute_key(form, REf)
Widget	form;
REField	REf;
{
	ArgPack	argp;

	argp=ArgPack_duplicate_args(d2_field_edit_mine);
/***/	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNmaxLength, (XtArgVal) REf->MaxKeyLength );
	ArgPack_add_arg(argp, XmNcursorPosition,(XtArgVal)  strlen(REf->Key));
	ArgPack_add_arg(argp, XmNvalue, (XtArgVal) REf->Key);
	ArgPack_add_arg(argp, XmNresizeWidth, (XtArgVal) FALSE  );
	ArgPack_add_arg(argp, XmNleftOffset, (XtArgVal)0);
	ArgPack_add_arg(argp, XmNrightOffset, (XtArgVal)0);
	REf->KeyW = XmCreateText(form, "attribute-key",
				 ArgPack_the_args(argp),
				 ArgPack_num_args(argp));
	ArgPack_delete(argp);
	XtAddCallback(REf->KeyW,XmNvalueChangedCallback,
		      d2_KeyModify_CB,
		      REf->rei);
	XtAddCallback(REf->KeyW,XmNfocusCallback,
		      ed_Select_field_CB,
		      REf);
	XmAddTabGroup(REf->KeyW); 
	XtManageChild(REf->KeyW);
}

Widget
d2_create_attribute_option(form, REf)
Widget	form;
REField	REf;
{
	Widget	att_opt;
	ArgPack	argp;

	assert(form);
	assert(REf);
	assert(REf->KeyW);

	argp = ArgPack_duplicate_args(att_opt_res);
	ArgPack_add_arg(argp, XmNbottomWidget, (XtArgVal)REf->KeyW);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNlabelString, 
			(XtArgVal)XmStringCreate(AlAttribute_types[REf->Type],
						 XmSTRING_DEFAULT_CHARSET));
	att_opt = XmCreateLabel(form, "attribute-menu-top",
			       ArgPack_the_args(argp),
			       ArgPack_num_args(argp));
	ArgPack_delete(argp);
/***	XmAddTabGroup(att_opt); 
	Not clear what the above would be for a label of a menu
***/
	XtManageChild(att_opt);
	return att_opt;
}

NORET
d2_create_attribute_type_option(form, attach_left, REf)
Widget	form,
	attach_left;
REField	REf;
{
	Widget	att_type_opt;
	ArgPack	argp;

	argp = ArgPack_duplicate_args(att_opt_res);
	ArgPack_add_arg(argp, XmNbottomWidget, (XtArgVal)REf->KeyW);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_WIDGET);
	ArgPack_add_arg(argp, XmNleftWidget, (XtArgVal)attach_left);
	ArgPack_add_arg(argp, XmNlabelString,
			(XtArgVal)XmStringCreate(REf->FieldType,
						 XmSTRING_DEFAULT_CHARSET));
	att_type_opt = XmCreateLabel(form, "type-menu-top",
				     ArgPack_the_args(argp),
				     ArgPack_num_args(argp));
	ArgPack_delete(argp);
/***	XmAddTabGroup(att_type_opt); 
	Not clear what the above would be for a label of a menu
***/
	XtManageChild(att_type_opt);
	return;
}

Widget
d2_create_field_section(REf)
REField	REf;
{
	Widget	field_sec;
	ArgPack	argp;

	argp = ArgPack_duplicate_args(field_sec_res);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	field_sec = XmCreateForm(REf->ContainerW, "field-section", 
				 ArgPack_the_args(argp),
				 ArgPack_num_args(argp));
	d2_create_attribute_key(field_sec, REf);	/* do first */
	if(d2_INFOM)
	{	Widget	att_opt;

		att_opt = d2_create_attribute_option(field_sec, REf);
		d2_create_attribute_type_option(field_sec, att_opt, REf);
		Alxt_SetArg(field_sec, XmNheight, (XtArgVal)
			    ((int)Alxt_get_widget_feature(att_opt, XmNheight) +
			     (int)Alxt_get_widget_feature(REf->KeyW, XmNheight)));
	}
	ArgPack_delete(argp);
	XtManageChild(field_sec);
	return field_sec;
}

/*Modified Rich Code--------------------------------------------------*/
NORET d2_If_AddField(rei,REm,TT)
reid rei;
REMember REm;
int TT;
{
  Widget  A1W, NextW, ParentW, AltsMenuW, FTMenuW, SW, IFCW, button;
  Widget OpFrameW;
  ArgPack AP;
  REField REPreviousField, REf;
  REMember remt;
/***  ChildPack CP1, CP3;*/
  char *FieldClassName, *trans;
  int ValueX, AltsMenuX, KeyX, vbl;
  extern NORET Alxt_center_text_in_text_widget();

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

  REf=REm->object.Field;

  RE_debug1("a1=%x\n",A1W);
#ifdef	NOTDEF
  AP=ArgPack_duplicate_args(d2_field_form);
#else
	AP=ArgPack_create();
#endif
  if (A1W==NULL) {
    if (REf->container->father->object.Assoc->LabelW!=NULL) {
      ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET );
      ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) 
		      REf->container->father->object.Assoc->LabelW);
    }
    else 
      ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_FORM );
  }
  else {
    ArgPack_add_arg(AP, XmNtopAttachment, (XtArgVal) XmATTACH_WIDGET );
    ArgPack_add_arg(AP, XmNtopWidget, (XtArgVal) A1W );
  }
/***thm  ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );*/
  ArgPack_add_arg(AP, XmNtopOffset, (XtArgVal) rei->if_field_spacing ); 
#ifdef NOTDEF
  REf->ContainerW=XtCreateWidget("field-container",
				 xmFormWidgetClass,
				 ParentW,
				 ArgPack_the_args(AP),
				 ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_duplicate_args(d2_field_edit);
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(AP, XmNmaxLength, (XtArgVal) REf->MaxKeyLength );
  ArgPack_add_arg(AP, XmNcursorPosition,(XtArgVal)  strlen(REf->Key));
  ArgPack_add_arg(AP, XmNvalue, (XtArgVal) REf->Key);
  ArgPack_add_arg(AP, XmNresizeWidth, (XtArgVal) FALSE  );
  ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );
  REf->KeyW=XtCreateManagedWidget("field-key",
				  xmTextWidgetClass,
				  REf->ContainerW,
				  ArgPack_the_args(AP),
				  ArgPack_num_args(AP));
  ArgPack_delete(AP);

  XtAddCallback(REf->KeyW,XmNvalueChangedCallback,
		d2_KeyModify_CB,
		REf->rei);
  XtAddCallback(REf->KeyW,XmNfocusCallback,
		ed_Select_field_CB,
		REf);

  if (REf->ShowOp==Bool_TRUE) {
    AP=ArgPack_duplicate_args(d2_field_option_frame);
    ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );
    ArgPack_add_arg(AP, XmNleftWidget, (XtArgVal) REf->KeyW );
    OpFrameW=XmCreateForm(REf->ContainerW,
			   "field-op-container-frame",
			   ArgPack_the_args(AP),
			   ArgPack_num_args(AP));
    ArgPack_delete(AP);
    XtManageChild(OpFrameW);
    
    AP=ArgPack_duplicate_args(d2_field_option_menu);
    ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );
    MenuPack_option_set_args(REf->OpMenu,AP);
    MenuPack_attach_to_widget(REf->OpMenu,OpFrameW);
    MenuPack_make_menu(REf->OpMenu);
    ArgPack_delete(AP);
    REf->OpW=MenuPack_get_top_level_manager(REf->OpMenu);
    
    button=MenuPack_option_get_button(REf->OpMenu);
    Alxt_SetArg(button,XmNshadowThickness, (XtArgVal) d2_FIELD_MENU_SHADOW );

    /* Alxt_SetArg(OpFrameW,XmNwidth, (XtArgVal)
		Alxt_get_widget_feature(REf->OpW,XmNwidth)); */
  }

  AP=ArgPack_duplicate_args(d2_field_edit);
  ArgPack_add_arg(AP, XmNmaxLength, (XtArgVal) REf->MaxValueBufferLength );
  ArgPack_add_arg(AP, XmNleftAttachment, (XtArgVal)   XmATTACH_WIDGET );
  if (REf->ShowOp==Bool_TRUE) 
    ArgPack_add_arg(AP, XmNleftWidget, (XtArgVal)   OpFrameW );
  else
    ArgPack_add_arg(AP, XmNleftWidget, (XtArgVal)   REf->KeyW );
  ArgPack_add_arg(AP, XmNcursorPosition,(XtArgVal)  strlen(REf->ValueBuffer));
  ArgPack_add_arg(AP, XmNvalue, (XtArgVal)  REf->ValueBuffer);
  ArgPack_add_arg(AP, XmNresizeWidth, (XtArgVal) TRUE  );
  ArgPack_add_arg(AP, XmNheight, (XtArgVal) rei->if_field_height );
  REf->ValueW=XtCreateManagedWidget("field-value",
				    xmTextWidgetClass,
				    REf->ContainerW,
				    ArgPack_the_args(AP),
				    ArgPack_num_args(AP));
  XtAddCallback(REf->ValueW,XmNfocusCallback,
		ed_Select_field_CB,
		REf);
  ArgPack_delete(AP);

  RE_debug("added valuueW.\n");

  XtManageChild(REf->ContainerW);

  /* attempt to vertically center text in text widgets */
  Alxt_center_text_in_text_widget(REf->ValueW);
  Alxt_center_text_in_text_widget(REf->KeyW);

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

  XmAddTabGroup(REf->ContainerW); 
#endif

	d2_create_field_line(ParentW, NextW, AP, REf);

}

/*Rich Code--------------------------------------------------*/
NORET d2_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(d2_assoc_mine);
    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 );
    ArgPack_add_arg(AP,XmNwidth,(XtArgVal) rei->if_field_width);
    REm->object.Assoc->ContainerW = XmCreateForm(ParentW, "assoc-container",
						 ArgPack_the_args(AP),
						 ArgPack_num_args(AP));
    ArgPack_delete(AP);
    {
      AlRAType t=REm->object.Assoc->Type;
      AP=ArgPack_duplicate_args(d2_area_labels); 
      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));
      REm->object.Assoc->LabelW=
	XtCreateManagedWidget("assoc-label",
			      xmLabelWidgetClass,
			      REm->object.Assoc->ContainerW,
			      ArgPack_the_args(AP),
			      ArgPack_num_args(AP));
      XmAddTabGroup(REm->object.Assoc->LabelW); 
      ArgPack_delete(AP);
    }
  }
  for (i=0;i<Darray_len(REa->Contents);i++) {
    TempREm=(REMember)Darray_get(REa->Contents,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");
  }
/*** thm this does not work****/
	for (i=0;i<Darray_len(REa->Contents);i++)
	{	TempREm=(REMember)Darray_get(REa->Contents,i);
		if (TempREm->Type==ALRMT_FIELD)
		{	int	diff;
			if((diff = 
			    d2_MAX_ATT - 
			    (long)Alxt_get_widget_feature(TempREm->object.Field->KeyW,
							  XmNwidth))
			   > 0)
				Alxt_SetArg(XtParent(TempREm->object.Field->ValueW),
					    XmNleftOffset, (XtArgVal)diff);
		}
	}
					
 if (REm!=REm->object.Assoc->rei->TopLevelMember) 
	XtManageChild(REm->object.Assoc->ContainerW);
}

/* Some Rich stuff--------------------------------------------------*/
NORET d2_Fill_Work(rei,WorkW,d2_work_w,d2_if_work_h,d2_then_work_h)
reid rei;
Widget WorkW;
int d2_work_w, d2_then_work_h, d2_if_work_h;
{
  ArgPack argp, argp2;
  Widget IfWorkButtonsRCW, IfWorkW, ThenWorkButtonsRCW, ThenWorkW, label;
  Widget ThenWorkContW, IfWorkContW, frameW, frameThenW, IfWCW,TWCW;
	Widget	if_scroll,
		b_scroll;

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

  argp=ArgPack_duplicate_args(d2_area_labels);
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE );
  ArgPack_add_arg(argp, XmNwidth, (XtArgVal) d2_work_w );
  ArgPack_add_arg(argp,XmNfontList, (XtArgVal) rei->Fonts);
  ArgPack_add_arg(argp,XmNlabelString, (XtArgVal) Alxms_create(rei->Strings,
							     "IF",
					     ALFONTS_MINOR_HEADING));
  label=XtCreateManagedWidget("if-label",
			      xmLabelWidgetClass,
			      IfWCW,
			      ArgPack_the_args(argp),
			      ArgPack_num_args(argp));
  ArgPack_delete(argp);
  
  argp=ArgPack_duplicate_args(d2_work_form_container);
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNtopWidget, (XtArgVal) label );
  IfWorkContW=XmCreateForm(IfWCW, "if-work-container",
			   ArgPack_the_args(argp),
			   ArgPack_num_args(argp));
  ArgPack_delete(argp);

	argp = ArgPack_duplicate_args(scroll_res);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNrightAttachment, (XtArgVal)XmATTACH_NONE);
	b_scroll = XmCreateScrolledWindow(IfWorkContW, "If Scrolled Section",
					   ArgPack_the_args(argp),
					   ArgPack_num_args(argp));
	ArgPack_delete(argp);
	
  argp=ArgPack_duplicate_args(d2_menubar_mine);
/*
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE);
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
*/
  IfWorkButtonsRCW=XmCreateMenuBar(b_scroll, "if-work-buttons",
				   ArgPack_the_args(argp),
				   ArgPack_num_args(argp));
  ArgPack_delete(argp);

  d2_Fill_If_work_buttons(rei,IfWorkButtonsRCW);
  XtManageChild(IfWorkButtonsRCW);
	XmScrolledWindowSetAreas(b_scroll, (Widget)NULL, (Widget)NULL, 
				 IfWorkButtonsRCW);
	XtManageChild(b_scroll);

  rei->if_field_spacing=(int)Alxt_get_widget_feature(IfWorkButtonsRCW,
						     XmNspacing);
/*
  argp2=ArgPack_duplicate_args(d2_work_form_frame);
  frameW=XmCreateFrame(IfWorkContW,"frame",
		       ArgPack_the_args(argp2),
		       ArgPack_num_args(argp2));
  XtManageChild(frameW);
  ArgPack_delete(argp2);
*/
	argp = ArgPack_duplicate_args(scroll_res);
	ArgPack_add_arg(argp, XmNrightAttachment, (XtArgVal)XmATTACH_FORM);
	ArgPack_add_arg(argp, XmNleftAttachment, (XtArgVal)XmATTACH_WIDGET);
	ArgPack_add_arg(argp, XmNleftWidget, (XtArgVal)b_scroll);
	if_scroll = XmCreateScrolledWindow(IfWorkContW, "If Scrolled Section",
					   ArgPack_the_args(argp),
					   ArgPack_num_args(argp));
	ArgPack_delete(argp);


	argp = ArgPack_create();
	ArgPack_add_arg(argp, XmNborderWidth, (XtArgVal)0);
	ArgPack_add_arg(argp, XmNrubberPositioning, (XtArgVal)TRUE);
	ArgPack_add_arg(argp, XmNhorizontalSpacing, (XtArgVal)500);
	ArgPack_add_arg(argp, XmNverticalSpacing, (XtArgVal)500);
	ArgPack_add_arg(argp, XmNresizePolicy, (XtArgVal)XmRESIZE_ANY);
	IfWorkW=XmCreateForm(if_scroll, "if-work",
			     ArgPack_the_args(argp),
			     ArgPack_num_args(argp));
	ArgPack_delete(argp);

  d2_Fill_If_work(rei,IfWorkW); 
	XtManageChild(IfWorkW);
	XmScrolledWindowSetAreas(if_scroll, (Widget)NULL, (Widget)NULL, 
				 IfWorkW);
	XtManageChild(if_scroll);
	XtManageChild(IfWorkContW);
	XtManageChild(IfWCW);
  /*
    *  THEN
    */
    
  argp=ArgPack_duplicate_args(d2_work_form_container);
  ArgPack_add_arg(argp, XmNallowResize, (XtArgVal) TRUE );
  TWCW=XtCreateManagedWidget("then-work-outer-container",
			     xmFormWidgetClass,
			     WorkW,
			     ArgPack_the_args(argp),
			     ArgPack_num_args(argp));
  ArgPack_delete(argp);
    

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


  argp=ArgPack_duplicate_args(d2_work_form_container);
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM ); 
  ArgPack_add_arg(argp, XmNtopWidget, (XtArgVal) label); 
  ThenWorkContW=XtCreateManagedWidget("then-work-container",
				    xmFormWidgetClass,
				    TWCW,
				    ArgPack_the_args(argp),
				    ArgPack_num_args(argp));
  ArgPack_delete(argp);

  argp=ArgPack_duplicate_args(d2_rc);
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_NONE/*7*/ );
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
  ThenWorkButtonsRCW=XmCreateRowColumn(ThenWorkContW,
				     "then-work-buttons",
				     ArgPack_the_args(argp),
				     ArgPack_num_args(argp));
  XtManageChild(ThenWorkButtonsRCW);
  ArgPack_delete(argp);

/*  d2_Fill_If_work_buttons(rei,ThenWorkButtonsRCW); */
/*  XmAddTabGroup(ThenWorkButtonsRCW); */

  argp=ArgPack_duplicate_args(d2_work_form);
  ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_WIDGET );
  ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_FORM );
  ArgPack_add_arg(argp,XmNleftWidget, (XtArgVal) ThenWorkButtonsRCW);
  ArgPack_add_arg(argp, XmNwidth, (XtArgVal)  d2_work_w );
  ArgPack_add_arg(argp, XmNheight, (XtArgVal) d2_then_work_h );
  ThenWorkW=XtCreateManagedWidget("then-work",
				  xmFormWidgetClass,
				  ThenWorkContW,
				  ArgPack_the_args(argp),
				  ArgPack_num_args(argp));
  ArgPack_delete(argp);
  
  d2_Fill_Then_work(rei,ThenWorkW); 
}

NORET
d2_create(rei)
reid	rei;
{
	Widget	buttons,
		TopRCW,			/*** for Rich code */
		WorkW;			/*** "" */
	ArgPack	argp;
	int	d2_work_width, 
		d2_work_height;

	AlFonts_init();
	rei->ShellW = XtAppCreateShell("ruleeditor", "Argus",
				       vendorShellWidgetClass, rei->display,
				       d2_shell, XtNumber(d2_shell));
	rei->AppContext = XtWidgetToApplicationContext(rei->ShellW);

	rei->Then_Contents = Darray_create();

	rei->OuterW = XmCreateForm(rei->ShellW, "main-form", main_form_res,
				   XtNumber(main_form_res));

/*** !!  XtManageChild(rei->OuterW); */

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

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

/*
  *
  *  CREATE THE TO LABEL (from Rich code)
  *
*/

	argp=ArgPack_duplicate_args(d2_top_rc);
	ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_NONE/*7*/ );
/***thm	ArgPack_add_arg(argp, XmNwidth, (XtArgVal)  rei->app_width ); */
	ArgPack_add_arg(argp, XmNheight, (XtArgVal) d2_INFO_LINE_H );
	TopRCW=XmCreateRowColumn(rei->OuterW,"top-rc",
				 ArgPack_the_args(argp),
				 ArgPack_num_args(argp));
	XtManageChild(TopRCW);
	ArgPack_delete(argp);

	d2_Fill_TopTB(rei,TopRCW);

	buttons = d2_create_buttons(rei->OuterW, rei);

	/*
	* CREATE THE BODY AND BOTTOM LABEL WORK AREAS
	*/
	argp=ArgPack_duplicate_args(d2_work_paned);
	ArgPack_add_arg(argp, XmNtopAttachment,    (XtArgVal) XmATTACH_WIDGET );
	ArgPack_add_arg(argp, XmNleftAttachment,   (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNrightAttachment,  (XtArgVal) XmATTACH_FORM );
	ArgPack_add_arg(argp, XmNbottomAttachment, (XtArgVal) XmATTACH_WIDGET);
	ArgPack_add_arg(argp, XmNtopWidget, (XtArgVal) TopRCW);
	ArgPack_add_arg(argp, XmNbottomWidget, (XtArgVal)buttons);
	WorkW=XmCreatePanedWindow(rei->OuterW,"work-paned",
				  ArgPack_the_args(argp),
				  ArgPack_num_args(argp));
	ArgPack_delete(argp);
	
	d2_work_width=(int)Alxt_get_widget_feature(WorkW,XmNwidth);
	d2_work_height=(int)Alxt_get_widget_feature(WorkW,XmNheight);

	d2_Fill_Work(rei,WorkW,d2_work_width,
		     (int)d2_work_height/2,
		     (int)d2_work_height/2);  
	XtManageChild(WorkW);

	XtManageChild(rei->OuterW);
	XtRealizeWidget(rei->ShellW);
	AlUI_AttachCursor(rei->ShellW, RE_GLOBAL_CURSOR);
}

NORET
d2_create_field_line(form, next, AP, REf)
Widget	form,
	next;
ArgPack	AP;
REField	REf;
{
	ArgPack	argp;
	Widget	field_sec,
		value_sec;

	argp = ArgPack_append_args(AP, field_line_res);

/*	if(attach_top != (Widget)NULL)
	{	ArgPack_add_arg(argp, XmNtopAttachment,
				(XtArgVal)ATTACH_WIDGET);
		ArgPack_add_arg(argp, XmNtopWidget, (XtArgVal)attach_top);
	} 
	else
		ArgPack_add_arg(argp, XmNtopAttachment, 
				(XtArgVal)ATTACH_FORM);
*/	
	
	REf->ContainerW = XmCreateForm(form, "field-container",
				  ArgPack_the_args(argp),
				  ArgPack_num_args(argp));

	
	ArgPack_delete(argp);
 	value_sec = d2_create_value_section(field_sec = d2_create_field_section(REf), 
					    REf);
	Alxt_SetArg(REf->ContainerW, XmNheight, 
		    (XtArgVal)Alxt_get_widget_feature(field_sec, XmNheight));

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

	if (REf->rei->if_field_width==(-1))
		REf->rei->if_field_width=(int)Alxt_get_widget_feature(REf->ContainerW,
								      XmNwidth);
/*** this does not work */
	d2_MAX_ATT = ((long)Alxt_get_widget_feature(field_sec, XmNwidth)
		      > d2_MAX_ATT
		      ? (long)Alxt_get_widget_feature(field_sec, XmNwidth)
		      : d2_MAX_ATT);

	XmAddTabGroup(REf->ContainerW); 
	XtManageChild(REf->ContainerW);
}

