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