DataMuseum.dk

Presents historical artifacts from the history of:

Regnecentalen RC-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Regnecentalen RC-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦a20830786⟧ TextFile

    Length: 39009 (0x9861)
    Types: TextFile
    Notes: UNIX file
    Names: »widgetView.c«

Derivation

└─⟦a85bd4a7c⟧ Bits:30004636/disk2.imd INTERACTIVE Motif Environment Development System
└─⟦a85bd4a7c⟧ UNIX Filesystem
    └─⟦this⟧ »xt/new/usr/lib/X11/examples/widgetView/widgetView.c« 

TextFile

#ifdef REV_INFO
#ifndef lint
static char SCCSID[] = "OSF/Motif: @(#)widgetView.c	1.2 - 89/08/31 - 11:17:33";
#endif /* lint */
#endif /* REV_INFO */
/****************************************************************************
 ****************************************************************************
 **
 **   File:     widgetView.c
 **
 **   Project:     Motif - widget examination program
 **
 **   Description: Program which shows resources of widgets
 **
 **
 **
 **   (c) Copyright 1989 by Open Software Foundation, Inc.
 **       All Rights Reserved.
 **
 **
 ****************************************************************************
 ****************************************************************************/

/***************************************************
*                                                  *
*  Revision history:                               *
*                                                  *
*  06/26/89      pjlevine      complete rewrite    *
*                                                  *
****************************************************/


#include "widgetView.h"
#include "widgets.h"

#define STRING_OFFSET 14
#define TESTLABEL "its"

/* for the FILE selection on menu bar */
#define LABEL1 "New"
#define LABEL2 "Open"
#define LABEL3 "Save"
#define LABEL4 "Quit"

/* for the Convienience function selection */
#define LABEL5 "Enabled"

/* the HELP selection */
#define LABEL6 "Manual"
#define LABEL7 "Source Code"
#define LABEL8 "widgetView"

#define SCALE 0
#define TOGGLE_BUT 1
#define TEXT_INPUT 2
#define PUSH_BUT 3

/* the filename of this program */

char filename [256];

typedef struct resource_vals {
  Cardinal num_items;
  char **name;
  char **type;
  long value [MAX_ARGS];
  long orgvalue [MAX_ARGS];
  Widget widget_addr [MAX_ARGS];
  short  widget_type [MAX_ARGS];
}RESOURCEVALS;

RESOURCEVALS  resources, GetWidgetHierarchy ();

static char   buffy [256];

/***********************************************************/
void  Quit()
{
     printf("exiting...\n\r");
     fflush(stdout);
     exit(0);
}
/**********************************************************/
XtCallbackProc MenuQuit (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  exit (0);

}

/**********************************************************/
/* enter here whenever a value is being changed           */
/**********************************************************/
XtCallbackProc ValueField (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  int i, n = 0;
  Arg        args[MAX_ARGS];
  XmString   tcs;

  if ((i = GetValuePosition (w)) < 0)
    printf ("error in get position\n");

  switch (resources.widget_type [i]) {
    
      case SCALE:
                    n = 0;
		    XtSetArg (args [n], XmNvalue, &resources.value [i]); n++;
		    XtGetValues (w, args, n);
		    break;
   
      case TOGGLE_BUT:
		    n = 0;
		    if (resources.value [i] == True) {
		      resources.value [i] = False;
		      tcs = XmStringLtoRCreate("False", 
					       XmSTRING_DEFAULT_CHARSET);
		      XtSetArg (args [n], XmNlabelString, tcs); n++;
		    }
		    else {
		      resources.value [i] = True;
		      tcs = XmStringLtoRCreate("True", 
					       XmSTRING_DEFAULT_CHARSET);
		      XtSetArg (args [n], XmNlabelString, tcs); n++;
		    }
		    XtSetValues (w, args, n);
		    XmStringFree (tcs);
		    break;

      default:
		    printf ("none found\n");
  }

}

/**********************************************************/
GetValuePosition (widget)
Widget widget;

{
  
  int i;

  for (i=0; i<MAX_ARGS; i++) {
    if (widget == resources.widget_addr [i])
      return (i);
  }
  return (-1);
}



