Blame demos/unsupported/transfer/list.c

Packit b099d7
/* $XConsortium: list.c /main/5 1995/07/15 20:46:14 drk $ */
Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */ 
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include <Xm/CSText.h>
Packit b099d7
#include <Xm/TransferP.h>
Packit b099d7
#include <errno.h>
Packit b099d7
#include "transfer.h"
Packit b099d7
Packit b099d7
#define MAXT 100
Packit b099d7
#define DEFSTR "<Deferred>"
Packit b099d7
Packit b099d7
extern TransferDataRec datums[];
Packit b099d7
extern unsigned int num_datums;
Packit b099d7
Packit b099d7
static XmString GetItemValue(Widget);
Packit b099d7
static char GetDisplayFormatFromType(Widget, Atom);
Packit b099d7
static void setFormatAndMenu(char);
Packit b099d7
static void SetDisplayTypeFromType(Widget, Atom);
Packit b099d7
Packit b099d7
static Boolean global_set_defer = False;
Packit b099d7
static Atom global_set_type_spec = None;
Packit b099d7
static char global_read_format_spec = 'S';
Packit b099d7
static XtPointer global_value = NULL;
Packit b099d7
static Atom global_type = None;
Packit b099d7
static unsigned long global_length = 0;
Packit b099d7
static int global_format = 8;
Packit b099d7
static Boolean global_deferred = False;
Packit b099d7
static int current_selected_item = -1;
Packit b099d7
Packit b099d7
static Atom type = None;
Packit b099d7
Packit b099d7
void 
Packit b099d7
SetType(Widget w, char *in, XtPointer ignore)
Packit b099d7
{
Packit b099d7
  if (strlen(in) == 0)
Packit b099d7
    global_set_type_spec = XmeGetEncodingAtom(w);
Packit b099d7
  else if (strcmp(in, "NONE") == 0)
Packit b099d7
    global_set_type_spec = None;
Packit b099d7
  else
Packit b099d7
    global_set_type_spec = XInternAtom(XtDisplay(w), in, False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*******************************************************************
Packit b099d7
 * FindRightButton
Packit b099d7
 * 
Packit b099d7
 * picks the correct button for the type option menu to display
Packit b099d7
 * note that the names are ATOMNAME_button,  so it prepends a 
Packit b099d7
 * '*' in front and '_button' after the name before looking up
Packit b099d7
 * the button.
Packit b099d7
 ******************************************************************/
Packit b099d7
Packit b099d7
static Widget 
Packit b099d7
FindRightButton(char* atom_string)
Packit b099d7
{
Packit b099d7
  char buffer[80];
Packit b099d7
Packit b099d7
  strcpy(buffer, "*b_");
Packit b099d7
  strcat(buffer, atom_string);
Packit b099d7
Packit b099d7
  return(XtNameToWidget(toplevel, buffer));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 * ListSelectItem
Packit b099d7
 * 
Packit b099d7
 * this is called when the user selects an item in the list.  It takes
Packit b099d7
 * the type of the item and decides how to display it in the CSText
Packit b099d7
 * widget
Packit b099d7
 *********************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
ListSelectItem(Widget w, XtPointer ignore, XmListCallbackStruct *listcb)
Packit b099d7
{
Packit b099d7
  int index = listcb -> item_position;
Packit b099d7
  Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
Packit b099d7
       XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
Packit b099d7
       XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
Packit b099d7
       XA_MOTIF_CS = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_COMPOUND_STRING, False),
Packit b099d7
       XA_MOTIF_RT = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_RENDER_TABLE, False);
Packit b099d7
  Widget mem = (Widget) NULL;
Packit b099d7
  char *targetname, *typename;
Packit b099d7
  XmString output, tmp;
Packit b099d7
Packit b099d7
  if (index < 1 || index > num_datums) return;
Packit b099d7
Packit b099d7
  index --;
Packit b099d7
Packit b099d7
  current_selected_item = index;
Packit b099d7
  global_type = type = datums[index].type;
Packit b099d7
  global_value = datums[index].value;
Packit b099d7
  global_length = datums[index].length;
Packit b099d7
  global_format = datums[index].format;
Packit b099d7
  global_deferred = datums[index].deferred;
Packit b099d7
Packit b099d7
  /* We create a big string and then place the string into
Packit b099d7
     the display field */
Packit b099d7
Packit b099d7
  /* Target */
Packit b099d7
  /* output = XmStringGenerate("Target: \t", NULL, NULL, NULL); */
Packit b099d7
  output = XmStringCreateLocalized("Target: ");
Packit b099d7
  targetname = GetSafeAtom(XtDisplay(w), datums[index].target);
Packit b099d7
  if (targetname == NULL) targetname = XtNewString("Unknown");
Packit b099d7
  tmp = XmStringCreateLocalized(targetname);
Packit b099d7
  XtFree(targetname);
Packit b099d7
  output = XmStringConcatAndFree(output, tmp);
Packit b099d7
  output = XmStringConcatAndFree(output, XmStringSeparatorCreate());
Packit b099d7
Packit b099d7
  /* Type */
Packit b099d7
  /* tmp = XmStringGenerate("Type: \t", NULL, NULL, NULL); */
Packit b099d7
  tmp = XmStringCreateLocalized("Type: ");
Packit b099d7
  output = XmStringConcatAndFree(output, tmp);
Packit b099d7
  typename = GetSafeAtom(XtDisplay(w), datums[index].type);
Packit b099d7
  if (typename == NULL) typename = XtNewString("Unknown");
Packit b099d7
  tmp = XmStringCreateLocalized(typename);
Packit b099d7
  XtFree(typename);
Packit b099d7
  output = XmStringConcatAndFree(output, tmp);
Packit b099d7
  output = XmStringConcatAndFree(output, XmStringSeparatorCreate());
Packit b099d7
Packit b099d7
  /* Value display */
Packit b099d7
  /* tmp = XmStringGenerate("Value: \t", NULL, NULL, NULL); */
Packit b099d7
  tmp = XmStringCreateLocalized("Value: ");
Packit b099d7
  output = XmStringConcatAndFree(output, tmp);
Packit b099d7
  tmp = GetItemValue(text_display);
Packit b099d7
  output = XmStringConcatAndFree(output, tmp);
Packit b099d7
Packit b099d7
  /* Put value into display */
Packit b099d7
  XmCSTextSetString(text_display, output);
Packit b099d7
  XmStringFree(output);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 * EditItem
Packit b099d7
 * 
Packit b099d7
 * This is called from the Properties or New menu item.  If param
Packit b099d7
 * is 0 then this is a new item.
Packit b099d7
 *********************************************************************/
Packit b099d7
Packit b099d7
void 
Packit b099d7
EditItem(Widget w, int param, XtPointer ignore)
Packit b099d7
{
Packit b099d7
  int index = current_selected_item;
Packit b099d7
  Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
Packit b099d7
       XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
Packit b099d7
       XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
Packit b099d7
       XA_MOTIF_CS = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_COMPOUND_STRING, False),
Packit b099d7
       XA_MOTIF_RT = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_RENDER_TABLE, False);
Packit b099d7
  Widget mem = (Widget) NULL;
Packit b099d7
  char *targetname;
Packit b099d7
  XmString tmp;
Packit b099d7
Packit b099d7
  if (index >= num_datums) return;
Packit b099d7
Packit b099d7
  global_type = type = datums[index].type;
Packit b099d7
  global_value = datums[index].value;
Packit b099d7
  global_length = datums[index].length;
Packit b099d7
  global_format = datums[index].format;
Packit b099d7
  global_deferred = datums[index].deferred;
Packit b099d7
  global_set_defer = global_deferred;
Packit b099d7
  global_set_type_spec = global_type;
Packit b099d7
  global_read_format_spec = 'S';
Packit b099d7
Packit b099d7
  if (param != 0) {
Packit b099d7
    /* Put name of target into display field */
Packit b099d7
    targetname = GetSafeAtom(XtDisplay(w), datums[index].target);
Packit b099d7
    
Packit b099d7
    if (targetname == NULL) targetname = XtNewString("Unknown");
Packit b099d7
Packit b099d7
    tmp = XmStringCreateLocalized(targetname);
Packit b099d7
    XmCSTextSetString(text2, tmp);
Packit b099d7
    XmStringFree(tmp);
Packit b099d7
    tmp = GetItemValue(text1);
Packit b099d7
    XmCSTextSetString(text1, tmp);
Packit b099d7
    XmStringFree(tmp);
Packit b099d7
    XtFree(targetname);
Packit b099d7
    SetDisplayTypeFromType(text1, global_type);
Packit b099d7
    global_read_format_spec = GetDisplayFormatFromType(text1, global_type);
Packit b099d7
    setFormatAndMenu(global_read_format_spec);
Packit b099d7
    XmToggleButtonGadgetSetState(defer, global_deferred, False);
Packit b099d7
  } else {
Packit b099d7
    tmp = XmStringCreateLocalized("");
Packit b099d7
    XmCSTextSetString(text1, tmp);
Packit b099d7
    XmCSTextSetString(text2, tmp);
Packit b099d7
    SetDisplayTypeFromType(text1, XA_STRING);
Packit b099d7
    setFormatAndMenu('S');
Packit b099d7
    XmToggleButtonGadgetSetState(defer, False, False);
Packit b099d7
  }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
static char 
Packit b099d7
GetDisplayFormatFromType(Widget w, Atom type)
Packit b099d7
{
Packit b099d7
  Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
Packit b099d7
       XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
Packit b099d7
       XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
Packit b099d7
       XA_MOTIF_CS = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_COMPOUND_STRING, False),
Packit b099d7
       XA_MOTIF_RT = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_RENDER_TABLE, False);
