Blame dialogboxes.c

Packit 4d380f
/* simple dialog boxes, used by both whiptail and tcl dialog bindings */
Packit 4d380f
Packit 4d380f
#include "config.h"
Packit 4d380f
#include <fcntl.h>
Packit 4d380f
#include <stdio.h>
Packit 4d380f
#include <string.h>
Packit 4d380f
#include <stdlib.h>
Packit 4d380f
#include <unistd.h>
Packit 4d380f
#include <wchar.h>
Packit 4d380f
#include <slang.h>
Packit 4d380f
Packit 4d380f
#include "nls.h"
Packit 4d380f
#include "dialogboxes.h"
Packit 4d380f
#include "newt.h"
Packit 4d380f
#include "newt_pr.h"
Packit 4d380f
#include "popt.h"
Packit 4d380f
Packit 4d380f
#define MAXBUF    200
Packit 4d380f
#define MAXFORMAT 20
Packit 4d380f
#define BUTTONS   4
Packit 4d380f
Packit 4d380f
/* globals -- ick */
Packit 4d380f
static int buttonHeight = 1;
Packit 4d380f
static const char * buttonText[BUTTONS];
Packit 4d380f
Packit 4d380f
int max (int a, int b)
Packit 4d380f
{
Packit 4d380f
	return (a > b) ? a : b;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int min (int a, int b)
Packit 4d380f
{
Packit 4d380f
	return ( a < b) ? a : b ;
Packit 4d380f
}
Packit 4d380f
 
Packit 4d380f
static newtComponent (*makeButton)(int left, int right, const char * text) = 
Packit 4d380f
		newtCompactButton;
Packit 4d380f
Packit 4d380f
static const char * getButtonText(int button) {
Packit 4d380f
    const char * text;
Packit 4d380f
    if (button < 0 || button >= BUTTONS)
Packit 4d380f
	return NULL;
Packit 4d380f
Packit 4d380f
    text = buttonText[button];
Packit 4d380f
    if (text)
Packit 4d380f
	return text;
Packit 4d380f
Packit 4d380f
    switch (button) {
Packit 4d380f
	case 0: return dgettext(PACKAGE, "Ok");
Packit 4d380f
	case 1: return dgettext(PACKAGE, "Cancel");
Packit 4d380f
	case 2: return dgettext(PACKAGE, "Yes");
Packit 4d380f
	case 3: return dgettext(PACKAGE, "No");
Packit 4d380f
	default:
Packit 4d380f
		return NULL;
Packit 4d380f
    }
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
static void addButtons(int height, int width, newtComponent form, 
Packit 4d380f
		       newtComponent * okay, newtComponent * cancel, 
Packit 4d380f
		       int flags) {
Packit 4d380f
	// FIXME: DO SOMETHING ABOUT THE HARD-CODED CONSTANTS
Packit 4d380f
    if (flags & FLAG_NOCANCEL) {
Packit 4d380f
	   *okay = makeButton((width - 8) / 2, height - buttonHeight - 1,
Packit 4d380f
			      getButtonText(BUTTON_OK));
Packit 4d380f
	    *cancel = NULL;
Packit 4d380f
	newtFormAddComponent(form, *okay);
Packit 4d380f
    } else {
Packit 4d380f
	*okay = makeButton((width - 18) / 3, height - buttonHeight - 1, 
Packit 4d380f
			   getButtonText(BUTTON_OK));
Packit 4d380f
	*cancel = makeButton(((width - 18) / 3) * 2 + 9, 
Packit 4d380f
				height - buttonHeight - 1, 
Packit 4d380f
				getButtonText(BUTTON_CANCEL));
Packit 4d380f
	newtFormAddComponents(form, *okay, *cancel, NULL);
Packit 4d380f
    }
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
static void cleanNewlines(char *text)
Packit 4d380f
{
Packit 4d380f
    char *p, *q;
Packit 4d380f
Packit 4d380f
    for (p = q = text; *p; p++, q++)
Packit 4d380f
        if (*p == '\\' && p[1] == 'n') {
Packit 4d380f
            p++;
Packit 4d380f
            *q = '\n';
Packit 4d380f
        } else
Packit 4d380f
            *q = *p;
Packit 4d380f
    *q = '\0';
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
static newtComponent textbox(int maxHeight, int width, const char * text,
Packit 4d380f
			int flags, int * height) {
Packit 4d380f
    newtComponent tb;
Packit 4d380f
    int sFlag = (flags & FLAG_SCROLL_TEXT) ? NEWT_FLAG_SCROLL : 0;
Packit 4d380f
    int i;
Packit 4d380f
    char *buf;
Packit 4d380f
Packit 4d380f
    buf = alloca(strlen(text) + 1);
Packit 4d380f
    strcpy(buf, text);
Packit 4d380f
    cleanNewlines(buf);
Packit 4d380f
Packit 4d380f
    tb = newtTextbox(1, 0, width, maxHeight, NEWT_FLAG_WRAP | sFlag);
Packit 4d380f
    newtTextboxSetText(tb, buf);
Packit 4d380f
Packit 4d380f
    i = newtTextboxGetNumLines(tb);
Packit 4d380f
    if (i < maxHeight) {
Packit 4d380f
	newtTextboxSetHeight(tb, i);
Packit 4d380f
	maxHeight = i;
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    *height = maxHeight;
Packit 4d380f
Packit 4d380f
    return tb;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int gauge(const char * text, int height, int width, poptContext optCon, int fd, 
Packit 4d380f
		int flags) {
Packit 4d380f
    newtComponent form, scale, tb;
Packit 4d380f
    int top;
Packit 4d380f
    const char * arg;
Packit 4d380f
    char * end;
Packit 4d380f
    int val;
Packit 4d380f
    FILE * f = fdopen(fd, "r");
Packit 4d380f
    char buf[3000];
Packit 4d380f
    char buf3[50];
Packit 4d380f
    int i;
Packit 4d380f
Packit 4d380f
    setlinebuf(f);
Packit 4d380f
Packit 4d380f
    if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
    val = strtoul(arg, &end, 10);
Packit 4d380f
    if (*end) return DLG_ERROR;
Packit 4d380f
Packit 4d380f
    tb = textbox(height - 3, width - 2, text, flags, &top);
Packit 4d380f
Packit 4d380f
    form = newtForm(NULL, NULL, 0);
Packit 4d380f
Packit 4d380f
    scale = newtScale(2, height - 2, width - 4, 100);
Packit 4d380f
    newtScaleSet(scale, val);
Packit 4d380f
Packit 4d380f
    newtFormAddComponents(form, tb, scale, NULL);
Packit 4d380f
Packit 4d380f
    newtDrawForm(form);
Packit 4d380f
    newtRefresh();
Packit 4d380f
Packit 4d380f
    do {
Packit 4d380f
	if (!fgets(buf, sizeof(buf) - 1, f))
Packit 4d380f
	    continue;
Packit 4d380f
	buf[strlen(buf) - 1] = '\0';
Packit 4d380f
Packit 4d380f
	if (!strcmp(buf, "XXX")) {
Packit 4d380f
	    while (!fgets(buf3, sizeof(buf3) - 1, f) && !feof(f))
Packit 4d380f
		;
Packit 4d380f
	    if (feof(f))
Packit 4d380f
		break;
Packit 4d380f
	    buf3[strlen(buf3) - 1] = '\0';
Packit 4d380f
Packit 4d380f
	    i = 0;
Packit 4d380f
	    do {
Packit 4d380f
		if (!fgets(buf + i, sizeof(buf) - 1 - i, f))
Packit 4d380f
		    continue;
Packit 4d380f
		if (!strcmp(buf + i, "XXX\n")) {
Packit 4d380f
		    *(buf + i) = '\0';
Packit 4d380f
		    break;
Packit 4d380f
		}
Packit 4d380f
		i = strlen(buf);
Packit 4d380f
	    } while (!feof(f));
Packit 4d380f
Packit 4d380f
	    if (i > 0)
Packit 4d380f
		buf[strlen(buf) - 1] = '\0';
Packit 4d380f
	    else
Packit 4d380f
		buf[0] = '\0';
Packit 4d380f
Packit 4d380f
	    cleanNewlines(buf);
Packit 4d380f
	    newtTextboxSetText(tb, buf);
Packit 4d380f
Packit 4d380f
	    arg = buf3;
Packit 4d380f
	} else {
Packit 4d380f
	    arg = buf;
Packit 4d380f
	}
Packit 4d380f
Packit 4d380f
	val = strtoul(arg, &end, 10);
Packit 4d380f
	if (!*end) {
Packit 4d380f
	    newtScaleSet(scale, val);
Packit 4d380f
	    newtDrawForm(form);
Packit 4d380f
	    newtRefresh();
Packit 4d380f
	}
Packit 4d380f
    } while (!feof(f));
Packit 4d380f
Packit 4d380f
    newtFormDestroy(form);
Packit 4d380f
Packit 4d380f
    return DLG_OKAY;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int inputBox(const char * text, int height, int width, poptContext optCon, 
Packit 4d380f
		int flags, char ** result) {
Packit 4d380f
    newtComponent form, entry, okay, cancel, answer, tb;
Packit 4d380f
    const char * val;
Packit 4d380f
    int pFlag = (flags & FLAG_PASSWORD) ? NEWT_FLAG_PASSWORD : 0;
Packit 4d380f
    int rc = DLG_OKAY;
Packit 4d380f
    int top;
Packit 4d380f
Packit 4d380f
    val = poptGetArg(optCon);
Packit 4d380f
    tb = textbox(height - 3 - buttonHeight, width - 2,
Packit 4d380f
			text, flags, &top);
Packit 4d380f
Packit 4d380f
    form = newtForm(NULL, NULL, 0);
Packit 4d380f
    entry = newtEntry(1, top + 1, val, width - 2, &val, 
Packit 4d380f
			NEWT_FLAG_SCROLL | NEWT_FLAG_RETURNEXIT | pFlag);
Packit 4d380f
Packit 4d380f
    newtFormAddComponents(form, tb, entry, NULL);
Packit 4d380f
Packit 4d380f
    addButtons(height, width, form, &okay, &cancel, flags);
Packit 4d380f
Packit 4d380f
    answer = newtRunForm(form);
Packit 4d380f
    *result = NULL;
Packit 4d380f
    if (answer == cancel)
Packit 4d380f
	rc = DLG_CANCEL;
Packit 4d380f
    else if (answer == NULL)
Packit 4d380f
	rc = DLG_ESCAPE;
Packit 4d380f
    else
Packit 4d380f
	*result = strdup(val);
Packit 4d380f
Packit 4d380f
    newtFormDestroy(form);
Packit 4d380f
Packit 4d380f
    return rc;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
static int mystrncpyw(char *dest, const char *src, int n, int *maxwidth)
Packit 4d380f
{
Packit 4d380f
    int i = 0;
Packit 4d380f
    int w = 0, cw;
Packit 4d380f
    wchar_t c;
Packit 4d380f
    mbstate_t ps;
Packit 4d380f
    const char *p = src;
Packit 4d380f
    char *d = dest;
Packit 4d380f
    
Packit 4d380f
    memset(&ps, 0, sizeof(ps));
Packit 4d380f
    
Packit 4d380f
    for (;;) {
Packit 4d380f
	int ret = mbrtowc(&c, p, MB_CUR_MAX, &ps);
Packit 4d380f
	if (ret <= 0) break;
Packit 4d380f
	if (ret + i >= n) break;
Packit 4d380f
	cw = wcwidth(c);
Packit 4d380f
	if (cw < 0) break;
Packit 4d380f
	if (cw + w > *maxwidth) break;
Packit 4d380f
	w += cw;
Packit 4d380f
	memcpy(d, p, ret);
Packit 4d380f
	d += ret;
Packit 4d380f
	p += ret;
Packit 4d380f
	i += ret;
Packit 4d380f
    }
Packit 4d380f
    dest[i] = '\0';
Packit 4d380f
    *maxwidth = w;
Packit 4d380f
    return i;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int listBox(const char * text, int height, int width, poptContext optCon,
Packit 4d380f
		int flags, const char *default_item, char ** result) {
Packit 4d380f
    newtComponent form, okay, tb, answer, listBox;
Packit 4d380f
    newtComponent cancel = NULL;
Packit 4d380f
    const char * arg;
Packit 4d380f
    char * end;
Packit 4d380f
    int listHeight;
Packit 4d380f
    int numItems = 0;
Packit 4d380f
    int allocedItems = 5;
Packit 4d380f
    int i, top;
Packit 4d380f
    int rc = DLG_OKAY;
Packit 4d380f
    char buf[MAXBUF];
Packit 4d380f
    int maxTagWidth = 0;
Packit 4d380f
    int maxTextWidth = 0;
Packit 4d380f
    int defItem = -1;
Packit 4d380f
    int scrollFlag;
Packit 4d380f
    int lineWidth, textWidth, tagWidth;
Packit 4d380f
    struct {
Packit 4d380f
	const char * text;
Packit 4d380f
	const char * tag;
Packit 4d380f
    } * itemInfo = malloc(allocedItems * sizeof(*itemInfo));
Packit 4d380f
Packit 4d380f
    if (itemInfo == NULL) return DLG_ERROR;
Packit 4d380f
    if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
    listHeight = strtoul(arg, &end, 10);
Packit 4d380f
    if (*end) return DLG_ERROR;
Packit 4d380f
Packit 4d380f
    while ((arg = poptGetArg(optCon))) {
Packit 4d380f
	if (allocedItems == numItems) {
Packit 4d380f
	    allocedItems += 5;
Packit 4d380f
	    itemInfo = realloc(itemInfo, sizeof(*itemInfo) * allocedItems);
Packit 4d380f
	    if (itemInfo == NULL) return DLG_ERROR;
Packit 4d380f
	}
Packit 4d380f
Packit 4d380f
	itemInfo[numItems].tag = arg;
Packit 4d380f
	if (default_item && (strcmp(default_item, arg) == 0)) {
Packit 4d380f
	 	defItem = numItems;
Packit 4d380f
	}
Packit 4d380f
	if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
Packit 4d380f
	if (!(flags & FLAG_NOITEM)) {
Packit 4d380f
	    itemInfo[numItems].text = arg;
Packit 4d380f
	} else
Packit 4d380f
	    itemInfo[numItems].text = "";
Packit 4d380f
Packit 4d380f
	if (wstrlen(itemInfo[numItems].text,-1) > (unsigned int)maxTextWidth)
Packit 4d380f
	    maxTextWidth = wstrlen(itemInfo[numItems].text,-1);
Packit 4d380f
	if (wstrlen(itemInfo[numItems].tag,-1) > (unsigned int)maxTagWidth)
Packit 4d380f
	    maxTagWidth = wstrlen(itemInfo[numItems].tag,-1);
Packit 4d380f
Packit 4d380f
	numItems++;
Packit 4d380f
    }
Packit 4d380f
    if (numItems == 0)
Packit 4d380f
	return DLG_ERROR;
Packit 4d380f
Packit 4d380f
    if (flags & FLAG_NOTAGS) {
Packit 4d380f
	    maxTagWidth = 0;
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    form = newtForm(NULL, NULL, 0);
Packit 4d380f
Packit 4d380f
    tb = textbox(height - 4 - buttonHeight - listHeight, width - 2,
Packit 4d380f
			text, flags, &top);
Packit 4d380f
Packit 4d380f
    if (listHeight >= numItems) {
Packit 4d380f
	scrollFlag = 0;
Packit 4d380f
	i = 0;
Packit 4d380f
    } else {
Packit 4d380f
	scrollFlag = NEWT_FLAG_SCROLL;
Packit 4d380f
	i = 2;
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    lineWidth = min(maxTagWidth + maxTextWidth + i + 1, SLtt_Screen_Cols - 6);
Packit 4d380f
    listBox = newtListbox( (width - lineWidth) / 2 , top + 1, listHeight,
Packit 4d380f
                          NEWT_FLAG_RETURNEXIT | scrollFlag);
Packit 4d380f
Packit 4d380f
    textWidth = maxTextWidth;
Packit 4d380f
    tagWidth = maxTagWidth;
Packit 4d380f
    if (maxTextWidth == 0) {
Packit 4d380f
        tagWidth = lineWidth;
Packit 4d380f
    } else {
Packit 4d380f
	tagWidth++;
Packit 4d380f
	textWidth++;
Packit 4d380f
	while (textWidth + tagWidth + i > lineWidth) {
Packit 4d380f
	    if (textWidth >= tagWidth && textWidth > 0)
Packit 4d380f
		textWidth--;
Packit 4d380f
	    else if (tagWidth > 0)
Packit 4d380f
		tagWidth--;
Packit 4d380f
	    else
Packit 4d380f
		break;
Packit 4d380f
	}
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    if (!(flags & FLAG_NOTAGS)) {
Packit 4d380f
       for (i = 0; i < numItems; i++) {
Packit 4d380f
	   int w = tagWidth;
Packit 4d380f
	   int len, j;
Packit 4d380f
	   len = mystrncpyw(buf, itemInfo[i].tag, MAXBUF, &w);
Packit 4d380f
	   for (j = 0; j < tagWidth - w; j++) {
Packit 4d380f
		   if (len + 1 >= MAXBUF)
Packit 4d380f
		       break;
Packit 4d380f
		   buf[len++] = ' ';
Packit 4d380f
	   }
Packit 4d380f
	   buf[len] = '\0';
Packit 4d380f
	   w = textWidth;
Packit 4d380f
	   mystrncpyw(buf + len, itemInfo[i].text, MAXBUF-len, &w);
Packit 4d380f
           newtListboxAddEntry(listBox, buf, (void *)(long) i);
Packit 4d380f
       }
Packit 4d380f
     } else {
Packit 4d380f
        for (i = 0; i < numItems; i++) {
Packit 4d380f
           snprintf(buf, MAXBUF, "%s", itemInfo[i].text);
Packit 4d380f
           newtListboxAddEntry(listBox, buf, (void *)(long) i);
Packit 4d380f
      }
Packit 4d380f
   }
Packit 4d380f
Packit 4d380f
    if (defItem != -1)
Packit 4d380f
	newtListboxSetCurrent (listBox, defItem);
Packit 4d380f
Packit 4d380f
    newtFormAddComponents(form, tb, listBox, NULL);
Packit 4d380f
Packit 4d380f
    addButtons(height, width, form, &okay, &cancel, flags);
Packit 4d380f
Packit 4d380f
    answer = newtRunForm(form);
Packit 4d380f
    *result = NULL;
Packit 4d380f
    if (answer == cancel)
Packit 4d380f
	rc = DLG_CANCEL;
Packit 4d380f
    else if (answer == NULL)
Packit 4d380f
	rc = DLG_ESCAPE;
Packit 4d380f
    else {
Packit 4d380f
	i = (long) newtListboxGetCurrent(listBox);
Packit 4d380f
	*result = strdup(itemInfo[i].tag);
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    newtFormDestroy(form);
Packit 4d380f
    free(itemInfo);
Packit 4d380f
Packit 4d380f
    return rc;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int checkList(const char * text, int height, int width, poptContext optCon,
Packit 4d380f
		int useRadio, int flags, char *** selections) {
Packit 4d380f
    newtComponent form, okay, tb, subform, answer;
Packit 4d380f
    newtComponent sb = NULL, cancel = NULL;
Packit 4d380f
    const char * arg;
Packit 4d380f
    char * end;
Packit 4d380f
    int listHeight;
Packit 4d380f
    int numBoxes = 0;
Packit 4d380f
    int allocedBoxes = 5;
Packit 4d380f
    int i;
Packit 4d380f
    int numSelected;
Packit 4d380f
    int rc = DLG_OKAY;
Packit 4d380f
    char buf[MAXBUF], format[MAXFORMAT];
Packit 4d380f
    int maxWidth = 0;
Packit 4d380f
    int top;
Packit 4d380f
    struct {
Packit 4d380f
	const char * text;
Packit 4d380f
	const char * tag;
Packit 4d380f
	newtComponent comp;
Packit 4d380f
    } * cbInfo = malloc(allocedBoxes * sizeof(*cbInfo));
Packit 4d380f
    char * cbStates = malloc(allocedBoxes * sizeof(*cbStates));
Packit 4d380f
Packit 4d380f
    if ( (cbInfo == NULL) || (cbStates == NULL)) return DLG_ERROR;
Packit 4d380f
    if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
    listHeight = strtoul(arg, &end, 10);
Packit 4d380f
    if (*end) return DLG_ERROR;
Packit 4d380f
Packit 4d380f
    while ((arg = poptGetArg(optCon))) {
Packit 4d380f
	if (allocedBoxes == numBoxes) {
Packit 4d380f
	    allocedBoxes += 5;
Packit 4d380f
	    cbInfo = realloc(cbInfo, sizeof(*cbInfo) * allocedBoxes);
Packit 4d380f
	    cbStates = realloc(cbStates, sizeof(*cbStates) * allocedBoxes);
Packit 4d380f
	    if ((cbInfo == NULL) || (cbStates == NULL)) return DLG_ERROR;
Packit 4d380f
	}
Packit 4d380f
Packit 4d380f
	cbInfo[numBoxes].tag = arg;
Packit 4d380f
	if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
Packit 4d380f
	if (!(flags & FLAG_NOITEM)) {
Packit 4d380f
	    cbInfo[numBoxes].text = arg;
Packit 4d380f
	    if (!(arg = poptGetArg(optCon))) return DLG_ERROR;
Packit 4d380f
	} else
Packit 4d380f
	    cbInfo[numBoxes].text = "";
Packit 4d380f
Packit 4d380f
	if (!strcmp(arg, "1") || !strcasecmp(arg, "on") || 
Packit 4d380f
		!strcasecmp(arg, "yes"))
Packit 4d380f
	    cbStates[numBoxes] = '*';
Packit 4d380f
	else
Packit 4d380f
	    cbStates[numBoxes] = ' ';
Packit 4d380f
Packit 4d380f
	if (wstrlen(cbInfo[numBoxes].tag,-1) > (unsigned int)maxWidth)
Packit 4d380f
	    maxWidth = wstrlen(cbInfo[numBoxes].tag,-1);
Packit 4d380f
Packit 4d380f
	numBoxes++;
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    form = newtForm(NULL, NULL, 0);
Packit 4d380f
Packit 4d380f
    tb = textbox(height - 3 - buttonHeight - listHeight, width - 2,
Packit 4d380f
			text, flags, &top);
Packit 4d380f
Packit 4d380f
    if (listHeight < numBoxes) { 
Packit 4d380f
	sb = newtVerticalScrollbar(width - 4, 
Packit 4d380f
				   top + 1,
Packit 4d380f
				   listHeight, NEWT_COLORSET_CHECKBOX,
Packit 4d380f
				   NEWT_COLORSET_ACTCHECKBOX);
Packit 4d380f
	newtFormAddComponent(form, sb);
Packit 4d380f
    }
Packit 4d380f
    subform = newtForm(sb, NULL, 0);
Packit 4d380f
    newtFormSetBackground(subform, NEWT_COLORSET_CHECKBOX);
Packit 4d380f
Packit 4d380f
    if (flags & FLAG_NOTAGS)
Packit 4d380f
	snprintf(format, MAXFORMAT, "%%.0s%%s");
Packit 4d380f
    else
Packit 4d380f
	snprintf(format, MAXFORMAT, "%%-%ds  %%s", maxWidth);
Packit 4d380f
Packit 4d380f
    for (i = 0; i < numBoxes; i++) {
Packit 4d380f
	snprintf(buf, MAXBUF, format, cbInfo[i].tag, cbInfo[i].text);
Packit 4d380f
Packit 4d380f
	if (useRadio)
Packit 4d380f
	    cbInfo[i].comp = newtRadiobutton(4, top + 1 + i, buf,
Packit 4d380f
					cbStates[i] != ' ', 
Packit 4d380f
					i ? cbInfo[i - 1].comp : NULL);
Packit 4d380f
	else
Packit 4d380f
	    cbInfo[i].comp = newtCheckbox(4, top + 1 + i, buf,
Packit 4d380f
			      cbStates[i], NULL, cbStates + i);
Packit 4d380f
Packit 4d380f
	newtCheckboxSetFlags(cbInfo[i].comp, NEWT_FLAG_RETURNEXIT, NEWT_FLAGS_SET);
Packit 4d380f
	newtFormAddComponent(subform, cbInfo[i].comp);
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    newtFormSetHeight(subform, listHeight);
Packit 4d380f
    newtFormSetWidth(subform, width - 10);
Packit 4d380f
Packit 4d380f
    newtFormAddComponents(form, tb, subform, NULL);
Packit 4d380f
Packit 4d380f
    addButtons(height, width, form, &okay, &cancel, flags);
Packit 4d380f
Packit 4d380f
    answer = newtRunForm(form);
Packit 4d380f
    *selections = NULL;
Packit 4d380f
    if (answer == cancel)
Packit 4d380f
	rc = DLG_CANCEL;
Packit 4d380f
    else if (answer == NULL)
Packit 4d380f
	rc = DLG_ESCAPE;
Packit 4d380f
    else {
Packit 4d380f
	if (useRadio) {
Packit 4d380f
	    answer = newtRadioGetCurrent(cbInfo[0].comp);
Packit 4d380f
	    *selections = malloc(sizeof(char *) * 2);
Packit 4d380f
	    if (*selections == NULL)
Packit 4d380f
		return DLG_ERROR;
Packit 4d380f
	    (*selections)[0] = (*selections)[1] = NULL;
Packit 4d380f
	    for (i = 0; i < numBoxes; i++)
Packit 4d380f
		if (cbInfo[i].comp == answer) {
Packit 4d380f
		    (*selections)[0] = strdup(cbInfo[i].tag);
Packit 4d380f
		    break;
Packit 4d380f
		}
Packit 4d380f
	} else {
Packit 4d380f
	    numSelected = 0;
Packit 4d380f
	    for (i = 0; i < numBoxes; i++) {
Packit 4d380f
		if (cbStates[i] != ' ') numSelected++;
Packit 4d380f
	    }
Packit 4d380f
Packit 4d380f
	    *selections = malloc(sizeof(char *) * (numSelected + 1));
Packit 4d380f
	    if (*selections == NULL)
Packit 4d380f
		return DLG_ERROR;
Packit 4d380f
Packit 4d380f
	    numSelected = 0;
Packit 4d380f
	    for (i = 0; i < numBoxes; i++) {
Packit 4d380f
		if (cbStates[i] != ' ')
Packit 4d380f
		    (*selections)[numSelected++] = strdup(cbInfo[i].tag);
Packit 4d380f
	    }
Packit 4d380f
Packit 4d380f
	    (*selections)[numSelected] = NULL;
Packit 4d380f
	}
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    free(cbInfo);
Packit 4d380f
    free(cbStates);
Packit 4d380f
    newtFormDestroy(form);
Packit 4d380f
Packit 4d380f
    return rc;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
int messageBox(const char * text, int height, int width, int type, int flags) {
Packit 4d380f
    newtComponent form, yes, tb, answer;
Packit 4d380f
    newtComponent no = NULL;
Packit 4d380f
    int rc = DLG_OKAY;
Packit 4d380f
    int tFlag = (flags & FLAG_SCROLL_TEXT) ? NEWT_FLAG_SCROLL : 0;
Packit 4d380f
Packit 4d380f
    form = newtForm(NULL, NULL, 0);
Packit 4d380f
Packit 4d380f
    tb = newtTextbox(1, 1, width - 2, height - 3 - buttonHeight, 
Packit 4d380f
			NEWT_FLAG_WRAP | tFlag);
Packit 4d380f
    newtTextboxSetText(tb, text);
Packit 4d380f
Packit 4d380f
    newtFormAddComponent(form, tb);
Packit 4d380f
Packit 4d380f
    switch ( type ) {
Packit 4d380f
    case MSGBOX_INFO:
Packit 4d380f
	break;
Packit 4d380f
    case MSGBOX_MSG:
Packit 4d380f
	// FIXME Do something about the hard-coded constants
Packit 4d380f
	yes = makeButton((width - 8) / 2, height - 1 - buttonHeight, 
Packit 4d380f
			  getButtonText(BUTTON_OK));
Packit 4d380f
	newtFormAddComponent(form, yes);
Packit 4d380f
	break;
Packit 4d380f
    default:
Packit 4d380f
	yes = makeButton((width - 16) / 3, height - 1 - buttonHeight, 
Packit 4d380f
			 getButtonText(BUTTON_YES));
Packit 4d380f
	no = makeButton(((width - 16) / 3) * 2 + 9, height - 1 - buttonHeight, 
Packit 4d380f
		         getButtonText(BUTTON_NO));
Packit 4d380f
	newtFormAddComponents(form, yes, no, NULL);
Packit 4d380f
Packit 4d380f
	if (flags & FLAG_DEFAULT_NO)
Packit 4d380f
	    newtFormSetCurrent(form, no);
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    if ( type != MSGBOX_INFO ) {
Packit 4d380f
	if (newtRunForm(form) == NULL)
Packit 4d380f
		rc = DLG_ESCAPE;
Packit 4d380f
Packit 4d380f
	answer = newtFormGetCurrent(form);
Packit 4d380f
Packit 4d380f
	if (answer == no)
Packit 4d380f
	    rc = DLG_CANCEL;
Packit 4d380f
    }
Packit 4d380f
    else {
Packit 4d380f
	newtDrawForm(form);
Packit 4d380f
	newtRefresh();
Packit 4d380f
    }
Packit 4d380f
Packit 4d380f
    newtFormDestroy(form);
Packit 4d380f
Packit 4d380f
    return rc;
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
void useFullButtons(int state) {
Packit 4d380f
    if (state) {
Packit 4d380f
	buttonHeight = 3;
Packit 4d380f
	makeButton = newtButton;
Packit 4d380f
   } else {
Packit 4d380f
	buttonHeight = 1;
Packit 4d380f
	makeButton = newtCompactButton;
Packit 4d380f
   }
Packit 4d380f
}
Packit 4d380f
Packit 4d380f
void setButtonText(const char * text, int button) {
Packit 4d380f
    if (button < 0 || button >= BUTTONS)
Packit 4d380f
	return;
Packit 4d380f
    buttonText[button] = text;
Packit 4d380f
}