/**********************************************************/
/* do the changed resources when the APPLY push button is pressed */
/**********************************************************/
XtCallbackProc ApplyResource (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{
  int i;
  Arg           args[MAX_ARGS];


  /* set the entire resource list */

  for (i=0; i<resources.num_items; i++) {
      XtSetArg(args [i], resources.name [i], resources.value [i]);
    }
  if (ActiveWidget != (Widget) NULL)
    XtSetValues (ActiveWidget, args, i-1);

}

/**********************************************************/
/* do the cancel resource when the CANCEL push button is pressed */
/**********************************************************/
XtCallbackProc CancelResource (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{
  int i;
  Arg           args[MAX_ARGS];

  /* reset the resources to the value when the resource wuz created */

  for (i=0; i<resources.num_items; i++) {
      XtSetArg(args [i], resources.name [i], resources.orgvalue [i]);
    }
  
  if (ActiveWidget != (Widget) NULL)
    XtSetValues (ActiveWidget, args, i-1);

}

/**********************************************************/
XtCallbackProc NewFileOK (w, client_data, callback_data)
Widget   w;
char *client_data;
XmSelectionBoxCallbackStruct *callback_data;
{
  Widget CreateLabel (), GetWidgetList ();
  char *textstr, *extract_normal_string ();
  int i;

  if (callback_data->value == (XmString) NULL)
    return (0);

  textstr = extract_normal_string (callback_data->value);

  /* textstr now contains the widget selection */

  XtUnmanageChild (WidgetShell);
  XtUnmanageChild (WidgetDialog);


  ActiveWidget = GetWidgetList (textstr);

  /* got a new one so open it */

  if (ActiveWidget != (Widget) NULL) 
    SetNewWidget (ActiveWidget);

}


/**********************************************************/
XtCallbackProc NewFile (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  int i;

  /* destroy the bulletin board in the resource edit region */

  /* here's the widget selection region */
  XtManageChild (WidgetShell);
  XtManageChild (WidgetDialog);

  if (TBoardW != (Widget) NULL)
    XtDestroyWidget (TBoardW);
  if (ActiveWidget != (Widget) NULL)
    XtDestroyWidget (ActiveWidget);
  for (i=0; i<resources.num_items; i++) {
    free (resources.name [i]);
    free (resources.type [i]);
  }


}


/**********************************************************/
XtCallbackProc OpenFileOK (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  Widget CreateLabel ();

  XtUnmanageChild (FileDialog);
  XtUnmanageChild (FileSelection);

  ActiveWidget = CreateLabel (WidgetBoard, "WIDGET DISPLAY (OPEN)", 50, 50);

  SetNewWidget (ActiveWidget);

  printf ("open file selected\n");

}



/**********************************************************/
XtCallbackProc OpenFile (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  int i;

  if (TBoardW != (Widget) NULL)
    XtDestroyWidget (TBoardW);
  if (ActiveWidget != (Widget) NULL)
    XtDestroyWidget (ActiveWidget);
  for (i=0; i<resources.num_items; i++) {
    free (resources.name [i]);
    free (resources.type [i]);
  }
  XtManageChild (FileDialog);
  XtManageChild (FileSelection);

}

/**********************************************************/
XtCallbackProc SaveFile (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  printf ("save file selected\n");

}

/**********************************************************/
XtCallbackProc PrintToFile (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  if (ActiveWidget != (Widget) NULL ) {
    XtManageChild (PrintFileDialog);
    XtManageChild (PrintFileSelection);
  }
}

/**********************************************************/
XtCallbackProc PrintToFileOK (w, client_data, callback_data)
Widget   w;
char *client_data;
XmSelectionBoxCallbackStruct *callback_data;
{
  char *textstr, *extract_normal_string ();
  int i;
  FILE *fp;

  if (callback_data->value == (XmString) NULL)
    return (0);

  textstr = extract_normal_string (callback_data->value);

  /* write to the file */

  if ((fp = fopen (textstr, "r+")) == NULL) {
    if ((fp = fopen (textstr, "a+")) == NULL) {
      printf ("error creating or opening %s\n", textstr);
      return (0);
    }
  }
  for (i=0; i<resources.num_items; i++) {
    fprintf (fp, "%-20s%-20s%-5ld\n", resources.name [i], 
	     resources.type[i], resources.value [i]);
  }
  fclose (fp);

  XtUnmanageChild (PrintFileDialog);
  XtUnmanageChild (PrintFileSelection);

}
/**********************************************************/
XtCallbackProc PrintToFileApply (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{


}


/**********************************************************/
XtCallbackProc PrintToPrinter (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  printf ("printout selected\n");

}

/**********************************************************/
XtCallbackProc Enabled (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  printf ("save file selected\n");

}

/**********************************************************/
XtCallbackProc ManHelp (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  system ("xterm -e man label &");
  printf ("man selected\n");

}

/**********************************************************/
XtCallbackProc SourceHelp (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  printf ("source help selected\n");

}

/**********************************************************/
XtCallbackProc ViewHelp (w, client_data, call_data)
Widget   w;
caddr_t  client_data,
         call_data;
{

  printf ("view help selected\n");

}

/**********************************************************/
SetLabel (label)
char *label;
{
    register int  n;
    Arg           args[MAX_ARGS];
    XmString      tcs;

    n = 0;

    tcs = XmStringLtoRCreate(label, XmSTRING_DEFAULT_CHARSET);
    XtSetArg(args[n], XmNlabelString, tcs);  n++;
    XtSetValues (LabelW, args, n);
    XmStringFree(tcs);

}

/***********************************************************/
Widget CreateCascade (label, mnemonic, submenu, parent)
char       *label,
           mnemonic;
Widget     submenu,
           parent;

{

  Widget   widget;
  int      n;
  Arg      args[MAX_ARGS];
  XmString tcs;

  n = 0;
  tcs = XmStringLtoRCreate (label, XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  XtSetArg(args[n], XmNmnemonic, mnemonic); n++;
  XtSetArg(args[n], XmNsubMenuId, submenu); n++;
  widget = XmCreateCascadeButton (parent, "cascade", args, n);
  XtManageChild(widget);
  XmStringFree(tcs);

  return (widget);
}

/***********************************************************/
Widget CreateDialog (parent, addrstr, num_items)
Widget parent;
XmString *addrstr;
Cardinal num_items;
{
  Widget   widget,
           OKBtn,
           HelpBtn;
  int      n;
  Arg      args[MAX_ARGS];
  XmString tcs;


  tcs = XmStringLtoRCreate ("Font List", XmSTRING_DEFAULT_CHARSET);

  n = 0;
  XtSetArg(args[n], XmNheight,  200);  n++;
  XtSetArg(args[n], XmNwidth,  200);  n++;
  XtSetArg(args[n], XmNx, 10);  n++;
  XtSetArg(args[n], XmNy, 10);  n++;
  /* the label of the selection box list */
  XtSetArg (args[n], XmNlistLabelString, tcs); n++;
  XmStringFree (tcs);
  tcs = XmStringLtoRCreate (TESTLABEL, XmSTRING_DEFAULT_CHARSET);

  /* the label of the cancel box */
  XtSetArg (args[n], XmNhelpLabelString, tcs); n++;

  /* the contents of the selection box list */
  XtSetArg (args[n], XmNlistItems, addrstr); n++;

  /* there are eight items */
  XtSetArg (args[n], XmNlistItemCount, num_items); n++;

  /* eight of which are visible */
  XtSetArg (args[n], XmNlistVisibleItemCount, 8); n++;

  widget = XmCreateSelectionBox (parent, "selection_dialog",
				    args, n);

  XmStringFree (tcs);

  return (widget);
}

/***********************************************************/
Widget CreateDialogShell (parent, say, x, y)
Widget parent;
char *say;
Cardinal x, y;
{

  static   Widget   widget;
  int      n;
  Arg      args[MAX_ARGS];

  n = 0;
  XtSetArg(args[n], XmNwidth, 400);  n++;
  XtSetArg(args[n], XmNheight, 400);  n++;
  XtSetArg(args[n], XmNx, x);  n++;
  XtSetArg(args[n], XmNy, y);  n++;
  XtSetArg(args[n], XmNallowShellResize, True);  n++;
  widget = XmCreateDialogShell (parent, say, args, n);


  return (widget);
}

/***********************************************************/
Widget CreateList (parent, addrstr, num_items)
Widget parent;
XmString *addrstr;
Cardinal num_items;
{
  Widget   widget,
           OKBtn,
           HelpBtn;
  int      n;
  Arg      args[MAX_ARGS];
  XmString tcs;


  tcs = XmStringLtoRCreate ("Resources", XmSTRING_DEFAULT_CHARSET);

  n = 0;
  ScrollBarList = XmCreateScrollBar (SWin, "Scroll_bar", args, n);

  n = 0;
  XtSetArg(args[n], XmNheight,  200);  n++;
  XtSetArg(args[n], XmNwidth,  200);  n++;
  XtSetArg(args[n], XmNx, 10);  n++;
  XtSetArg(args[n], XmNy, 10);  n++;
  /* the label of the selection box list */
  XtSetArg (args[n], XmNlistLabelString, tcs); n++;

  /* the contents of the selection box list */
  XtSetArg (args[n], XmNitems, addrstr); n++;

  /* there are eight items */
  XtSetArg (args[n], XmNitemCount, num_items); n++;

  /* eight of which are visible */
  XtSetArg (args[n], XmNvisibleItemCount, 8); n++;
  
  XtSetArg (args[n], XmNverticalScrollBar, ScrollBarList); n++;

  widget = XmCreateList (parent, "selection_dialog",
				    args, n);
  return (widget);
}
/***********************************************************/
Widget CreateFileSelection (parent, name)
Widget parent;
char *name;
{

  static   Widget   widget;
  int      n;
  Arg      args[MAX_ARGS];

  n = 0;
  widget = XmCreateFileSelectionBox (parent, name, args, n);

/*  FileOK = XmFileSelectionBoxGetChild (widget, XmDIALOG_OK_BUTTON);
  n = 0;
  XtSetArg (args[n], XmNshowAsDefault, 1); n++;
  XtSetValues (FileOK, args, n);
  XtManageChild (FileOK);
*/

  return (widget);
}

/***********************************************************/
Widget CreatePushButton (label, mnemonic, parent)
char      *label,
          mnemonic;
Widget    parent;

{

  static Widget       widget;
  int          n;
  Arg          args[MAX_ARGS];
  XmString     tcs,
               acc_text;

  n = 0;
  tcs = XmStringLtoRCreate(label, XmSTRING_DEFAULT_CHARSET);
  acc_text = XmStringLtoRCreate("^A", XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNmnemonic, mnemonic); n++;
  /* if there is an accelerator associated with the button */
#ifdef ACCEL
      XtSetArg(args[n], XmNaccelerator, "Ctrl<Key>A"); n++;
      XtSetArg(args[n], XmNacceleratorText, acc_text);n++;
#endif
  widget = XmCreatePushButton(parent, label, args, n);
  XtManageChild(widget);
  XmStringFree(tcs);
  XmStringFree(acc_text);

  return(widget);
}


/***********************************************************/
Widget CreateRadioBox (parent)
Widget     parent;
{
  Widget       widget;
  int          n;
  Arg          args[MAX_ARGS];

  n = 0;
  /*
   * contains two toggle buttons which by virtue of being contained
   * within a radio box are mutually exclusive
   */
  widget = XmCreateRadioBox (parent, "radioBox", args, n);
  XtManageChild (widget);
  
  return (widget);
}


/***********************************************************/
Widget CreateSeparator (parent)
Widget     parent;
{
  Widget       widget;
  Arg          args[MAX_ARGS];
  int          n;

  n = 0;
  widget = XmCreateSeparator (parent, "separator", args, n);
  XtManageChild (widget);

  return(widget);
}


/***********************************************************/
static Widget CreateToggle (parent, label, mnemonic, x, y, indicator)
Widget     parent;
char       *label,
           mnemonic;
int        x, y;
Boolean    indicator;

{
  Widget       widget;
  int          n;
  Arg          args[MAX_ARGS];
  XmString     tcs;


  n = 0;

  XtSetArg(args[n], XmNx, x);n++;
  XtSetArg(args[n], XmNy, y);n++;
  XtSetArg(args[n], XmNshadowType, XmSHADOW_OUT);n++;
  ToggleFrame = XmCreateFrame (parent, "Frame", args, n);
  XtManageChild (ToggleFrame);

  n = 0;
  tcs = XmStringLtoRCreate (label, XmSTRING_DEFAULT_CHARSET);
  XtSetArg(args[n], XmNlabelString, tcs);n++;
  XtSetArg(args[n], XmNmnemonic, mnemonic);n++;
  XtSetArg(args[n], XmNset, indicator);n++;
  widget = XmCreateToggleButton (ToggleFrame, "toggle",args,n);
  XtManageChild (widget);
  XmStringFree(tcs);

  return(widget);

}

/***********************************************************/
/* posts the popup menu when button 2 is pressed in the frame widget */
XtCallbackProc PostIt (w, popup, event)
Widget       w,
             popup;
XButtonEvent *event;

{
  if (event->button != Button2)
    return;
  XmMenuPosition (popup, event);
  XtManageChild (popup);
}


/***********************************************************/
Widget CreateLabel (parent, string, posx, posy)
Widget parent;
char *string;
int posx, posy;
{


  Widget       widget;
  Arg          args[MAX_ARGS];
  XmString tcs;
  XmFontList   fontlist;
  int n=0;
  Dimension width, height;
  

  tcs = XmStringLtoRCreate (string, XmSTRING_DEFAULT_CHARSET);

  XtSetArg(args[n], XmNx, posx);  n++;
  XtSetArg(args[n], XmNy, posy);  n++;
/*  XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_ANY);  n++;
  XtSetArg(args[n], XmNshadowThickness, 2);  n++;
*/
  LabelBoardW = XmCreateFrame (parent, "Frame", args, n);
  XtManageChild (LabelBoardW);

  n = 0;
  XtSetArg(args[n], XmNx, 0);  n++;
  XtSetArg(args[n], XmNy, 0);  n++;
  XtSetArg(args[n], XmNrecomputeSize, True);  n++;
  XtSetArg(args[n], XmNlabelString, tcs); n++;
  widget = XmCreateLabel (LabelBoardW, "Label", args, n);
  XtManageChild (widget);

  XmStringFree (tcs);

  /* return the bulletin board so a subsequent Xtdestroy
     will kill both the bboard and the label */
  return (LabelBoardW);
}

/***********************************************************/
Widget CreateText (parent, x, y, width, height)
Widget parent;
int x, y, width, height;
{

  Widget widget;
  Arg          args[MAX_ARGS];
  int n=0;

    XtSetArg(args[n], XmNeditMode,  XmMULTI_LINE_EDIT);  n++;
    XtSetArg(args[n], XmNeditable,  False);  n++;
    XtSetArg(args[n], XmNheight,  height);  n++;
    XtSetArg(args[n], XmNwidth,  width);  n++;
    XtSetArg(args[n], XmNx,  x);  n++;
    XtSetArg(args[n], XmNy,  y);  n++;
    XtSetArg(args[n], XmNresizeWidth,  True);  n++;
    XtSetArg(args[n], XmNresizeHeight,  False);  n++;

    widget = XmCreateText (parent, "s_text", args, n);

    return (widget);
}

/***********************************************************/
Widget CreateScale (parent, value, minimum, maximum, xpos, ypos)
Widget parent;
int value,
    minimum,
    maximum,
    xpos,
    ypos;
{

  
  Widget widget;
  Arg          args[MAX_ARGS];
  int n=0;


    XtSetArg(args[n], XmNx,  xpos);  n++;
    XtSetArg(args[n], XmNy,  ypos);  n++;
    XtSetArg(args[n], XmNshadowType, XmSHADOW_OUT);n++;
    ScaleFrame = XmCreateFrame (parent, "Frame", args, n);
    XtManageChild (ScaleFrame);

    n= 0;
    XtSetArg(args[n], XmNvalue,  value);  n++;
    XtSetArg(args[n], XmNminimum,  minimum);  n++;
    XtSetArg(args[n], XmNmaximum,  maximum);  n++;
    XtSetArg(args[n], XmNshowValue,  True);  n++;
    XtSetArg(args[n], XmNorientation,  XmHORIZONTAL);  n++;
    XtSetArg(args[n], XmNprocessingDirection,  XmMAX_ON_RIGHT);  n++;
    widget = XmCreateScale (ScaleFrame, "Scale", args, n);
    XtManageChild (widget);
    
    return (widget);

}

/***********************************************************/
void  main(argc, argv)
int     argc;
char    **argv;
{
    register int           n;
    Arg           args[MAX_ARGS];
    int           num_items;
    int           num_widgets;
    /* font shit */
    XmString      *DoTheFont (), *font_addrstr;

    Widget Dummy;
    Widget XmCreateScrolledText ();
    XmString *addrstr, *GetKnownWidgets ();


    MenuBar = (Widget) NULL;

    signal(SIGHUP,  Quit);
    signal(SIGINT,  Quit);
    signal(SIGQUIT, Quit);

    system ("touch foo");
    system ("rm -r foo");


    XtToolkitInitialize();
    if ((display = XtOpenDisplay (NULL, NULL, argv[1], "XMclient",
				  NULL, 0, &argc, argv)) == NULL)
    {
	fprintf (stderr,"\n%s:  Can't open display\n", argv[0]);
        exit(1);
    }


    strcpy (filename, argv[0]);
    strcat (filename, ".c");
    printf ("filename = %s\n", filename);
    n = 0;
    XtSetArg(args[n], XmNallowShellResize, True);  n++;
    Shell = XtAppCreateShell(argv[0], NULL, applicationShellWidgetClass,
                              display, args, n);

    n = 0;
    MainWindow = XmCreateMainWindow(Shell, "MainWindow", args, n);
    XtManageChild(MainWindow);

    n = 0;
    XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_GROW);  n++;
    WorkRegion = XmCreateBulletinBoard (MainWindow, "s_text", args, n);
    XtManageChild (WorkRegion);

    CreateMenuBar ();

    CreateTextWin ();

    WidgetShell = CreateDialogShell (Shell, "List O' Widgets", 200, 200);
    addrstr = GetKnownWidgets (&num_widgets);
    WidgetDialog = CreateDialog (WidgetShell, addrstr, num_widgets); 
    XtAddCallback (WidgetDialog, XmNokCallback, NewFileOK, NULL);


    FileDialog = CreateDialogShell (Shell, "Open Existing File", 300, 300);
    FileSelection = CreateFileSelection (FileDialog, "Select File"); 
    XtAddCallback (FileSelection, XmNokCallback, OpenFileOK, NULL);

    PrintFileDialog = CreateDialogShell (Shell, "Print Resources to File", 
					 300, 300);
    PrintFileSelection = CreateFileSelection (PrintFileDialog, "Select File"); 
    XtAddCallback (PrintFileSelection, XmNokCallback, PrintToFileOK, NULL);

/*    FontDialog = CreateDialogShell (Shell, "List O' Fonts", 450, 450);
    font_addrstr = DoTheFont (&num_items);
    n = 0;
    XtSetArg(args[n], XmNwidth,  450);  n++;
    XtSetArg(args[n], XmNheight, 450);  n++;
    FontBulletin = XmCreateBulletinBoard (FontDialog, "f_bulletin", args, n);
    FontShell = CreateDialog (FontBulletin, font_addrstr, num_items); 
    XtAddCallback (FontShell, XmNcancelCallback, FontSelectCancel, NULL);
    XtAddCallback (FontShell, XmNokCallback, FontSelectOK, NULL);
    XtAddCallback (FontShell, XmNapplyCallback, FontSelectApply, NULL);
    XtAddCallback (FontShell, XmNhelpCallback, FontTest, NULL);

    FontTestDialog = CreateText (FontBulletin, 30, 275, 250, 150);
    n = 0;
    XtSetArg(args[n], XmNeditable,  True);  n++;
    XtSetValues (FontTestDialog, args, n);


    CreateDisplayWin ();


    CreateWidgetList ();


    TextShell = CreateDialogShell (Shell, "Help Window", 200, 200);
    TextDialog = CreateText (TextShell, 0, 0, 350, 350);
*/

    XtRealizeWidget(Shell);

    XtMainLoop();

}

/***********************************************************/
CreateTextWin ()
{
    int           n, i;
    Arg           args[MAX_ARGS];
    char          *buffer, *GetSource ();
    
    n = 0;
/*
    XtSetArg(args[n], XmNshadowThickness, 0);  n++; 
    XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_ANY);  n++;
    SWin = XmCreateBulletinBoard (WorkRegion, "s_win", args, n);
    XtManageChild (SWin);
*/
    /* widget bulletin board */

    n=0;
    XtSetArg(args[n], XmNx,  0);  n++;
    XtSetArg(args[n], XmNy,  60);  n++;
    XtSetArg(args[n], XmNheight,  400);  n++;
    XtSetArg(args[n], XmNwidth,  275);  n++;
    XtSetArg(args[n], XmNshadowThickness, 2);  n++; 
    XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_GROW);  n++;

    WidgetBoard = XmCreateBulletinBoard (WorkRegion, "Form", args, n);
    XtManageChild (WidgetBoard);


    /* text widget over on the right */

    n=0;
    XtSetArg(args[n], XmNx,  350);  n++;
    XtSetArg(args[n], XmNy,  60);  n++;
    XtSetArg(args[n], XmNheight,  400);  n++;
    XtSetArg(args[n], XmNwidth,  WIDTH - 350);  n++;
    XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC);  n++; 
    TextWin = XmCreateScrolledWindow (WorkRegion, "s_text", args, n);
    XtManageChild (TextWin);


    n=0;
    XtSetArg(args[n], XmNx,  0);  n++;
    XtSetArg(args[n], XmNy,  0);  n++;
    XtSetArg(args[n], XmNheight,  400);  n++;
    XtSetArg(args[n], XmNwidth,  WIDTH - 300);  n++;
    XtSetArg(args[n], XmNshadowThickness, 0);  n++; 
    XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_ANY);  n++;
    TBoardW = XmCreateBulletinBoard (TextWin, "Form", args, n);
    XtManageChild (TBoardW);


/*
    buffer = GetSource ("widgetView.c");
    XmTextSetString (TextWin, buffer);
*/
    LabelW = CreateLabel (WorkRegion, "WIDGET DISPLAY REGION", 0, 0);
    LabelHierarchy = CreateLabel (WorkRegion, "WIDGET HIERARCHY", 0, 500);
    CreateLabel (WorkRegion, "RESOURCE EDIT WINDOW", 350, 0);
    n = 0;
    ResourceButton = CreatePushButton ("Apply Resource Changes", '1', 
				       WorkRegion);
    XtSetArg(args[n], XmNx,  500);  n++;
    XtSetArg(args[n], XmNy,  490);  n++;
    XtSetValues (ResourceButton, args, n);
    XtAddCallback (ResourceButton, XmNactivateCallback, ApplyResource, NULL);
    n = 0;
    ResourceButton1 = CreatePushButton ("Cancel Resource Changes", '1', 
					WorkRegion);
    XtSetArg(args[n], XmNx,  500);  n++;
    XtSetArg(args[n], XmNy,  520);  n++;
    XtSetValues (ResourceButton1, args, n);
    XtAddCallback (ResourceButton1, XmNactivateCallback, CancelResource, NULL);

}
/***********************************************************/
SetNewWidget (widget)
Widget widget;
{

    int           n, i;
    Arg           args[MAX_ARGS];
    char          buff [256];

    long   hscroll, vscroll;
    
    /* create a main bulletin for the scrolled window */

    n=0;
    XtSetArg(args[n], XmNx,  0);  n++;
    XtSetArg(args[n], XmNy,  0);  n++;
    XtSetArg(args[n], XmNheight,  1500);  n++;
    XtSetArg(args[n], XmNwidth,  WIDTH);  n++;
    XtSetArg(args[n], XmNshadowThickness, 0);  n++; 
    XtSetArg(args[n], XmNresizePolicy,  XmRESIZE_ANY);  n++;
    TBoardW = XmCreateBulletinBoard (TextWin, "Form", args, n);


    XtSetArg(args[0], XmNhorizontalScrollBar,  &hscroll);
    XtGetValues (widget, args, 0);
    XtSetArg(args[0], XmNverticalScrollBar,  &vscroll);
    XtGetValues (widget, args, 0);

    XmScrolledWindowSetAreas (TextWin, hscroll, vscroll, TBoardW);

    XtManageChild (TBoardW);

    CreateLabel (TBoardW, "RESOURCE NAME", 0, 0);
    CreateLabel (TBoardW, "RESOURCE TYPE", 150, 0);
    CreateLabel (TBoardW, "VALUE CHANGE FIELD", 300, 0);

    resources = GetWidgetHierarchy (widget);
    for (i = 0; i<resources.num_items; i++) {
      sprintf (buff, "%-20s%-20s", resources.name [i], resources.type[i]);
      CreateLabel (TBoardW, buff, 0, (i+1) * 50);
      XtSetArg(args [i], resources.name [i], &resources.value [i]);
    }
    XtGetValues (widget, args, i);

    for (i = 0; i<resources.num_items; i++) {
      /* hold the original values around */
      resources.orgvalue [i] = resources.value [i];
      /* we have the value so get the correct display widget up */
      CreateValueField (TBoardW, i);
/*
      printf ("value [%d] = %d,buffy = %s\n",i, resources.value [i], 
	args [i].name);
      sprintf (buffy, "%ld", resources.value [i]);
      CreateLabel (TBoardW, buffy, 300, (i+1) * 50);
*/
    }
}

