#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/AsciiSrc.h>

#include "xznol.h"
#include "file.h"

static XContext itable = 0;
static XContext iuser = 0;

/*ARGSUSED*/
static void unhash(Widget w, XtPointer client, XtPointer call)
{
   XDeleteContext(XtDisplay(w), (XID) w, itable);
   XDeleteContext(XtDisplay(w), (XID) w, iuser);
}

Widget make_user_table_text(Widget parent, char *name,
			    user *user, table *table)
{
   char *info;
   Widget w;
   int sensitive = 1;

   if (!table) {
      info = "No such table";
      sensitive = 0;
   } else if (user) {
      info = get_user_info_from_table(table, user);
      if (!info) info = "No info specified";
   } else {
      info = "No user specified";
      sensitive = 0;
   }

   w = XtVaCreateManagedWidget(name, asciiTextWidgetClass, parent,
			       XtNstring, info,
			       XtNtype, XawAsciiString,
			       XtNsensitive, sensitive,
			       NULL);

   if (!user) return(w);

   if (itable == 0) itable = XUniqueContext();
   if (XSaveContext(XtDisplay(w), (XID) w, itable, (caddr_t) table))
      abort();

   if (iuser == 0) iuser = XUniqueContext();
   if (XSaveContext(XtDisplay(w), (XID) w, iuser, (caddr_t) user))
      abort();

   XtAddCallback(w, XtNdestroyCallback, unhash, NULL);

   return(w);
}

void save_user_table_text(Widget w)
{
   table *t;
   user *u;
   char *i;

   if (XFindContext(XtDisplay(w), (XID) w, itable, (caddr_t *) &t) ||
       XFindContext(XtDisplay(w), (XID) w, iuser, (caddr_t *) &u))
      return;

   XtVaGetValues(XawTextGetSource(w), XtNstring, &i, NULL);

   save_info(t, u, i);

   XawAsciiSourceFreeString(XawTextGetSource(w));
}
