#include "mteP.h"
#include <memory.h>
#include <MsgType.h>
#include <al.h>
#include "mteEd.h"
#include <menupack.h>
#include <FieldCore.h>
#include "mteArgs.h"
#include <string.h>
#include <ArgPack.h>
#include <xstuff.h>
#include <childpack.h>
#include <assert.h>
#include <profile.h>
#include <FTreg.h>
#include "rap.h"

/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
/*                             MAJOR KLUDGE                                */
/* these defenitions are here because of a bad design decision in the */
 /* interface to the xtools library.  They will go away in the future when */
 /* that library is eliminated. */

Widget TestWidget_GR;
Pixel  ForePix_GR, BackPix_GR;
Screen *   Screen_GR;

/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
/*--------------------------------------------------*/
int Mte_get_modified(GR)
MteGR GR;
{
  return(Bool_to_int(GR->Modified));
}

/*--------------------------------------------------*/
MteGR Mte_create(FromWhere,
		 MsgT,
		 SaveFunc,
		 QuitFunc,
		 argc,
		 argv,
		 sfn,
		 ReadOnly,
		 ClientData)
MteFromWhere FromWhere;
AlMsgType    MsgT;
MteSaveFunc  SaveFunc;
MteQuitFunc  QuitFunc;
int          argc;
char**       argv;
char*        sfn;
Bool         ReadOnly;
VOIDP        ClientData;
{
  MteGR GR;
  char *s;
  
  GR=(MteGR)Memory_allocate(sizeof(struct MteGR_str));
  GR->FromWhere=FromWhere;
  if (AlMsgType_validp(MsgT)==Bool_FALSE)
    Al_fatal_error("MteGR_create: Bad MsgType specified.");
  GR->MT=MsgT;
  GR->SaveFunc=SaveFunc;
  GR->QuitFunc=QuitFunc;
  GR->argc=argc;
  GR->argv=argv;
  GR->OuterW=NULL;
  GR->ShellW=NULL;
  GR->ContainerW=NULL;
  GR->Instantiated=Bool_FALSE;
  GR->FTrets=Darray_create();
  GR->Fields=Darray_create();
  GR->Modified=Bool_FALSE;
  GR->fullName=AlMsgType_get_fullname(MsgT);
  GR->name=(char*)NULL;
  GR->ParentMT=AlMsgType_get_parent(MsgT);
  GR->ReadOnly=ReadOnly;
  GR->saveFileName=RapStr_duplicate(sfn);
  GR->ClientData=ClientData;
  s=AlProfile_get_CP_val(ALPROF_DEF_FIELD_TYPE);
  if (s==(char*)NULL) Al_fatal_error("mteditor: could not get default field type.");
  GR->DefaultFT=AlFTreg_string_to_obj(s);
  return(GR);
}
/*--------------------------------------------------*/
NORET Mte_destroy(GR)
MteGR GR;
{
  unsigned i,l;
  if (GR->Instantiated==Bool_TRUE)
    XtDestroyWidget(GR->ShellW);
  l=Darray_len(GR->FTrets);
  for (i=0;i<l;i++)
    MteFTret_destroy((MteFTret)Darray_reml(GR->FTrets));
  Darray_destroy(GR->FTrets);
  Darray_destroy(GR->Fields);  /* look into memory use here !!! */
    /* look into the names in there and see if you have to deallocate them */
    /* */
  Memory_free(GR);
}

/*--------------------------------------------------*/
AlMsgType Mte_get_message_type(GR)
MteGR GR;
{
  return(GR->MT);
}
/*--------------------------------------------------*/
VOIDP Mte_get_client_data(GR)
MteGR GR;
{
  return(GR->ClientData);
}
/*--------------------------------------------------*/
NORET Mte_realize(GR)
MteGR GR;
{
  unsigned i,l;
  Darray MTFields=Darray_create();
  AlFieldCore FC;

  /* add all the fields and create instances for them */
  AlMsgType_all_fields(GR->MT,MTFields);
  l=Darray_len(MTFields);
  for (i=0;i<l;i++) {
    FC=(AlFieldCore)Darray_get(MTFields,i);
    Darray_addh(GR->Fields,MteField_create(GR,
					   AlFieldCore_get_key(FC),
					   AlFieldCore_get_field_type(FC),
					   MTE_FIELD_FROM_MT));
  }

  Mte_instantiate(GR);
}

