diff --git a/sc/sc3100.cpp b/sc/sc3100.cpp index d9cd2f14f..0b9c88dd2 100755 --- a/sc/sc3100.cpp +++ b/sc/sc3100.cpp @@ -1,7 +1,11 @@ #ifndef __PRINTER_H #include <printer.h> #endif - + +#ifndef __PROGIND_H +#include <progind.h> +#endif + #include "../ba/baformed.h" #include "sc3.h" #include "sc3100a.h" @@ -23,19 +27,27 @@ typedef struct { class TForm_EC_editor : public TForm_editor { - s_data _prm; + s_data _prm; + TMask * _msk; // maschera di selezione sezione protected: static bool cpy_handler(TMask_field& f, KEY k); static bool font_handler(TMask_field& f, KEY k); - void load_fonts(TMask& m); - void change_pos(char sc, pagetype pt); + void load_fonts(); + void change_pos(char sc, pagetype pt); bool recalculate_positions(const char* name, int size); + void hook_footer_to_body(TPrint_section* f, TPrint_section* b); + void unhook_footer(TPrint_section* f); virtual const char* selection_mask() const { return "sc3100a"; } virtual bool ask_profile(); virtual bool edit(char s, pagetype p); + virtual void print(); public: + TForm_EC_editor() {_msk = NULL;} + virtual ~TForm_EC_editor() {} }; +inline TForm_EC_editor& app() { return (TForm_EC_editor&) main_app();} + BOOLEAN XVT_CALLCONV1 wprms (long data) { s_data* st =(s_data*)data; @@ -91,7 +103,8 @@ bool TForm_EC_editor::cpy_handler(TMask_field& f, KEY k) { error_box("Errore %d in scrittura testata profilo.",frm.status()); return TRUE; - } + } + TProgind pi(50,"Copia in corso...",FALSE,FALSE,10); rfr.zero();rfr.put("TIPOPROF",form); rfr.put("CODPROF",scod); //Profilo sorgente rfr.read(_isgteq); @@ -102,7 +115,8 @@ bool TForm_EC_editor::cpy_handler(TMask_field& f, KEY k) if (rfr_to_write.write() != NOERR) rfr_to_write.rewrite(); rfr.read(_isgreat); - } + } + pi.cancel(); if (rfr_to_write.status() != NOERR) { error_box("Errore %d in scrittura righe profilo.",rfr_to_write.status()); @@ -156,7 +170,7 @@ bool TForm_EC_editor::font_handler(TMask_field& f, KEY key) return TRUE; } -void TForm_EC_editor::load_fonts(TMask& m) +void TForm_EC_editor::load_fonts() { const int MAX_FAMILIES = 128; char* family[MAX_FAMILIES]; @@ -172,7 +186,7 @@ void TForm_EC_editor::load_fonts(TMask& m) if (form().fontname() == family[i]) font_found = TRUE; xvt_mem_free(family[i]); } - TList_field& lst = (TList_field&)m.field(F_SFONT); + TList_field& lst = (TList_field&)_msk->field(F_SFONT); lst.replace_items(pn1, pn2); if (!font_found) warning_box("Il font %s non esiste per la stampante di default.",(const char*) form().fontname()); lst.set(form().fontname()); @@ -181,22 +195,19 @@ void TForm_EC_editor::load_fonts(TMask& m) void TForm_EC_editor::change_pos(char sc, pagetype pt) { TPrint_section* sec = form().exist(sc, pt); - if (sec != NULL) + if (sec != NULL && !sec->columnwise()) { sec->set_dirty(); for (word i = 0; i < sec->fields() ; i++) { TForm_item& fi = sec->field(i); - short value = sec->columnwise() ? fi.y() : fi.x(); + short value = fi.x(); if (value > 0 && (_prm.ratio != 1.0)) { real x_pos; x_pos = value * _prm.ratio; x_pos.round(); - if (sec->columnwise()) - fi.y() = (short)x_pos.integer(); - else - fi.x() = (short)x_pos.integer(); + fi.x() = (short)x_pos.integer(); fi.set_dirty(); } } @@ -228,14 +239,44 @@ bool TForm_EC_editor::recalculate_positions(const char* name, int size) return TRUE; } +void TForm_EC_editor::hook_footer_to_body(TPrint_section* f, TPrint_section* b) +{ + const word items = b->columnwise() ? f->fields() : 0; + b->reset_tabs(); + for (word i=0;i<items;i++) + { + TForm_item& fi = f->field(i); + if (fi.x()>0) continue; + const TForm_item& fb = b->find_field(fi.id()); + const int x = fb.x()+b->ofspc(); + fi.x() = x; + fi.ofs() = 999; + } +} + +void TForm_EC_editor::unhook_footer(TPrint_section* f) +{ + const word items = f->fields(); + for (word i=0;i<items;i++) + { + TForm_item& fi = f->field(i); + if (fi.ofs()==999) + { + fi.ofs() = 0; + fi.x() = 0; + } + } +} + bool TForm_EC_editor::edit(char s, pagetype p) { - TMask m("sc3100c"); + _msk= new TMask("sc3100c"); TString80 caption; bool dirty = FALSE; bool other = FALSE; KEY k; + enable_menu_item(M_FILE_PRINT); if (extra()) { if (s == 'R') @@ -257,49 +298,52 @@ bool TForm_EC_editor::edit(char s, pagetype p) if (!extra() || (extra() && other)) { // Carica i fonts disponibili nel listbox - load_fonts(m); + load_fonts(); printer().set_char_size(form().fontsize()); // Questo settera' il carattere della stampante a quello del form - // Setta l'handler per il listbox dei fonts - m.set_handler(F_SFONT,font_handler); + // Setta l'handler per il listbox dei fonts e per aggiornare i valori dello sfondo + _msk->set_handler(F_SFONT,font_handler); // carica i dati relativi all'offset - m.set(F_SX, form().offset_x()); - m.set(F_SY, form().offset_y()); + _msk->set(F_SX, form().offset_x()); + _msk->set(F_SY, form().offset_y()); TString ctp; ctp << form().char_to_pos(); - m.set(F_SCTP, ctp); - m.set(F_SIPX, form().ipx()); - m.set(F_SIPY, form().ipy()); + _msk->set(F_SCTP, ctp); + _msk->set(F_SIPX, form().ipx()); + _msk->set(F_SIPY, form().ipy()); + _msk->set(F_FOOT_H,form().exist('F',odd_page)->height()); // carica i dati relativi ai flags (memorizzati in HEADER LAST) if (form().exist('H', last_page)) { TForm_item& flags = form().find_field('H',last_page,PEC_FLAGS); TToken_string tt(flags.prompt()); if (tt.get(0) != NULL) - m.set(F_SVALUTA,tt.get(0)); + _msk->set(F_SVALUTA,tt.get(0)); if (tt.get(1) != NULL) - m.set(F_FINK,tt.get(1)); + _msk->set(F_FINK,tt.get(1)); + if (tt.get(2) != NULL) + _msk->set(F_MAXTOT,tt.get(2)); } // carica i dati relativi allo sfondo (memorizzati in GRAPHICS ODD) if (form().exist('G', odd_page)) { TForm_item& pict = form().find_field('G',odd_page,PEC_PICTURE); - m.set(F_BACKGROUND,pict.prompt()); - m.set(F_BACKWIDTH,pict.width()); - m.set(F_BACKHEIGHT,pict.height()); - m.set(F_BACKX,pict.x()); - m.set(F_BACKY,pict.y()); + _msk->set(F_BACKGROUND,pict.prompt()); + _msk->set(F_BACKWIDTH,pict.width()); + _msk->set(F_BACKHEIGHT,pict.height()); + _msk->set(F_BACKX,pict.x()); + _msk->set(F_BACKY,pict.y()); } bool font_changed=FALSE; while (TRUE) { bool local_dirty = FALSE; - k = m.run(); - if ((m.field(F_SFONT).dirty() || m.field(F_SSIZE).dirty())) + k = _msk->run(); + if ((_msk->field(F_SFONT).dirty() || _msk->field(F_SSIZE).dirty())) { font_changed = TRUE; - TString ff(m.get(F_SFONT)); - dirty = recalculate_positions(ff, m.get_int(F_SSIZE)); // Va bene dirty e non local_dirty - printer().set_char_size(m.get_int(F_SSIZE)); // Questo settera' il carattere della stampante a quello del form + TString ff(_msk->get(F_SFONT)); + dirty = recalculate_positions(ff, _msk->get_int(F_SSIZE)); // Va bene dirty e non local_dirty + printer().set_char_size(_msk->get_int(F_SSIZE)); // Questo settera' il carattere della stampante a quello del form } if (k==K_F3) local_dirty = edit_fincatura(); else if (k==K_F4) local_dirty = edit_formato_data(); @@ -338,26 +382,26 @@ bool TForm_EC_editor::edit(char s, pagetype p) change_pos(s,odd_page); } } - if (local_dirty || m.dirty()!=0) dirty=TRUE; + if (local_dirty || _msk->dirty()!=0) dirty=TRUE; if (k==K_ESC || k==K_ENTER) break; } // End of while } // End if - if (m.dirty() != 0 || dirty) + if (_msk->dirty() != 0 || dirty) { - form().fontname() = m.get(F_SFONT); - form().fontsize() = m.get_int(F_SSIZE); - form().offset_x() = m.get_int(F_SX); - form().offset_y() = m.get_int(F_SY); - form().char_to_pos() = m.get(F_SCTP)[0]; - form().ipx() = m.get_int(F_SIPX); - form().ipy() = m.get_int(F_SIPY); + form().fontname() = _msk->get(F_SFONT); + form().fontsize() = _msk->get_int(F_SSIZE); + form().offset_x() = _msk->get_int(F_SX); + form().offset_y() = _msk->get_int(F_SY); + form().char_to_pos() = _msk->get(F_SCTP)[0]; + form().ipx() = _msk->get_int(F_SIPX); + form().ipy() = _msk->get_int(F_SIPY); if (form().exist('H', last_page)) { TForm_item& flags = form().find_field('H',last_page,PEC_FLAGS); - TString s(m.get(F_SVALUTA)); - s << "|" << m.get(F_FINK); + TString s(_msk->get(F_SVALUTA)); + s << "|" << _msk->get(F_FINK); s << "|" << _msk->get(F_MAXTOT); form().section('H',last_page).set_dirty(); flags.set_prompt(s); flags.set_dirty(); @@ -365,11 +409,11 @@ bool TForm_EC_editor::edit(char s, pagetype p) if (form().exist('G', odd_page)) { TForm_item& pict = form().find_field('G',odd_page,PEC_PICTURE); - pict.set_prompt(m.get(F_BACKGROUND)); - pict.width() = m.get_int(F_BACKWIDTH); - pict.height() = m.get_int(F_BACKHEIGHT); - pict.x() = m.get_int(F_BACKX); - pict.y() = m.get_int(F_BACKY); + pict.set_prompt(_msk->get(F_BACKGROUND)); + pict.width() = _msk->get_int(F_BACKWIDTH); + pict.height() = _msk->get_int(F_BACKHEIGHT); + pict.x() = _msk->get_int(F_BACKX); + pict.y() = _msk->get_int(F_BACKY); form().section('G',odd_page).set_dirty(); pict.set_dirty(); } @@ -389,15 +433,74 @@ bool TForm_EC_editor::edit(char s, pagetype p) } else form().write_profile(); - } + } + if (_msk!=NULL) delete _msk; + _msk = NULL; + disable_menu_item(M_FILE_PRINT); if (!extra()) dispatch_e_menu(MENU_ITEM(14)); return dirty; } +void TForm_EC_editor::print() +{ + TPrint_section* g = form().exist('G',odd_page); + TPrint_section* h = form().exist('H',odd_page); + TPrint_section* f = form().exist('F',odd_page); + TPrint_section* b = form().exist('B',odd_page); + bool remove = TRUE; + + CHECK(b!=NULL && f!=NULL && h!=NULL,"Una o piu' sezioni non sono presenti"); + // Rilegge la sezione grafica, perche' se e' la seconda volta che si + // stampa deve ripristinare la situazione iniziale. + // NB la sezione grafica deve contenere solo sfondo: le linee di fincatura + // qui generate non verranno salvate; analogamente il programma di stampa + // vero e proprio. + if (b->columnwise()) + { + bool gen_fink = TRUE; + if (_msk != NULL) + { + TForm_item& pict = g->find_field(PEC_PICTURE); + pict.set_prompt(_msk->get(F_BACKGROUND)); + pict.width() = _msk->get_int(F_BACKWIDTH); + pict.height() = _msk->get_int(F_BACKHEIGHT); + pict.x() = _msk->get_int(F_BACKX); + pict.y() = _msk->get_int(F_BACKY); + form().offset_y() = _msk->get_int(F_SY); + form().offset_x() = _msk->get_int(F_SX); + form()._background_mode = (bkg_mode)_msk->get_int(F_FINK); + if (form()._background_mode == none) gen_fink = FALSE; + if (printer().is_generic() && form()._background_mode == graphics) form()._background_mode = texto; + } + // Schiaffa dentro le stringhe di esempio per ogni campo che non ha prompt o riferimenti sul file + // per i campi memo si copia _memo in _prompt + const int formlen = printer().formlen(); + const int h_height = h->height(); + int rws[3] = {h_height,formlen-f->height(),0}; + if (gen_fink) + form().genera_fincatura(odd_page,h_height-2,formlen,rws); + form().genera_intestazioni(odd_page,h_height-1); + } else + remove = FALSE; + hook_footer_to_body(f,b); + form().put_examples('H',odd_page); + form().put_examples('F',odd_page); + TForm_editor::print(); + form().remove_examples('H',odd_page); + form().remove_examples('F',odd_page); + unhook_footer(f); + if (remove) + { + form().remove_temp_items('G',odd_page); + form().remove_temp_items('H',odd_page); + } +} + bool TForm_EC_editor::ask_profile() { KEY k; mask().set_handler(DLG_COPY,cpy_handler); + disable_menu_item(M_FILE_PRINT); while ((k = mask().run()) != K_QUIT) { TLocalisamfile frm(LF_FORM); @@ -425,6 +528,7 @@ bool TForm_EC_editor::ask_profile() if (fcode != 0 && yesno_box("Confermare la cancellazione del profilo %04ld%c", fcode,flng)) { + TProgind pi(50,"Cancellazione in corso...",FALSE,FALSE,10); frm.zero(); frm.put("TIPOPROF", fform); if (fcode != 0 ) @@ -439,6 +543,7 @@ bool TForm_EC_editor::ask_profile() for ( ; rfr.get("CODPROF") == cod && rfr.get("TIPOPROF") == fform; rfr.next()) rfr.remove(); } + pi.cancel(); mask().set(F_CODE,""); mask().set(F_CODEL,""); mask().set(F_DESC,"");