/***********************************************************/
CreateValueField (parent, offset)
Widget parent;
int offset;
{

  Widget widget;
  int minimum, maximum;

  minimum = maximum = 0;
  switch (GetFieldType (resources.type [offset], offset, &minimum, &maximum)) {

      case TOGGLE_BUT:
          /* create toggle button widget */
          if (resources.value [offset])
	    widget = CreateToggle (parent, "True", '1', 300, 
				   (offset+1)* 50, True);
	  else
	    widget = CreateToggle (parent, "False", '1', 300, 
				   (offset+1)* 50, False);
	  XtAddCallback (widget, XmNarmCallback, ValueField, NULL);
	  resources.widget_type [offset] = TOGGLE_BUT;
	  break;

      case SCALE:
	  widget = CreateScale (parent, resources.value [offset], 
				minimum, maximum, 300, (offset+1) * 50);
	  XtAddCallback (widget, XmNdragCallback, ValueField, NULL);
	  resources.widget_type [offset] = SCALE;
	  break;
      
      default:
	  sprintf (buffy, "%ld", resources.value [offset]);
	  widget = CreateLabel (parent, buffy, 300, (offset+1) * 50);

  } /* switch */

  resources.widget_addr [offset] = widget;
 

}

/***********************************************************/
GetFieldType (resource_type, offset, minimum, maximum)
char *resource_type;
int offset,
    *minimum,
    *maximum;