/*--------------------------------------------------*/
MteField MteField_create(GR,key,FT,FromWhere)
MteGR GR;
char *key;
AlFieldType FT;
MteFFromWhere FromWhere;
{
  MteField F;
  char *ftn;
  
  F=(MteField)Memory_allocate(sizeof(struct MteField_str));
  F->KeyLength=strlen(key)+MTE_KEY_LENGTH;
  F->key=strcpy(Memory_allocate(F->KeyLength),(key==NULL) ? "" : key );
  assert(FT);
  F->FieldType=FT;
  ftn=(char *)AlFTreg_obj_to_string(FT);
  F->fieldTypeName=strcpy(Memory_allocate(strlen(ftn)+1),ftn);
  F->FromWhere=FromWhere;
  F->FTMenu=MteField_make_FTmenu(GR,F);
  F->FTMenuW=NULL; 
  F->FTW=NULL;
  F->KeyW=NULL;
  F->ContainerW=NULL;
  return(F);
}

/*--------------------------------------------------*/
MteFTret MteFTret_create(GR,ft,f)
MteGR GR;
char *ft;
MteField f;
{
  MteFTret ftret;
  ftret=(MteFTret)Memory_allocate(sizeof(struct MteFTret_str));
  assert(ft);
  ftret->fieldType=strcpy(Memory_allocate(strlen(ft)+1),ft);
  assert(f);
  ftret->Field=f;
  ftret->GR=GR;
  Darray_addh(GR->FTrets,ftret);
  return(ftret);
}

/*--------------------------------------------------*/
NORET MteFTret_destroy(ft)
MteFTret ft;
{
  Memory_free(ft->fieldType);
  Memory_free(ft);
}

/*--------------------------------------------------*/
MenuPack MteField_make_FTmenu(GR,f)
MteGR GR;
MteField f;
{
  Darray FTypes=Darray_create();
  unsigned i,l;
  MenuPack mp;
  MteFTret ftret;
  char *ftname;

  mp=MenuPack_create(NULL,"Field Types");
  AlFTreg_get_all_field_types(FTypes);
  l=Darray_len(FTypes);
  for (i=0;i<l;i++) {
    ftname=(char *)Darray_get(FTypes,i);
    ftret=MteFTret_create(GR,ftname,f);
    MenuPack_add_option(ftname,mp,
			(XtCallbackProc)MteEd_SelectFT_CB,
			(caddr_t)ftret);
  }
  return(mp);
}

#define KLUDGE_FONT_PATH "/usr/lib/X11/fonts/old/"