Packit b099d7
Packit b099d7
  if (type == XA_ATOM ||
Packit b099d7
      type == XInternAtom(XtDisplay(w), "ATOM_PAIR", False) ||
Packit b099d7
      type == XA_INTEGER || type == XA_PIXEL ||
Packit b099d7
      type == XInternAtom(XtDisplay(w), "SPAN", False)) {
Packit b099d7
    return('D');
Packit b099d7
  } else if (type == XA_STRING) {
Packit b099d7
    return('S');
Packit b099d7
  } else if (type == XA_COMPOUND_TEXT) {
Packit b099d7
    return('T');
Packit b099d7
  } else if (type == XA_LOCALE_TEXT) {
Packit b099d7
    return('L');
Packit b099d7
  } else if (type == XA_DRAWABLE || type == XA_WINDOW ||
Packit b099d7
	     type == XA_COLORMAP) {
Packit b099d7
    return('H');
Packit b099d7
  } else if (type == XA_MOTIF_CS) {
Packit b099d7
    return('C');
Packit b099d7
  } else if (type == XmeGetEncodingAtom(w)) {
Packit b099d7
    return('L');
Packit b099d7
  } else {
Packit b099d7
    return('H');
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetDisplayTypeFromType(Widget w, Atom type)
Packit b099d7
{
Packit b099d7
  Atom XA_COMPOUND_TEXT = XInternAtom(XtDisplay(w), XmSCOMPOUND_TEXT, False),
Packit b099d7
       XA_PIXEL = XInternAtom(XtDisplay(w), "PIXEL", False),
Packit b099d7
       XA_LOCALE_TEXT = XmeGetEncodingAtom(w),
Packit b099d7
       XA_MOTIF_CS = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_COMPOUND_STRING, False),
Packit b099d7
       XA_MOTIF_RT = XInternAtom(XtDisplay(w), 
Packit b099d7
				 XmS_MOTIF_RENDER_TABLE, False);
Packit b099d7
  Widget mem;
Packit b099d7
Packit b099d7
  if (type == XA_ATOM ||
Packit b099d7
      type == XInternAtom(XtDisplay(w), "ATOM_PAIR", False)) {
Packit b099d7
    char str[80];
Packit b099d7
    mem = FindRightButton("ATOM");
Packit b099d7
  } else if (type == XA_INTEGER || type == XA_PIXEL) {
Packit b099d7
    if (type == XA_INTEGER)
Packit b099d7
      mem = FindRightButton("INTEGER");
Packit b099d7
    else
Packit b099d7
      mem = FindRightButton("PIXEL");
Packit b099d7
  } else if (type == XInternAtom(XtDisplay(w), "SPAN", False)) {
Packit b099d7
    mem = FindRightButton("SPAN");
Packit b099d7
  } else if (type == XA_STRING) {
Packit b099d7
    mem = FindRightButton("STRING");
Packit b099d7
  } else if (type == XA_COMPOUND_TEXT) {
Packit b099d7
    char *str;
Packit b099d7
    mem = FindRightButton("COMPOUND_TEXT");
Packit b099d7
  } else if (type == XA_LOCALE_TEXT) {
Packit b099d7
    mem = FindRightButton("LOCALE_TEXT");
Packit b099d7
  } else if (type == XA_DRAWABLE || type == XA_WINDOW ||
Packit b099d7
	     type == XA_COLORMAP) {
Packit b099d7
    if (type == XA_DRAWABLE)
Packit b099d7
      mem = FindRightButton("DRAWABLE");
Packit b099d7
    else if (type == XA_COLORMAP)
Packit b099d7
      mem = FindRightButton("COLORMAP");
Packit b099d7
    else
Packit b099d7
      mem = FindRightButton("WINDOW");
Packit b099d7
  } else if (type == XA_MOTIF_CS) {
Packit b099d7
    mem = FindRightButton("_MOTIF_COMPOUND_STRING");
Packit b099d7
  } else if (type == XmeGetEncodingAtom(w)) {
Packit b099d7
    mem = FindRightButton("LOCALE");
Packit b099d7
  } else {
Packit b099d7
    char *typestring;
Packit b099d7
    char buffer[80];
Packit b099d7
Packit b099d7
    mem = FindRightButton("unknown");
Packit b099d7
Packit b099d7
    typestring = GetSafeAtom(XtDisplay(w), type);
Packit b099d7
    sprintf(buffer, "Unknown type %s (%d) found", typestring, type);
Packit b099d7
    XFree(typestring);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  if (mem != (Widget) NULL)
Packit b099d7
    XtVaSetValues(typeOM, XmNmenuHistory, mem, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void
Packit b099d7
setFormatAndMenu(char in)
Packit b099d7
{
Packit b099d7
  Widget mem = (Widget) NULL;
Packit b099d7
Packit b099d7
  if (in == 'S') {
Packit b099d7
    /* C String display */
Packit b099d7
    mem = format_s;
Packit b099d7
  } else if (in == 'L') {
Packit b099d7
    /* Locale Text display */
Packit b099d7
    mem = format_l;
Packit b099d7
  } else if (in == 'T') {
Packit b099d7
    /* Compound Text display */
Packit b099d7
    mem = format_t;
Packit b099d7
  } else if (in == 'C') {
Packit b099d7
    /* Compound String display */
Packit b099d7
    mem = format_cs;
Packit b099d7
  } else if (in == 'D') {
Packit b099d7
    /* Decimal display */
Packit b099d7
    mem = format_id;
Packit b099d7
  } else {
Packit b099d7
    /* Hex display */
Packit b099d7
    mem = format_ih;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  SetFormat(NULL, in, NULL);
Packit b099d7
Packit b099d7
  if (mem != (Widget) NULL)
Packit b099d7
    XtVaSetValues(format_om, XmNmenuHistory, mem, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
char *output_buffer = NULL;
Packit b099d7
int output_buffer_max = 0;
Packit b099d7
int output_buffer_current = 0;
Packit b099d7
Packit b099d7
void ClearOB() 
Packit b099d7
{
Packit b099d7
  output_buffer_current = 0;
Packit b099d7
  if (output_buffer_max > 0)
Packit b099d7
    output_buffer[0] = 0;
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
AppendOB(char *str)
Packit b099d7
{
Packit b099d7
  int len;
Packit b099d7
  int i;
Packit b099d7
Packit b099d7
  len = strlen(str);
Packit b099d7
  while(len + output_buffer_current > output_buffer_max) {
Packit b099d7
    if (output_buffer_max == 0) {
Packit b099d7
      output_buffer_max = 256;
Packit b099d7
      output_buffer = XtMalloc(output_buffer_max);
Packit b099d7
    } else {
Packit b099d7
      output_buffer_max *= 2;
Packit b099d7
      output_buffer = XtRealloc(output_buffer, output_buffer_max);
Packit b099d7
    }
Packit b099d7
  }
Packit b099d7
Packit b099d7
  /* Copy data */
Packit b099d7
  for(i = 0; i <= len; i++)
Packit b099d7
    output_buffer[output_buffer_current + i] = str[i];
Packit b099d7
Packit b099d7
  /* Update end pointer */
Packit b099d7
  output_buffer_current += len;
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
SetFormat(Widget w, char in, XtPointer ignore)
Packit b099d7
{
Packit b099d7
  int byte_length;
Packit b099d7
  XmString strtmp;
Packit b099d7
Packit b099d7
  global_read_format_spec = in;
Packit b099d7
}
Packit b099d7
Packit b099d7
static 
Packit b099d7
XmString GetItemValue(Widget w)
Packit b099d7
{
Packit b099d7
  int byte_length;
Packit b099d7
  XmString strtmp;
Packit b099d7
  char in;
Packit b099d7
Packit b099d7
  byte_length = global_length * global_format / 8;
Packit b099d7
Packit b099d7
  in = GetDisplayFormatFromType(w, global_type);
Packit b099d7
Packit b099d7
  if (in == 'S') {
Packit b099d7
    /* C String display */
Packit b099d7
    strtmp = XmStringCreateLocalized(global_value);
Packit b099d7
  } else if (in == 'L') {
Packit b099d7
    /* Locale Text display */
Packit b099d7
    strtmp = XmStringCreateLocalized(global_value);
Packit b099d7
  } else if (in == 'T') {
Packit b099d7
    /* Compound Text display */
Packit b099d7
    strtmp = XmCvtCTToXmString(global_value);
Packit b099d7
  } else if (in == 'C') {
Packit b099d7
    /* Compound String display */
Packit b099d7
    strtmp = XmCvtByteStreamToXmString(global_value);
Packit b099d7
  } else if (in == 'D') {
Packit b099d7
    /* Decimal display */
Packit b099d7
    int count, i;
Packit b099d7
Packit b099d7
    count = byte_length / 4; 
Packit b099d7
    ClearOB();
Packit b099d7
    for(i = 0; i < count; i++) {
Packit b099d7
      char buf[32];
Packit b099d7
Packit b099d7
      sprintf(buf, "%d ", ((int *) global_value)[i]);
Packit b099d7
      AppendOB(buf);
Packit b099d7
    }
Packit b099d7
    strtmp = XmStringCreateLocalized(output_buffer);
Packit b099d7
  } else {
Packit b099d7
    /* Decimal display */
Packit b099d7
    int count, i;
Packit b099d7
Packit b099d7
    count = byte_length / 4; 
Packit b099d7
    ClearOB();
Packit b099d7
    for(i = 0; i < count; i++) {
Packit b099d7
      char buf[32];
Packit b099d7
Packit b099d7
      sprintf(buf, "0x%x ", ((int *) global_value)[i]);
Packit b099d7
      AppendOB(buf);
Packit b099d7
    }
Packit b099d7
    strtmp = XmStringCreateLocalized(output_buffer);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  return(strtmp);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*******************************************************************
Packit b099d7
 * SetValue
Packit b099d7
 *
Packit b099d7
 * No,  it's not a widget method.  This SetValue implements an action
Packit b099d7
 * which takes the current value in the interface and stores it away
Packit b099d7
 * for that particular target.  This allows arbitrary data to be stored
Packit b099d7
 * into the data array for later transfer.
Packit b099d7
 *******************************************************************/
Packit b099d7
void
Packit b099d7
SetValue(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
Packit b099d7
{
Packit b099d7
  XmString value;
Packit b099d7
  XmString target_name;
Packit b099d7
  char *type_widget_name;
Packit b099d7
  char *display_format_widget_name;
Packit b099d7
  char *target_string;
Packit b099d7
  Widget mem_history;
Packit b099d7
  Arg args[1];
Packit b099d7
  int index;
Packit b099d7
  int base;
Packit b099d7
  Atom target;
Packit b099d7
  
Packit b099d7
  target_name = XmCSTextGetString(text2);
Packit b099d7
  value = XmCSTextGetString(text1);
Packit b099d7
  
Packit b099d7
  if (global_set_type_spec == None) return;
Packit b099d7
Packit b099d7
  /* Get the target string from the XmString */
Packit b099d7
  target_string = ConvertXmStringToString(target_name);
Packit b099d7
  target = XInternAtom(XtDisplay(widget), target_string, False);
Packit b099d7
  XtFree(target_string);
Packit b099d7
  
Packit b099d7
  /* Find the index of this target,  or add it to the end */
Packit b099d7
  for(index = 0; index < num_datums; index++)
Packit b099d7
    if (datums[index].target == target) break;
Packit b099d7
Packit b099d7
  /* Add to the end,  if this is a new target */
Packit b099d7
  if (index == num_datums) {
Packit b099d7
    XmListAddItemUnselected(list, target_name, 0);
Packit b099d7
    datums[index].target = target;
Packit b099d7
    num_datums++;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  /* Handle deferred */
Packit b099d7
  if (datums[index].deferred != global_set_defer) {
Packit b099d7
    XmString new_item[1];
Packit b099d7
    datums[index].deferred = global_set_defer;
Packit b099d7
Packit b099d7
    if (datums[index].deferred) {
Packit b099d7
      char *buffer;
Packit b099d7
Packit b099d7
      buffer = XtMalloc(strlen(target_string) + 2 + strlen(DEFSTR));
Packit b099d7
      strcpy(buffer, target_string);
Packit b099d7
      strcat(buffer, "\t");
Packit b099d7
      strcat(buffer, DEFSTR);
Packit b099d7
      new_item[0] = XmStringGenerate(buffer, NULL, XmCHARSET_TEXT, NULL);
Packit b099d7
      XtFree(buffer);
Packit b099d7
    } else
Packit b099d7
      new_item[0] = XmStringCopy(target_name);
Packit b099d7
Packit b099d7
    XmListReplaceItemsPos(list, new_item, 1, index + 1);
Packit b099d7
    XmListSelectPos(list, index + 1, False);
Packit b099d7
    XmStringFree(new_item[0]);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  datums[index].type = global_set_type_spec;
Packit b099d7
  
Packit b099d7
  /* Convert the value */
Packit b099d7
  if (global_read_format_spec == 'S') {
Packit b099d7
    datums[index].value = ConvertXmStringToString(value);
Packit b099d7
    if (datums[index].value != NULL) {
Packit b099d7
      datums[index].length = strlen(datums[index].value);
Packit b099d7
    } else {
Packit b099d7
      datums[index].length = 0;
Packit b099d7
    }
Packit b099d7
    datums[index].format = 8;
Packit b099d7
  } else if (global_read_format_spec == 'L') {
Packit b099d7
    char *ctext;
Packit b099d7
    char *ltext = NULL;
Packit b099d7
    Atom COMPOUND_TEXT = XInternAtom(XtDisplay(widget), 
Packit b099d7
				     XmSCOMPOUND_TEXT, False);
Packit b099d7
    XTextProperty text_prop;
Packit b099d7
    int status;
Packit b099d7
    char ** values;
Packit b099d7
    int num_values = 0;
Packit b099d7
    int malloc_size = 0;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    ctext = XmCvtXmStringToCT(value);
Packit b099d7
Packit b099d7
    text_prop.value = (unsigned char *) ctext;
Packit b099d7
    text_prop.encoding = COMPOUND_TEXT;
Packit b099d7
    text_prop.format = 8;
Packit b099d7
    text_prop.nitems = strlen(ctext);
Packit b099d7
Packit b099d7
    status = XmbTextPropertyToTextList(XtDisplay(widget), &text_prop, &values,
Packit b099d7
				       &num_values);
Packit b099d7
Packit b099d7
    XtFree(ctext);
Packit b099d7
Packit b099d7
    if (num_values) { 
Packit b099d7
      for (i = 0; i < num_values ; i++)
Packit b099d7
	malloc_size += strlen(values[i]);
Packit b099d7
Packit b099d7
      ltext = XtMalloc ((unsigned) malloc_size + 1);
Packit b099d7
      ltext[0] = '\0';
Packit b099d7
      for (i = 0; i < num_values ; i++)
Packit b099d7
	strcat(ltext, values[i]);
Packit b099d7
      XFreeStringList(values);
Packit b099d7
    } else {
Packit b099d7
      ltext = XtNewString("");
Packit b099d7
    }
Packit b099d7
Packit b099d7
    datums[index].value = ltext;
Packit b099d7
    datums[index].length = malloc_size;
Packit b099d7
    datums[index].format = 8;
Packit b099d7
  } else if (global_read_format_spec == 'T') {
Packit b099d7
    datums[index].value = XmCvtXmStringToCT(value);
Packit b099d7
    if (datums[index].value != NULL) {
Packit b099d7
      datums[index].length = strlen(datums[index].value);
Packit b099d7
    } else {
Packit b099d7
      datums[index].length = 0;
Packit b099d7
    }
Packit b099d7
    datums[index].format = 8;
Packit b099d7
  } else if (global_read_format_spec == 'C') {
Packit b099d7
    datums[index].length = 
Packit b099d7
      XmCvtXmStringToByteStream(value, 
Packit b099d7
				(unsigned char **) &datums[index].value);
Packit b099d7
    datums[index].format = 8;
Packit b099d7
  } else if (global_read_format_spec == 'D' ||
Packit b099d7
	     global_read_format_spec == 'H') {
Packit b099d7
    /* Doesn't matter,  the numbers contain the base information.
Packit b099d7
       We assume a string with whitespace separating the values. */
Packit b099d7
    int max_values = 5;
Packit b099d7
    long *array = (long *) XtMalloc(sizeof(long) * max_values);
Packit b099d7
    int count = 0;
Packit b099d7
    char *convert;
Packit b099d7
    char *current;
Packit b099d7
    char *end;
Packit b099d7
    Boolean done = False;
Packit b099d7
    
Packit b099d7
    convert = ConvertXmStringToString(value);
Packit b099d7
    current = convert;
Packit b099d7
Packit b099d7
    if (global_read_format_spec == 'H')
Packit b099d7
      base = 16;
Packit b099d7
    else
Packit b099d7
      base = 0;
Packit b099d7
Packit b099d7
    while(! done) {
Packit b099d7
      /* Realloc array if getting too big */
Packit b099d7
      if (count >= max_values) {
Packit b099d7
	max_values += 5;
Packit b099d7
	array = (long *) XtRealloc((char*) array, sizeof(long) * max_values);
Packit b099d7
      }
Packit b099d7
      if (current == 0) break;
Packit b099d7
      /* Now grab the next number */
Packit b099d7
      array[count++] = strtol(current, &end, base);
Packit b099d7
      if (current == end || errno == ERANGE) {
Packit b099d7
	done = True;
Packit b099d7
	count--;
Packit b099d7
      } else 
Packit b099d7
	current = end;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    datums[index].value = (XtPointer) array;
Packit b099d7
    datums[index].length = count;
Packit b099d7
    datums[index].format = 32;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  XmStringFree(target_name);
Packit b099d7
  XmStringFree(value);
Packit b099d7
  XmListSelectPos(list, index + 1, True);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*******************************************************************
Packit b099d7
 * RemoveValue
Packit b099d7
 *
Packit b099d7
 * This removes an element from the data array.
Packit b099d7
 *******************************************************************/
Packit b099d7
void 
Packit b099d7
RemoveValue(Widget widget, char *ignore, XmAnyCallbackStruct *callback_data)
Packit b099d7
{
Packit b099d7
  if (current_selected_item < 0 ||
Packit b099d7
      current_selected_item >= num_datums) {
Packit b099d7
    XBell(XtDisplay(widget), 100);
Packit b099d7
  } else {
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    /* Free current value pointed at */
Packit b099d7
    XtFree(datums[current_selected_item].value);
Packit b099d7
Packit b099d7
    num_datums--;
Packit b099d7
    /* Remove item from internal list */
Packit b099d7
    for(i = current_selected_item; i < num_datums; i++)
Packit b099d7
      datums[i] = datums[i + 1];
Packit b099d7
Packit b099d7
    /* Remove from screen display */
Packit b099d7
    XmListDeletePos(list, current_selected_item + 1);
Packit b099d7
    /* Now update the display with the new value */
Packit b099d7
    if (current_selected_item < num_datums)
Packit b099d7
      XmListSelectPos(list, current_selected_item + 1, True);
Packit b099d7
    else if (num_datums > 0)
Packit b099d7
      XmListSelectPos(list, current_selected_item, True);
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
deferCB(Widget widget, char *ignore,
Packit b099d7
	XmToggleButtonCallbackStruct *callback_data)
Packit b099d7
{
Packit b099d7
  char *targetname;
Packit b099d7
  XmString new_item[1];
Packit b099d7
Packit b099d7
  global_set_defer = callback_data -> set;
Packit b099d7
}
Packit b099d7
Packit b099d7
XmParseMapping table[2];
Packit b099d7
int table_size = -1;
Packit b099d7
Packit b099d7
char*
Packit b099d7
ConvertXmStringToString(XmString xmstr)
Packit b099d7
{
Packit b099d7
  char *rvalue;
Packit b099d7
Packit b099d7
  if (table_size < 0) {
Packit b099d7
    XmString tmp;
Packit b099d7
    int nargs;
Packit b099d7
    Arg args[10];
Packit b099d7
Packit b099d7
    table_size = 0;
Packit b099d7
    tmp = XmStringComponentCreate(XmSTRING_COMPONENT_TAB, 0, NULL);
Packit b099d7
    nargs = 0;
Packit b099d7
    XtSetArg(args[nargs], XmNincludeStatus, XmINSERT), nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNsubstitute, tmp), 	 nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNpattern, "\t"), 		 nargs++;
Packit b099d7
    table[table_size++] = XmParseMappingCreate(args, nargs);
Packit b099d7
    XmStringFree(tmp);
Packit b099d7
Packit b099d7
    tmp = XmStringSeparatorCreate();
Packit b099d7
    nargs = 0;
Packit b099d7
    XtSetArg(args[nargs], XmNincludeStatus, XmINSERT), nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNsubstitute, tmp),	 nargs++;
Packit b099d7
    XtSetArg(args[nargs], XmNpattern, "\n"),		 nargs++;
Packit b099d7
    table[table_size++] = XmParseMappingCreate(args, nargs);
Packit b099d7
Packit b099d7
    XmStringFree(tmp);
Packit b099d7
  }
Packit b099d7
Packit b099d7
  rvalue = (char *) XmStringUnparse(xmstr, NULL, 
Packit b099d7
				    XmMULTIBYTE_TEXT, XmMULTIBYTE_TEXT,
Packit b099d7
				    table, table_size, XmOUTPUT_ALL);
Packit b099d7
Packit b099d7
  return(rvalue);
Packit b099d7
}