{

  int i = 0;

  /* global structures give the values of the world 
   scale_types [], toggle_types []*/

  *minimum = *maximum = 0;

  while (strcmp (scale_vals [i].type , "END")) {
    if (!strcmp (scale_vals [i].type, resource_type)) {
      *minimum = scale_vals [i].minimum;
      *maximum = scale_vals [i].maximum;
      if (resources.value [offset] > *maximum)
	*maximum = (int) resources.value [offset];
      return (SCALE);
    }
    i++;
  }
  i = 0;
  while (strcmp (toggle_types [i], "END")) {
    if (!strcmp (toggle_types [i], resource_type))
      return (TOGGLE_BUT);
    i++;
  }
  return (NOT_FOUND);
}
					    

/***********************************************************/
XmString *GetKnownWidgets (num_widgets)
int *num_widgets;
{
  
  static XmString *addrstr;
  int i = 0;

  addrstr = (XmString *) calloc (100, sizeof (XmString));
  while (1) { 
    addrstr[i] = XmStringLtoRCreate (widgetlist [i], 
				     XmSTRING_DEFAULT_CHARSET);
    i++;
    if (!strcmp (widgetlist [i], "END")) 
      break;
  }
  *num_widgets = i;
  return (addrstr);
}
/***********************************************************/
RESOURCEVALS GetWidgetHierarchy (GenWidget)
Widget GenWidget;
{
  
  static XtResourceList resource;
  static RESOURCEVALS  local_resources;
  WidgetClass widget_class, s_class;
  int i, n;
  Arg           args[MAX_ARGS];
  Widget papa;
  char *hierarchy;

  local_resources.num_items = 0;

  hierarchy = (char*) calloc (1, 256);
  widget_class = XtClass (GenWidget);

  strcat (hierarchy, widget_class->core_class.class_name);
  strcat (hierarchy, ".");
  s_class = widget_class->core_class.superclass;
  while(1) {

    /* loop through superclasses until we reach core */

    strcat (hierarchy, s_class->core_class.class_name);
    if (!strcmp (s_class->core_class.class_name, "Core") ||
	!s_class)
      break;
    strcat (hierarchy, ".");
    s_class = s_class->core_class.superclass;
  }

  /* this is the core.manager... hierarchy */
  printf ("hierarch 1 = %s\n", hierarchy);
  WidgetHierarchy = CreateLabel (WorkRegion, hierarchy, 0, 550);
  free (hierarchy);

  XtGetResourceList (widget_class, &resource, &local_resources.num_items);

  local_resources.name = (char **) calloc (local_resources.num_items, 
					   sizeof (char **));
  local_resources.type = (char **) calloc (local_resources.num_items, 
					   sizeof (char **));
  printf ("widget num = %d\n\r", local_resources.num_items);
  for (i = 0; i < local_resources.num_items; i++) {
    local_resources.name[i] = resource[i].resource_name;
    local_resources.type[i] = resource[i].resource_type;
    printf ("widget = %s\n\r", resource[i].resource_name);
    printf ("resource type = %s\n", resource[i].resource_type);

  }
  return (local_resources);
}