/*--------------------------------------------------*/
NORET Mte_instantiate(GR)
MteGR GR;
{
  ArgPack AP;
  Widget TopTBW, BotTBW,shell;

  if (GR->FromWhere==MTE_FROM_COMMAND_LINE)
    shell=XtInitialize((char *)"mteditor",
		       (char *)"LEns", 
		       (XrmOptionDescRec*)NULL,
		       (Cardinal)0, 
		       &(GR->argc),
		       GR->argv);

  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  /*           This is a mojor kludge designed to simply get     */
  /*  This release out the door (June 9 1989).  Please excuse    */
  /*  repulsiveness of this approach.  It will go away very soon */
  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  {
    char **fps, **nf;
    int i,count;
    Bool Add=Bool_TRUE;
    Display *Dis;
     
    Dis=XtDisplay(shell);
    fps=(char**)XGetFontPath(Dis,&count);
    for (i=0;i<count;i++)
      if (strcmp(KLUDGE_FONT_PATH,fps[i])==0)
	Add=Bool_FALSE;
      
    if (Add==Bool_TRUE) {
      nf=(char**)Memory_allocate(sizeof(char*)*(count+1));
      for (i=0;i<count;i++) nf[i]=fps[i];
      XFreeFontPath(fps);
      nf[count]=KLUDGE_FONT_PATH;
      XSetFontPath(Dis,nf,count+1);
    }
  }

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_ShellArgs);
  GR->ShellW=XtCreateApplicationShell("mte_app_shell",
				      topLevelShellWidgetClass,
				      ArgPack_the_args(AP),
				      ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AlUI_Initialize(GR->ShellW);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_OuterArgs);
  GR->OuterW=XtCreateManagedWidget("mte_outer",
				   formWidgetClass,
				   GR->ShellW,
				   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_TopTBArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  TopTBW=XtCreateManagedWidget("mte_top_tb",
			       formWidgetClass,
			       GR->OuterW,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  Mte_fill_ttb(GR,TopTBW);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_ContainerArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) TopTBW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  GR->ContainerW=XtCreateManagedWidget("mte_container",
				       formWidgetClass,
				       GR->OuterW,
				       ArgPack_the_args(AP),
				       ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  Mte_fill_container(GR);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_BotTBArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) GR->ContainerW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  BotTBW=XtCreateManagedWidget("mte_bottom_tb",
			       XwtitlebarWidgetClass,
			       GR->OuterW,
			       ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  Mte_fill_bottom_tb(GR,BotTBW);

  XtRealizeWidget(GR->ShellW);
  AlUI_AttachCursor(GR->ShellW,MTE_GLOBAL_CURSOR);
  GR->Instantiated=Bool_TRUE;
  XtMainLoop();
}

/*--------------------------------------------------*/
NORET Mte_fill_container(GR) 
MteGR GR;
{
  MteField Field, TField;
  unsigned i,l;
  Widget AttachW;

  l=Darray_len(GR->Fields);
  for (i=0;i<l;i++) {
    Field=(MteField)Darray_get(GR->Fields,i);
    if (i==0) 
      AttachW=NULL;
    else {
      TField=(MteField)Darray_get(GR->Fields,i-1);
      AttachW=TField->ContainerW;
    }
    Mte_add_field(GR,Field,AttachW);
  }
}

/*--------------------------------------------------*/
NORET Mte_add_field(GR,Field,AttachW)
MteGR GR;
MteField Field;
Widget AttachW;
{
  Widget FTMenuW, SW;
  ChildPack CP1, CP3;
  ArgPack AP;

  Alxt_SetArg(GR->ContainerW,XtNresizable,(XtArgVal)FALSE);
  
  CP1=ChildPack_create();
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_field_containerArgs);
  ArgPack_add_arg(AP,XtNfromVert,(XtArgVal) AttachW);
  ArgPack_add_arg(AP,XtNfromHoriz,(XtArgVal) NULL);
  Field->ContainerW=XtCreateWidget("field_container",
				   formWidgetClass,
				   GR->ContainerW,
				   ArgPack_the_args(AP),
				   ArgPack_num_args(AP));
  ChildPack_add(CP1,Field->ContainerW);
  ArgPack_delete(AP);
  
  if (Field->FromWhere==MTE_FIELD_FROM_USER) {
    AP=ArgPack_create();
    AP=ArgPack_duplicate_args(mte_KeyEditArgs);
    ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNinsertPosition,(XtArgVal) 0 );
    ArgPack_add_arg(AP, XtNstring, (XtArgVal) Field->key);
    ArgPack_add_arg(AP, XtNlength, (XtArgVal) Field->KeyLength);
    Field->KeyW=XtCreateManagedWidget("mte_edit_key",
				      asciiStringWidgetClass,
				      Field->ContainerW,
				      ArgPack_the_args(AP),
				      ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  else {
    AP=ArgPack_create();
    AP=ArgPack_duplicate_args(mte_KeyArgs);
    ArgPack_add_arg(AP,XtNlabel,(XtArgVal) Field->key);
    ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
    ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
    Field->KeyW=XtCreateManagedWidget("mte_key",
				      labelWidgetClass,
				      Field->ContainerW,
				      ArgPack_the_args(AP),
				      ArgPack_num_args(AP));
    ArgPack_delete(AP);
  }
  
  /* create the field types menu */
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_MenuBoxArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) Field->KeyW);
  Field->FTMenuW=XtCreateManagedWidget("mte_menu_box",
				       boxWidgetClass,
				       Field->ContainerW,
				       ArgPack_the_args(AP),
				       ArgPack_num_args(AP));
  ArgPack_delete(AP);

  CP3=ChildPack_create();
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_MenuRasterArgs);
  ArgPack_add_arg(AP,XtNbackgroundPixmap, 
		  (XtArgVal) Alxt_get_menu_pixmap(GR->OuterW));
  FTMenuW=XtCreateWidget("mte_menu_raster",
			 labelWidgetClass,
			 Field->FTMenuW,
			 ArgPack_the_args(AP),
			 ArgPack_num_args(AP));
  ChildPack_add(CP3,FTMenuW); 
  ArgPack_delete(AP);
  MenuPack_attach_to_widget(Field->FTMenu,FTMenuW);
  MenuPack_make_menu(Field->FTMenu);
  SW=MenuPack_get_widget(Field->FTMenu,Field->fieldTypeName);
  if (SW!=NULL) 
    Alxt_SetArg(SW,XtNsetMark,(XtArgVal)TRUE);
  else
    printf("warning: mte: couldn't find field type %s\n",Field->fieldTypeName);
  XtManageChildren(ChildPack_get_wlist(CP3),ChildPack_get_count(CP3));
  ChildPack_destroy(CP3);

  if (GR->ReadOnly==Bool_TRUE || Field->FromWhere==MTE_FIELD_FROM_MT)
    MenuPack_add_arg_to_all(Field->FTMenu,XtNsensitive,FALSE);
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_FTArgs);
  ArgPack_add_arg(AP,XtNlabel,(XtArgVal) Field->fieldTypeName);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) Field->FTMenuW);
  Field->FTW=XtCreateManagedWidget("mte_ft",
				   labelWidgetClass,
				   Field->ContainerW,
				   ArgPack_the_args(AP),
				   ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  Alxt_SetArg(GR->ContainerW,XtNresizable,(XtArgVal)TRUE);
  
  XtManageChildren(ChildPack_get_wlist(CP1),ChildPack_get_count(CP1));
  ChildPack_destroy(CP1);
}

