/* 
 * Motif
 *
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
 *
 * These libraries and programs are free software; you can
 * redistribute them and/or modify them under the terms of the GNU
 * Lesser General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * These libraries and programs are distributed in the hope that
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with these librararies and programs; if not, write
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA 02110-1301 USA
 */
/* 
 * HISTORY
 */

#ifdef REV_INFO
#ifndef lint
static char *rcsid = "$XConsortium: interface.c /main/7 1996/06/11 17:27:01 pascale $";
#endif
#endif

#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#ifdef USE_CMS
#include <X11/Xcms.h>
#endif /* USE_CMS */
#include <Xm/Xm.h>
#include <Xm/Protocols.h>
#include <Xmd/Menus.h>
#include <Xmd/Help.h>

#include <stdarg.h>

#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include "transfer.h"


#include <Xm/CascadeB.h>
#include <Xm/CascadeBG.h>
#include <Xm/DrawingA.h>
#include <Xm/Form.h>
#include <Xm/Frame.h>
#include <Xm/LabelG.h>
#include <Xm/List.h>
#include <Xm/MainW.h>
#include <Xm/MessageB.h>
#include <Xm/MwmUtil.h>
#include <Xm/PushBG.h>
#include <Xm/RowColumn.h>
#include <Xm/ScrolledW.h>
#include <Xm/SeparatoG.h>
#include <Xm/CSText.h>
#include <Xm/ToggleB.h>
#include <Xm/ToggleBG.h>

/* These translations make togglebutton ignore the user,  they're
   used to prevent the user from setting or clearing the ownership
   display */
#define TB_NO_USER_INPUT \
"<EnterWindow>:		NOP()\n\
<LeaveWindow>:		NOP()\n\
c<Btn1Down>:		NOP()\n\
~c<Btn1Down>:		NOP()\n\
~c<Btn1Up>:		NOP()"

Widget CreateHelpDialog();
void manageCB();

/* Local variables used when selecting screen & display */
static Display * sDisplay = NULL;
static Screen  * sScreen  = NULL;


Widget mainwindow, menubar, form, optionmenu,
       selectionmenu, primary, secondary, clipboard, named,
       state, op, omd, onamed, frame,
       target, frame1, workarea, field2, l2, text2,
       format_om, formatmenu, format_s, format_l,
       format_t, format_cs, format_id, format_ih, field1,
       l1, text1, buttons, typeOM, typepulldown, b_atom,
       b_drawable, b_window, b_colormap, b_integer, b_pixel,
       b_compound_text, b_string, b_span, b_locale_text,
       b__motif_compound_string, unknown_button, list,
       b_locale, framelabel, defer, text_display;

/****************************************************************
 * get_constraint_widget:
 ****************************************************************/
static Widget get_constraint_widget(Widget child, Widget parent)
{
  Widget w;
  
  w = child;
  while (XtParent(w) != parent)
    w = XtParent(w);
  return (w);
}



/****************************************************************
 *
 *  Main C code for presentation component
 *
 ****************************************************************/

/**************************************************************
 * create_mainWindow_widget:
 **************************************************************/