/***********************************************************/
XmString *DoTheFont (count)
int *count;
{

    char **fontlist;
    int i;
    static XmString *addrstr;

    fontlist = XListFonts (display, "*", 100, count);
    addrstr = (XmString *) calloc (*count, sizeof (XmString));
    printf ("num = %d\n\r", *count);
    for (i = 0; i < *count; i++) {
      addrstr[i] = XmStringLtoRCreate (fontlist[i], 
				       XmSTRING_DEFAULT_CHARSET);
    }

    return (addrstr);
}
/***********************************************************/
char *GetSource (fileptr)
char *fileptr;
{

  static char *retbuff;
  int fd, flen;

  if ((fd = open (fileptr, O_RDONLY)) < 0) {
    printf ("Cannot open file %s\n", fileptr);
    return ((char *) NULL);
  }
  flen = GetFileLen(fd);
  retbuff = (char*) calloc (1, flen + 1);
  if (read (fd, retbuff, flen) <= 0) {
    printf ("Error reading file %s\n", fileptr);
    return ((char *) NULL);
  }
  close (fd);
  return (retbuff);
}

/***********************************************************/
GetFileLen (fd)
int fd;
{
  static int retval;

#ifdef i386
  lseek (fd, 0, SEEK_SET);  
  retval = lseek (fd, 0, SEEK_END);
  lseek (fd, 0, SEEK_SET);  
#else /* i386 */
  lseek (fd, 0, L_SET);  
  retval = lseek (fd, 0, L_XTND);
  lseek (fd, 0, L_SET);  
#endif /* i386 */

  return (retval);

}