/*--------------------------------------------------*/
NORET mte_quit_func(w,GRv,cadda)
Widget w;
caddr_t GRv, cadda;
{
  MteGR GR=(MteGR)GRv;
  (GR->QuitFunc)(GR,GR->MT);
}

/*--------------------------------------------------*/
NORET mte_save_func(w,GRv,cadda)
Widget w;
caddr_t GRv, cadda;
{
  MteGR GR=(MteGR)GRv;
  Darray FC;
  AlFieldCore fc;
  MteField mfield;
  unsigned i,l;
  AlMsgType NewMT;
  
  FC=Darray_create(); /* of field cores */

  /* create the new MT */
  l=Darray_len(GR->Fields);
  for (i=0;i<l;i++) {
    mfield=(MteField)Darray_get(GR->Fields,i);
    fc=AlFieldCore_create(mfield->fieldTypeName);
    AlFieldCore_set_key(fc,mfield->key);
    Darray_addh(FC,fc);
  }
  NewMT=AlMsgType_create(GR->fullName,
			 FC,
			 AlMsgType_get_parent_name(GR->MT),
			 (time_t)NULL);

  (GR->SaveFunc)(GR,NewMT);
}

/*--------------------------------------------------*/
NORET Mte_fill_bottom_tb(GR,w)
MteGR GR;
Widget w;
{
  ArgPack AP;
  Widget tw;

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_QuitArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(w,CONTROL_BUTTONS_FONT));
  tw=XtCreateManagedWidget("mte_quit_button",
			commandWidgetClass,
			w,
			ArgPack_the_args(AP),ArgPack_num_args(AP));
  XtAddCallback(tw,XtNcallback,mte_quit_func,(caddr_t)GR);
  ArgPack_delete(AP);
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_SaveArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(w,CONTROL_BUTTONS_FONT));
  ArgPack_add_arg(AP,XtNsensitive, (XtArgVal) (GR->ReadOnly==Bool_TRUE) ?
		  FALSE : TRUE);
  tw=XtCreateManagedWidget("mte_save_button",
			commandWidgetClass,
			w,
			ArgPack_the_args(AP),ArgPack_num_args(AP));
  XtAddCallback(tw,XtNcallback,mte_save_func,(caddr_t)GR);
  ArgPack_delete(AP);
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_AddFieldArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(w,CONTROL_BUTTONS_FONT));
  ArgPack_add_arg(AP,XtNsensitive, (XtArgVal) (GR->ReadOnly==Bool_TRUE) ?
		  FALSE : TRUE);
  tw=XtCreateManagedWidget("mte_add_field_button",
			   commandWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  XtAddCallback(tw,XtNcallback,MteEd_add_field_CB,(caddr_t)GR);
  ArgPack_delete(AP);
}

