//EDITOR DI MASCHERE #include <xvt.h> #include "ba2600.h" //Costruttore della classe TEditMask_window: gestisce la maschera TEditMask_window::TEditMask_window(short x,short y,short dx,short dy, const char*title,long flags, WIN_TYPE wt) { create(x,y,dx,dy,title,flags,wt); _controllo=NULL; _controls=NULL; _pixmap=TRUE; set_font(); _sheet=NULL; _total_page=_page=1; _name.add(TR("Maschera"),0); _name.add(TR("Maschera"),1); _type_vz="a"; _coordx=x; _coordy=y; _alt=dy; _lung=dx; _tool=FALSE; _mode=TRUE; _y_tool=19; _rt.left=_rt.right=_rt.bottom=0; _rt.top=_y_tool*ROWY; _rct_sel.left=_rct_sel.top=_rct_sel.bottom=_rct_sel.right=0; _nsheet=0; } //Permette il ridimensionamento RCT& TEditMask_window::resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt, bool intool) const { static RCT r; if (_tool) // Mask with Toolbar { if (y >= 0) { /* Scommentare quando verranno inseriti i tab buttons if (_total_page>1) y++; */ } if (x > 0 || (wt != WO_TE && x == 0)) { RCT pc; xvt_vobj_get_client_rect(win(), &pc); const int width = pc.right; const int tot = 80*CHARX; if (width > tot) x += (width-tot) / (2*CHARX); } } wt = WC_TEXTEDIT; r.left = (x+1)*CHARX; r.top = y*ROWY; r.right = dx*CHARX; r.bottom = (CHARY << 1) - (CHARY-2); if (y >= 0 && _tool && intool) r.top += ROWY*_y_tool; if (dy > 1) r.bottom += ROWY*(dy-1); if (x < 0 || y < 0 || dx <= 0 || dy <= 0) { RCT pc; xvt_vobj_get_client_rect(win(), &pc); const short MAXX = pc.right; const short MAXY = (_tool && !intool) ? ROWY*_y_tool : pc.bottom; if (x < 0) { x = -x; if (wt != WC_TEXTEDIT && x == 1) x = 11; if (x > 10) { const int num = x/10 -1; const int tot = x%10; const int spc = (MAXX - tot*r.right) / (tot+1); r.left = spc + num*(spc+r.right); } else r.left = MAXX - r.right - x*CHARX; } if (y < 0) { y = -y; if (wt != WC_TEXTEDIT && y == 1) y = 11; if (y > 10) { const int num = y/10 -1; const int tot = y%10; const int spc = (MAXY - tot*r.bottom) / (tot+1); r.top = spc + num*(spc+r.bottom); } else r.top = MAXY - r.bottom - (y-1)*ROWY; } if (dx <= 0) r.right = MAXX + dx*CHARX; else r.right += r.left; if (dy <= 0) r.bottom = MAXY + dy*ROWY; else r.bottom += r.top; } else { r.right += r.left; r.bottom += r.top; } return r; } //Costruttore della classe TEditMask_control che gestisce i controlli TEditMask_control::TEditMask_control(TEditMask_window* parent) { _intool=FALSE; _parent=parent; _pag=parent->page(); _left=_top=1; _latox=15; _latoy=1; resize_rect(); _id="DLG_USER"; _type_field="control"; _selected=FALSE; _focus=0; } //Costruttore della classe TEditMask_control per definirne la copia TEditMask_control::TEditMask_control(const TEditMask_control& ctl) { _intool=ctl._intool; _parent=ctl._parent; _focus=ctl._focus; _pag=ctl._pag; _rct=ctl._rct; _left=ctl._left; _top=ctl._top; _prompt=ctl._prompt; _id=ctl._id; _latox=ctl._latox; _latoy=ctl._latoy; _field=ctl._field; _key=ctl._key; _warning=ctl._warning; _check=ctl._check; _flag=ctl._flag; _group=ctl._group; _message=ctl._message; _selected=ctl._selected; _type_field=ctl._type_field; } //Permette il riordino dei controlli in base alla priorit� del focus static int compare(const TObject** o1,const TObject** o2) { if (o1 == o2) return 0; TEditMask_control* s1 = (TEditMask_control*)*o1; TEditMask_control* s2 = (TEditMask_control*)*o2; return (s1->get_focus() - s2->get_focus()); } //Ricerca durante la lettura la maschera corrispondente allo spread numero i TEditMask_control* TEditMask_window::find_sheet(int i) { for(int j=0; j<_controls.items(); j++) { TEditMask_control& sh=(TEditMask_control& )_controls[j]; if (sh.get_idsheet()==i) return &sh; } return NULL; } //Definisce la presenza di pagine prive di controlli int TEditMask_window::page_null(int page) { bool cont=FALSE; for(int i=0; i<_controls.items(); i++) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (down.page()==page) { cont=TRUE; break; } } return cont; } //Salva su file la scrittura delle pagine void TEditMask_window::save_page(ostream& out) { RCT r={_rt.top,0,_rt.bottom,_rt.right}; _controls.sort(compare);//ordinamento secondo la priorit� focus for (int k=1; k <= _total_page ; k++) { if (page_null(k)) { out << "PAGE \""<< _name[k] <<"\" "<< _coordx <<" " <<_coordy; out << " " <<_lung <<" " <<_alt << "\n\n"; for(int i=0; i<_controls.items(); i++) { TEditMask_control& up=(TEditMask_control& )_controls[i]; if(up.page()==k) { PNT p={up.rectangle().top,up.rectangle().left}; if(up.type()=="BUTTON ") { TString tipo=up.ident(); if(tipo=="DLG_OK" || tipo=="DLG_CANCEL" ||\ tipo=="DLG_DELREC" ||tipo=="DLG_QUIT" || tipo=="DLG_PRINT" ||\ tipo=="DLG_SELECT") up.set_prompt(""); } if(xvt_rect_has_point(&r,p) != 0) ; else out<<_controls[i]; } } out << "ENDPAGE\n\n"; } } out << "\nENDMASK\n\n"; } //Creazione del file .uml void TEditMask_window::create_file() { _file.lower(); _file.ext("uml"); ofstream file(_file); RCT r={_rt.top,0,_rt.bottom,_rt.right}; _file.ext("h"); file<<"#include \"" << _file<<"\"\n\n"; _file.ext("uml"); int k=101; if(_tool) { file<<"TOOLBAR \"TOOLBAR\" 0 "<<_y_tool<<" 0 0\n\n"; for(int i=0; i<_controls.items(); i++) { //i controlli della toolbar TEditMask_control& up=(TEditMask_control& )_controls[i]; PNT p={up.rectangle().top,up.rectangle().left}; if(up.type()=="BUTTON ") { TString tipo=up.ident(); if (tipo=="DLG_OK" || tipo=="DLG_CANCEL" || tipo=="DLG_DELREC" ||tipo=="DLG_QUIT" || tipo=="DLG_PRINT" || tipo=="DLG_SELECT") up.set_prompt(""); } if(xvt_rect_has_point(&r,p) != 0) file<<_controls[i]; } file<<"ENDPAGE\n\n"; } save_page(file); //controlli della finestra principale for(int i=0; i<_controls.items(); i++) //controlli dello spread { TEditMask_control& up=(TEditMask_control& )_controls[i]; if(up.figlio()!=NULL) up.figlio()->save_page(file); } file.close(); } //Creazione del file .h void TEditMask_window::create_fileh() { TFilename header(_file); header.lower(); header.ext("h"); ofstream fileh(header); int k=101; for(int i=0; i<_controls.items(); i++) { TEditMask_control& up=(TEditMask_control& )_controls[i]; if(up.ident()!=("DLG_NULL")) { fileh<<"#define "<<up.ident()<< " "<< k <<'\n'; k++; } } } //Definizione di un controllo disabilitato o nascosto int TEditMask_control::flag_crt() const { if(_flag.find('H')!=-1 || _flag.find('h')!=-1) return 1; if(_flag.find('D')!=-1 || _flag.find('d')!=-1) return 2; return 0; } //Ridimensiona le coordinate e le dimensioni del controllo <TEditMask_window::resize_rect(..)> RCT& TEditMask_control::resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt,bool intool)const { return _parent->resize_rect(x,y,dx,dy,wt,intool); } //Ridimensiona come sopra void TEditMask_control::resize_rect() { set_dim(_latox,_latoy); } //Definisce il padre TEditMask_window& TEditMask_control::padre() const { CHECK(_parent,"Campo senza maschera"); return *_parent; } //Setta il prompt const TString& TEditMask_control::set_prompt(const TString& prompt) { return _prompt=(prompt); } //Setta il tipo di controllo const TString& TEditMask_control::set_type(const TString& fld) { return _type_field=(fld); } //Setta l'identificativo const TString& TEditMask_control::set_id(const TString& id) { return _id=(id); } //Setta il campo FLAGS const TString& TEditMask_control::set_flag(const TString& fl) { return _flag=(fl); } //Setta il campo GROUP const TString& TEditMask_control::set_group(const TString& gr) { return _group=(gr); } //Setta il campo CHECKTYPE const TString& TEditMask_control::set_check(const TString& ck) { return _check=(ck); } //Setta il flag relativo alla selezione bool TEditMask_control::set_selected(bool sl) { _selected=sl; return _selected; } //Disegna linee void TEditMask_control::line(short x0,short y0,short x1,short y1) const { PNT f = {y0,x0}; PNT t = {y1,x1}; xvt_dwin_draw_set_pos(maschera(), f); xvt_dwin_draw_line(maschera(), t); } //Scrive il prompt sul controllo void TEditMask_control::frase(short x, short y) const { padre().stringat(x, y,_prompt); } //Setta i campi comuni sulla maschera di supporto void TEditMask_control::set_field(TMask& mask) { mask.set(F_PROMPT,_prompt); mask.set(F_PAGE,_pag); mask.set(F_FOCUS,_focus); mask.set(F_IDENT,_id); mask.set(F_LEFT,_left); mask.set(F_UPPER,_top); mask.set(F_INTOOL,_intool ? "X" : " "); } //Legge i MESSAGE dalla maschera di supporto void TEditMask_control::get_message(TSheet_field& sp) { _message=sp.rows_array(); } //Setta i MESSAGE sulla maschera di supporto void TEditMask_control::set_message(TSheet_field& sp) { sp.rows_array()=_message; } //Stampa su file.uml i MESSAGE void TEditMask_control::print_message(ostream& out)const { TToken_string mes; for(int i=0;i<_message.items();i++) { mes=_message.row(i); if(!mes.blank()) { mes.replace('^','|'); out<<" MESSAGE "<< mes <<"\n"; } } } //Setta i campi opzionali comuni sulla maschera di supporto void TEditMask_control::set_option(TMask& mask) { mask.set(F_FLAG,_flag); mask.set(F_GROUP,_group); mask.set(F_WARNING,_warning); mask.set(F_CHECK,_check); mask.set(F_KEY,_key); mask.set(F_FIELD,_field); } //Legge i campi comuni dalla maschera di supporto void TEditMask_control::get_field(TMask& mask) { _prompt=mask.get(F_PROMPT); _focus=mask.get_int(F_FOCUS); _left=mask.get_int(F_LEFT); _top=mask.get_int(F_UPPER); _pag=mask.get_int(F_PAGE); _id=mask.get(F_IDENT); _intool=mask.get_bool(F_INTOOL); _pag=_parent->max_page(_pag); } //Setta le dimensioni del controllo void TEditMask_control::set_dim(int ln, int lg) { _latox = ln; _latoy = lg; _rct = resize_rect(_left,_top,_latox,_latoy,WO_TE,_intool); } //Setta le coordinate del controllo void TEditMask_control::set_crd(int x, int y) { _left = x; _top = y; } //Legge dalla maschera di supporto i campi comuni opzionali void TEditMask_control::get_option(TMask& mask) { _flag=mask.get(F_FLAG); _group=mask.get(F_GROUP); _warning=mask.get(F_WARNING); _check=mask.get(F_CHECK); _key=mask.get(F_KEY); _field=mask.get(F_FIELD); } //Stampa su file .uml il controllo(i campi comuni e particolari) void TEditMask_control::print_on(ostream& out) const { char c; out<<" BEGIN"<<"\n" ; out<<" PROMPT " << _left << " " <<_top<<" \""; out<<_prompt; for(int i=off(); i > 0; i--) out << ' '; out<<"\"\n"; if(_flag.not_empty()) { for(int j=0;j<_flag.len();j++) { c=toupper(_flag.operator[](j)); if (c!=' ') out<<" FLAGS "<<"\""<< c <<"\"\n"; } } print_message(out); if(_group.not_empty()) out<<" GROUP "<<_group<<"\n"; if(_field.not_empty()) { out<<" FIELD "; for(int f=0;f<_field.len();f++) { c=toupper(_field.operator[](f)); out<<c; } out<<"\n"; } if(_key.not_empty()) out<<" KEY "<<_key<<"\n"; if(_check.not_empty()) { if(_check!=("a")) out<<" CHECKTYPE "; if (_check==("b")) out << "NORMAL\n"; if (_check==("c")) out << "REQUIRED\n"; if (_check==("d")) out << "SEARCH\n"; if (_check==("e")) out << "FORCED\n"; } if(_warning.not_empty()) out<<" WARNING \"" << _warning << "\"\n"; } //Legge da file .uml lecaratteristiche comuni dei controlli void TEditMask_control::read_field(TScanner& scanner,const TString& tok,bool intool) { TString s; if(tok=="PROMPT") { _left = scanner.integer(); _top = scanner.integer(); _prompt = scanner.string(); _intool = intool; _rct = resize_rect(_left,_top,_latox,_latoy,WO_TE,intool); } if(tok=="FLAGS" || tok=="WARNING") { s=(scanner.string()); if(tok=="FLAGS") _flag <<' '<<(s); else _warning=(s); } if(tok=="KEY" || tok=="FIELD" ||\ tok=="GROUP" || tok=="MESSAGE") { TString kf=scanner.line(); if(tok=="KEY") _key <<(kf); else if(tok=="FIELD") _field=(kf); else if(tok=="GROUP") _group <<' '<<(kf); else { kf.replace('|','^'); _message.add(kf); } } if(tok=="CHECKTYPE") { s=scanner.pop(); if(s==("NORMAL")) set_check("b"); if(s==("REQUIRED")) set_check("c"); if(s==("SEARCH")) set_check("d"); if(s==("FORCED")) set_check("e"); } } /////////////////////////////////////////////////////////// // TeditMask_string :controllo tipo STRING /////////////////////////////////////////////////////////// //Costruttore del controllo STRING TEditMask_string::TEditMask_string(TEditMask_window* parent): TEditMask_control(parent) { _lungvd=_lungsz=15; _lngspt=0; _offset = 1; set_prompt(PR("Stringa")); set_type("STRING "); set_id("F_STRING"); set_dim(_lungvd+prompt_len()+off(),1); } //Costruttore copia del controllo TEditMask_string::TEditMask_string(const TEditMask_string& ctl): TEditMask_control(ctl) { _lungvd=_lungsz=ctl._lungvd; _lngspt=ctl._lngspt; _offset =ctl._offset; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(_lungvd+prompt_len()+off(),1); } //Setta l'offset void TEditMask_string::set_offset(int d) { _offset=d; } //Controlla l'assenza di valori per le lunghezze void TEditMask_string::error_lung(int lsz, int lvd) { if(lsz==0) _lungsz=8; if (_lungvd<=0) { _lungvd=_lungsz; _lngspt=0; } else _lngspt=_lungvd; } //Fa l'update del controllo void TEditMask_string::update()const { RCT r=rectangle(); int lenght=prompt_len()*CHARX; int off=_offset*CHARX; RCT ret={r.top,r.left+lenght+off,r.bottom-(CHARY-2)/8,r.right}; padre().set_pen(COLOR_BLACK); if(flag_crt()==2) padre().set_brush(MASK_BACK_COLOR); else padre().set_brush(NORMAL_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&ret); padre().hide_brush(); frase(r.left,r.top); } //Setta solo browse e offset sulla maschera di supporto void TEditMask_string::set_bwoff(TMask& m) { m.set(F_USE,_use); m.set(F_OFFSET,_offset); } //Setta solo le lunghezze sulla maschera di supporto void TEditMask_string::set_lngz(TMask& m) { m.set(F_LONGEFF,_lungsz); m.set(F_LONGEVD,_lungvd); } //Legge dalla maschera di supporto solo le lunghezze void TEditMask_string::get_lngz(TMask& m) { _lungsz=m.get_int(F_LONGEFF); _lungvd=m.get_int(F_LONGEVD); error_lung(_lungsz,_lungvd); } //Legge dalla maschera di supporto solo browse e offset void TEditMask_string::get_bwoff(TMask& m) { _use=m.get(F_USE); _offset=m.get_int(F_OFFSET); } //Gestisce la maschera di supporto KEY TEditMask_string::main_loop() { TMask _mask("ba2600g"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_lngz(_mask); _mask.set(F_ADDR,_addr); set_bwoff(_mask); set_field(_mask); set_option(_mask); set_message(s); KEY k = _mask.run(); if (k == K_ENTER) { get_lngz(_mask); get_message(s); get_field(_mask); get_option(_mask); get_bwoff(_mask); _addr=_mask.get(F_ADDR); set_dim(_lungvd+prompt_len()+off(),1); } return k; } //Stampa su file .uml solo le lunghezze void TEditMask_string::print_lngz(ostream& out) const { if(_lngspt<=0) out << _lungsz <<'\n'; else out<< _lungsz <<' '<< _lungvd <<'\n'; } //Stampa su file .uml solo il browse void TEditMask_string::print_use(ostream& out)const { TString in; if(_use.not_empty()) { for(int k=0;;k++) { int y; for(y = 0;_use[k]!='\n' && _use[k];k++,y++) in[y]=_use[k]; in[y]='\0'; out<<" "<< in <<"\n"; if(!_use[k]) break; } } } //Stampa su file .uml il controllo void TEditMask_string::print_on(ostream& out) const { out<<type()<< ident() << ' '; print_lngz(out); TEditMask_control::print_on(out); if(_addr.not_empty()) out<<" ADD RUN "<<_addr<<"\n"; print_use(out); out <<" END"<<"\n\n"; } //Legge da file .uml solo i valori delle lunghezze void TEditMask_string::read_lngz(TScanner& scanner) { _lungsz=scanner.integer(); if(_lungsz<=0) _lungsz=8; _lungvd=scanner.integer(); if(_lungvd <=0 ) { _lungvd=_lungsz; _lngspt=0; } else _lngspt=_lungvd; } //Legge da file .uml solo l'offset int TEditMask_string::read_off(const TString& prt) { int off=0; for(int i = prt.len()-1; i >= 0 && !isalpha(prt[i]) && !ispunct(prt[i]); i--) off++; return _offset=off; } //Legge da file .uml solo il browse void TEditMask_string::read_use(TScanner& scanner,const TString& tok) { if(tok=="USE" || tok=="JOIN" || tok=="INPUT" ||\ tok=="OUTPUT" || tok=="DISPLAY" || tok=="COPY") { _use <<(tok); _use <<(' '); _use <<(scanner.line()); _use <<('\n'); } } //Legge da file .uml il controllo void TEditMask_string::read_from(TScanner& scanner, bool intool) { TString tok; set_id(scanner.pop()); read_lngz(scanner); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok, intool); read_use(scanner,tok); if(tok=="ADD") { tok=scanner.pop(); tok=scanner.pop(); _addr=(tok); } tok=scanner.pop(); } tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); set_dim(_lungvd+prompt_len()+off(),1); } /////////////////////////////////////////////////////////// // TeditMask_number :controllo tipo NUMBER /////////////////////////////////////////////////////////// //Costruttore del controllo NUMBER TEditMask_number::TEditMask_number(TEditMask_window* parent) :TEditMask_string(parent) { _latox=10; _decimals=0; set_prompt(PR("Numero")); set_type("NUMBER "); set_id("F_NUMBER"); set_dim(_latox + prompt_len() + off(),1); } //Costruttore copia del controllo TEditMask_number::TEditMask_number(const TEditMask_number& ctl) :TEditMask_string(ctl) { _latox=ctl._latox; _decimals=ctl._decimals; _picture=ctl._picture; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(_latox + prompt_len() + off(),1); } //Setta i decimali void TEditMask_number::set_decimal(int d) { _decimals=d; } //Gestisce la maschera di supporto KEY TEditMask_number::main_loop() { TMask _mask("ba2600r"); TSheet_field& s=_mask.sfield(F_MESSAGE); _mask.set(F_LONGEFF,_latox); _mask.set(F_PICTURE,_picture); _mask.set(F_DECIMAL,_decimals); set_field(_mask); set_option(_mask); set_message(s); set_bwoff(_mask); KEY k = _mask.run(); if (k == K_ENTER) { get_message(s); get_field(_mask); get_option(_mask); get_bwoff(_mask); _latox=_mask.get_int(F_LONGEFF); _picture=_mask.get(F_PICTURE); _decimals=_mask.get_int(F_DECIMAL); set_dim(_latox + prompt_len() + off(),1); } return k; } //Stampa su file .uml il controllo void TEditMask_number::print_on(ostream& out) const { if(_decimals<=0) out<<type()<<ident() << " "<< _latox <<'\n'; else out<<type()<<ident() << " "<< _latox <<" "<<_decimals<<'\n'; TEditMask_control::print_on(out); if(_picture.not_empty()) out<<" PICTURE \""<<_picture<<"\"\n"; print_use(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_number::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); _decimals=scanner.integer(); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); read_use(scanner,tok); if(tok=="PICTURE") _picture=(scanner.string()); tok=scanner.pop(); } tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); set_dim(_latox+prompt_len()+off(),1); } const TString& TEditMask_number::set_picture(const TString& pic) { return _picture=(pic); } /////////////////////////////////////////////////////////// // TeditMask_currency :controllo tipo CURRENCY /////////////////////////////////////////////////////////// //Costruttore del controllo CURRENCY TEditMask_currency::TEditMask_currency(TEditMask_window* parent) :TEditMask_number(parent) { _latox=10; set_picture(""); set_prompt(PR("Valuta ")); set_type("CURRENCY "); set_id("F_CUR"); set_dim(_latox + prompt_len(),1); } //Costruttore copia del controllo TEditMask_currency::TEditMask_currency(const TEditMask_currency& ctl) :TEditMask_number(ctl) { _latox=ctl._latox; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(_latox + prompt_len(),1); } //Gestisce la maschera di supporto KEY TEditMask_currency::main_loop() { TMask _mask("ba2600y"); TSheet_field& s=_mask.sfield(F_MESSAGE); _mask.set(F_LONGEFF,_latox); _mask.set(F_PICTURE,_picture); set_field(_mask); set_option(_mask); set_message(s); set_bwoff(_mask); KEY k = _mask.run(); if (k == K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); get_bwoff(_mask); _latox=_mask.get_int(F_LONGEFF); _picture=_mask.get(F_PICTURE); set_picture(_picture); set_dim(_latox + prompt_len() + off(),1); } return k; } void TEditMask_currency::read_from(TScanner& scanner,bool intool) { TEditMask_number::read_from(scanner,intool); set_decimal(0); } /////////////////////////////////////////////////////////// // TeditMask_date :controllo tipo DATE /////////////////////////////////////////////////////////// //Costruttore del controllo DATE TEditMask_date::TEditMask_date(TEditMask_window* parent) :TEditMask_string(parent) { set_prompt(PR("Data")); set_type("DATE "); set_dim(10+prompt_len()+off(),1); set_id("F_DATE"); } //Costruttore copia del controllo TEditMask_date::TEditMask_date(const TEditMask_date& ctl) :TEditMask_string(ctl) { set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(10+prompt_len()+off(),1); } //Gestisce la maschera di supporto KEY TEditMask_date::main_loop() { TMask _mask("ba2600e"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_field(_mask); set_option(_mask); set_message(s); set_bwoff(_mask); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); get_bwoff(_mask); set_dim(12 + prompt_len() + off(),1); } return k; } //Stampa su file .uml il controllo void TEditMask_date::print_on(ostream& out) const { TString id=ident(); out<<type()<<ident() <<"\n"; TEditMask_control::print_on(out); print_use(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_date::read_from(TScanner& scanner,bool intool) { TString id,tok; set_id(scanner.pop()); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); read_use(scanner,tok); tok=scanner.pop(); } tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); set_dim(12+prompt_len()+off(),1); } /////////////////////////////////////////////////////////// // TeditMask_boolean :controllo tipo BOOLEAN /////////////////////////////////////////////////////////// //Costruttore del controllo BOOLEAN TEditMask_boolean::TEditMask_boolean(TEditMask_window* parent) :TEditMask_control(parent) { set_type("BOOLEAN "); set_id("F_CHECK"); set_prompt(PR("Booleano ")); set_dim(prompt_len()+2,1); } //Costruttore copia del controllo TEditMask_boolean::TEditMask_boolean(const TEditMask_boolean& ctl) :TEditMask_control(ctl) { set_type(ctl.type()); set_id(ctl.ident()); set_prompt(ctl.prt()); set_dim(prompt_len()+2,1); } //Fa l'update del controllo void TEditMask_boolean::update()const { RCT r=rectangle(); int lato=(r.bottom - r.top)/2; r.bottom=r.top+(CHARY-2); int top = r.top; r.top = r.bottom - lato; padre().set_pen(MASK_LIGHT_COLOR); line(r.left,r.top,r.left+lato,r.top); line(r.left,r.top,r.left,r.bottom); padre().set_pen(MASK_DARK_COLOR); line(r.left+lato,r.top,r.left+lato,r.bottom); line(r.left,r.bottom,r.left+lato,r.bottom); padre().set_pen(COLOR_BLACK); frase(r.left+lato+CHARX,top); } //Gestisce la maschera di supporto KEY TEditMask_boolean::main_loop() { TMask _mask("ba2600k"); TSheet_field& s=_mask.sfield(116); set_field(_mask); set_option(_mask); set_message(s); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); set_dim(prompt_len()+2,1); } return k; } //Stampa su file .uml il controllo void TEditMask_boolean::print_on(ostream& out) const { out<<type()<<ident()<< "\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_boolean::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } set_dim(prompt_len()+2,1); } /////////////////////////////////////////////////////////// // TeditMask_text :controllo tipo TEXT /////////////////////////////////////////////////////////// //Costruttore del controllo TEXT TEditMask_text::TEditMask_text(TEditMask_window* parent) :TEditMask_string(parent) { set_prompt(PR("Testo")); set_dim(prompt_len(),1); set_type("TEXT "); set_id("DLG_NULL"); set_focus(-1); } //Costruttore copia del controllo TEditMask_text::TEditMask_text(const TEditMask_text& ctl) :TEditMask_string(ctl) { _flag=ctl._flag; _group=ctl._group; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(prompt_len(),1); set_focus(-1); } //Fa l'update del controllo void TEditMask_text::update() const { RCT r=rectangle(); if(flag_crt()==2) padre().set_pen(MASK_BACK_COLOR); else padre().set_pen(COLOR_BLACK); frase(r.left,r.top); } //Gestisce la maschera di supporto KEY TEditMask_text::main_loop() { TMask _mask("ba2600t"); set_field(_mask); _mask.set(F_FLAG,_flag); _mask.set(F_GROUP,_group); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); _flag=_mask.get(F_FLAG); _group=_mask.get(F_GROUP); set_flag(_flag); set_group(_group); set_dim(prompt_len(),1); } return k; } //Stampa su file .uml il controllo void TEditMask_text::print_on(ostream& out) const { out<<type()<< ident() <<"\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_text::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } set_dim(prompt_len(),1); } /////////////////////////////////////////////////////////// // TeditMask_button :controllo tipo BUTTON /////////////////////////////////////////////////////////// //Costruttore TEditMask_button::TEditMask_button(TEditMask_window* parent) :TEditMask_control(parent) { _latox=10; _latoy=2; set_prompt(FR("Bottone")); set_type("BUTTON "); set_id("DLG_NULL"); set_dim(_latox+2,_latoy); } //Costruttore copia del controllo TEditMask_button::TEditMask_button(const TEditMask_button& ctl) :TEditMask_control(ctl) { _latox=ctl._latox; _latoy=ctl._latoy; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(_latox+2,_latoy); } //Definisce i bottoni standard void TEditMask_button::type_button(const TString& id,const TString& pr) { if(pr=="") { // if(id=="DLG_NULL") ; if(id=="DLG_OK") set_prompt(BR("Conferma", 9)) ; else if(id=="DLG_CANCEL") set_prompt(BR("Annulla", 9)); else if(id=="DLG_DELREC") set_prompt(BR("Elimina", 9)); else if(id=="DLG_QUIT") set_prompt(BR("Fine", 9)); else if(id=="DLG_PRINT") set_prompt(BR("Stampa", 9)); else if(id=="DLG_SELECT") set_prompt(BR("Seleziona", 9)); } } //Fa l'update del controllo void TEditMask_button::update()const { RCT rt=rectangle(); RCT r={rt.top,rt.left,rt.bottom-(CHARY-2)/2,rt.right}; int lenght=prompt_len()*CHARX; int latol=(r.right-r.left); int posfx=(latol-lenght)/2; int posfy=((r.bottom-r.top)/2); if(flag_crt()==2) padre().set_brush(DISABLED_BACK_COLOR); else padre().set_brush(BTN_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&r); padre().set_pen(BTN_LIGHT_COLOR,2); line(r.left+2,r.top+2,r.right-2,r.top+2); line(r.left+2,r.top+2,r.left+2,r.bottom-2); padre().set_pen(BTN_DARK_COLOR,2); line(r.right-2,r.top+2,r.right-2,r.bottom-2); line(r.left+2,r.bottom-2,r.right-2,r.bottom-2); padre().set_pen(COLOR_BLACK,1); frase(r.left+posfx,r.top+posfy-10); } //Gestisce la maschera di supporto KEY TEditMask_button::main_loop() { TMask _mask("ba2600n"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_field(_mask); set_option(_mask); set_message(s); _mask.set(F_LONGEFF,_latox); _mask.set(F_LARGE,_latoy); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); _latox=_mask.get_int(F_LONGEFF); _latoy=_mask.get_int(F_LARGE); set_dim(_latox+2,_latoy); type_button(ident(),prt()); } return k; } //Stampa su file .uml il controllo void TEditMask_button::print_on(ostream& out) const { const TString tipo=prt(); out<<type()<<ident()<<" "<<_latox<<" "<<_latoy<<"\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge fa dile .uml il controllo void TEditMask_button::read_from(TScanner& scanner,bool intool) { TString id,tok; id=scanner.pop(); set_id(id); _latox=scanner.integer(); if(_latox<=0) _latox=10; _latoy=scanner.integer(); if(_latoy<=0) _latoy=2; set_dim(_latox+2,_latoy); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } tok=prt(); type_button(id,tok); } /////////////////////////////////////////////////////////// // TeditMask_group :controllo tipo GROUP /////////////////////////////////////////////////////////// //Costruttore del controllo GROUP TEditMask_group::TEditMask_group(TEditMask_window* parent) :TEditMask_control(parent) { set_prompt(PR("Gruppo")); set_type("GROUPBOX "); set_id("DLG_NULL"); _latox=18; _latoy=6; set_dim(_latox,_latoy); set_focus(-2); } //Costruttore copia del controllo TEditMask_group::TEditMask_group(const TEditMask_group& ctl) :TEditMask_control(ctl) { set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); _latox=ctl._latox; _latoy=ctl._latoy; set_dim(_latox,_latoy); set_focus(-2); } //Presenza o no del flags "R" bool TEditMask_group::fl_crt() const { TString fl=flag(); if(fl.find('R')!=-1 || fl.find('r')!=-1) return TRUE; return FALSE; } //Fa l'update del controllo void TEditMask_group::update()const { RCT r=rectangle(); if(fl_crt()) padre().set_pen(MASK_DARK_COLOR); else padre().set_pen(MASK_LIGHT_COLOR); line(r.left,r.top+1+ROWY/2,r.right,r.top+1+ROWY/2); line(r.left,r.top+1+ROWY/2,r.left,r.bottom+1-ROWY/2); if(fl_crt()) padre().set_pen(MASK_LIGHT_COLOR); else padre().set_pen(MASK_DARK_COLOR); line(r.right,r.top+1+ROWY/2,r.right,r.bottom+1-ROWY/2); line(r.left,r.bottom+1-ROWY/2,r.right,r.bottom+1-ROWY/2); padre().set_pen(COLOR_BLACK); frase(r.left+2,r.top); } //Gestisce la maschera di supporto KEY TEditMask_group::main_loop() { TMask _mask("ba2600p"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_field(_mask); set_option(_mask); set_message(s); _mask.set(F_LARGE,_latoy); _mask.set(F_LONGEFF,_latox); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); _latoy=_mask.get_int(F_LARGE); _latox=_mask.get_int(F_LONGEFF); set_dim(_latox,_latoy); } return k; } //Stampa su file .uml il controllo void TEditMask_group::print_on(ostream& out) const { out<<type()<<ident()<<" "<<_latox<<" "<<_latoy<<"\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_group::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); _latoy=scanner.integer(); set_dim(_latox,_latoy); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } } /////////////////////////////////////////////////////////// // TeditMask_list :controllo tipo LIST /////////////////////////////////////////////////////////// //Costruttore del controllo LIST TEditMask_list::TEditMask_list(TEditMask_window* parent) :TEditMask_string(parent) { _num_item=0; _offset=1; set_id("F_LIST"); set_prompt(PR("Lista")); set_type("LIST "); set_dim(dim_video()+ prompt_len()+off(),1); } //Costruttore copia del controllo TEditMask_list::TEditMask_list(const TEditMask_list& ctl) :TEditMask_string(ctl) { _num_item=ctl._num_item; _offset=ctl._offset; _item=ctl._item; set_id(ctl.ident()); set_prompt(ctl.prt()); set_type(ctl.type()); set_dim(dim_video()+ prompt_len()+off(),1); } //Disegna la freccia del controllo void TEditMask_list::image()const { RCT r=rectangle(); int lato=r.bottom-r.top; PNT rt[]= {{r.top+lato/2-4,r.right-lato/2-2}, {r.top+lato/2-4,r.right-lato/2+1}, {r.top+lato/2,r.right-lato/2+1},{r.top+lato/2,r.right-lato/2-2}, {r.top+lato/2-4,r.right-lato/2-2}}; PNT p[] = {{r.top+lato/2,r.right-lato+5}, {r.top+lato/2,r.right-5}, {r.top+lato/2+3,r.right-(lato/2)},{r.top+lato/2,r.right-lato+5}}; padre().set_brush(COLOR_BLACK); xvt_dwin_draw_polygon(maschera(), rt, 5); xvt_dwin_draw_polygon(maschera(), p, 4); line(r.right-lato+5,r.top+lato/2+5,r.right-5,r.top+lato/2+5); padre().hide_brush(); } //Fa l'update del controllo void TEditMask_list::update()const { RCT r=rectangle(); r.bottom=r.bottom-(CHARY-2)/8; int lato=(r.bottom-r.top); RCT rt={r.top, r.right-lato,r.bottom,r.right}; TEditMask_string::update(); padre().set_brush(BTN_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&rt); padre().set_pen(BTN_LIGHT_COLOR,2); line((r.right+2)-lato,r.top+2,(r.right-2),r.top+2); line((r.right+2)-lato,r.top+2,(r.right+2)-lato,r.bottom-2); padre().set_pen(BTN_DARK_COLOR,2); line((r.right-2),r.top+2,r.right-2,r.bottom-2); line((r.right+2)-lato,r.bottom-2,r.right-2,r.bottom-2); padre().set_pen(COLOR_BLACK,1); image(); } //Setta sulla maschera di supporto solo _item void TEditMask_list::set_item(TSheet_field& sp) { sp.rows_array()=_item; } //Legge dalla maschera di supporto solo _item void TEditMask_list::get_item(TSheet_field& sp) { _item=sp.rows_array(); _num_item=sp.items(); } //Gestisce la maschera di supporto KEY TEditMask_list::main_loop() { TMask _mask("ba2600x"); TSheet_field& s=_mask.sfield(F_ITEM); set_lngz(_mask); _mask.set(F_OFFSET,_offset); set_field(_mask); set_option(_mask); set_item(s); KEY k= _mask.run(); if(k==K_ENTER) { get_lngz(_mask); get_field(_mask); get_option(_mask); get_item(s); _offset=_mask.get_int(F_OFFSET); set_offset(_offset); set_dim(dim_video()+prompt_len()+off(),1); } return k; } //Stampa su file .uml solo _item void TEditMask_list::print_item(ostream& out)const { TString message,codice,desc; for(int i=0;i<_item.items();i++) { TToken_string& it=(TToken_string&)_item.row(i); codice=it.get(0); desc=it.get(); if(!codice.blank() && !desc.blank()) { out<<" ITEM \""<<codice<<'|'<<desc<<"\"\n"; message=it.get(2); if(!message.blank()) { message.replace('^','|'); out<<" MESSAGE "<< message<<"\n"; } } } } //Stampa su file .uml il controllo void TEditMask_list::print_on(ostream& out) const { out<<type() << ident() <<' '; print_lngz(out); TEditMask_control::print_on(out); print_item(out); out <<" END"<<"\n\n"; } //Legge da file .uml solo _item TString& TEditMask_list::read_item(TScanner& scanner, TString& tok) { TToken_string it,mes; if(tok=="ITEM") { _num_item++; it=scanner.string(); tok=scanner.pop(); if(tok=="MESSAGE") { mes=scanner.line(); mes.replace('|','^'); it.add(mes); tok=scanner.pop(); } } else tok=scanner.pop(); if(it.ok() && !it.blank()) _item.add(it); return tok; } //Legge da file .uml il controllo void TEditMask_list::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); read_lngz(scanner); tok=scanner.pop(); //tralascio BEGIN while(tok!="END") { tok=read_item(scanner,tok); read_field(scanner,tok,intool); } tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); set_dim(dim_video()+prompt_len()+off(),1); } /////////////////////////////////////////////////////////// // TeditMask_radio :controllo tipo RADIOBUTTON /////////////////////////////////////////////////////////// //Costruttore del controllo RADIOBUTTON TEditMask_radio::TEditMask_radio(TEditMask_window* parent) :TEditMask_list(parent) { _latox=20; _latoy=4; set_id("F_RADIO"); set_prompt(PR("Pulsantiera")); set_type("RADIOBUTTON "); set_dim(_latox,_latoy); } //Costruttore copia del controllo TEditMask_radio::TEditMask_radio(const TEditMask_radio& ctl) :TEditMask_list(ctl) { _latox=ctl._latox; _latoy=ctl._latoy; set_id(ctl.ident()); set_prompt(ctl.prt()); set_type(ctl.type()); set_dim(_latox,_latoy); } //Fa l'update del controllo void TEditMask_radio::update() const { RCT r=rectangle(); padre().hide_brush(); padre().set_pen(MASK_LIGHT_COLOR); line(r.left,r.top+ROWY,r.right,r.top+ROWY); line(r.left,r.top+ROWY,r.left,r.bottom); padre().set_pen(MASK_DARK_COLOR); line(r.right,r.top+ROWY,r.right,r.bottom); line(r.left,r.bottom,r.right,r.bottom); padre().set_pen(COLOR_BLACK); padre().set_pen(MASK_LIGHT_COLOR); int i,k; for (i = 0, k = ROWY; i < n_item(); i++, k+=ROWY) { line(r.left+(ROWY-10),r.top+ROWY+k,r.left+ROWY-2,r.top+(ROWY-8)+k); line(r.left+(ROWY-2),r.top+(ROWY+8)+k,r.left+(ROWY-10),r.top+ROWY+k); } i=0; k=ROWY; padre().set_pen(MASK_DARK_COLOR); for (;i<n_item(); i++, k=k+ROWY) { line(r.left+(ROWY+6),r.top+ROWY+k,r.left+(ROWY-2),r.top+(ROWY+8)+k); line(r.left+(ROWY-2),r.top+(ROWY-8)+k,r.left+(ROWY+6),r.top+ROWY+k); } i=0; k=ROWY; for (;i<n_item(); i++, k=k+ROWY) { TToken_string it=item().row(i); padre().stringat(r.left+(ROWY+10),r.top+(ROWY-8)+k,it.get(1)); } frase(r.left+2,r.top); padre().set_pen(COLOR_BLACK); } //Gestisce la maschera di supporto KEY TEditMask_radio::main_loop() { TMask _mask("ba2600o"); TSheet_field& s=_mask.sfield(F_ITEM); set_field(_mask); set_option(_mask); _mask.set(F_LONGEFF,_latox); set_item(s); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_item(s); _latox=_mask.get_int(F_LONGEFF); if(n_item()==0) set_dim(_latox,4); else { _latoy=16/CHARX; _latoy+=n_item(); //per mantenere l'altezza set_dim(_latox,_latoy); } } else if(k==K_ESC) set_dim(_latox,_latoy); return k; } //Stampa su file .uml il controllo void TEditMask_radio::print_on(ostream& out) const { out<<type() <<ident()<<" "<<_latox<<"\n"; TEditMask_control::print_on(out); print_item(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_radio::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); tok=scanner.pop(); while(tok!="END") { tok=read_item(scanner,tok); read_field(scanner,tok,intool); } if(n_item()==0) _latoy=4; else { _latoy=16/CHARX; _latoy+=n_item(); } set_dim(_latox,_latoy); } /////////////////////////////////////////////////////////// // TeditMask_memo :controllo tipo MEMO /////////////////////////////////////////////////////////// //Costruttore del controllo MEMO TEditMask_memo::TEditMask_memo(TEditMask_window* parent) :TEditMask_control(parent) { _latox=40; _latoy=10; set_prompt(PR("Memo")); set_type("MEMO "); set_id("F_MEMO"); set_dim(_latox,_latoy); } //Costruttore copia del controllo TEditMask_memo::TEditMask_memo(const TEditMask_memo& ctl) :TEditMask_control(ctl) { _latox=ctl._latox; _latoy=ctl._latoy; set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); set_dim(_latox,_latoy); } //Fa l'update del controllo void TEditMask_memo::update()const { RCT r=rectangle(); RCT ret={r.top+ROWY,r.left,r.bottom,r.right}; padre().set_brush(NORMAL_BACK_COLOR); padre().set_pen(COLOR_BLACK,2); xvt_dwin_draw_rect(maschera(),&ret); padre().hide_brush(); padre().set_pen(COLOR_BLACK,1); frase(r.left,r.top); } //Gestisce la maschera di supporto KEY TEditMask_memo::main_loop() { TMask _mask("ba2600m"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_field(_mask); set_option(_mask); set_message(s); _mask.set(F_LONGEFF,_latox); _mask.set(F_LARGE,_latoy); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); _latox=_mask.get_int(F_LONGEFF); _latoy=_mask.get_int(F_LARGE); set_dim(_latox,_latoy); } return k; } //Stampa su file .uml il controllo void TEditMask_memo::print_on(ostream& out)const { out<<type() <<ident()<<" "<<_latox<<" "<<_latoy<<"\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_memo::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); _latoy=scanner.integer(); set_dim(_latox,_latoy); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } } /////////////////////////////////////////////////////////// // TeditMask_spread :controllo tipo SPREADSHEET /////////////////////////////////////////////////////////// //Costruttore del controllo SPREADSHEET TEditMask_sheet::TEditMask_sheet(TEditMask_window* parent) :TEditMask_control(parent), _sheetmask(1,5,60,12,"Sheet",WSF_SIZE,W_DOC) { _latox=40; _latoy=6; set_dim(_latox,_latoy); set_prompt(PR("Tabella")); set_type("SPREADSHEET "); set_id("F_SPREAD"); _sheetmask.set_sheet(this); _sheetmask.open(); if(padre().get_mod()) window_sheet(); //in read non deve creare bottoni in pi� } //Costruttore copia del controllo TEditMask_sheet::TEditMask_sheet(const TEditMask_sheet& ctl) :TEditMask_control(ctl), _sheetmask(1,5,60,12,"Sheet",WSF_SIZE,W_DOC) { _latox=ctl._latox; _latoy=ctl._latoy; set_dim(_latox,_latoy); set_prompt(ctl.prt()); set_type(ctl.type()); set_id(ctl.ident()); _sheetmask.set_sheet(this); _sheetmask.open(); if(padre().get_mod()) window_sheet(); } //Crea sulla maschera (in fase di creazione) 3 bottoni standard void TEditMask_sheet::window_sheet() { DRAW_CTOOLS t; TEditMask_control* btn_ok=_sheetmask.addbutton(); btn_ok->set_prompt(BR("Conferma", 9)); btn_ok->set_id("DLG_OK"); btn_ok->set_crd(-13,-1); btn_ok->set_dim(10+2,2); TEditMask_control* btn_cancel=_sheetmask.addbutton(); btn_cancel->set_prompt(BR("Annulla", 9)); btn_cancel->set_id("DLG_CANCEL"); btn_cancel->set_crd(-23,-1); btn_cancel->set_dim(10+2,2); TEditMask_control* btn_del=_sheetmask.addbutton(); btn_del->set_prompt(BR("Elimina", 9)); btn_del->set_id("DLG_DELREC"); btn_del->set_crd(-33,-1); btn_del->set_dim(10+2,2); xvt_app_get_default_ctools(&t); //per eliminare la modalit� M_XOR xvt_dwin_set_draw_ctools(maschera(),&t); } //Fa l'update del controllo void TEditMask_sheet::update()const { RCT r=rectangle(); int longe=r.right-(r.left+3*CHARX); int large=r.bottom-(r.top+ROWY); int latolong=longe/6; RCT rt={r.top,r.left,r.top+ROWY,r.right-10}; //orizzontale RCT rc={r.top,r.left,r.top+ROWY+3*CHARY,r.left+3*CHARX};//verticale RCT rg={r.top,r.left,r.bottom,r.right}; RCT rn={r.top+ROWY,r.left+3*CHARX,r.top+ROWY+3*CHARY,r.right-10}; padre().set_brush(TOOL_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&rg); padre().set_brush(NORMAL_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&rn); padre().set_brush(BTN_BACK_COLOR); xvt_dwin_draw_rect(maschera(),&rc); xvt_dwin_draw_rect(maschera(),&rt); padre().hide_brush(); padre().set_pen(BTN_LIGHT_COLOR,2); line(r.left+2,r.top+2,r.right-12,r.top+2); line(r.left+2,r.top+2,r.left+2,r.top+ROWY+3*CHARY); line(r.left+3*CHARX+2,r.top+2,r.left+3*CHARX+2,r.top+ROWY-2);//primo pezz..verticale line(r.left+2,r.top+ROWY+2,r.left+3*CHARX,r.top+ROWY+2); //primo pezz..orizz. for (int i=2;i<6;i+=2) //verticali line(r.left+3*CHARX+i*latolong+2,r.top+2,r.left+3*CHARX+i*latolong+2,r.top+ROWY-2); for (int s=1;s<3;s++) //orizz. line(r.left+2,r.top+ROWY+2+s*CHARY,r.left+3*CHARX-2,r.top+ROWY+s*CHARY+2); padre().set_pen(BTN_DARK_COLOR,2); line(r.left+2,r.top+ROWY-2,r.right-10,r.top+ROWY-2);//orizz. line(r.left+3*CHARX,r.top,r.left+3*CHARX,r.top+ROWY+3*CHARY); //verticale line(r.right-12,r.top+1,r.right-12,r.top+ROWY); for (int f=2;f<6;f+=2) //righe verticali line(r.left+3*CHARX+f*latolong,r.top+2,r.left+3*CHARX+f*latolong,r.top+ROWY-2); for (int h=1;h<4;h++) //righe orizzontali line(r.left+2,r.top+ROWY+h*CHARY,r.left+3*CHARX-2,r.top+ROWY+h*CHARY); padre().set_pen(COLOR_BLACK,2); line(r.left+2,r.top+ROWY,r.right-12,r.top+ROWY);//orizz. line(r.right-12,r.top+1,r.right-12,r.top+ROWY); padre().set_pen(COLOR_BLACK,1); for (int j=2;j<6;j+=2) //verticali line(r.left+3*CHARX+j*latolong,r.top+ROWY,r.left+3*CHARX+j*latolong,r.top+ROWY+3*CHARY); for (int y=1;y<3;y++) //orizzontali line(r.left+3*CHARX,r.top+ROWY+y*CHARY,r.right-10,r.top+ROWY+y*CHARY); padre().stringat(r.left+2*CHARX,r.top+ROWY,"1"); padre().stringat(r.left+2*CHARX,r.top+2*CHARY+CHARX,"2"); padre().stringat(r.left+2*CHARX,r.top+3*CHARY+CHARX,"3"); } //Setta sulla maschera di supporto solo _item e browse void TEditMask_sheet::set_itbr(TMask& m,TSheet_field& sp) { sp.rows_array()=_item; m.set(F_USE,_browse); } //Legge dalla maschera di supporto solo _item e browse void TEditMask_sheet::getitbr(TMask& m,TSheet_field& sp) { _item=sp.rows_array(); _browse=m.get(F_USE); } //Gestisce la maschera di supporto KEY TEditMask_sheet::main_loop() { TToken_string spr, sd; TMask _mask("ba2600d"); TSheet_field& s=_mask.sfield(F_ITEM); set_field(_mask); set_option(_mask); _mask.set(F_LONGEFF,_latox); _mask.set(F_LARGE,_latoy); set_itbr(_mask,s); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); getitbr(_mask,s); _latox=_mask.get_int(F_LONGEFF); _latoy=_mask.get_int(F_LARGE); set_dim(_latox,_latoy); } return k; } //Stampa su file .uml solo _item void TEditMask_sheet::print_item(ostream& out)const { TString message,desc; for(int i=0;i<_item.items();i++) { TToken_string& it=(TToken_string&)_item.row(i); desc=it.get(0); if(!desc.blank()) { out<<" ITEM \""<<desc<<"\"\n"; message=it.get(1); if(!message.blank()) out<<" MESSAGE "<< message<<"\n"; } } } //Stampa su file .uml solo il browse void TEditMask_sheet::print_browse(ostream& out)const { TString in; if(_browse.not_empty()) { for(int k=0;;k++) { int y; for(y = 0;_browse[k]!='\n' && _browse[k]; k++, y++) in[y]=_browse[k]; in[y]='\0'; out<<" "<<in<<"\n"; if(!_browse[k]) break; } } } //Stampa su file .uml il controllo void TEditMask_sheet::print_on(ostream& out)const { out<<type() <<ident()<<" "<<_latox<<" "<<_latoy<<"\n"; TEditMask_control::print_on(out); print_item(out); print_browse(out); out <<" END"<<"\n\n"; } //Legge da file .uml solo gli _item TString& TEditMask_sheet::read_item(TScanner& scanner,TString& tok) { TString sh; if(tok=="ITEM") { sh=scanner.string(); if(sh.ok() && !sh.blank()) _item.add(sh); } tok=scanner.pop(); return tok; } //Legge da file .uml solo il browse void TEditMask_sheet::read_browse(TScanner& scanner,const TString& tok) { if(tok=="USE" || tok=="JOIN" || tok=="INPUT" ||\ tok=="OUTPUT" || tok=="DISPLAY" || tok=="COPY") { _browse <<(tok); _browse <<(scanner.line()); _browse <<('\n'); } } //Legge da file .uml il controllo void TEditMask_sheet::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); _latoy=scanner.integer(); set_dim(_latox,_latoy); tok=scanner.pop(); while(tok!="END") { tok=read_item(scanner,tok); read_field(scanner,tok,intool); read_browse(scanner,tok); } } /////////////////////////////////////////////////////////// // TeditMask_zoom :controllo tipo ZOOM /////////////////////////////////////////////////////////// //Costruttore del controllo ZOOM TEditMask_zoom::TEditMask_zoom(TEditMask_window* parent) :TEditMask_list(parent) { _latox=15; _offset=1; set_id("F_ZOOM"); set_prompt(PR("Zoom")); set_type("ZOOM "); set_dim(_latox+prompt_len()+off(),1); } //Costruttore copia del controllo TEditMask_zoom::TEditMask_zoom(const TEditMask_zoom& ctl) :TEditMask_list(ctl) { _latox=ctl._latox; _offset=ctl._offset; set_id(ctl.ident()); set_prompt(ctl.prt()); set_type(ctl.type()); set_dim(_latox+prompt_len()+off(),1); } //Gestisce la maschera di supporto KEY TEditMask_zoom::main_loop() { TMask _mask("ba2600z"); TSheet_field& s=_mask.sfield(F_MESSAGE); set_field(_mask); set_option(_mask); set_message(s); _mask.set(F_LONGEFF,_latox); _mask.set(F_OFFSET,_offset); KEY k= _mask.run(); if(k==K_ENTER) { get_field(_mask); get_option(_mask); get_message(s); _latox=_mask.get_int(F_LONGEFF); _offset=_mask.get_int(F_OFFSET); set_offset(_offset); set_dim(_latox+prompt_len()+off(),1); } return k; } //Stampa su file .uml il controllo void TEditMask_zoom::print_on(ostream& out) const { TString id=ident(); out<<type() << ident() <<" "<<_latox<<"\n"; TEditMask_control::print_on(out); out <<" END"<<"\n\n"; } //Legge da file .uml il controllo void TEditMask_zoom::read_from(TScanner& scanner,bool intool) { TString tok; set_id(scanner.pop()); _latox=scanner.integer(); tok=scanner.pop(); while(tok!="END") { read_field(scanner,tok,intool); tok=scanner.pop(); } tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); set_dim(_latox+prompt_len()+off(),1); } //---------------------------------------- //Inizializza il rettangolo di selezione void TEditMask_window::inizialition() { _rct_sel.left=_rct_sel.top=0; _rct_sel.right=_rct_sel.bottom=0; } //Intercetta un punto all'interno del controllo bool TEditMask_control::contains(const PNT pnt) { bool dentro=xvt_rect_has_point(&_rct,pnt) != 0; return dentro; } //Ritorna il controllo avente il punto pnt TEditMask_control* TEditMask_window::search(const PNT& pnt) { for(int i=_controls.items()-1; i >= 0; i--) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (_page==down.page() && down.contains(pnt)) { down.set_selected(TRUE); return &down; } } return NULL; } //Ritorna TRUE se esistono controlli selezionati bool TEditMask_window::search(RCT* rct) { bool sel=FALSE; for(int i=_controls.items()-1; i >= 0; i--) { TEditMask_control& down=(TEditMask_control& )_controls[i]; PNT p={down.rectangle().top,down.rectangle().left}; bool selected=xvt_rect_has_point(rct,p) != 0; if (selected && _page == down.page()) { down.set_selected(TRUE); sel=TRUE; selected=FALSE; } } return sel; } //Ridisegna il controllo spostato bool TEditMask_control::redesign(int dx, int dy) { PNT dev; dev.h = _rct.left; dev.v = _rct.top; PNT log = padre().logic(dev, _intool); _left = log.h + dx / CHARX; if (_left < 0) _left = 0; if (_left > 78) _left = 78; _top = log.v + dy / ROWY ; if (_top < 0) _top = 0; if (_top > ROWY) _top = ROWY; resize_rect(); return TRUE; } //Ridisegna il rettangolo di selezione bool TEditMask_window::redesign(RCT* rct, int dx, int dy) { int height = xvt_rect_get_height(rct); int width = xvt_rect_get_width(rct); bool intool; PNT dev; dev.h = rct->left; dev.v = rct->top; PNT log = logic(dev, intool); int x = log.h + dx/CHARX; if (x < 0) x = 0; if (x > 78) x = 78; int y = log.v + dy/ROWY; if (y < 0) y = 0; if (y > 19) y = 19; *rct = resize_rect(x,y,1,1,WO_TE,intool); rct->right = rct->left +width; rct->bottom=rct->top + height; return TRUE; } //Permette di spostare uno o pi� controlli selezionati void TEditMask_window::move(RCT* rct,PNT pntinz, PNT pntfin) { int dx=(pntfin.h-pntinz.h); //trasla lungo x int dy=(pntfin.v-pntinz.v); //trasla lungo y if(pntfin.h/CHARX==pntinz.h/CHARX && pntfin.v/ROWY==pntinz.v/ROWY) ; else { redesign(rct,dx,dy); for(int i=0; i<_controls.items(); i++) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (down.get_selected()) down.redesign(dx,dy); } } } //Distrugge il controllo con tasto ELIMINA di maschera di supporto void TEditMask_window::destroy_control(TEditMask_control* c) { for(int i=_controls.last(); i >= 0; i--) { if (_controls.objptr(i) == c) { _controls.destroy(i, TRUE); break; } } _controllo=NULL; } //Controllo sull'ordine delle pagine int TEditMask_window::max_page(int pag) { if(pag>_total_page) { int diff=pag-_total_page; if(diff==1) _total_page=pag; else { error_box("Non esagerare, va avanti una pagina per volta! Ti aiuto io... "); _total_page+=1; pag=_total_page; } _name.add("Maschera",pag); _name.pack(); } return pag; } //Copia i controlli selezionati void TEditMask_window::copy_crt_sel() { int items=_controls.items(); PNT inz={_rct_sel.top,_rct_sel.left}; PNT fin={1*ROWY,1*CHARX}; for(int i=items-1; i>=0; i--) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (down.get_selected()) { down.set_selected(FALSE); int j=_controls.add(down); TEditMask_control& gr=(TEditMask_control& )_controls[j]; gr.set_selected(TRUE); } } move(&_rct_sel,inz,fin); force_update(); } //Cancella i controlli selezionati void TEditMask_window::erase_crt_sel() { for(int i=_controls.last(); i >= 0; i--) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (down.get_selected()) _controls.destroy(i, TRUE); } _controllo=NULL; inizialition(); xvt_win_set_cursor(win(), CURSOR_ARROW); force_update(); } //Muove nella pagina richiesta(se permessa)i controlli selezionati void TEditMask_window::move_crt_sel() { int pag; TMask m("ba2600l"); KEY k=m.run(); if(k==K_ENTER) { if(xvt_rect_is_empty(&_rct_sel)) warning_box(TR("Pensi di avere selezionato qualcosa??")); else { pag=m.get_int(101); if(pag==0) { warning_box(TR("La pagina 0 non esiste! Lascio tutto ancora nella stessa pagina.")); pag=_page; } else { pag=max_page(pag); for(int i=0; i<_controls.items(); i++) { TEditMask_control& down=(TEditMask_control& )_controls[i]; if (down.get_selected()) down.set_page(pag); } } } } } //Disegna una linea sulla "maschera" void TEditMask_window::line(short x0,short y0,short x1,short y1) const { PNT f = {y0,x0}; PNT t = {y1,x1}; xvt_dwin_draw_set_pos(win(), f); xvt_dwin_draw_line(win(), t); } //Gestisce l'evento legato ad E_CHAR void TEditMask_window::o_key(KEY key) { switch(key) { case K_NEXT: if(_page==_total_page) ; else _page+=1; update(); break; case K_PREV: if(_page!=1 && _page>1) _page-=1; update(); break; case K_DEL: erase_crt_sel(); break; case K_F6: copy_crt_sel(); break; case K_F2: { move_crt_sel(); force_update(); } break; case K_F3: { vision_ctrl(); } break; case K_F4: { vision_spread(); } break; case K_F5: { vision_sp_ctl(); } break; default: break; } } //Deseleziona i controlli selezionati void TEditMask_window::deselection() { for(int i=0; i<_controls.items(); i++) { TEditMask_control& down=(TEditMask_control& )_controls[i]; down.set_selected(FALSE); } xvt_win_set_cursor(win(), CURSOR_ARROW); } //Controlla l'appartenenza di un punto al rettangolo di selezione bool TEditMask_window::selection(RCT* rct,PNT pnt) { return (xvt_rect_has_point(rct,pnt) != 0); } //Crea il rettangolo di selezione void TEditMask_window::rubber_rect(WINDOW win, RCT*rctp,PNT p) { RCT rct; DRAW_CTOOLS t; xvt_app_get_default_ctools(&t); t.pen.color=COLOR_BLACK; t.brush.color=MASK_BACK_COLOR; t.pen.pat=PAT_RUBBER; t.brush.pat=PAT_HOLLOW; t.mode=M_XOR; xvt_dwin_set_draw_ctools(win,&t); normalize_rect(&rct,rctp); xvt_dwin_draw_rect(win,&rct); } //Normalizza un rettangolo void TEditMask_window::normalize_rect(RCT *norm_rctp, RCT*rctp) { xvt_rect_set(norm_rctp, min(rctp->left, rctp->right), min(rctp->top, rctp->bottom),max(rctp->left, rctp->right), max(rctp->top, rctp->bottom)); } //Gestisce la selezione void TEditMask_window::selected_crt(WINDOW win, EVENT* ep) { static PNT last_pnt,posinz,posfin; static bool first_move,down=FALSE,sel=FALSE; static bool is_rect=FALSE; switch(ep->type) { case E_MOUSE_DOWN: if(ep->v.mouse.button==0) //solo con il tasto sinistro { down=TRUE; last_pnt=posinz=ep->v.mouse.where; //punto iniziale if(xvt_rect_is_empty(&_rct_sel)) //fase primordiale { _controllo=search(posinz); if(_controllo) { _rct_sel=_controllo->rectangle(); //diventa il controllo stesso _controllo->set_selected(TRUE); is_rect=TRUE; } } if(selection(&_rct_sel,last_pnt)) { is_rect=TRUE; sel=TRUE; } else { is_rect=FALSE; deselection(); //deseleziono i controlli _rct_sel.left=ep->v.mouse.where.h; //si definisce la posizione iniziale _rct_sel.top=ep->v.mouse.where.v; first_move=TRUE; //per dire se esiste un rubber rect } xvt_win_trap_pointer(win); //arresta tutti gli altri possibili eventi } break; case E_MOUSE_MOVE: last_pnt=ep->v.mouse.where; if(!down) //non ho premuto down percio' non disegno { bool in_rct = selection(&_rct_sel,last_pnt); xvt_win_set_cursor(win, in_rct ? CURSOR_PLUS : CURSOR_ARROW); is_rect = in_rct; return ; } if(!selection(&_rct_sel,last_pnt)) { if(!is_rect) { if(!first_move) rubber_rect(win,&_rct_sel,last_pnt); //cancella il vecchio rettangolo first_move=FALSE; //risetto solamente _rct_sel.right=ep->v.mouse.where.h; //disegno il nuovo rettangolo->rinnova sempre _rct_sel.bottom=ep->v.mouse.where.v; //le coordinate finali per disegnarlo mentre si muove il mouse rubber_rect(win,&_rct_sel,last_pnt); } } break; case E_MOUSE_UP: DRAW_CTOOLS t; posfin=ep->v.mouse.where; if(sel) { move(&_rct_sel,posinz,posfin); force_update(); sel=FALSE; } else { if(posinz.h==posfin.h && posinz.v==posfin.v) inizialition(); if(!first_move) rubber_rect(win,&_rct_sel,last_pnt); //cancella il rubber rettangolo if(!xvt_rect_is_empty(&_rct_sel)) { if(!search(&_rct_sel)) { inizialition(); deselection(); } else is_rect=TRUE; } xvt_win_set_cursor(win, CURSOR_ARROW); xvt_win_release_pointer(); //rilascia gli eventi } down=FALSE; xvt_app_get_default_ctools(&t); //per eliminare la modalit� M_XOR xvt_dwin_set_draw_ctools(win,&t); break; } } //Converte da pixel a caratteri PNT& TEditMask_window::logic(const PNT& p, bool& intool) { static PNT pnt; RCT r; const int MAXX=640; xvt_vobj_get_client_rect(win(), &r); //client_area const int width = r.right; int x = p.h; if (width > MAXX) { const int dim = (width - MAXX) / 2; x -= dim; } pnt.h = x < 2*CHARX ? 0 : x/CHARX-1; pnt.v = p.v/ROWY; /* Scommentare quando verranno inseriti i tab buttons if (_tool && _total_page > 1) { if (pnt.v > 0) pnt.v--; } */ if (_tool && pnt.v > _y_tool) { pnt.v -= _y_tool; intool = TRUE; } else intool = FALSE; return pnt; } //Gestisce gli eventi long TEditMask_window::handler(WINDOW win, EVENT *ep) { static bool down=FALSE; switch (ep->type) { case E_MOUSE_DOWN: { _controllo=search(ep->v.mouse.where); if(_controllo && _controllo->type()=="SPREADSHEET ") { _controllo->set_hismask(TRUE); _idsheet=_controllo->get_idsheet(); } if(ep->v.mouse.button==1) { if (_controllo) { KEY k = _controllo->main_loop(); if (k == K_DEL) destroy_control(_controllo); } else main_loop(); update(); break; } } case E_MOUSE_UP: case E_MOUSE_MOVE: { TString80 s; const PNT& p = ep->v.mouse.where; bool intool; const PNT pnt=logic(p, intool); s.format(FR("Coordinate:%3d,%3d"), pnt.h , pnt.v); xvtil_statbar_set(s); if(win) selected_crt(win,ep); } break; case E_CHAR: { TString16 p; o_key(e_char_to_key(ep)); p.format(FR("Pag.%d"),_page); xvtil_statbar_set(p); set_caption(_name.row(_page)); } break; default: break; } return TWindow::handler(win, ep); } //Aggiunge un controllo tipo STRING TEditMask_control* TEditMask_window::addstring() { TEditMask_string* c=new TEditMask_string(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo NUMBER TEditMask_control* TEditMask_window::addnumber() { TEditMask_number* c=new TEditMask_number(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo CURRENCY TEditMask_control* TEditMask_window::addcurrency() { TEditMask_currency* c=new TEditMask_currency(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo DATE TEditMask_control* TEditMask_window::adddate() { TEditMask_date* c=new TEditMask_date(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo BOOLEAN TEditMask_control* TEditMask_window::addboolean() { TEditMask_boolean* c=new TEditMask_boolean(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo TEXT TEditMask_control* TEditMask_window::addtext() { TEditMask_text* c=new TEditMask_text(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo BUTTON TEditMask_control* TEditMask_window::addbutton() { TEditMask_button* c=new TEditMask_button(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo GROUP TEditMask_control* TEditMask_window::addgroup() { TEditMask_group* c=new TEditMask_group(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo RADIOBUTTON TEditMask_control* TEditMask_window::addradio() { TEditMask_radio* c=new TEditMask_radio(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo MEMO TEditMask_control* TEditMask_window::addmemo() { TEditMask_memo* c=new TEditMask_memo(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo ZOOM TEditMask_control* TEditMask_window::addzoom() { TEditMask_zoom* c=new TEditMask_zoom(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo SPREADSHEET TEditMask_control* TEditMask_window::addsheet() { TEditMask_sheet* c=new TEditMask_sheet(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo tipo LISTBOX TEditMask_control* TEditMask_window::addlist() { TEditMask_list* c=new TEditMask_list(this); _controls.add(c); c->update(); return c; } //Aggiunge un controllo generico(esplicitato da m) void TEditMask_window::add_control(MENU_TAG m) { TEditMask_control* ctl=NULL; TEditMask_window* w=this; bool is_sheet = get_sheet() != NULL; for(int i=0;i<_controls.items() ;i++) { TEditMask_control& sp = (TEditMask_control&)_controls[i]; if(sp.type()=="SPREADSHEET " && _page==sp.page() && sp.get_hismask()) { w =find_sheet(_idsheet)->figlio(); is_sheet= TRUE; w->set_focus(); sp.set_hismask(FALSE); break; } else w = this; } switch(m) { case MENU_ITEM_ID(31): w->addbutton(); break; case MENU_ITEM_ID(32): w->addboolean(); break; case MENU_ITEM_ID(33): w->addcurrency(); break; case MENU_ITEM_ID(34): w->adddate(); break; case MENU_ITEM_ID(35): w->addgroup(); break; case MENU_ITEM_ID(36): w->addlist(); break; case MENU_ITEM_ID(37): w->addmemo(); break; case MENU_ITEM_ID(38): w->addnumber(); break; case MENU_ITEM_ID(39): w->addradio(); break; case MENU_ITEM_ID(311): w->addstring(); break; case MENU_ITEM_ID(312): w->addtext(); break; case MENU_ITEM_ID(313): w->addzoom(); break; case MENU_ITEM_ID(310): if (!is_sheet) { ctl = w->addsheet(); _nsheet++; ctl->set_idsheet(_nsheet); } break; default: break; } } //Setta la "maschera" a seconda della presenza o no della tool void TEditMask_window::set_toolbar(bool tb) { TToken_string& it=(TToken_string&)_name.row(_page); if (tb != _tool || !tb) { xvt_vobj_destroy(win()); do_events(); _tool = tb; if (tb) create(0,0,0,0,it,0,W_PLAIN); else { create(_coordx,_coordy,_lung,_alt,it,WSF_SIZE,W_DOC); } open(); set_font(); for(int i=0; i<_controls.items(); i++) { TEditMask_control& up=(TEditMask_control& )_controls[i]; up.resize_rect(); up.update(); } } } //Fa l'update della "maschera" void TEditMask_window::update() { RCT r={_rt.top,0,_rt.bottom,_rt.right}; xvt_dwin_clear(win(), MASK_BACK_COLOR); if(_tool) { set_pen(MASK_LIGHT_COLOR); set_brush(MASK_BACK_COLOR); _rt=::resize_rect(0,_y_tool,0,0,W_DOC,win()); line(0,_rt.top,_rt.right,_rt.top); set_pen(TOOL_BACK_COLOR); line(0,_rt.top-2,_rt.right-2,_rt.top-2); set_pen(COLOR_BLACK); line(0,_rt.top-1,_rt.right-1,_rt.top-1); hide_brush(); } for(int i=0; i<_controls.items(); i++) { _controls.pack(); TEditMask_control& up=(TEditMask_control& )_controls[i]; PNT p={up.rectangle().top,up.rectangle().left}; if(up.page()==_page && up.flag_crt()!=1) up.update(); if(xvt_rect_has_point(&r,p) != 0) up.update(); } } //Setta i campi della maschera di supporto della "maschera" void TEditMask_window::set_mask(TMask& m) { m.set(F_PAG,_page); m.set(F_TOOL,_tool ? "X" : " "); m.set(F_TYPE,_type_vz); m.set(F_X,_coordx); m.set(F_Y,_coordy); m.set(F_LG,_alt); m.set(F_LN,_lung); m.set(F_TOTALP,_total_page); m.set(F_TOOLY,_y_tool); } //Legge dalla maschera di supporto i campi void TEditMask_window::get_mask(TMask& m) { _type_vz=m.get(F_TYPE); _coordx=m.get_int(F_X); _coordy=m.get_int(F_Y); _alt=m.get_int(F_LG); _lung=m.get_int(F_LN); _y_tool=m.get_int(F_TOOLY); if(_type_vz==("a")) _coordx=_coordy=-1; set_toolbar(m.get_bool(F_TOOL)); } //Legge da file .uml solo i controlli TEditMask_control* TEditMask_window::read_control(TScanner& scanner,const TString& k, bool intool) //aggiunge i controlli { TEditMask_control* ctl=NULL; if (k == "ST") ctl = addstring(); if (k == "NU") ctl = addnumber(); if (k == "CU") ctl = addcurrency(); if (k == "DA") ctl = adddate(); if (k == "BO") ctl = addboolean(); if (k == "TE") ctl = addtext(); if (k == "BU") ctl = addbutton(); if (k == "LI") ctl = addlist(); if (k == "ME") ctl = addmemo(); if (k == "ZO") ctl = addzoom(); if (k == "GR") ctl = addgroup(); if (k == "SP") { ctl = addsheet(); _nsheet++; ctl->set_idsheet(_nsheet); } if (k == "RA") ctl = addradio(); if(ctl) ctl->read_from(scanner, intool); /* else warning_box("Ce sta' un campo un po' strano.. AGGIORNAMI!! "); */ return ctl; } //Legge da file .uml solo le propriet� della pagina void TEditMask_window::read_page(TScanner& scanner, int pg,bool tool) { if(!tool) _name.add(TR("Maschera"),0); _page=_total_page=pg; _name.add(scanner.string(),_page); set_caption(_name.row(_page)); _coordx=scanner.integer(); _coordy=scanner.integer(); _lung=scanner.integer(); _alt=scanner.integer(); if(!tool) set_toolbar(FALSE); } //Legge da file .uml solo la toolbar bool TEditMask_window::read_tool(TScanner& scanner) { TString s; _name.add(scanner.string(),0); set_toolbar(TRUE); scanner.rectangle(_rt.left, _rt.top, _rt.right, _rt.bottom); _y_tool=_rt.top; if (_y_tool < 0) _y_tool = _y_tool + 22; s=scanner.pop(); int fieldno=1; while(s!="ENDPAGE") { TEditMask_control* ctrl = read_control(scanner,scanner.key(), TRUE); if (ctrl) ctrl->set_focus(fieldno++); s=scanner.pop(); } return TRUE; } //Gestisce la lettura da file .uml della "maschera" void TEditMask_window::restore_mask(const char* filename) { int pg=0,sh=0; TString in; bool tool=FALSE, endpage=FALSE; _file=filename; _file.lower(); TScanner scanner(_file); TEditMask_window* w=this; in=scanner.pop(); if(scanner.ok()) { while(!scanner.eof()) { for(int i=-1; i<_nsheet; i++) { if(_nsheet!=0) { pg=0; sh++; tool=FALSE; in=scanner.pop(); w=find_sheet(sh)->figlio(); } while (in!="ENDMASK") { while (in!="ENDPAGE") { if (in =="TOOLBAR") { tool=w->read_tool(scanner); in=scanner.pop(); } if (in == "PAGE") { pg++; int fieldno=1; w->read_page(scanner, pg, tool); in=scanner.pop(); while (in != "ENDPAGE") { TEditMask_control* ctrl = w->read_control(scanner,scanner.key()); if (ctrl) ctrl->set_focus(fieldno++); in=scanner.pop(); } endpage=TRUE; } if (!endpage) in=scanner.pop(); } in=scanner.pop(); } } in=scanner.pop(); } } endpage=tool=FALSE; } //Salva come.. la "maschera" su file .uml void TEditMask_window::save_as_mask() { FILE_SPEC fs; memset(&fs, 0, sizeof(FILE_SPEC)); strcpy(fs.type,"UML"); strcpy(fs.creator, "ba2"); xvt_fsys_get_default_dir(&fs.dir); if (xvt_dm_post_file_save(&fs, TR("Salva con nome:"))== FL_OK) { xvt_fsys_set_dir(&fs.dir); _file=fs.name; create_file(); create_fileh(); } else return; } //Risalva la "maschera" su file .uml void TEditMask_window::save_mask() { create_file(); create_fileh(); } //Visualizza i controlli della "maschera" dello spreadsheet corrente void TEditMask_window::vision_sp_ctl() { TEditMask_window* w=this; for(int i=0;i<_controls.items() ;i++) { TEditMask_control& sp = (TEditMask_control&)_controls[i]; if(sp.type()=="SPREADSHEET " && _page==sp.page()) { w =sp.figlio(); w->vision_ctrl(); } } } //Visualizza la "maschera" relativa allo spreadsheet corrente void TEditMask_window::vision_spread() { TEditMask_window* w=this; for(int i=0;i<_controls.items() ;i++) { TEditMask_control& sp = (TEditMask_control&)_controls[i]; if(sp.type()=="SPREADSHEET " && _page==sp.page()) { w =sp.figlio(); w->set_focus(); } } } //Visualizza tutti i controlli presenti nella pagina corrente void TEditMask_window::vision_ctrl() { TArray_sheet elenco(-1,-1,76,20,TR("Elenco dei controlli"), HR("Tipo@15|Identificativo@15|Prompt@25|Pagina@8|Flags@10"), 0x4); for(int i=0;i<_controls.items() ;i++) { TEditMask_control& e = (TEditMask_control&)_controls[i]; if(_page==e.page()) { TToken_string* ts = new TToken_string(80); ts->add(e.type()); ts->add(e.ident()); ts->add(e.prt()); ts->add(e.page()); ts->add(e.flag()); elenco.add(ts); } } KEY k = elenco.run(); if (k == K_ENTER || k == K_DEL) { TEditMask_control& e = (TEditMask_control&)_controls[(int)elenco.selected()]; if (k == K_ENTER) k = e.main_loop(); if (k == K_DEL) destroy_control(&e); force_update(); } } //Gestisce la maschera di supporto della "maschera" KEY TEditMask_window::main_loop() { TMask _mask("ba2600s"); TString name; set_mask(_mask); for(int k=0;k<=_total_page;k++) if(_page==k) _mask.set(F_PRT,_name.row(k)); KEY key=_mask.run(); if(key==K_ENTER) { _page=_mask.get_int(F_PAG); max_page(_page); _name.add(_mask.get(F_PRT),_page); _name.pack(); get_mask(_mask); } return key; } //////////////////////////////////////////////////////////////////////// // TMaskEditor_application :classe per la gestione dell'applicazione //////////////////////////////////////////////////////////////////////// //Richiama <TApplication::create> bool TMaskEditor_application::create() { dispatch_e_menu(MENU_ITEM_ID(11)); return true; } //Richiama <TApplication::destroy> bool TMaskEditor_application::destroy() { destroy_window(); return TApplication::destroy(); } //Distrugge la finestra("maschera") presente void TMaskEditor_application::destroy_window() { if(_window) { do_events(); delete _window; _window=NULL; } } //Crea una nuova finestra("maschera") void TMaskEditor_application::new_mask() { destroy_window(); _window = new TEditMask_window(-1,-1,78,20,TR("Maschera"), WSF_SIZE,W_DOC); _window->open(); _dirty = TRUE; } //Apre una "maschera" void TMaskEditor_application::open_mask() { TFilename in; if (_dirty && _save && yesno_box(TR("Salvare la maschera corrente?"))) save_as_mask(); _dirty = _save = FALSE; destroy_window(); FILE_SPEC fs; memset(&fs, 0, sizeof(FILE_SPEC)); strcpy(fs.type, "UML"); strcpy(fs.name, ""); strcpy(fs.creator, "ba2"); xvt_fsys_get_default_dir(&fs.dir); if (xvt_dm_post_file_open(&fs, TR("Apri file:")) == FL_OK) //apre solo virtualmente { xvt_fsys_set_dir(&fs.dir); in=fs.name; in.lower(); } else return; if(!in.exist()) { xvt_dm_post_error((char *)TR("Il file non pu� essere aperto... non esiste!")); return; } else { destroy_window(); _window = new TEditMask_window(-1,-1,68,16,TR("Maschera"), WSF_SIZE,W_DOC); _save=TRUE; _window->set_mod(FALSE); _window->open(); _window->restore_mask(fs.name); _window->force_update(); } } //Risalva la "maschera" void TMaskEditor_application::save_mask() { _window->save_mask(); } //Salva come.. la "maschera" void TMaskEditor_application::save_as_mask() { _save=TRUE; _window->save_as_mask(); } //Aggiunge un controllo scelto da menu void TMaskEditor_application::add_control(MENU_TAG m) { _window->set_mod(TRUE); _window->add_control(m); } //Copia i controlli selezionati void TMaskEditor_application::copy_crt_sel() { _window->copy_crt_sel(); } //Cancella i controlli selezionati void TMaskEditor_application::erase_crt_sel() { _window->erase_crt_sel(); } //Sposta in un'altra pagina i controlli selezionati void TMaskEditor_application::move_crt_sel() { _window->move_crt_sel(); } //Permette di compilare la "maschera" creata void TMaskEditor_application::build() { TString app; if(!_window->filename().empty()) { app<<"mskcomp.bat " << _window->filename(); TExternal_app compile(app); compile.run(); } else save_as_mask(); } void TMaskEditor_application::execute() { TString app; if(!_window->filename().empty()) { TFilename name=_window->filename(); name.ext(""); app<<"ba3 -3 " << name; TExternal_app exe(app); exe.run(); } else save_as_mask(); } //Visualizza i controlli presenti nella pagina corrente void TMaskEditor_application::vision_ctrl() { _window->vision_ctrl(); } //Visualizza la "maschera" dello spreadsheet corrente void TMaskEditor_application::vision_spread() { _window->vision_spread(); } //Visualizza i controllo della "maschera" dello spreadsheet corrente void TMaskEditor_application::vision_sp_ctl() { _window->vision_sp_ctl(); } //Gestisce le scelte da menu bool TMaskEditor_application::menu(MENU_TAG m) { switch (m) { case MENU_ITEM_ID(11): // Nuovo... { _save=FALSE; new_mask(); } break; case MENU_ITEM_ID(12): // Apri... open_mask(); break; case MENU_ITEM_ID(13): // Salva... if(_window) { _window->deselection(); _window->inizialition(); if(_save) save_mask(); else save_as_mask(); } break; case MENU_ITEM_ID(14): // Salva con nome if(_window) { _window->deselection(); _window->inizialition(); save_as_mask(); } break; case MENU_ITEM_ID(21): // Copia i controlli selezionati if(_window) copy_crt_sel(); break; case MENU_ITEM_ID(22): // Elimina i controlli selezionati if(_window) erase_crt_sel(); break; case MENU_ITEM_ID(23): // Sposta i controlli selezionati in un'altra pagina if(_window) move_crt_sel(); break; //Aggiunge controlli alla maschera case MENU_ITEM_ID(31): //bottone case MENU_ITEM_ID(32): //checkbox case MENU_ITEM_ID(33): //currency case MENU_ITEM_ID(34): //data case MENU_ITEM_ID(35): //group case MENU_ITEM_ID(36): //lista case MENU_ITEM_ID(37): //memo case MENU_ITEM_ID(38): //radio_bottoni case MENU_ITEM_ID(39): //number case MENU_ITEM_ID(310): //spreadsheet case MENU_ITEM_ID(311): //stringa case MENU_ITEM_ID(312): //text case MENU_ITEM_ID(313): //zoom if(_window) { _window->deselection(); _window->inizialition(); add_control(m); } break; case MENU_ITEM_ID(41): // Visualizza controlli di pag. if(_window) { _window->deselection(); _window->inizialition(); vision_ctrl(); } break; case MENU_ITEM_ID(42): // Visualizza mask di spread if(_window) { _window->deselection(); _window->inizialition(); vision_spread(); } break; case MENU_ITEM_ID(43): // Visualizza controlli di mask di spread if(_window) { _window->deselection(); _window->inizialition(); vision_sp_ctl(); } break; case MENU_ITEM_ID(51): // Fa la compilazione della maschera if(_window) { _window->deselection(); _window->inizialition(); build(); } break; case MENU_ITEM_ID(52): // Fa l'esecuzione della maschera if(_window) { _window->deselection(); _window->inizialition(); execute(); } break; default: break; } return TRUE; } int ba2600(int argc, char* argv[]) { TMaskEditor_application a; a.run(argc, argv, TR("Editor di maschere")); return 0; }