1217309Snwhitehorn/*
2255852Sdteske *  $Id: mixedform.c,v 1.12 2013/09/02 17:02:05 tom Exp $
3217309Snwhitehorn *
4251843Sbapt *  mixedform.c -- implements the mixed form (i.e, typed pairs label/editbox)
5217309Snwhitehorn *
6251843Sbapt *  Copyright 2007-2011,2013	Thomas E. Dickey
7217309Snwhitehorn *
8217309Snwhitehorn *  This program is free software; you can redistribute it and/or modify
9217309Snwhitehorn *  it under the terms of the GNU Lesser General Public License, version 2.1
10217309Snwhitehorn *  as published by the Free Software Foundation.
11217309Snwhitehorn *
12217309Snwhitehorn *  This program is distributed in the hope that it will be useful, but
13217309Snwhitehorn *  WITHOUT ANY WARRANTY; without even the implied warranty of
14217309Snwhitehorn *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15217309Snwhitehorn *  Lesser General Public License for more details.
16217309Snwhitehorn *
17217309Snwhitehorn *  You should have received a copy of the GNU Lesser General Public
18217309Snwhitehorn *  License along with this program; if not, write to
19217309Snwhitehorn *	Free Software Foundation, Inc.
20217309Snwhitehorn *	51 Franklin St., Fifth Floor
21217309Snwhitehorn *	Boston, MA 02110, USA.
22217309Snwhitehorn *
23217309Snwhitehorn *  This is inspired by a patch from Kiran Cherupally
24217309Snwhitehorn *  (but different interface design).
25217309Snwhitehorn */
26217309Snwhitehorn
27217309Snwhitehorn#include <dialog.h>
28217309Snwhitehorn
29217309Snwhitehorn#define LLEN(n) ((n) * MIXEDFORM_TAGS)
30217309Snwhitehorn
31217309Snwhitehorn#define ItemName(i)     items[LLEN(i) + 0]
32217309Snwhitehorn#define ItemNameY(i)    items[LLEN(i) + 1]
33217309Snwhitehorn#define ItemNameX(i)    items[LLEN(i) + 2]
34217309Snwhitehorn#define ItemText(i)     items[LLEN(i) + 3]
35217309Snwhitehorn#define ItemTextY(i)    items[LLEN(i) + 4]
36217309Snwhitehorn#define ItemTextX(i)    items[LLEN(i) + 5]
37217309Snwhitehorn#define ItemTextFLen(i) items[LLEN(i) + 6]
38217309Snwhitehorn#define ItemTextILen(i) items[LLEN(i) + 7]
39217309Snwhitehorn#define ItemTypep(i)    items[LLEN(i) + 8]
40217309Snwhitehorn#define ItemHelp(i)     (dialog_vars.item_help ? items[LLEN(i) + 9] : dlg_strempty())
41217309Snwhitehorn
42217309Snwhitehornint
43217309Snwhitehorndialog_mixedform(const char *title,
44217309Snwhitehorn		 const char *cprompt,
45217309Snwhitehorn		 int height,
46217309Snwhitehorn		 int width,
47217309Snwhitehorn		 int form_height,
48217309Snwhitehorn		 int item_no,
49217309Snwhitehorn		 char **items)
50217309Snwhitehorn{
51217309Snwhitehorn    int result;
52217309Snwhitehorn    int choice;
53217309Snwhitehorn    int i;
54217309Snwhitehorn    DIALOG_FORMITEM *listitems;
55217309Snwhitehorn    DIALOG_VARS save_vars;
56217309Snwhitehorn    bool show_status = FALSE;
57255852Sdteske    char *help_result;
58217309Snwhitehorn
59217309Snwhitehorn    dlg_save_vars(&save_vars);
60217309Snwhitehorn    dialog_vars.separate_output = TRUE;
61217309Snwhitehorn
62217309Snwhitehorn    listitems = dlg_calloc(DIALOG_FORMITEM, (size_t) item_no + 1);
63217309Snwhitehorn    assert_ptr(listitems, "dialog_mixedform");
64217309Snwhitehorn
65217309Snwhitehorn    for (i = 0; i < item_no; ++i) {
66217309Snwhitehorn	listitems[i].type = dialog_vars.formitem_type;
67217309Snwhitehorn	listitems[i].name = ItemName(i);
68217309Snwhitehorn	listitems[i].name_len = (int) strlen(ItemName(i));
69217309Snwhitehorn	listitems[i].name_y = dlg_ordinate(ItemNameY(i));
70217309Snwhitehorn	listitems[i].name_x = dlg_ordinate(ItemNameX(i));
71217309Snwhitehorn	listitems[i].text = ItemText(i);
72217309Snwhitehorn	listitems[i].text_len = (int) strlen(ItemText(i));
73217309Snwhitehorn	listitems[i].text_y = dlg_ordinate(ItemTextY(i));
74217309Snwhitehorn	listitems[i].text_x = dlg_ordinate(ItemTextX(i));
75217309Snwhitehorn	listitems[i].text_flen = atoi(ItemTextFLen(i));
76217309Snwhitehorn	listitems[i].text_ilen = atoi(ItemTextILen(i));
77217309Snwhitehorn	listitems[i].help = (dialog_vars.item_help ? ItemHelp(i) :
78217309Snwhitehorn			     dlg_strempty());
79217309Snwhitehorn	listitems[i].type = (unsigned) atoi(ItemTypep(i));
80217309Snwhitehorn    }
81217309Snwhitehorn
82217309Snwhitehorn    result = dlg_form(title,
83217309Snwhitehorn		      cprompt,
84217309Snwhitehorn		      height,
85217309Snwhitehorn		      width,
86217309Snwhitehorn		      form_height,
87217309Snwhitehorn		      item_no,
88217309Snwhitehorn		      listitems,
89217309Snwhitehorn		      &choice);
90217309Snwhitehorn
91217309Snwhitehorn    switch (result) {
92217309Snwhitehorn    case DLG_EXIT_OK:		/* FALLTHRU */
93217309Snwhitehorn    case DLG_EXIT_EXTRA:
94217309Snwhitehorn	show_status = TRUE;
95217309Snwhitehorn	break;
96217309Snwhitehorn    case DLG_EXIT_HELP:
97255852Sdteske	dlg_add_help_formitem(&result, &help_result, &listitems[choice]);
98217309Snwhitehorn	show_status = dialog_vars.help_status;
99255852Sdteske	dlg_add_string(help_result);
100217309Snwhitehorn	if (show_status)
101217309Snwhitehorn	    dlg_add_separator();
102217309Snwhitehorn	break;
103217309Snwhitehorn    }
104217309Snwhitehorn    if (show_status) {
105217309Snwhitehorn	for (i = 0; i < item_no; i++) {
106217309Snwhitehorn	    if (listitems[i].text_flen > 0) {
107217309Snwhitehorn		dlg_add_string(listitems[i].text);
108217309Snwhitehorn		dlg_add_separator();
109217309Snwhitehorn	    }
110217309Snwhitehorn	}
111251843Sbapt	dlg_add_last_key(-1);
112217309Snwhitehorn    }
113217309Snwhitehorn
114217309Snwhitehorn    dlg_free_formitems(listitems);
115217309Snwhitehorn    dlg_restore_vars(&save_vars);
116217309Snwhitehorn
117217309Snwhitehorn    return result;
118217309Snwhitehorn}
119