#include #include #include "diadef.h" #include #include "dialog.h" #include "../diajava/proto.h" PUBLIC void FIELD_CHECK_BASE::xul_draw(int, SSTRINGS &){} PUBLIC FIELD_CHECK_BASE::FIELD_CHECK_BASE( const char *_prompt, char &_var) : FIELD (_prompt) { var = &_var; val = _var; backup = val; registry_buf[0] = '\0'; } PUBLIC void FIELD_CHECK_BASE::draw_helpdia(WINDOW *dialog, int nof) { draw_helpdia_common (dialog,nof); } PUBLIC void FIELD_CHECK_BASE::set_registry_value(const char *v) { val = atoi(v); } PUBLIC const char *FIELD_CHECK_BASE::get_registry_value() { sprintf (registry_buf,"%d",val); return registry_buf; } PUBLIC FIELD_CHECK_RADIO::FIELD_CHECK_RADIO( const char *_prompt, char &_var, const char *_title) : FIELD_CHECK_BASE (_prompt,_var) { original_title = _title; // For the virtual registry (see return_prompt below) title = strdup(_title); box.width = 4 + strlen(_title); } PUBLIC FIELD_CHECK_RADIO::~FIELD_CHECK_RADIO() { free (title); } PUBLIC const char* FIELD_CHECK_RADIO::return_prompt() { const char *ret = original_prompt; if (original_prompt == NULL || original_prompt[0] == '\0'){ ret = original_title; } return ret; } PUBLIC void FIELD_CHECK_RADIO::restore() { *var = backup; } PUBLIC void FIELD_CHECK_RADIO::reload(const char *dianame, int nof) { val = *var; sendval (dianame,nof,'C',val); } PUBLIC void FIELD_CHECK_RADIO::save() { *var = val; } /* Position the cursor in the field */ PUBLIC void FIELD_CHECK_RADIO::setcursor(WINDOW *dialog, int) { wmove (dialog,box.y,box.x+1); } /* Draw only the input part of a field */ PUBLIC void FIELD_CHECK_RADIO::drawtxt_check ( WINDOW *dialog, char openchar, // Code to draw the left side of the button char closechar, // Right side char selchar) // Interior of the button { char buf[4+strlen(title)+1]; sprintf (buf,"%c%c%c %s",openchar,selchar,closechar,title); wattrset(dialog, inputbox_attr); diaetc_drawinput (dialog,box.x,box.y,box.width,buf); } /* Build a key that uniquely identify this field in the dialog */ PUBLIC void FIELD_CHECK_RADIO::format_htmlkey(char *key, int nof) { char buf[strlen(prompt)+1+strlen(title)+1]; strcpy (buf,prompt); strcat (buf,title); html_formatkey (key,"%s-%d",buf,nof); } /* #Specification: dialog / checkbox A checkbox is used to toggle an option. It edit a variable from 0 to 1. The checkbox is presented like this # prompt [ ] some explanation prompt [X] some explanation # */ # PUBLIC FIELD_CHECK::FIELD_CHECK( const char *_prompt, char &_var, const char *_title) : FIELD_CHECK_RADIO (_prompt,_var,_title) { } /* Draw only the input part of a field */ PUBLIC void FIELD_CHECK::drawtxt ( WINDOW *dialog, int, int, int) { char checked = readonly ? '#' : 'X'; drawtxt_check (dialog,'[',']',val ? checked : ' '); } static const char YES[]="yes"; static const char NO[]="no"; PUBLIC void FIELD_CHECK::html_draw(int nof) { char key[100]; format_htmlkey (key,nof); html_printf ("%s",prompt); html_defvar ("checkbox",key,YES,val ? "checked" : ""); html_printf ("%s\n",title); html_defvarcur (key,backup ? YES : NO); } PUBLIC void FIELD_CHECK::gui_draw(int nof, SSTRINGS &) { guisendprompt(); char tmp[1000]; diagui_sendcmd (P_Checkbox,"C%d %d %s\n",nof,val,diagui_quote(title,tmp)); } PUBLIC MENU_STATUS FIELD_CHECK::gui_get(int nof, const char *, const char *) { val = atoi (diagui_getval('C',nof)); return MENU_NULL; } /* Get the letter use to define the ID of a field in GUI mode. */ PUBLIC char FIELD_CHECK::getidprefix () { return 'C'; } PUBLIC int FIELD_CHECK::html_validate(int nof) { int ret = -1; char key[100]; format_htmlkey (key,nof); char oldval = stricmp(html_getoldval(key),YES)==0; char newval = stricmp(html_getval(key),YES)==0; if (backup == oldval){ ret = 0; val = newval; } return ret; } PUBLIC MENU_STATUS FIELD_CHECK::dokey ( WINDOW *dialog, int key, FIELD_MSG &, bool &) { switch (key){ case ' ': val = !val; drawtxt (dialog,0,0,0); break; } return MENU_NULL; } /* Add a check box field to the dialog. */ PUBLIC FIELD_CHECK *DIALOG::newf_chk( const char *prompt, char &var, const char *title) { FIELD_CHECK *s = new FIELD_CHECK(prompt,var,title); add (s); return s; } class FIELD_CHECK_BOOL: public FIELD_CHECK{ bool &bvar; char cvar; /*~PROTOBEG~ FIELD_CHECK_BOOL */ public: FIELD_CHECK_BOOL (const char *_prompt, bool&_var, const char *_title); void reload (const char *dianame, int nof); void restore (void); void save (void); /*~PROTOEND~ FIELD_CHECK_BOOL */ }; PUBLIC FIELD_CHECK_BOOL::FIELD_CHECK_BOOL ( const char *_prompt, bool &_var, const char *_title) : FIELD_CHECK (_prompt,cvar,_title),bvar(_var) { cvar = _var ? 1 : 0; val = cvar; } PUBLIC void FIELD_CHECK_BOOL::restore() { FIELD_CHECK::restore(); bvar = cvar != 0; } PUBLIC void FIELD_CHECK_BOOL::save() { FIELD_CHECK::save(); bvar = cvar != 0; } PUBLIC void FIELD_CHECK_BOOL::reload(const char *dianame, int nof) { cvar = bvar ? 1 : 0; FIELD_CHECK::reload(dianame,nof); } PUBLIC FIELD_CHECK *DIALOG::newf_chk( const char *prompt, bool &var, const char *title) { FIELD_CHECK *s = new FIELD_CHECK_BOOL(prompt,var,title); add (s); return s; } /* #Specification: dialog / checkbox multi A checkbox multi is used to toggle an between more than one option but not too many. It edit a variable from 0,1,number of option-1. It is presented like this. # prompt (o) opt1 ( ) opt2 ( ) opt3 prompt ( ) opt1 ( ) opt2 ( ) opt3 # */ # PUBLIC FIELD_CHECK_MULTI::FIELD_CHECK_MULTI( const char *_prompt, char &_var, const char *_options[]) : FIELD_CHECK_BASE(_prompt,_var) { int len = 0; for (int i=0; _options[i] != NULL; i++){ const char *str = _options[i]; len += strlen(str)+4+1; options.add (new SSTRING (str)); } box.width = len; } /* Draw only the input part of a field */ PUBLIC void FIELD_CHECK_MULTI::drawtxt ( WINDOW *dialog, int, int, int) { SSTRING tmp; int n = options.getnb(); for (int i=0; iget()); } diaetc_drawinput (dialog,box.x,box.y,box.width,tmp.get()); } PUBLIC void FIELD_CHECK_MULTI::save( ) { *var = val; } PUBLIC void FIELD_CHECK_MULTI::restore( ) { *var = backup; } PUBLIC void FIELD_CHECK_MULTI::reload(const char *dianame, int nof) { val = *var; sendval (dianame,nof,'R',val); } PUBLIC void FIELD_CHECK_MULTI::html_draw(int nof) { char key[100]; format_htmlkey (key,nof); html_printf ("%s",prompt); int n = options.getnb(); for (int i=0; iget(); html_defvar ("radio",key,i,val == i ? "checked" : ""); html_printf ("\t\t%s\n",str); } html_defvarcur (key,backup); } PUBLIC void FIELD_CHECK_MULTI::gui_draw(int nof, SSTRINGS &) { guisendprompt(); int n = options.getnb(); diagui_sendcmd (P_Form,"F%d $vexpand=0\n",nof); for (int i=0; iget(); char tmp[1000]; diagui_sendcmd (P_Radio,"R%d %d %d %s\n",nof,i,i==val ,diagui_quote(str,tmp)); } diagui_sendcmd (P_End,"\n"); } PUBLIC MENU_STATUS FIELD_CHECK_MULTI::gui_get(int nof, const char *, const char *) { val = atoi(diagui_getval('R',nof)); return MENU_NULL; } /* Get the letter use to define the ID of a field in GUI mode. */ PUBLIC char FIELD_CHECK_MULTI::getidprefix () { return 'R'; } PUBLIC int FIELD_CHECK_MULTI::html_validate(int nof) { int ret = -1; char key[100]; format_htmlkey (key,nof); int oldval = atoi(html_getoldval(key)); int newval = atoi(html_getval(key)); if (backup == oldval){ ret = 0; val = newval; } return ret; } PUBLIC MENU_STATUS FIELD_CHECK_MULTI::dokey ( WINDOW *dialog, int key, FIELD_MSG &, bool &) { int nbopt = options.getnb(); char lastopt = (char)(nbopt-1); char newval = val; switch (key){ case ' ': case KEY_RIGHT: newval = (val+1) % nbopt; break; case KEY_HOME: newval = 0; break; case 5: /* ^E like Emacs */ case KEY_END: newval = lastopt; break; case KEY_LEFT: if (newval == 0){ newval = lastopt; }else{ newval--; } break; } if (newval != val){ val = newval; drawtxt (dialog,0,0,0); } return MENU_NULL; } /* Add a multi value horizontal check box field to the dialog. */ PUBLIC FIELD_CHECK_MULTI *DIALOG::newf_chkm( const char *prompt, char &var, const char *title[]) { FIELD_CHECK_MULTI *s = new FIELD_CHECK_MULTI(prompt,var,title); add (s); return s; } class FIELD_CHECK_MULTI_COL: public FIELD_CHECK_MULTI{ int tbcol[DIALOG_MAXCOL]; /*~PROTOBEG~ FIELD_CHECK_MULTI_COL */ public: FIELD_CHECK_MULTI_COL (const char *_prompt, char &_var, const char *_options[]); void drawtxt (WINDOW *dialog, int , int , int); int getwidths (int tb[], int &); void gui_draw (int nof, SSTRINGS&); void html_draw (int nof); void setwidths (int max_width, int tb[]); /*~PROTOEND~ FIELD_CHECK_MULTI_COL */ }; PUBLIC FIELD_CHECK_MULTI_COL::FIELD_CHECK_MULTI_COL( const char *_prompt, char &_var, const char *_options[]) : FIELD_CHECK_MULTI(_prompt,_var,_options) { memset (tbcol,0,sizeof(tbcol)); } PUBLIC int FIELD_CHECK_MULTI_COL::getwidths (int tb[], int &) { int n = options.getnb(); for (int i=0; iget(); int len = strlen(str); if (len > 0) len ++; tb[i] = len+4; } return n; } PUBLIC void FIELD_CHECK_MULTI_COL::setwidths (int max_width, int tb[]) { memcpy (tbcol,tb,sizeof(tbcol)); box.width = max_width; } PUBLIC void FIELD_CHECK_MULTI_COL::gui_draw(int nof, SSTRINGS &) { guisendprompt(); int n = options.getnb(); for (int i=0; iget(); char tmp[1000]; diagui_sendcmd (P_Radio,"R%d %d %d %s\n",nof,i,i==val ,diagui_quote(str,tmp)); if (str[0] == '\0') diagui_sendcmd (P_Dispolast,"c 1 c 1\n"); } } PUBLIC void FIELD_CHECK_MULTI_COL::html_draw(int nof) { char key[100]; format_htmlkey (key,nof); html_printf ("%s",prompt); int n = options.getnb(); for (int i=0; iget(); html_printf (str[0] == '\0' ? "" : ""); html_defvar ("radio",key,i,val == i ? "checked" : ""); html_printf ("\t\t%s\n",str); } html_defvarcur (key,backup); } /* Draw only the input part of a field */ PUBLIC void FIELD_CHECK_MULTI_COL::drawtxt ( WINDOW *dialog, int, int, int) { SSTRING tmp; int n = options.getnb(); for (int i=0; iget(); int len = 0; if (str[0] == '\0'){ int pad = (colwidth - 3)/2; for (int p=0; p