#include #include #include #include "diadef.h" #include "dialog.h" #include "dialog.m" #include "../diajava/proto.h" #include "../diajava/diajava.h" enum FLDNUM_TYPE{ FLDNUM_DEC, FLDNUM_HEX, FLDNUM_OCT, FLDNUM_DBL }; class FIELD_NUM: public FIELD_STRING_BASE{ protected: double *dblval; int *intval; double dbl_backup; int int_backup; FLDNUM_TYPE type; int nbdecimals; /*~PROTOBEG~ FIELD_NUM */ public: FIELD_NUM (const char *_prompt, double *_dblval, int *_intval, FLDNUM_TYPE _type, int _nbdecimals); protected: MENU_STATUS dokey (WINDOW *w, int key, FIELD_MSG&msg, bool&grab); public: void html_draw (int nof); int post_validate (void); void reload (const char *dianame, int nof); void restore (void); void save (void); private: bool validchar (char car); public: /*~PROTOEND~ FIELD_NUM */ }; static const char *tb_format[]={"%d","%x","%o","%f"}; PUBLIC FIELD_NUM::FIELD_NUM( const char *_prompt, double *_dblval, int *_intval, FLDNUM_TYPE _type, int _nbdecimals) : FIELD_STRING_BASE (_prompt, _dblval != NULL ? 30 : 12) { fwidth = size; type = _type; dbl_backup = 0; int_backup = 0; dblval = _dblval; intval = _intval; if (_dblval != NULL){ dbl_backup = *_dblval; int_backup = (int)dbl_backup; }else{ int_backup = *_intval; } nbdecimals = _nbdecimals; if (_nbdecimals == 0){ sprintf (buf, tb_format[type],int_backup); }else{ sprintf (buf, "%.*f",nbdecimals,dbl_backup); } } PRIVATE bool FIELD_NUM::validchar (char car) { bool ret = false; if (type == FLDNUM_DEC || type == FLDNUM_DBL){ ret = isdigit(car); }else if (type == FLDNUM_HEX){ ret = isxdigit(car); }else if (type == FLDNUM_OCT){ ret = car >= '0' && car < '8'; } return ret; } PROTECTED MENU_STATUS FIELD_NUM::dokey( WINDOW *w, int key, FIELD_MSG &msg, bool &grab) { MENU_STATUS ret = MENU_NULL; int charok = validchar (key); if (charok || (key >= KEY_MIN && key <= KEY_MAX) || key < ' ' || (x.input + x.scroll == 0 && key == '-') || (nbdecimals > 0 && key == '.') || key == 24 || key == KEY_F(4)){ ret = FIELD_STRING_BASE::dokey(w,key,msg,grab); } return ret; } /* Draw the field with the prompt */ PUBLIC void FIELD_NUM::html_draw(int nof) { char key[100]; format_htmlkey (key,nof); html_printf ("%s",prompt); html_defvar ("integer",key,buf,"size=10 maxlength=20"); html_defvarcur (key,backup.get()); } PUBLIC void FIELD_NUM::save() { if (dblval != NULL){ sscanf (buf,"%lf",dblval); }else{ sscanf (buf,tb_format[type] ,intval); } } PUBLIC void FIELD_NUM::restore() { if (dblval != NULL){ *dblval = dbl_backup; }else{ *intval = int_backup; } } PUBLIC void FIELD_NUM::reload(const char *dianame, int nof) { SSTRING oldbuf(buf); if (dblval != NULL){ dbl_backup = *dblval; if (nbdecimals != 0){ sprintf (buf, "%.*f",nbdecimals,*dblval); }else{ sprintf (buf,"%d",(int)*dblval); } }else{ int_backup = *intval; sprintf (buf,tb_format[type],*intval); } if (oldbuf.cmp(buf)!=0)sendval (dianame,nof,'S',buf); } PUBLIC int FIELD_NUM::post_validate() { int ret = 0; const char *pt = buf; if (*pt == '-') pt++; int points = 0; while (*pt != '\0'){ bool charok = validchar (*pt); if (*pt == '.'){ if (nbdecimals == 0){ xconf_error (MSG_U(E_NOPT ,"No decimal point allowed")); ret = -1; break; }else if(points == 0){ points++; }else{ xconf_error (MSG_U(E_MANYPT ,"Too many decimal points!")); ret = -1; break; } }else if (!charok){ xconf_error (MSG_U(E_NONDIGIT ,"Only digits and the minus sign are allowed")); ret = -1; break; } pt++; } return ret; } /* Add a numerical field to the dialog. */ PUBLIC FIELD *DIALOG::newf_num( const char *prompt, int &val) { FIELD_NUM *s = new FIELD_NUM(prompt,NULL,&val,FLDNUM_DEC,0); add (s); return s; } /* Add an hexadecimal field to the dialog. */ PUBLIC FIELD *DIALOG::newf_hexnum( const char *prompt, int &val) { FIELD_NUM *s = new FIELD_NUM(prompt,NULL,&val,FLDNUM_HEX,0); add (s); return s; } /* Add an octal field to the dialog. */ PUBLIC FIELD *DIALOG::newf_octnum( const char *prompt, int &val) { FIELD_NUM *s = new FIELD_NUM(prompt,NULL,&val,FLDNUM_OCT,0); add (s); return s; } /* Add a floating point field to the dialog. */ PUBLIC FIELD *DIALOG::newf_dbl( const char *prompt, double &val, int nbdecimals) { FIELD_NUM *s = new FIELD_NUM(prompt,&val,NULL,FLDNUM_DBL,nbdecimals); add (s); return s; } class FIELD_SLIDER: public FIELD_NUM{ protected: int minval,maxval; // To scale le slider /*~PROTOBEG~ FIELD_SLIDER */ public: FIELD_SLIDER (const char *_prompt, int &_val, int _minval, int _maxval); void gui_draw (int nof, SSTRINGS&tb); /*~PROTOEND~ FIELD_SLIDER */ }; PUBLIC FIELD_SLIDER::FIELD_SLIDER( const char *_prompt, int &_val, int _minval, int _maxval) : FIELD_NUM (_prompt,NULL,&_val,FLDNUM_DEC,0) { minval = _minval; maxval = _maxval; } PUBLIC void FIELD_SLIDER::gui_draw(int nof, SSTRINGS &tb) { if (diajava_slider){ guisendprompt(); if (readonly){ diagui_send_Label (buf); }else{ diagui_sendcmd (P_Slider,"S%d 200 %d %d %s\n",nof ,minval,maxval,buf); } }else{ FIELD_NUM::gui_draw(nof,tb); } } /* Add a horizontal slider field (integer input) to the dialog. */ PUBLIC FIELD *DIALOG::newf_slider( const char *prompt, int &val, int minval, int maxval) { FIELD_SLIDER *s = new FIELD_SLIDER(prompt,val,minval,maxval); add (s); return s; } class FIELD_GAUGE: public FIELD_NUM{ int range; /*~PROTOBEG~ FIELD_GAUGE */ public: FIELD_GAUGE (const char *_prompt, int &_val, int _range); void drawtxt (WINDOW *dialog, int , int , int); void gui_draw (int nof, SSTRINGS&); void html_draw (int); /*~PROTOEND~ FIELD_GAUGE */ }; PUBLIC FIELD_GAUGE::FIELD_GAUGE( const char *_prompt, int &_val, int _range) : FIELD_NUM (_prompt,NULL,&_val,FLDNUM_DEC,0) { range = _range; } PUBLIC void FIELD_GAUGE::drawtxt (WINDOW *dialog, int, int, int) { wattrset(dialog, inputbox_attr); wmove(dialog, box.y,box.x); int stop = *intval; if (range != 0){ stop = stop * box.width/range; } for (int i=0; i%s",prompt); int stop = *intval * range/box.width; for (int i=0; i