|
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 |
}
|