/***********************************************************/
CreateMenuBar ()
{

    int           n;
    Arg           args[MAX_ARGS];


    /*
    **  the menubar
    */

    n = 0;
    MenuBar = (Widget) XmCreateMenuBar ((Widget) MainWindow, "MenuBar", 
					args, n); 
    if (MenuBar == NULL) {
      printf ("null menu bar\n\r");
      exit (0);
    }
    XtManageChild(MenuBar);

    /*  create the first level pulldowns */

    n = 0;
    PullDown1 = XmCreatePulldownMenu (MenuBar, "File", args, n);
    PullDown2 = XmCreatePulldownMenu (MenuBar, "Convienience Fcns", args, n);
    PullDown3 = XmCreatePulldownMenu (MenuBar, "Help", args, n);

    /*  create cascade buttons for menubar  */

    MenuBtn1 = CreateCascade ("File", 'F', PullDown1, MenuBar);
    MenuBtn2 = CreateCascade ("Convienience Functions", 'C',PullDown2, MenuBar);
    MenuBtn3 = CreateCascade ("Help", 'H', PullDown3, MenuBar);


    /*
    **  Menu1 (FILE menu)
    */

    Label1A = CreatePushButton (LABEL1,'1',PullDown1);
    XtAddCallback (Label1A, XmNactivateCallback, NewFile, NULL);

    Label1B = CreatePushButton (LABEL2, '2', PullDown1);
    XtAddCallback (Label1B, XmNactivateCallback, OpenFile, NULL);

    Label1C = CreatePushButton (LABEL3, '3', PullDown1);
    XtAddCallback (Label1C, XmNactivateCallback, SaveFile, NULL);

    CreateSeparator (PullDown1);
    
    n = 0;
    PullDown1A = XmCreatePulldownMenu(PullDown1, "Print Resources",args, n);
    Cascade1 = CreateCascade ("Print Resources", '4', PullDown1A, PullDown1);

    ToFileLabel = CreatePushButton ("To File",'1',PullDown1A);
    XtAddCallback (ToFileLabel, XmNactivateCallback, PrintToFile, NULL);

    ToPrinterLabel = CreatePushButton ("To Printer", '2', PullDown1A);
    XtAddCallback (ToPrinterLabel, XmNactivateCallback, PrintToPrinter, NULL);

    CreateSeparator (PullDown1);

    Label1D = CreatePushButton (LABEL4, '5', PullDown1);
    XtAddCallback (Label1D, XmNactivateCallback, MenuQuit, NULL);



    /*
    **  Menu2   (Convienience function menu)
    */

    Label2A = CreateToggle (PullDown2, LABEL5, '1', 0, 0, False);
    XtAddCallback (Label2A, XmNactivateCallback, Enabled, NULL);

    /* menu 3  (HELP menu) */


    Label3A = CreatePushButton (LABEL6,'5',PullDown3);
    XtAddCallback (Label3A, XmNactivateCallback, ManHelp, NULL);

    Label3B = CreatePushButton (LABEL7,'5',PullDown3);
    XtAddCallback (Label3B, XmNactivateCallback, SourceHelp, NULL);

    Label3C = CreatePushButton (LABEL8,'5',PullDown3);
    XtAddCallback (Label3C, XmNactivateCallback, ViewHelp, NULL);

}