Widget create_mainWindow_widget(char    * name,
				Widget    parent)
{
  Arg args[27];
  Arg pargs[27];
  Widget tmpw;
  Widget helpDialog, helpMenu, help, help_overview, pulldown;
  Widget frame1;
  XmString xms;
  XmString xms1;
  XtPointer closure;
  int inc;
  int n;
  int pn;
#ifdef USE_CMS
  XcmsColor target_color, exact_color;
#else
  XColor target_color, exact_color;
#endif /* USE_CMS */
  Pixel target_color_pixel;
  XtTranslations toggle_button_trans = 
    XtParseTranslationTable(TB_NO_USER_INPUT);
  XmRendition rend[1];
  XmRenderTable listRT;
  XmTabList listTabs = NULL;
  XmTab tabs[1];
  WidgetList menu;
  Cardinal count;

  /* RenderTable */
  tabs[0] = XmTabCreate(3.0, XmINCHES, XmABSOLUTE, 
			XmALIGNMENT_BEGINNING, NULL);
  listTabs = XmTabListInsertTabs(NULL, tabs, 1, 0);
  XmTabFree(tabs[0]);

  n = 0;
  XtSetArg(args[n], XmNfontName, "*helvetica-bold-r-*-12-*"); n++;
  XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
  XtSetArg(args[n], XmNtabList, listTabs); n++;
  rend[0] = XmRenditionCreate(parent, XmFONTLIST_DEFAULT_TAG, args, n);
  listRT = XmRenderTableAddRenditions(NULL, rend, 1, XmMERGE_REPLACE);;
  XmTabListFree(listTabs);
  XmRenditionFree(rend[0]);

  /* Get red color,  or white if monochrome or failure */
  if (DefaultDepthOfScreen(XtScreen(parent)) > 1 &&
      /* XcmsLookupColor(XtDisplay(parent),
	 DefaultColormapOfScreen(XtScreen(parent)),
	 "CIEuvY:0.0/0.0/1.0", 
	 &exact_color, &target_color,
	 XcmsUndefinedFormat) == XcmsSuccess &&
	 XcmsAllocColor(XtDisplay(parent), 
	 DefaultColormapOfScreen(XtScreen(parent)),
	 &target_color,
	 XcmsUndefinedFormat) == XcmsSuccess) */
      
      XLookupColor(XtDisplay(parent),
		   DefaultColormapOfScreen(XtScreen(parent)),
		   "red", &exact_color, &target_color) != 0 &&
      XAllocColor(XtDisplay(parent), 
		  DefaultColormapOfScreen(XtScreen(parent)),
		  &target_color) != 0)
    target_color_pixel = target_color.pixel;
  else
    target_color_pixel = WhitePixelOfScreen(XtScreen(parent));
  
  mainwindow = XmCreateMainWindow(parent, name, NULL, 0);
  
  menubar = XmCreateMenuBar(mainwindow, "menuBar", NULL, 0);
  
  pulldown = XmdCreateMenu(SELECTED_MENU, menubar, &menu, &count);
  XtVaSetValues(pulldown, XmNtearOffModel, XmTEAR_OFF_ENABLED,
		NULL, NULL);
  XtUnmanageChild(menu[SELECTED_OPEN]);
  XtManageChild(menu[SELECTED_PROPERTIES]);
  XtManageChild(menu[SELECTED_NEW]);
  XtUnmanageChild(menu[SELECTED_SEP1]);
  XtManageChild(menu[SELECTED_DELETE]);
  XtAddCallback(menu[SELECTED_DELETE], XmNactivateCallback, 
		(XtCallbackProc) RemoveValue, NULL);
  XtAddCallback(menu[SELECTED_NEW], XmNactivateCallback, 
		(XtCallbackProc) manageCB, (XtPointer) editBox);
  XtAddCallback(menu[SELECTED_PROPERTIES], XmNactivateCallback, 
		(XtCallbackProc) manageCB, (XtPointer) editBox);
  XtAddCallback(menu[SELECTED_NEW], XmNactivateCallback, 
		(XtCallbackProc) EditItem, (XtPointer) 0);
  XtAddCallback(menu[SELECTED_PROPERTIES], XmNactivateCallback, 
		(XtCallbackProc) EditItem, (XtPointer) 1);

  XtAddCallback(menu[SELECTED_EXIT], XmNactivateCallback, 
		(XtCallbackProc) quitCB, NULL);

  pulldown = XmdCreateMenu(EDIT_MENU, menubar, &menu, &count);
  XtVaSetValues(pulldown, XmNtearOffModel, XmTEAR_OFF_ENABLED,
		NULL, NULL);
  XtAddCallback(menu[EDIT_CUT],	XmNactivateCallback, 
		(XtCallbackProc) cut, NULL);
  XtAddCallback(menu[EDIT_COPY], XmNactivateCallback,
		(XtCallbackProc) copy, NULL);
  XtAddCallback(menu[EDIT_PASTE], XmNactivateCallback, 
		(XtCallbackProc) paste, NULL);
  xms = XmStringCreateLocalized("Paste and Delete");
  XtVaSetValues(menu[EDIT_PASTE_SPECIAL],
		XmNlabelString, xms, NULL, NULL);
  XmStringFree(xms);
  XtAddCallback(menu[EDIT_PASTE_SPECIAL], XmNactivateCallback,
		(XtCallbackProc) pasteMove, NULL);
  XtManageChild(menu[EDIT_PASTE_SPECIAL]);
  XtUnmanageChild(menu[EDIT_DELETE]);
  
  /*********** Create the help menu and help text *********/
  helpMenu = XmCreatePulldownMenu(menubar, "helpMenu", NULL, 0);

  n = 0;
  XtSetArg(args[n], XmNsubMenuId, helpMenu); n++;
  XtSetArg(args[n], XmNmnemonic, 'H'); n++;
  help = XmCreateCascadeButtonGadget(menubar, "Help", args, n);
  XtManageChild(help);

  n = 0;
  XtSetArg(args[n], XmNmenuHelpWidget, help); n++;
  XtSetValues(menubar, args, n);

  helpDialog = CreateHelpDialog(mainwindow, "helpDialog");

  n = 0;
  XtSetArg(args[n], XmNmnemonic, 'O'); n++;
  help_overview = XmCreatePushButtonGadget(helpMenu, "Overview", args, n);
  XtManageChild(help_overview);
  XtAddCallback(help_overview, XmNactivateCallback,
		(XtCallbackProc) manageCB, (XtPointer) helpDialog);

  /***************** form : XmForm *****************/
  n = 0;
  XtSetArg(args[n], XmNrubberPositioning, False); n++;
  XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
  form = XmCreateForm(mainwindow, "form", args, n);

  /***************** SelectionMenu : XmPulldownMenu *****************/
  selectionmenu = XmCreatePulldownMenu(form, "SelectionMenu", NULL, 0);

  /***************** Primary : XmPushButtonGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNmnemonic, 'P'); n++;
  primary = XmCreatePushButtonGadget(selectionmenu, "Primary", args, n);

  /***************** Secondary : XmPushButtonGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNmnemonic, 'S'); n++;
  secondary = XmCreatePushButtonGadget(selectionmenu, "Secondary", args, n);

  /***************** Clipboard : XmPushButtonGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNmnemonic, 'C'); n++;
  clipboard = XmCreatePushButtonGadget(selectionmenu, "Clipboard", args, n);

  /***************** Named : XmPushButtonGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNmnemonic, 'A'); n++;
  named = XmCreatePushButtonGadget(selectionmenu, "NamedAtom", args, n);

  /***************** optionMenu : XmOptionMenu *****************/
  n = 0;
  xms = XmStringCreateLocalized("Selection");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNmnemonic, 'S'); n++;
  XtSetArg(args[n], XmNresizable, True); n++;
  XtSetArg(args[n], XmNsubMenuId, selectionmenu); n++;
  optionmenu = XmCreateOptionMenu(form, "optionMenu", args, n);
  if (xms) XmStringFree(xms);

  /***************** state : XmRowColumn *****************/
  n = 0;
  XtSetArg(args[n], XmNorientation, XmVERTICAL); n++;
  state = XmCreateRowColumn(form, "state", args, n);

  /***************** showPrimary : XmToggleButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Owns Primary");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); n++;
  XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_CHECK); n++;
  XtSetArg(args[n], XmNindicatorSize, 15); n++;
  XtSetArg(args[n], XmNtraversalOn, False); n++;
  op = XmCreateToggleButton(state, "showPrimary", args, n);
  XtOverrideTranslations(op, toggle_button_trans);

  if (xms) XmStringFree(xms);

  /***************** showMotifDest : XmToggleButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Owns Destination");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); n++;
  XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_CHECK); n++;
  XtSetArg(args[n], XmNindicatorSize, 15); n++;
  XtSetArg(args[n], XmNtraversalOn, False); n++;
  omd = XmCreateToggleButton(state, "showMotifDest", args, n);
  XtOverrideTranslations(omd, toggle_button_trans);

  if (xms) XmStringFree(xms);

  /***************** showNamed : XmToggleButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Owns Named");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); n++;
  XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_CHECK); n++;
  XtSetArg(args[n], XmNindicatorSize, 15); n++;
  XtSetArg(args[n], XmNtraversalOn, False); n++;
  onamed = XmCreateToggleButton(state, "showNamed", args, n);
  XtOverrideTranslations(onamed, toggle_button_trans);

  if (xms) XmStringFree(xms);

  /***************** frame : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 57); n++;
  XtSetArg(args[n], XmNy, 63); n++;
  XtSetArg(args[n], XmNresizable, True); n++;
  frame = XmCreateFrame(form, "frame", args, n);

  /***************** drawingArea : XmDrawingArea *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 145); n++;
  XtSetArg(args[n], XmNy, 68); n++;
  XtSetArg(args[n], XmNwidth, 70); n++;
  XtSetArg(args[n], XmNheight, 70); n++;
  XtSetArg(args[n], XtNbackground, target_color_pixel); n++;
  target = XmCreateDrawingArea(frame, "drawingArea", args, n);

  /***************** frame1 : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNresizable, True); n++;
  frame1 = XmCreateFrame(form, "frame1", args, n);

  /***************** display : XmScrolledCSText ******************/
  n = 0;
  XtSetArg(args[n], XmNresizable, True); n++;
  XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
  XtSetArg(args[n], XmNeditable, False); n++;
  XtSetArg(args[n], XmNrows, 5); n++;
  text_display = XmCreateScrolledCSText(frame1, "display", args, n);

  /***************** targetList : XmScrolledList *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 52); n++;
  XtSetArg(args[n], XmNy, 226); n++;
  XtSetArg(args[n], XmNwidth, 250); n++;
  XtSetArg(args[n], XmNheight, 240); n++;
  XtSetArg(args[n], XmNselectionPolicy, XmBROWSE_SELECT); n++;
  XtSetArg(args[n], XmNfontList, listRT); n++;
  list = XmCreateScrolledList(form, "targetList", args, n);
  XtManageChild(menubar);

  /***************** optionMenu : XmOptionMenu *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopOffset, 10); n++;
  XtSetValues(optionmenu, args, n);


  XtAddCallback(primary, XmNactivateCallback, 
		(XtCallbackProc) setMode, (XtPointer) Mprimary);
  XtManageChild(primary);

  XtAddCallback(secondary,
		XmNactivateCallback, 
		(XtCallbackProc) setMode, (XtPointer) Msecondary);
  XtManageChild(secondary);

  XtAddCallback(clipboard,
		XmNactivateCallback, 
		(XtCallbackProc) setMode, (XtPointer) Mclipboard);
  XtManageChild(clipboard);

  XtAddCallback(named,
		XmNactivateCallback,
		(XtCallbackProc) setMode, (XtPointer) Mnamed);
  XtManageChild(named);
  XtManageChild(optionmenu);

  /***************** state : XmRowColumn *****************/
  n = 0;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  XtSetArg(args[n], XmNleftWidget, frame); n++;
  XtSetValues(state, args, n);

  XtManageChild(op);
  XtManageChild(omd);
  XtManageChild(onamed);
  XtManageChild(state);

  /***************** frame : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopOffset, 10); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNleftWidget, optionmenu); n++;
  XtSetValues(frame, args, n);
  XtManageChild(target);
  XtManageChild(frame);

  /***************** frame1 : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
  XtSetArg(args[n], XmNtopWidget, frame); n++;
  XtSetArg(args[n], XmNtopOffset, 6); n++;
  XtSetArg(args[n], XmNrightOffset, 10); n++;
  XtSetValues(frame1, args, n);

  /***************** targetList : XmScrolledList *****************/
  pn = 0;

  XtAddCallback(list, XmNbrowseSelectionCallback,
		(XtCallbackProc) ListSelectItem, NULL);
  XtAddCallback(list, XmNdefaultActionCallback,
		(XtCallbackProc) manageCB, (XtPointer) editBox);
  XtAddCallback(list, XmNdefaultActionCallback,
		(XtCallbackProc) EditItem, (XtPointer) 1);

  XtSetArg(pargs[pn], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); pn++;
  XtSetArg(pargs[pn], XmNrightAttachment, XmATTACH_OPPOSITE_WIDGET); pn++;
  XtSetArg(pargs[pn], XmNtopAttachment, XmATTACH_WIDGET); pn++;
  XtSetArg(pargs[pn], XmNtopWidget, frame1); pn++;
  XtSetArg(pargs[pn], XmNtopOffset, 5); pn++;
  XtSetArg(pargs[pn], XmNleftWidget, frame1); pn++;
  XtSetArg(pargs[pn], XmNleftOffset, 0); pn++;
  XtSetArg(pargs[pn], XmNrightWidget, frame1); pn++;
  XtSetArg(pargs[pn], XmNrightOffset, 0); pn++;
  XtSetArg(pargs[pn], XmNbottomAttachment, XmATTACH_FORM); pn++;
  XtSetArg(pargs[pn], XmNbottomOffset, 5); pn++;
  tmpw = get_constraint_widget(list, form);
  if (tmpw)
    XtSetValues(tmpw, pargs, pn);

  XtManageChild(text_display);
  XtManageChild(frame1);
  XtManageChild(list);
  XtManageChild(form);
  XtManageChild(mainwindow);

  return mainwindow;
}