#define A_WIDTH 160
/*--------------------------------------------------*/
NORET Mte_fill_ttb(GR,w)
MteGR GR;
Widget w;
{
  ArgPack AP;
  Widget AppLabelW, a1,a2,b1,b2,bl1,a3,b3;
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNfont, (XtArgVal) AlUI_GetFont(w,BIG_LABEL_FONT));
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) "Message Type Editor");
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyCenter);
  ArgPack_add_arg(AP,XtNwidth, (XtArgVal) MTE_FIELD_WIDTH);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  AppLabelW=XtCreateManagedWidget("mte_application_label1",
			labelWidgetClass,
			w,
			ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_BlackLineArgs);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) AppLabelW);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  ArgPack_add_arg(AP,XtNforeground,
		  (XtArgVal)Alxt_get_widget_feature(AppLabelW,XtNbackground));
  ArgPack_add_arg(AP,XtNbackground,
		  (XtArgVal)Alxt_get_widget_feature(AppLabelW,XtNforeground));
  bl1=XtCreateManagedWidget("mte_bl1",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyRight);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) ((GR->ReadOnly==Bool_TRUE) ?
		  "Message Type:" : "Creating Message Type:"));
  ArgPack_add_arg(AP,XtNwidth, (XtArgVal) A_WIDTH);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) bl1);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  a1=XtCreateManagedWidget("mte_mt_labela1",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
  
  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyLeft);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) GR->fullName);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) bl1);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) a1);
  b1=XtCreateManagedWidget("mte_mt_labelb1",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyRight);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) "Mode:");
  ArgPack_add_arg(AP,XtNwidth, (XtArgVal)  A_WIDTH);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) a1);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  a2=XtCreateManagedWidget("mte_mt_labela2",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyLeft);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) ((GR->ReadOnly==Bool_TRUE) ? 
		  "Read Only" : "Read and Write"));
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) b1);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) a2);
  b2=XtCreateManagedWidget("mte_mt_labelb2",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyRight);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) ((GR->ReadOnly==Bool_TRUE) ?
		  "From File:" : "To File:"));
  ArgPack_add_arg(AP,XtNwidth, (XtArgVal)  A_WIDTH);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) a2);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) NULL);
  a3=XtCreateManagedWidget("mte_mt_labela2",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);

  AP=ArgPack_create();
  AP=ArgPack_duplicate_args(mte_DumbLabelArgs);
  ArgPack_add_arg(AP,XtNjustify, (XtArgVal) XtJustifyLeft);
  ArgPack_add_arg(AP,XtNlabel, (XtArgVal) GR->saveFileName);
  ArgPack_add_arg(AP,XtNfromVert, (XtArgVal) b2);
  ArgPack_add_arg(AP,XtNfromHoriz, (XtArgVal) a3);
  b3=XtCreateManagedWidget("mte_mt_labelb2",
			   labelWidgetClass,
			   w,
			   ArgPack_the_args(AP),ArgPack_num_args(AP));
  ArgPack_delete(AP);
}