/***********************************************************/
Widget GetWidgetList (widget_name)
char *widget_name;
{
  int i = 0;
  Widget widget;
  int           n = 0;
  Arg           args[MAX_ARGS];
  XmString      tcs;

  /* let's find the position of the widget list */

  while (strcmp (widgetlist [i], "END")) {
    if (!strcmp (widgetlist [i], widget_name))
      break;
    i++;
  }

  /* check if we found something useful */
  if (!strcmp (widgetlist [i], "END"))
	 return ((Widget) NULL);

  /* got position in i */
 
  tcs = XmStringLtoRCreate ("This is a test", XmSTRING_DEFAULT_CHARSET);
  XtSetArg (args [n], XmNx, 25); n++;
  XtSetArg (args [n], XmNy, 25); n++;

  switch (i) {
      /* create the widget with WidgetBoard as parent */
      case ARROW_BUTTON:
          widget = XmCreateArrowButton (WidgetBoard, "BBoard", args, n);
          break;
      case BULLETIN_BOARD:
          widget = XmCreateBulletinBoard (WidgetBoard, "BBoard", args, n);
          break;
      case BULLETIN_BOARD_DIALOG:
          widget = XmCreateBulletinBoardDialog (WidgetBoard, "BBoard", args, n);
          break;
      case CASCADE_BUTTON:
          widget = XmCreateCascadeButton (WidgetBoard, "BBoard", args, n);
          break;
      case CASCADE_BUTTON_GADGET:
	  printf ("can't do the thing\n");
	  widget = (Widget) NULL;
          break;
      case COMMAND:
          widget = XmCreateCommand (WidgetBoard, "BBoard", args, n);
          break;
      case DIALOG_SHELL:
          widget = XmCreateDialogShell (WidgetBoard, "BBoard", args, n);
          break;
      case DRAWING_AREA:
          widget = XmCreateDrawingArea (WidgetBoard, "BBoard", args, n);
          break;
      case DRAWN_BUTTON:
          widget = XmCreateDrawnButton (WidgetBoard, "BBoard", args, n);
          break;
      case ERROR_DIALOG:
          widget = XmCreateErrorDialog (WidgetBoard, "BBoard", args, n);
          break;
      case FILE_SELECTION_BOX:
          widget = XmCreateFileSelectionBox (WidgetBoard, "BBoard", args, n);
          break;
      case FILE_SELECTION_DIALOG:
          widget = XmCreateFileSelectionDialog (WidgetBoard, "BBoard", args, n);
          break;
      case FORM:
          widget = XmCreateForm (WidgetBoard, "BBoard", args, n);
          break;
      case FORM_DIALOG:
          widget = XmCreateFormDialog (WidgetBoard, "BBoard", args, n);
          break;
      case FRAME:
          widget = XmCreateFrame (WidgetBoard, "BBoard", args, n);
          break;
      case INFORMATION_DIALOG:
          widget = XmCreateInformationDialog (WidgetBoard, "BBoard", args, n);
          break;
      case LABEL:
	  XtSetArg (args [n], XmNlabelString, tcs); n++;
          widget = XmCreateLabel (WidgetBoard, "BBoard", args, n);
          break;
      case LABEL_GADGET:
	  printf ("can't do the label gadget scene\n");
	  widget = (Widget) NULL;
          break;
      case LIST:
          widget = XmCreateList (WidgetBoard, "BBoard", args, n);
          break;
      case MENU_BAR:
          widget = XmCreateMenuBar (WidgetBoard, "BBoard", args, n);
          break;
      case MENU_SHELL:
          widget = XmCreateMenuShell (WidgetBoard, "BBoard", args, n);
          break;
      default:
	    widget = (Widget) NULL;
     
  }
  if (widget != (Widget) NULL) {
    XmStringFree (tcs);
    XtManageChild (widget);
  }
  return (widget);


}

/***********************************************************/
/* support routine to get normal string from XmString */
char *extract_normal_string(cs)
XmString cs;
{

  XmStringContext context;
  XmStringCharSet charset;
  XmStringDirection direction;
  Boolean separator;
  static char *primitive_string;

  XmStringInitContext (&context,cs);
  XmStringGetNextSegment (context,&primitive_string,
			  &charset,&direction,&separator);
  XmStringFreeContext (context);
  return ((char *) primitive_string);
}