/**************************************************************
 * create_editbox_widget:
 **************************************************************/
Widget create_editbox_widget(char    * name,
				Widget    parent)
{
  Arg args[27];
  Arg pargs[27];
  Widget dialog, tmpw;
  Widget button;
  Cardinal n, pn;
  XmString xms;
  XmString ls1, ls2, ls3;

  n = 0;
  ls1 = XmStringCreateLocalized("OK");
  ls2 = XmStringCreateLocalized("Cancel");
  ls3 = XmStringCreateLocalized("Help");
  XtSetArg(args[n], XmNokLabelString, ls1); n++;
  XtSetArg(args[n], XmNcancelLabelString, ls2); n++;
  XtSetArg(args[n], XmNhelpLabelString, ls3); n++;
  XtSetArg(args[n], XmNautoUnmanage, False); n++;
  dialog = XmCreateTemplateDialog(parent, name, args, n);
  XmStringFree(ls1);
  XmStringFree(ls2);
  XmStringFree(ls3);
  XtAddCallback(dialog, XmNokCallback, (XtCallbackProc) unmanageCB, dialog);
  XtAddCallback(dialog, XmNcancelCallback,
		(XtCallbackProc) unmanageCB, dialog);
  XtAddCallback(dialog, XmNhelpCallback, (XtCallbackProc) unmanageCB, dialog);

  XtAddCallback(dialog, XmNokCallback, (XtCallbackProc) SetValue, dialog);

  n = 0;
  button = XmCreatePushButtonGadget(dialog, "Apply", args, n);
  XtManageChild(button);
  XtAddCallback(button, XmNactivateCallback, 
		(XtCallbackProc) SetValue, dialog);

  /***************** frame1 : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNresizable, True); n++;
  frame1 = XmCreateFrame(dialog, "frame1", args, n);

  /***************** workArea : XmWorkArea *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 0); n++;
  XtSetArg(args[n], XmNy, 0); n++;
  XtSetArg(args[n], XmNcolumns, 3); n++;
  workarea = XmCreateWorkArea(frame1, "workArea", args, n);

  /***************** field2 : XmForm *****************/
  n = 0;
  XtSetArg(args[n], XmNrubberPositioning, True); n++;
  XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
  field2 = XmCreateForm(workarea, "field2", args, n);

  /***************** l2 : XmLabelGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 31); n++;
  XtSetArg(args[n], XmNy, 28); n++;
  XtSetArg(args[n], XmNwidth, 72); n++;
  XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
  XtSetArg(args[n], XmNresizable, False); n++;
  l2 = XmCreateLabelGadget(field2, "Target", args, n);

  /***************** tf2 : XmCSText *****************/
  n = 0;
  XtSetArg(args[n], XmNresizable, True); n++;
  text2 = XmCreateCSText(field2, "tf2", args, n);

  /***************** FormatMenu : XmPulldownMenu *****************/
  formatmenu = XmCreatePulldownMenu(workarea, "FormatMenu", NULL, 0);

  /***************** C_String : XmPushButtonGadget *****************/
  n = 0;
  format_s = XmCreatePushButtonGadget(formatmenu, "C_String", args, n);

  /***************** LocaleText : XmPushButtonGadget *****************/
  n = 0;
  format_l = XmCreatePushButtonGadget(formatmenu, "LocaleText", args, n);

  /***************** CompoundText : XmPushButtonGadget *****************/
  n = 0;
  format_t = XmCreatePushButtonGadget(formatmenu, "CompoundText", args, n);

  /***************** CompoundString : XmPushButtonGadget *****************/
  n = 0;
  format_cs = XmCreatePushButtonGadget(formatmenu, "CompoundString", args, n);

  /***************** DecInt : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Integer (Decimal)");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  format_id = XmCreatePushButtonGadget(formatmenu, "DecInt", args, n);
  if (xms) XmStringFree(xms);

  /***************** HexInt : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Integer (Hex)");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  format_ih = XmCreatePushButtonGadget(formatmenu, "HexInt", args, n);
  if (xms) XmStringFree(xms);

  /***************** FormatOM : XmOptionMenu *****************/
  n = 0;
  xms = XmStringCreateLocalized("Input Format\n\
");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNmnemonic, 'I'); n++;
  XtSetArg(args[n], XmNmarginWidth, 10); n++;
  XtSetArg(args[n], XmNsubMenuId, formatmenu); n++;
  format_om = XmCreateOptionMenu(workarea, "FormatOM", args, n);
  if (xms) XmStringFree(xms);

  /***************** field1 : XmForm *****************/
  n = 0;
  XtSetArg(args[n], XmNrubberPositioning, True); n++;
  XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); n++;
  field1 = XmCreateForm(workarea, "field1", args, n);

  /***************** l1 : XmLabelGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNx, 31); n++;
  XtSetArg(args[n], XmNy, 28); n++;
  XtSetArg(args[n], XmNwidth, 72); n++;
  xms = XmStringCreateLocalized("TargetValue");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
  XtSetArg(args[n], XmNresizable, False); n++;
  l1 = XmCreateLabelGadget(field1, "l1", args, n);
  if (xms) XmStringFree(xms);

  /***************** tf1 : XmScrolledCSText *****************/
  n = 0;
  XtSetArg(args[n], XmNrows, 3); n++;
  XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
  text1 = XmCreateScrolledCSText(field1, "tf1", args, n);

  /***************** typePulldown : XmPulldownMenu *****************/
  typepulldown = XmCreatePulldownMenu(workarea, "typePulldown", NULL, 0);

  /***************** b_ATOM : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("ATOM");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_atom = XmCreatePushButtonGadget(typepulldown, "b_ATOM", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_DRAWABLE : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("DRAWABLE");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_drawable = XmCreatePushButtonGadget(typepulldown, "b_DRAWABLE", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_WINDOW : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("WINDOW");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_window = XmCreatePushButtonGadget(typepulldown, "b_WINDOW", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_COLORMAP : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("COLORMAP");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_colormap = XmCreatePushButtonGadget(typepulldown, "b_COLORMAP", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_INTEGER : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("INTEGER");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_integer = XmCreatePushButtonGadget(typepulldown, "b_INTEGER", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_PIXEL : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("PIXEL");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_pixel = XmCreatePushButtonGadget(typepulldown, "b_PIXEL", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_COMPOUND_TEXT : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("COMPOUND_TEXT");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_compound_text = 
    XmCreatePushButtonGadget(typepulldown, "b_COMPOUND_TEXT", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_STRING : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("Locale encoding");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_locale = XmCreatePushButtonGadget(typepulldown, "b_LOCALE", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_STRING : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("STRING");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_string = XmCreatePushButtonGadget(typepulldown, "b_STRING", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_SPAN : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("SPAN");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_span = XmCreatePushButtonGadget(typepulldown, "b_SPAN", args, n);
  if (xms) XmStringFree(xms);

  /***************** b_LOCALE_TEXT : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("LOCALE_TEXT");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b_locale_text = 
    XmCreatePushButtonGadget(typepulldown, "b_LOCALE_TEXT", args, n);
  if (xms) XmStringFree(xms);

  /***************** b__MOTIF_COMPOUND_STRING : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("MOTIF COMPOUND STRING");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  b__motif_compound_string = 
    XmCreatePushButtonGadget(typepulldown, 
			     "b__MOTIF_COMPOUND_STRING", args, n);
  if (xms) XmStringFree(xms);

  /***************** unknown_button : XmPushButtonGadget *****************/
  n = 0;
  xms = XmStringCreateLocalized("unknown");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  unknown_button = XmCreatePushButtonGadget(typepulldown, "b_unknown", 
					    args, n);
  if (xms) XmStringFree(xms);

  /***************** typeMenu : XmOptionMenu *****************/
  n = 0;
  xms = XmStringCreateLocalized("Type");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  XtSetArg(args[n], XmNmnemonic, 'T'); n++;
  XtSetArg(args[n], XmNsubMenuId, typepulldown); n++;
  typeOM = XmCreateOptionMenu(workarea, "typeMenu", args, n);

  if (xms) XmStringFree(xms);

  /***************** buttons : XmWorkArea *****************/
  n = 0;
  XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
  buttons = XmCreateWorkArea(workarea, "buttons", args, n);

  /***************** DeferButton : XmToggleButtonGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNmarginWidth, 20); n++;
  XtSetArg(args[n], XmNindicatorSize, 15); n++;
  XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_CROSS_BOX); n++;
  xms = XmStringCreateLocalized("Defer Target");
  XtSetArg(args[n], XmNlabelString, xms); n++;
  defer = XmCreateToggleButtonGadget(buttons, "Defer", args, n);
  XtManageChild(defer);
  XtAddCallback(defer, XmNvalueChangedCallback, 
		(XtCallbackProc) deferCB, NULL);
  if (xms) XmStringFree(xms);

  /***************** frame1 : XmFrame *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
  XtSetArg(args[n], XmNtopWidget, frame); n++;
  XtSetArg(args[n], XmNtopOffset, 6); n++;
  XtSetArg(args[n], XmNrightOffset, 10); n++;
  XtSetValues(frame1, args, n);


  /***************** l2 : XmLabelGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopOffset, 10); n++;
  XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNbottomOffset, 10); n++;
  XtSetValues(l2, args, n);

  XtManageChild(l2);

  /***************** tf2 : XmCSText *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_POSITION); n++;
  XtSetArg(args[n], XmNbottomAttachment, XmATTACH_POSITION); n++;
  XtSetArg(args[n], XmNrightOffset, 5); n++;
  XtSetArg(args[n], XmNleftWidget, l2); n++;
  XtSetArg(args[n], XmNleftOffset, 5); n++;
  XtSetArg(args[n], XmNtopPosition, 5); n++;
  XtSetArg(args[n], XmNbottomPosition, 95); n++;
  XtSetValues(text2, args, n);

  XtManageChild(text2);
  XtManageChild(field2);

  XtAddCallback(format_s, XmNactivateCallback, 
		(XtCallbackProc) SetFormat, (XtPointer) 'S');
  XtManageChild(format_s);

  XtAddCallback(format_l, XmNactivateCallback, 
		(XtCallbackProc) SetFormat, (XtPointer) 'L');
  XtManageChild(format_l);

  XtAddCallback(format_t, XmNactivateCallback,
		(XtCallbackProc) SetFormat, (XtPointer) 'T');
  XtManageChild(format_t);

  XtAddCallback(format_cs, XmNactivateCallback, 
		(XtCallbackProc) SetFormat, (XtPointer) 'C');
  XtManageChild(format_cs);

  XtAddCallback(format_id, XmNactivateCallback, 
		(XtCallbackProc) SetFormat, (XtPointer) 'D');
  XtManageChild(format_id);

  XtAddCallback(format_ih, XmNactivateCallback, 
		(XtCallbackProc) SetFormat, (XtPointer) 'H');
  XtManageChild(format_ih);
  XtManageChild(format_om);

  /***************** l1 : XmLabelGadget *****************/
  n = 0;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNleftOffset, 10); n++;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNtopOffset, 10); n++;
  XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
  XtSetArg(args[n], XmNbottomOffset, 10); n++;
  XtSetValues(l1, args, n);

  XtManageChild(l1);

  /***************** tf1 : XmScrolledCSText *****************/
  pn = 0;
  XtSetArg(pargs[pn], XmNleftAttachment, XmATTACH_WIDGET); pn++;
  XtSetArg(pargs[pn], XmNrightAttachment, XmATTACH_FORM); pn++;
  XtSetArg(pargs[pn], XmNtopAttachment, XmATTACH_FORM); pn++;
  XtSetArg(pargs[pn], XmNbottomAttachment, XmATTACH_FORM); pn++;
  XtSetArg(pargs[pn], XmNrightOffset, 5); pn++;
  XtSetArg(pargs[pn], XmNleftWidget, l1); pn++;
  XtSetArg(pargs[pn], XmNleftOffset, 5); pn++;
  XtSetArg(pargs[pn], XmNtopOffset, 5); pn++;
  XtSetArg(pargs[pn], XmNbottomOffset, 5); pn++;
  tmpw = get_constraint_widget(text1, field1);
  if (tmpw)
    XtSetValues(tmpw, pargs, pn);

  XtManageChild(text1);
  XtManageChild(field1);

  XtAddCallback(b_atom,	XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "ATOM");
  XtManageChild(b_atom);

  XtAddCallback(b_drawable, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "DRAWABLE");
  XtManageChild(b_drawable);

  XtAddCallback(b_window, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "WINDOW");
  XtManageChild(b_window);

  XtAddCallback(b_colormap, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "COLORMAP");
  XtManageChild(b_colormap);

  XtAddCallback(b_integer, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "INTEGER");
  XtManageChild(b_integer);

  XtAddCallback(b_pixel, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "PIXEL");
  XtManageChild(b_pixel);

  XtAddCallback(b_compound_text, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "COMPOUND_TEXT");
  XtManageChild(b_compound_text);

  XtAddCallback(b_string, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "STRING");
  XtManageChild(b_string);

  XtAddCallback(b_locale, XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "");
  XtManageChild(b_locale);

  XtAddCallback(b_span,	XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "SPAN");
  XtManageChild(b_span);

  XtAddCallback(b__motif_compound_string, XmNactivateCallback, 
		(XtCallbackProc) SetType,
		(XtPointer) "_MOTIF_COMPOUND_STRING");
  XtManageChild(b__motif_compound_string);

  XtAddCallback(unknown_button,	XmNactivateCallback, 
		(XtCallbackProc) SetType, (XtPointer) "NONE");

  XtManageChild(unknown_button);
  XtManageChild(typeOM);

  XtManageChild(buttons);
  XtManageChild(workarea);
  XtManageChild(frame1);

  return(dialog);
}

