From 11d8c5e0b0252e72ce6e23f9e5db9262fac0dbb2 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 19 Sep 1997 08:47:46 +0000 Subject: [PATCH] browfile.h Stampa background multipli form.cpp " printer.* " viswin.* " execp.* Aggiunta fantastica goto_url isam.cpp Tolta riga vuota mask.h Tolto TMask:: da un metodo files.h Tolto include object.h git-svn-id: svn://10.65.10.50/trunk@5225 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/browfile.h | 5 +++-- include/execp.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++-- include/execp.h | 3 +++ include/files.h | 4 ---- include/form.cpp | 20 ++++++++++++++--- include/isam.cpp | 1 - include/mask.h | 2 +- include/printer.cpp | 28 ++++++++++++++++++----- include/printer.h | 10 ++++----- include/viswin.cpp | 35 +++++++++++++++++------------ include/viswin.h | 2 +- 11 files changed, 127 insertions(+), 38 deletions(-) diff --git a/include/browfile.h b/include/browfile.h index 3a075c0d3..67abe58b8 100755 --- a/include/browfile.h +++ b/include/browfile.h @@ -21,10 +21,11 @@ class TBrowsefile_field : public TOperable_field TViswin* _viswin; MASK_LINKHANDLER _lh; TArray _links; - TString_array _background; bool _m_link; short _dlg; WINDOW _parent; + + TString_array _background; // Background per usi diversi da anterpima! protected: virtual word class_id() const; @@ -62,7 +63,7 @@ public: // print background void set_background(const char* bg); - TArray* get_bg_desc() { return &_background; } + TString_array& get_bg_desc() { return _background; } virtual short dlg() const { return _dlg; } // @cmember Ritorna la finestra padre diff --git a/include/execp.cpp b/include/execp.cpp index d1c6f4f25..f180a4d39 100755 --- a/include/execp.cpp +++ b/include/execp.cpp @@ -5,6 +5,7 @@ #include #if XVT_OS == XVT_OS_WIN +#include #include #include #include @@ -152,7 +153,7 @@ word TExternal_app::run( #if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 if (can_run()) { - main_app().begin_wait(); + TWait_cursor hourglass; #if XVT_OS == XVT_OS_WIN HL_LOGOUT(); _exitcode = WinExec((char*)(const char*)path, SW_SHOW); @@ -251,7 +252,6 @@ word TExternal_app::run( else _exitcode = -1; #endif - main_app().end_wait(); } else _exitcode = 1; #if XVT_OS == XVT_OS_WIN @@ -361,3 +361,54 @@ TExternal_app::TExternal_app(const char* p) _error = 0; _exitcode = 0; } + +/////////////////////////////////////////////////////////////////////////////// +// GotoURL +// Liberamente tradotto da Windows Developer Journal August 1997 +/////////////////////////////////////////////////////////////////////////////// + +static long get_reg_key(HKEY key, const char* subkey, TString& retdata) +{ + HKEY hkey; + long retval = RegOpenKey(key, subkey, &hkey); + if (retval == ERROR_SUCCESS) + { + long datasize = retdata.size(); + RegQueryValue(hkey, NULL, retdata.get_buffer(), &datasize); + RegCloseKey(hkey); + } + return retval; +} + +bool goto_url(const char* url) +{ + TString key(MAX_PATH*2); + bool retflag = FALSE; + + HINSTANCE hinst = ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); + DWORD winst = DWORD((DWORD*)hinst); + UINT error = UINT(winst); // Tutto 'sto giro per evitare un warning + if (error < 32) + { + if (get_reg_key(HKEY_CLASSES_ROOT, ".htm", key) == ERROR_SUCCESS) + { + key << "\\shell\\open\\command"; + if (get_reg_key(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS) + { + int pos = key.find("\"%1\""); + if (pos < 0) + pos = key.find("%1"); + if (pos > 0) + key.cut(pos); + key << ' ' << url; + error = WinExec(key, SW_SHOWNORMAL); + if (error > 31) + retflag = TRUE; + } + } + } + else + retflag = TRUE; + + return retflag; +} diff --git a/include/execp.h b/include/execp.h index f13453293..106d59476 100755 --- a/include/execp.h +++ b/include/execp.h @@ -51,4 +51,7 @@ public: TExternal_app(const char* p); }; +// Va ad un URl qualsiasi +bool goto_url(const char* url); + #endif diff --git a/include/files.h b/include/files.h index a087e17b8..d80990b7a 100755 --- a/include/files.h +++ b/include/files.h @@ -1,10 +1,6 @@ #ifndef __FILES_H #define __FILES_H -#ifndef __OBJECT_H -#include -#endif - #ifndef __EXTCTYPE_H #include #endif diff --git a/include/form.cpp b/include/form.cpp index 1ec5c87e8..0932b582c 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -700,7 +700,7 @@ void TForm_item::send_message( if (val.not_empty()) val << ' '; val << get(); des.set(val); - } else if (cmd == "DISABLE") { + } else if (cmd == "DISABLE") { des.disable(); } else if (cmd == "ENABLE") { des.enable(); @@ -710,6 +710,11 @@ void TForm_item::send_message( des.set(""); } else if (cmd == "SHOW") { des.show(); + } else if (cmd == "SUB") { + const real n(get()); + real r(des.get()); + r -= n; + des.set(r.string()); } else if (cmd[0] == '"') { TString256 val(cmd); val.strip("\""); @@ -2160,9 +2165,18 @@ TForm_item* TGraphic_section::parse_item(const TString& s) bool TGraphic_section::update() { - _back = ""; + _back.cut(0); const bool ok = TPrint_section::update(); - printer().setbackground(_back); + + int index; + switch(page_type()) + { + case even_page: index = 1; break; + case odd_page : index = 2; break; + case last_page: index = 3; break; + default : index = 0; break; + } + printer().setbackground(_back, index); return ok; } diff --git a/include/isam.cpp b/include/isam.cpp index 08a441d22..2455a8026 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -849,7 +849,6 @@ void TBaseisamfile::set_curr(TRectype * curr) } void TBaseisamfile::setkey(int nkey) - { CHECKD(nkey > 0 && nkey-1 <= _isamfile->r->NKeys, "Chiave non valida ", nkey); NOT_OPEN(); diff --git a/include/mask.h b/include/mask.h index 44566bc50..81da36048 100755 --- a/include/mask.h +++ b/include/mask.h @@ -291,7 +291,7 @@ public: { _should_check = FALSE;} // @cmember Evita che venga chiamata la TWindow - virtual void TMask::on_button(short); + virtual void on_button(short); // @cmember Assegna una azione al tasto non standard virtual bool on_key(KEY key); diff --git a/include/printer.cpp b/include/printer.cpp index 3d837d008..6c4a957ed 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -270,7 +270,6 @@ HIDDEN int read_int (const char *s, int &n, int &cnt) return n = atoi (nbuf); } - void TPrinter::parse_background(const char* bg_desc, TString_array& background) { TString_array pix; @@ -508,13 +507,29 @@ void TPrinter::parse_background(const char* bg_desc, TString_array& background) } } -void TPrinter::setbackground(const char* b) -{ - _background.destroy(); +void TPrinter::setbackground(const char* b, int index) +{ + CHECK(index >= 0 && index <= 3, "Bad background index"); + _backgrounds.destroy(index); if (b && *b) - parse_background(b, _background); + { + TString_array* bg = new TString_array(formlen()); + _backgrounds.add(bg, index); + parse_background(b, *bg); + } } +TString_array& TPrinter::getbgdesc(word page) const +{ + if (_backgrounds.items() == 0) + ((TPrinter*)this)->_backgrounds.add(new TString_array(formlen())); + int index = (page > 0) ? ((page-1) % _backgrounds.items()) : 0; + TString_array* bg = (TString_array*)_backgrounds.objptr(index); + CHECK(bg, "Null printer background"); + return *bg; +} + + bool printers_on_key(TMask_field & f, KEY key); // fv support structs for config @@ -2085,6 +2100,9 @@ void TPrinter::close () delete _finker; _finker = NULL; } + + // Dealloca sfondi ormai inutili + _backgrounds.destroy(); freeze (FALSE); _isopen = FALSE; diff --git a/include/printer.h b/include/printer.h index 6a579071c..5f8182539 100755 --- a/include/printer.h +++ b/include/printer.h @@ -300,8 +300,9 @@ class TPrinter : public TObject // @cmember:(INTERNAL) Nome del paragrafo di configurazione TString _config; - // @cmember:(INTERNAL) Array di stringhe per la desccrizione del background - TString_array _background; + // @cmember:(INTERNAL) Array di stringhe per la descrizione del background + TArray _backgrounds; + // @cmember:(INTERNAL) Nomi dei file delle immagini da stampare TString_array _image_names; @@ -472,13 +473,12 @@ public: // @cmember Elimina il contenuto del footer void resetfooter(); // @cmember Setta il colore del background - void setbackground(const char* bg); + void setbackground(const char* bg, int index = 0); // @cmember Ritorna l'array con i nomi delle immagini da stampare!!! TString_array& image_names() { return _image_names; } // @cmember Ritorna l'array con i nomi dei colori da stampare!!! - TString_array& getbgdesc() - { return _background; } + TString_array& getbgdesc(word page = 0) const; // @cmember Ritorna l'array con i segalibri settati TArray& get_bookmarks() { return _bookmarks; } diff --git a/include/viswin.cpp b/include/viswin.cpp index 1c71e3d03..4c1c99c5b 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -686,16 +686,24 @@ void TViswin::paint_screen () void TViswin::paint_background( long j, // @parm Numero della riga di cui stampare il background int row) // @parm Numero della riga a video sulla quale viene stampato il background -{ - const bool isbackground = _bg->items() > 0 && printer().isgraphics(); - const bool fink_mode = printer().get_fink_mode(); +{ + TPrinter& pr = printer(); + + if (_toplevel) + { + const word page = word((j-1) / pr.formlen() + 1); + _bg = &pr.getbgdesc(page); + } + + const bool isbackground = _bg->items() > 0 && pr.isgraphics(); + const bool fink_mode = pr.get_fink_mode(); const int rw = (int)(j % (long)_formlen); const int ox = (int)origin().x; const int mx = ox + columns(); if (!fink_mode) { - const char* line = printer().background_chars(rw); + const char* line = pr.background_chars(rw); set_color (COLOR_BLACK, COLOR_WHITE); if (line != NULL && (int)strlen(line) > ox) printat (X_OFFSET, row, "%s", &line[ox]); @@ -704,7 +712,7 @@ void TViswin::paint_background( if (!isbackground) return; - const TString& rwd = (TString &)(*_bg)[rw]; + const TString& rwd = _bg->row(rw); char curcol = 'n'; char curpen = 'n'; @@ -1055,15 +1063,14 @@ void TViswin::erase_crossbar () _cross_displayed = FALSE; } -void TViswin::display_point () +void TViswin::display_point() { - if (!_point_displayed) paint_point (); _point_displayed = TRUE; } -void TViswin::erase_point () +void TViswin::erase_point() { if (_point_displayed) paint_point (); @@ -2590,7 +2597,7 @@ TViswin::TViswin(const char *fname, _multiple = _toplevel ? (printer ().ismultiplelink()) : (_brwfld->is_multiple_link()); - _bg = _toplevel ? &(printer().getbgdesc()) : _brwfld->get_bg_desc(); + _bg = _toplevel ? &(printer().getbgdesc()) : &_brwfld->get_bg_desc(); _formlen = _toplevel ? printer().formlen() : maxalt; _linkID = -1; _inside_linkexec = FALSE; @@ -2745,19 +2752,19 @@ void TBrowsefile_field::disable_link(char fg, char bg) void TBrowsefile_field::set_background(const char* bg) { printer().parse_background(bg, _background); -} - -void TBrowsefile_field::add_line(const char* l) +} + +void TBrowsefile_field::add_line(const char* l) { _viswin->add_line(l); } -void TBrowsefile_field::close() +void TBrowsefile_field::close() { _viswin->close_print(); } -void TBrowsefile_field::goto_pos(long r, long c) +void TBrowsefile_field::goto_pos(long r, long c) { _viswin->goto_pos(r,c,TRUE); } diff --git a/include/viswin.h b/include/viswin.h index a77f89345..c4d25e529 100755 --- a/include/viswin.h +++ b/include/viswin.h @@ -154,7 +154,7 @@ class TViswin : public TScroll_window TToken_string _multiple_link; // @cmember:(INTERNAL) Array di colori di background - TArray* _bg; + TString_array* _bg; // @cmember:(INTERNAL) Indica se la stampa e' stata interrotta bool _frozen; // @cmember:(INTERNAL) Finestra in primo piano (se FALSE e un campo di una maschera)