Widget CreateHelpDialog(parent, name)
     Widget parent;
     char* name;
{
  Widget help;
  Arg args[10];
  int n;
  XmRendition rend[10];
  XmRenderTable rt;
  int i;
  XmTab tabs[5];
  XmTabList tablist;

  n = 0;
  XtSetArg(args[n], XmdNhelpFile, "transfer"); n++;
  help = XmdCreateHelpDialog(parent, "HelpDialog", args, n);
  /* Get the rendertable and add some new renditions */
  XtVaGetValues(help, XmNrenderTable, &rt, NULL, NULL);
  /* Make the tabs for the tables */
  n = 0;
  tabs[n] = XmTabCreate(1.5, XmINCHES, XmABSOLUTE,
			XmALIGNMENT_BEGINNING, NULL); n++;
  tabs[n] = XmTabCreate(3.0, XmINCHES, XmABSOLUTE,
			XmALIGNMENT_BEGINNING, NULL); n++;
  tabs[n] = XmTabCreate(4.5, XmINCHES, XmABSOLUTE,
			XmALIGNMENT_BEGINNING, NULL); n++;
  tabs[n] = XmTabCreate(6.0, XmINCHES, XmABSOLUTE,
			XmALIGNMENT_BEGINNING, NULL); n++;
  tablist = XmTabListInsertTabs(NULL, tabs, n, 0);
  for(i = 0; i < n; i++) XmTabFree(tabs[i]);

  /* Add extra renditions needed for the help file */
  n = 0; i = 0;
  XtSetArg(args[n], XmNtabList, tablist); n++;
  rend[i] = XmRenditionCreate(help, "table", args, n); i++;
  n = 0;
  XtSetArg(args[n], XmNfontName, "*courier-medium-r-*-12-*"); n++;
  XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
  rend[i] = XmRenditionCreate(help, "program", args, n); i++; 
  n = 0;
  XtSetArg(args[n], XmNunderlineType, XmSINGLE_LINE); n++;
  rend[i] = XmRenditionCreate(help, "underline", args, n); i++; 
  /* Make a copy so that setvalues will work correctly */
  rt = XmRenderTableCopy(rt, NULL, 0);
  rt = XmRenderTableAddRenditions(rt, rend, i, XmMERGE_NEW);
  for(n = 0; n < i; n++) XmRenditionFree(rend[n]);

  XtVaSetValues(help, XmNrenderTable, rt, NULL, NULL);
  XmRenderTableFree(rt);

  return(help);
}

void manageCB( widget, w_to_manage, callback_data)
     Widget widget;
     Widget w_to_manage;
     XtPointer callback_data;
{
  if (w_to_manage != (Widget) NULL)
    XtManageChild(w_to_manage);
}

void unmanageCB( widget, w_to_unmanage, callback_data)
     Widget widget;
     Widget w_to_unmanage;
     XtPointer callback_data;
{
  if (w_to_unmanage != (Widget) NULL)
    XtUnmanageChild(w_to_unmanage);
}

