From 32a6d81cfbb3f5d49569c58c4be829cf1a7f9852 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 11 Jul 2008 11:16:52 +0000 Subject: [PATCH] Patch level : 10.0 1088 Files correlati : xvaga Ricompilazione Demo : [ ] Commento : Corretta gestione finestre git-svn-id: svn://10.65.10.50/trunk@16866 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba0103.cpp | 21 +-- include/applicat.cpp | 48 +++++-- include/codeb.c | 6 + include/codeb.h | 1 + include/execp.cpp | 24 ++-- include/mask.cpp | 10 ++ include/sqlset.cpp | 2 +- include/treectrl.cpp | 6 +- include/viswin.cpp | 29 ++-- include/window.cpp | 13 +- xvaga/oswin32.cpp | 2 - xvaga/xvaga.cpp | 310 +++++++++++++++++++++---------------------- xvaga/xvt.h | 2 - xvaga/xvtctl.cpp | 16 +-- xvaga/xvtextra.cpp | 9 +- xvaga/xvtwin.cpp | 73 +++++----- xvaga/xvtwin.h | 5 +- 17 files changed, 308 insertions(+), 269 deletions(-) diff --git a/ba/ba0103.cpp b/ba/ba0103.cpp index c22433765..0c2b9caef 100755 --- a/ba/ba0103.cpp +++ b/ba/ba0103.cpp @@ -123,17 +123,20 @@ short TBook_window::pages() const return _ctrl == NULL_WIN ? 0 : xvt_notebk_get_num_tabs(_ctrl); } +static BOOLEAN hell_riser(WINDOW child, long data) +{ + if (data > 0) + xvt_vobj_raise(child); + xvt_win_enum_wins(child, hell_riser, data+1, 0); + return TRUE; +} + void TBook_window::force_page(short page) { - // Per le applicazioni figlie pare necessaria questa forzatura della visibilta' - for (int p = pages()-1; p >= 0; p--) - { - WINDOW pw = xvt_notebk_get_page(_ctrl, p); - const bool show = p == page; - if (show) - xvt_notebk_set_front_page(_ctrl, page); - xvt_vobj_set_visible(pw, show); - } + xvt_notebk_set_front_page(_ctrl, page); + + WINDOW w = xvt_notebk_get_page(_ctrl, page); + xvt_win_enum_wins(w, hell_riser, 0, 0); } void TBook_window::handler(WINDOW win, EVENT* ep) diff --git a/include/applicat.cpp b/include/applicat.cpp index 2d0877a77..dc25ae804 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -21,23 +22,38 @@ class TInfo_mask : public TArray_sheet { +protected: + virtual bool get_cell_colors(int row, int col, COLOR& fore, COLOR& back) const; + public: - void add_row(const char* prompt, const char* value); - void add_row(const char* prompt, unsigned long value); + void add_row(const char* prompt, const char* value, int err = 0); + void add_row(const char* prompt, unsigned long value, int err = 0); TInfo_mask(); }; -void TInfo_mask::add_row(const char* prompt, const char* value) +bool TInfo_mask::get_cell_colors(int r, int c, COLOR& fore, COLOR& back) const +{ + const int err = ((TArray_sheet*)this)->row(r).get_int(2); + if (err > 0) + { + fore = NORMAL_COLOR; + back = err == 1 ? REQUIRED_BACK_COLOR : FOCUS_BACK_COLOR; + } + return TArray_sheet::get_cell_colors(r, c, fore, back); +} + +void TInfo_mask::add_row(const char* prompt, const char* value, int err) { TToken_string* r = new TToken_string; r->add(prompt); r->add(value); + r->add(err); add(r); } -void TInfo_mask::add_row(const char* prompt, unsigned long value) +void TInfo_mask::add_row(const char* prompt, unsigned long value, int err) { - TString8 str; str.format("%lu", value); + TString16 str; str.format("%lu", value); add_row(prompt, str); } @@ -95,13 +111,17 @@ TInfo_mask::TInfo_mask() TFilename temp; temp.tempdir(); + TString strdb; + DB_version(strdb.get_buffer(), strdb.size()); + add_row(TR("Versione"), versione); add_row(TR("Protezione"), prot); - add_row(TR("N. di serie"), ser_no); + add_row(TR("N. di serie"), ser_no, ser_no < 0); add_row(TR("Assistenza"), dongle().year_assist()); add_row(TR("Installazione"), tipo); add_row(TR("Sistema"), stros); - add_row(TR("Libreria"), strwx); + add_row(TR("Libreria GUI"), strwx); + add_row(TR("Libreria DB"), strdb); add_row(TR("Utente"), user()); add_row(TR("Studio"), firm2dir(-1)); add_row(TR("Ditta"), campoini.get("Firm", "Main")); @@ -113,15 +133,17 @@ TInfo_mask::TInfo_mask() } add_row(TR("Programma"), arg); - add_row(TR("Config locale"), campoini.name()); - add_row(TR("Config utente"), userini.name()); - add_row(TR("File temporanei"), temp); - add_row(TR("Spazio su disco"), xvt_fsys_get_disk_free_space(firm2dir(-1), 'M')); - TString printer(userini.get("Name", "Printer")); + add_row(TR("Config locale"), campoini.name(), campoini.name().find(' ') >= 0); + add_row(TR("Config utente"), userini.name(), userini.name().find(' ') >= 0); + add_row(TR("File temporanei"), temp, temp.find(' ') >= 0); + const long mbfree = xvt_fsys_get_disk_free_space(firm2dir(-1), 'M'); + add_row(TR("Spazio su disco"), mbfree, mbfree < 512); + + TString printer(userini.get("Name", "Printer")); if (printer.blank()) printer = "Nessuna"; - add_row(TR("Stampante"), printer); + add_row(TR("Stampante"), printer, printer.len() < 32); } diff --git a/include/codeb.c b/include/codeb.c index e93a4518f..8888e5430 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -1168,3 +1168,9 @@ int DB_memowrite( const int handle, const char* fieldname, const char* data ) return ret; } +long DB_version(char* str, int maxstr) +{ + if (str != NULL && maxstr >= 16) + sprintf(str, "Codebase %d.%03d", S4VERSION/1000, S4VERSION%1000); + return S4VERSION; +} diff --git a/include/codeb.h b/include/codeb.h index e6cc7b67e..4cf25d299 100755 --- a/include/codeb.h +++ b/include/codeb.h @@ -66,6 +66,7 @@ extern "C" { int DB_rec_locked(int handle,long nrec); long DB_getconf(); long DB_changed(int handle); /* returns true if the index of the key is changed */ + long DB_version(char* str, int maxstr); #ifdef __cplusplus }; #endif diff --git a/include/execp.cpp b/include/execp.cpp index 29fd18aab..0d29b4556 100755 --- a/include/execp.cpp +++ b/include/execp.cpp @@ -5,11 +5,14 @@ #include #include -static bool is_outlook_menu() +static bool is_outlook_menu_chain() { - const int dw = xvt_vobj_get_attr(NULL_WIN, ATTR_SCREEN_WIDTH); - RCT rct; xvt_vobj_get_outer_rect(TASK_WIN, &rct); - return rct.left > 0 && rct.right < dw-1; + const TFixed_string app(__argv[0]); + if (app.match("*ba[0,1]*", true)) + return false; + + TConfig ini(CONFIG_GUI, "Colors"); + return ini.get_int("TreeView") == 3; } // @doc EXTERNAL @@ -72,13 +75,13 @@ long TExternal_app::run( xvt_fsys_set_dir(&d); } } - - // Vecchio titolo della finestra principale - TString256 old_title; - const bool close_all = !async && _path.starts_with("ba1 -0") && prefix_valid(); + TString256 old_title; // Vecchio titolo della finestra principale + bool close_all = false; // Chiudi tutti i file in caso di manutenzione + if (!async) { + close_all = _path.starts_with("ba1 -0") && prefix_valid(); if (close_all) //se lancia la gestione archivi forza la chiusura dei files e pure dei tracciati! prefix().set(""); else @@ -87,7 +90,8 @@ long TExternal_app::run( if (dongle().local()) dongle().logout(); - if (iconize && utente && is_outlook_menu()) + // Programma normale (non menu) che chiama "collega" + if (utente && iconize && is_outlook_menu_chain()) { xvt_vobj_get_title(TASK_WIN, old_title.get_buffer(), old_title.size()); xvt_vobj_set_title(TASK_WIN, __MAGIC_CAPTION__); @@ -98,9 +102,7 @@ long TExternal_app::run( _exitcode = xvt_sys_execute(path, !async, iconize); if (old_title.full()) // Rimetto le cose a posto - { xvt_vobj_set_title(TASK_WIN, old_title); - } // restore cwd xvt_fsys_set_dir(&oldir); diff --git a/include/mask.cpp b/include/mask.cpp index c2c5bd992..04d8464a7 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -1247,6 +1247,16 @@ void TMask::insert_bar(WINDOW page) else // TopBar { CHECK(_toolbar == NULL_WIN, "One single top bar, please!"); + + if (rows() < 18) // Ridimensiono maschera piccola (non massimizzata) + { + const short bar_height = max(rct_bar.bottom - rct_bar.top, TOOL_SIZE + TOOL_TEXT * 12); + RCT rct_new; xvt_vobj_get_client_rect(parent, &rct_new); + rct_new.bottom += bar_height; + xvt_rect_offset(&rct_new, rct_win.left, rct_win.top-bar_height/2); + xvt_vobj_move(parent, &rct_new); + } + _toolbar = page; xvt_pane_add(parent, _toolbar, "_TopBar_", 62, 0); } diff --git a/include/sqlset.cpp b/include/sqlset.cpp index 483c053c7..387955805 100755 --- a/include/sqlset.cpp +++ b/include/sqlset.cpp @@ -521,7 +521,7 @@ bool TSQL_recordset::move_to(TRecnotype n) if (n < _first_row || n >= _first_row+_page.items()) { TString sql; parsed_text(sql); - if (sql.find("LIMIT ") < 0) + if (sql.starts_with("SELECT ") && sql.find("LIMIT ") < 0) { const int semicolon = sql.rfind(';'); if (semicolon >= 0) diff --git a/include/treectrl.cpp b/include/treectrl.cpp index 3b005d327..5edaa4bc6 100755 --- a/include/treectrl.cpp +++ b/include/treectrl.cpp @@ -1083,8 +1083,7 @@ void TTree_window::update() { if (_header.full()) { - set_brush(MASK_BACK_COLOR); - bar(0, 0, columns(), _header.items()); + clear(MASK_BACK_COLOR); short x = 3, y = 0; FOR_EACH_TOKEN(_header, row) stringat(x, y++, row); @@ -1099,6 +1098,9 @@ void TTree_window::handler(WINDOW win, EVENT* ep) if (ep->v.ctl.ci.type == WC_TREE && _tree != NULL) handle_tree_event(ep); break; + case E_UPDATE: + update(); // TControl_host_window non lo fa + return; default: break; } diff --git a/include/viswin.cpp b/include/viswin.cpp index 8ce9292f2..619b87541 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -1238,7 +1238,7 @@ void TViswin::txt_clear(COLOR color) autoscroll(FALSE); set_brush(color); set_mode(M_COPY); - bar ((X_OFFSET-1), Y_OFFSET -1, columns()+1, rows()-BUTTONROW_SIZE); + bar ((X_OFFSET-1), Y_OFFSET -1, columns()+16, rows()-BUTTONROW_SIZE); } bool TViswin::can_be_closed() const @@ -2577,7 +2577,7 @@ TViswin::TViswin(const char *fname, if (parent == NULL_WIN) parent = TASK_WIN; - _toplevel = parent == TASK_WIN; + _toplevel = brwfld == NULL; // parent == TASK_WIN; if (_toplevel) { @@ -2617,19 +2617,21 @@ TViswin::TViswin(const char *fname, for (i = 0; i < _modules.items(); i++) ((TImage*)_modules.objptr(i))->convert_transparent_color(MASK_BACK_COLOR); - long flags = WSF_HSCROLL | WSF_VSCROLL; if (_toplevel) - flags |= WSF_SIZE /* | WSF_CLOSE */; - - WIN_TYPE rt = _toplevel ? W_DOC : W_PLAIN; - create(x, y, maxlarg, maxalt, title, flags, rt, parent, - _toplevel ? VISWIN_BAR : 0); - - attach_interface(win(), BACKGROUND); + { + const long flags = WSF_HSCROLL | WSF_VSCROLL | WSF_SIZE; + WIN_TYPE rt = W_DOC; + WINDOW myself = create(x, y, maxlarg, maxalt, title, flags, rt, parent, + _toplevel ? VISWIN_BAR : 0); + attach_interface(myself, BACKGROUND); + } + else + { + // La finestra e' gia' creata automaticamente dal TWindowed_field + } set_opaque_text (TRUE); - set_font (XVT_FFN_FIXED, XVT_FS_NONE, PRINT_HEIGHT); -// set_font (printer().fontname(), XVT_FS_NONE, PRINT_HEIGHT); + set_font (PRINT_FONT, XVT_FS_NONE, PRINT_HEIGHT); if (_toplevel) { @@ -2701,7 +2703,8 @@ TViswin::TViswin(const char *fname, TViswin ::~TViswin () { // avoid deleting child window (already deleted by mask) - if (!_toplevel) set_win(NULL_WIN); + if (!_toplevel) + set_win(NULL_WIN); } /////////////////////////////////////////////////////////// diff --git a/include/window.cpp b/include/window.cpp index 3b799c874..82bc76f48 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -397,13 +397,11 @@ word TWindow::class_id() const long TWindow::window_handler(WINDOW win, EVENT* ep) { TWindow* w = (TWindow*)xvt_vobj_get_data(win); - CHECK(w != NULL, "Invalid window"); - w->handler(win, ep); - + if (w != NULL) + w->handler(win, ep); return 0L; } - // @doc EXTERNAL // @mfunc Crea la finestra @@ -445,9 +443,10 @@ TWindow::~TWindow() { if (_win != NULL_WIN) { - if (is_valid_window(_win)) - xvt_vobj_destroy(_win); - _win = NULL_WIN; + const WINDOW del_win = _win; // Memorizzo l'handle da cancellare + _win = NULL_WIN; // Azzero preventivamente l'handle medesimo + if (is_valid_window(del_win)) + xvt_vobj_destroy(del_win); } } diff --git a/xvaga/oswin32.cpp b/xvaga/oswin32.cpp index 9f33eaaa3..438535cc3 100755 --- a/xvaga/oswin32.cpp +++ b/xvaga/oswin32.cpp @@ -392,10 +392,8 @@ bool OsWin32_DrawBitmap(HBITMAP hBMP, wxDC& dc, const wxRect& dst, const wxRect& free(bi); } else - { HGDIOBJ hOldBitmap = ::SelectObject(hMemDC, hBMP); - //::SetStretchBltMode(hDC, nDepth > 8 ? COLORONCOLOR : HALFTONE); ::SetStretchBltMode(hDC, HALFTONE); ::StretchBlt(hDC, dst.x, dst.y, dst.width, dst.height, hMemDC, src.x, src.y, src.width, src.height, SRCCOPY); diff --git a/xvaga/xvaga.cpp b/xvaga/xvaga.cpp index cfd39e17c..763cbaf9d 100755 --- a/xvaga/xvaga.cpp +++ b/xvaga/xvaga.cpp @@ -42,6 +42,7 @@ #define CAST_TWIN(win,w) TwxWindow& w = *wxStaticCast((wxWindow*)win, TwxWindow); #define CAST_TDC(win,dc) TDC& dc = GetTDCMapper().GetTDC(win); #define CAST_DC(win,dc) wxDC& dc = GetTDCMapper().GetDC(win); +#define CAST_FONT(font_id, font) TFontId& font = *wxStaticCast(font_id, TFontId); wxWindow* _mouse_trapper = NULL; RCT _startup_rect = { 0,0,0,0 }; @@ -260,7 +261,7 @@ wxString _GetResourceName(const char* type, int rid) const wxIcon& _GetIconResource(int rid) { - wxIcon* icon = (wxIcon*)_nice_icons.Get(rid); + wxIcon* icon = wxDynamicCast(_nice_icons.Get(rid), wxIcon); if (icon == NULL) { wxString strName = _GetResourceName("Icon", rid); @@ -270,7 +271,7 @@ const wxIcon& _GetIconResource(int rid) } else { - icon = (wxIcon*)_nice_icons.Get(ICON_RSRC); + icon = wxDynamicCast(_nice_icons.Get(ICON_RSRC), wxIcon); if (icon == NULL) { strName.Printf("%d", ICON_RSRC); @@ -285,7 +286,7 @@ const wxIcon& _GetIconResource(int rid) const wxCursor* GetCursorResource(int rid) { static wxHashTable _nice_cursors; - wxCursor* cursor = (wxCursor*)_nice_cursors.Get(rid); + wxCursor* cursor = wxDynamicCast(_nice_cursors.Get(rid), wxCursor); if (cursor == NULL) { switch (rid) @@ -489,8 +490,11 @@ void xvt_app_create(int argc, char **argv, unsigned long flags, #ifdef WIN32 if (hwndParent != NULL) { - HWND hwndChild = (HWND)_task_win->GetHandle(); - ::SetParent(hwndChild, hwndParent); +// HWND hwndChild = (HWND)_task_win->GetHandle(); +// ::SetParent(hwndChild, hwndParent); + wxWindow* padre = new wxWindow; + padre->AssociateHandle(hwndParent); + _task_win->Reparent(padre); } #endif @@ -530,10 +534,11 @@ void xvt_app_create(int argc, char **argv, unsigned long flags, for (int i= 0; i < 3; i++) pMenubar->Append(Menus[i], Title[i]); #endif - ((wxFrame*)_task_win)->SetMenuBar(pMenubar); - + wxFrame* pFrame = wxStaticCast(_task_win, wxFrame); + pFrame->SetMenuBar(pMenubar); if (style & wxMAXIMIZE) - ((wxFrame*)_task_win)->Maximize(); + pFrame->Maximize(); + _task_win->Show(); wxApp* a = wxTheApp; @@ -931,7 +936,7 @@ ASK_RESPONSE xvt_dm_post_ask(const char* Btn1, const char* Btn2, const char* Btn void xvt_dm_post_error(const char *fmt) { - _MessageBox(fmt, wxOK | wxCENTRE | wxICON_ERROR); + _MessageBox(fmt, wxOK | wxCENTRE | wxICON_HAND); } void xvt_dm_post_fatal_exit(const char *fmt) @@ -976,7 +981,7 @@ FL_STATUS xvt_dm_post_file_open(FILE_SPEC *fsp, const char *msg) FL_STATUS xvt_dm_post_file_save(FILE_SPEC *fsp, const char *msg) { - const int flags = wxSAVE; + const int flags = wxSAVE | wxOVERWRITE_PROMPT; return xvt_dm_post_file_ask(fsp, msg, flags); } @@ -994,7 +999,7 @@ FL_STATUS xvt_dm_post_dir_sel(DIRECTORY *dir) BOOLEAN xvt_dm_post_font_sel(WINDOW win, XVT_FNTID font_id, PRINT_RCD *precp, unsigned long reserved) { - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); wxFontData data; data.SetInitialFont(font.Font(NULL, win)); data.EnableEffects(reserved != 0); @@ -1119,8 +1124,8 @@ public: IMPLEMENT_DYNAMIC_CLASS(TXVT_IMAGE, wxImage); -#define CAST_IMAGE(xvtimg, imgptr) TXVT_IMAGE* imgptr = wxDynamicCast(xvtimg, TXVT_IMAGE); -#define CONST_IMAGE(xvtimg, imgptr) const TXVT_IMAGE* imgptr = wxDynamicCast(xvtimg, TXVT_IMAGE); +#define CAST_TIMAGE(xvtimg, img) TXVT_IMAGE* img = wxDynamicCast(xvtimg, TXVT_IMAGE); +#define CAST_IMAGE(xvtimg, img) const wxImage* img = wxDynamicCast(xvtimg, wxImage); #ifdef WIN32 @@ -1172,6 +1177,8 @@ TXVT_IMAGE::~TXVT_IMAGE() // Font Handling /////////////////////////////////////////////////////////// +IMPLEMENT_DYNAMIC_CLASS(TFontId, wxObject); + void TFontId::Copy(const TFontId& rFont) { m_strFace = rFont.m_strFace; @@ -1318,7 +1325,6 @@ void TFontId::Copy(const wxFont& rFont) m_win = NULL_WIN; } - /////////////////////////////////////////////////////////// // Drawable windows /////////////////////////////////////////////////////////// @@ -1450,7 +1456,7 @@ void xvt_dwin_draw_image_on_pdf(WINDOW win, const char* name, RCT* dest) void xvt_dwin_draw_image(WINDOW win, XVT_IMAGE img, RCT* dest, RCT* source) { - CAST_IMAGE(img, image); + CAST_TIMAGE(img, image); if (image != NULL) { if (xvt_dwin_is_update_needed(win, dest)) @@ -1752,9 +1758,8 @@ void xvt_dwin_set_draw_mode(WINDOW win, DRAW_MODE mode) void xvt_dwin_set_font(WINDOW win, XVT_FNTID font_id) { - XVT_ASSERT(font_id != NULL); CAST_TDC(win, dc); - const TFontId& font = *(const TFontId*)font_id; + CAST_FONT(font_id, font); if (dc._font != font) { dc._font = font; @@ -1835,9 +1840,9 @@ XVT_ERRSEV xvt_errmsg_get_sev_id(XVT_ERRMSG err) void xvt_font_copy(XVT_FNTID dest_font_id, XVT_FNTID src_font_id, XVT_FONT_ATTR_MASK mask) { XVT_ASSERT(dest_font_id && src_font_id && mask == XVT_FA_ALL); - TFontId* dst = (TFontId*)dest_font_id; - TFontId* src = (TFontId*)src_font_id; - *dst = *src; + CAST_FONT(dest_font_id, dst); + CAST_FONT(src_font_id, src); + dst = src; } XVT_FNTID xvt_font_create(void) @@ -1850,8 +1855,8 @@ void xvt_font_deserialize(XVT_FNTID font_id, const char* buf) { // 01\\Courier\\0\\10\\WIN01/-13/0/0/0/400/0/0/0/0/1/2/1/49/Courier - TFontId& font = *(TFontId*)font_id; - const char* s = strchr(buf, '/'); + CAST_FONT(font_id, font) + const char* s = strchr(buf, '/'); if (s == NULL) return; const int nSize = atoi(s+1); @@ -1894,13 +1899,17 @@ void xvt_font_deserialize(XVT_FNTID font_id, const char* buf) void xvt_font_destroy(XVT_FNTID font_id) { - delete (TFontId*)font_id; + if (font_id != NULL) + { + TFontId* fp = wxStaticCast(font_id, TFontId); + delete fp; + } } BOOLEAN xvt_font_get_family(XVT_FNTID font_id, char* buf, long max_buf) { - const TFontId& font = *(TFontId*)font_id; - strncpy(buf, font.FaceName(), max_buf); + CAST_FONT(font_id, font); + strncpy(buf, font.FaceName(), max_buf); buf[max_buf-1] = '\0'; return TRUE; } @@ -1910,7 +1919,7 @@ BOOLEAN xvt_font_get_family_mapped(XVT_FNTID font_id, char* buf, long max_buf) void xvt_font_get_metrics(XVT_FNTID font_id, int *leadingp, int *ascentp, int *descentp) { - const TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); WINDOW win = font.Win(); if (win == NULL_WIN) win = TASK_WIN; @@ -1934,29 +1943,31 @@ BOOLEAN xvt_font_get_native_desc(XVT_FNTID font_id, char *buf, long max_buf) long xvt_font_get_size(XVT_FNTID font_id) { - return ((TFontId*)font_id)->PointSize(); + CAST_FONT(font_id, font); + return font.PointSize(); } XVT_FONT_STYLE_MASK xvt_font_get_style(XVT_FNTID font_id) { - return ((TFontId*)font_id)->Mask(); + CAST_FONT(font_id, font); + return font.Mask(); } WINDOW xvt_font_get_win(XVT_FNTID font_id) { - return ((TFontId*)font_id)->Win(); + CAST_FONT(font_id, font); + return font.Win(); } BOOLEAN xvt_font_is_mapped(XVT_FNTID font_id) { - bool yes = ((TFontId*)font_id)->Win() != NULL_WIN; - return yes; + return xvt_font_get_win(font_id) != NULL_WIN; } void xvt_font_map(XVT_FNTID font_id, WINDOW win) { - TFontId* pFont = (TFontId*)font_id; - pFont->SetWin(win); + CAST_FONT(font_id, font); + font.SetWin(win); } void xvt_font_map_using_default(XVT_FNTID font_id) @@ -1966,19 +1977,19 @@ void xvt_font_map_using_default(XVT_FNTID font_id) void xvt_font_set_family(XVT_FNTID font_id, const char* family) { - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); font.SetFaceName(family); } void xvt_font_set_size(XVT_FNTID font_id, long size) { - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); font.SetPointSize(size); } void xvt_font_set_style(XVT_FNTID font_id, XVT_FONT_STYLE_MASK mask) { - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); font.SetMask(mask); } @@ -1986,7 +1997,7 @@ long xvt_font_serialize(XVT_FNTID font_id, char *buf, long max_buf) { // 01\\Courier\\0\\10\\WIN01/-13/0/0/0/400/0/0/0/0/1/2/1/49/Courier - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); const char* name = font.FaceName(); const int size = font.PointSize(); const int italic = (font.Mask() & XVT_FS_ITALIC) != 0; @@ -2003,7 +2014,7 @@ long xvt_font_serialize(XVT_FNTID font_id, char *buf, long max_buf) void xvt_font_unmap(XVT_FNTID font_id) { - TFontId& font = *(TFontId*)font_id; + CAST_FONT(font_id, font); font.SetWin(NULL_WIN); } @@ -2388,71 +2399,56 @@ XVT_IMAGE xvt_image_create(XVT_IMAGE_FORMAT format, short width, short height, l void xvt_image_destroy(XVT_IMAGE img) { - CAST_IMAGE(img, image); + CAST_TIMAGE(img, image); if (image != NULL) delete image; } COLOR xvt_image_get_clut(XVT_IMAGE img, short index) { - CONST_IMAGE(img, image); - if (image) + CAST_IMAGE(img, image); + if (image && image->Ok() && image->HasPalette()) { - const wxImage& bmp = image->Image(); - if (bmp.HasPalette()) - { - const wxPalette& pal = bmp.GetPalette(); - unsigned char r, g, b; - pal.GetRGB(index, &r, &g, &b); - return XVT_MAKE_COLOR(r, g, b); - } + const wxPalette& pal = image->GetPalette(); + unsigned char r, g, b; + pal.GetRGB(index, &r, &g, &b); + return XVT_MAKE_COLOR(r, g, b); } - return COLOR_BLACK; + return COLOR_INVALID; } -void xvt_image_get_dimensions(XVT_IMAGE image, short *width, short *height) +void xvt_image_get_dimensions(XVT_IMAGE image, short* width, short* height) { *width = *height = 0; - - CONST_IMAGE(image, img); - if (img != NULL) + + CAST_IMAGE(image, img); + if (img != NULL && img->Ok()) { - const wxImage& bmp = img->Image(); - if (bmp.Ok()) - { - *width = bmp.GetWidth(); - *height = bmp.GetHeight(); - } + *width = img->GetWidth(); + *height = img->GetHeight(); } } XVT_IMAGE_FORMAT xvt_image_get_format(XVT_IMAGE image) { - CONST_IMAGE(image, i); - if (i != NULL) - { - const wxImage& img = i->Image(); - return img.HasPalette() ? XVT_IMAGE_CL8 : XVT_IMAGE_RGB; - } + CAST_IMAGE(image, img); + if (img != NULL && img->Ok()) + return img->HasPalette() ? XVT_IMAGE_CL8 : XVT_IMAGE_RGB; return XVT_IMAGE_NONE; } short xvt_image_get_ncolors(XVT_IMAGE image) { int n = 0; - CONST_IMAGE(image, i); - if (i != NULL) + CAST_IMAGE(image, i); + if (i != NULL && i->Ok() && i->HasPalette()) { - const wxImage& bmp = i->Image(); - if (bmp.HasPalette()) + const wxPalette& pal = i->GetPalette(); + unsigned char r, g, b; + for (n = 16; n < 256; n++) { - const wxPalette& pal = bmp.GetPalette(); - unsigned char r, g, b; - for (n = 16; n < 256; n++) - { - if (!pal.GetRGB(n, &r, &g, &b)) - break; - } + if (!pal.GetRGB(n, &r, &g, &b)) + break; } } return n; @@ -2460,16 +2456,15 @@ short xvt_image_get_ncolors(XVT_IMAGE image) COLOR xvt_image_get_pixel(XVT_IMAGE image, short x, short y) { - CONST_IMAGE(image, i); - if (i != NULL) + CAST_IMAGE(image, i); + if (i != NULL && i->Ok()) { - const wxImage& bmp = i->Image(); - int r = bmp.GetRed(x, y); - int g = bmp.GetGreen(x, y); - int b = bmp.GetBlue(x, y); + int r = i->GetRed(x, y); + int g = i->GetGreen(x, y); + int b = i->GetBlue(x, y); return XVT_MAKE_COLOR(r, g, b); } - return -1; + return COLOR_INVALID; } XVT_IMAGE xvt_image_read(const char* filenamep) @@ -2489,8 +2484,8 @@ XVT_IMAGE xvt_image_read(const char* filenamep) if (::wxFileExists(name)) { i = new TXVT_IMAGE; - i->Image().LoadFile(name); - if (!i->Image().Ok()) + i->LoadFile(name); + if (!i->Ok()) { delete i; i = NULL; @@ -2506,29 +2501,26 @@ XVT_IMAGE xvt_image_read_bmp(const char *filenamep) void xvt_image_set_clut(XVT_IMAGE image, short index, COLOR color) { - CAST_IMAGE(image, i); - if (i != NULL) + CAST_TIMAGE(image, i); + if (i != NULL && i->Ok() && i->HasPalette()) { - wxImage& bmp = i->Image(); - if (bmp.HasPalette()) - { - const wxPalette& pal = bmp.GetPalette(); - CAST_COLOR (color, c); - unsigned char ri, gi, bi; - pal.GetRGB(index, &ri, &gi, &bi); + wxImage& bmp = i->Image(); // Set dirty! + const wxPalette& pal = bmp.GetPalette(); + CAST_COLOR (color, c); + unsigned char ri, gi, bi; + pal.GetRGB(index, &ri, &gi, &bi); - const int w = bmp.GetWidth(); - const int h = bmp.GetHeight(); - for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) - { - unsigned char r = bmp.GetRed(x, y); - if (r != ri) continue; - unsigned char g = bmp.GetGreen(x, y); - if (g != gi) continue; - unsigned char b = bmp.GetBlue(x, y); - if (b != bi) continue; - bmp.SetRGB(x, y, c.Red(), c.Green(), c.Blue()); - } + const int w = bmp.GetWidth(); + const int h = bmp.GetHeight(); + for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) + { + unsigned char r = bmp.GetRed(x, y); + if (r != ri) continue; + unsigned char g = bmp.GetGreen(x, y); + if (g != gi) continue; + unsigned char b = bmp.GetBlue(x, y); + if (b != bi) continue; + bmp.SetRGB(x, y, c.Red(), c.Green(), c.Blue()); } } } @@ -2540,25 +2532,24 @@ void xvt_image_set_ncolors(XVT_IMAGE image, short ncolors) void xvt_image_set_pixel(XVT_IMAGE image, short x, short y, COLOR color) { - CAST_IMAGE(image, i); - if (i != NULL) + CAST_TIMAGE(image, i); + if (i != NULL && i->Ok()) { - wxImage& bmp = i->Image(); - CAST_COLOR (color, c); - bmp.SetRGB(x, y, c.Red(), c.Green(), c.Blue()); + CAST_COLOR(color, c); + i->Image().SetRGB(x, y, c.Red(), c.Green(), c.Blue()); } } void xvt_image_transfer(XVT_IMAGE dstimage, XVT_IMAGE srcimage, RCT *dstrctp, RCT *srcrctp) { - CAST_IMAGE(dstimage, dst); - CAST_IMAGE(srcimage, src); + CAST_TIMAGE(dstimage, dst); + CAST_TIMAGE(srcimage, src); if (dst != NULL && src != NULL) { const wxRect rctDst = NormalizeRCT(dstrctp); const wxRect rctSrc = NormalizeRCT(srcrctp); wxMemoryDC dc; - wxBitmap bmp(dst->Image()); + wxBitmap bmp(*dst); dc.SelectObject(bmp); DrawImageOnDC(dc, src, rctDst, rctSrc); dst->Image() = bmp.ConvertToImage(); @@ -3381,7 +3372,7 @@ int xvt_str_compare_ignoring_case (const char* s1, const char* s2) char* xvt_str_duplicate(const char* str) { - return str ? _strdup(str) : NULL; // bleah! + return str ? wxStrdup(str) : NULL; // bleah! } char* xvt_str_number_format(char* str, int size) @@ -3432,14 +3423,14 @@ void xvt_str_make_upper(char* str) { wxString s(str); s.MakeUpper(); - strcpy(str, s); + wxStrcpy(str, s); } void xvt_str_make_lower(char* str) { wxString s(str); s.MakeLower(); - strcpy(str, s); + wxStrcpy(str, s); } double xvt_str_fuzzy_compare (const char* s1, const char* s2) @@ -3458,6 +3449,7 @@ BOOLEAN xvt_chr_is_digit(int c) { return (c <= 255) && wxIsdigit(c); } + BOOLEAN xvt_chr_is_alpha(int c) { return (c <= 255) && wxIsalpha(c); @@ -3506,7 +3498,7 @@ void xvt_sys_beep(int severity) BOOLEAN xvt_sys_get_host_name(char* name, int maxlen) { wxString str = wxGetHostName(); - strncpy(name, str, maxlen); + wxStrncpy(name, str, maxlen); name[maxlen-1] = '\0'; return *name > '\0'; } @@ -3514,7 +3506,7 @@ BOOLEAN xvt_sys_get_host_name(char* name, int maxlen) BOOLEAN xvt_sys_get_user_name(char* name, int maxlen) { wxString str = wxGetUserId(); - strncpy(name, str, maxlen); + wxStrncpy(name, str, maxlen); name[maxlen-1] = '\0'; return *name > '\0'; } @@ -3537,7 +3529,7 @@ wxThread::ExitCode TIconizeTaskThread::Entry() ::wxMilliSleep(500); if (__bChildRunning) // Il programma e' ancora attivo { - wxFrame* frame = (wxFrame*)_task_win; + wxFrame* frame = wxStaticCast(_task_win, wxFrame); frame->Iconize(); } return 0; @@ -3562,7 +3554,7 @@ long xvt_sys_execute(const char* cmdline, BOOLEAN sync, BOOLEAN iconizetask) if (sync) { - wxFrame* frame = (wxFrame*)_task_win; + wxFrame* frame = wxStaticCast(_task_win, wxFrame); if (iconizetask) { wxEnableTopLevelWindows(FALSE); @@ -3702,7 +3694,7 @@ BOOLEAN xvt_sys_find_editor(const char* file, char* editor) #endif ok = !e.IsEmpty(); if (ok && editor != NULL) - strcpy(editor, e); + wxStrcpy(editor, e); return ok; } @@ -3727,7 +3719,6 @@ unsigned int xvt_sys_load_icon(const char* file) } #else icon = new wxIcon; -// icon = new wxIcon(wxICON(file)); //verificare #endif } @@ -3735,7 +3726,7 @@ unsigned int xvt_sys_load_icon(const char* file) { for (id = 60001; ; id++) { - wxIcon* ico = (wxIcon*)_nice_icons.Get(id); + wxIcon* ico = wxDynamicCast(_nice_icons.Get(id), wxIcon); if (ico == NULL) { _nice_icons.Put(id, icon); @@ -3931,20 +3922,16 @@ void xvt_timer_destroy(long id) void xvt_vobj_destroy(WINDOW win) { - if (win != NULL_WIN) + wxWindow* w = wxDynamicCast(_nice_windows.Get(win), wxWindow); + if (w != NULL) { - if (win != PRINTER_WIN && win != TASK_WIN) - { - xvt_win_set_caret_visible(win, FALSE); + wxASSERT(win == (WINDOW)w); + + xvt_win_set_caret_visible(win, FALSE); + + w->Destroy(); // same as delete w + _nice_windows.Delete(win); // Elimina "di nuovo" dalla lista delle finestre attive - wxWindow* w = (wxWindow*)_nice_windows.Get(win); - if (w != NULL) - { - wxASSERT((wxWindow*)win == w); - w->Destroy(); // formerly delete w; - _nice_windows.Delete(win); // Elimina dalla lista delle finestre attive - } - } GetTDCMapper().DestroyTDC(win); // Elimina dalla lista dei display context } } @@ -4121,8 +4108,8 @@ RCT* xvt_vobj_get_client_rect(WINDOW win, RCT *rctp) long xvt_vobj_get_data(WINDOW win) { - CAST_TWIN(win, w); - return w._app_data; + const TwxWindow* w = wxDynamicCast(_nice_windows.Get(win), TwxWindow); + return w != NULL ? w->_app_data : 0L; } RCT* xvt_vobj_get_outer_rect(WINDOW win, RCT *rctp) @@ -4383,9 +4370,12 @@ BOOLEAN xvt_win_enum_wins(WINDOW parent_win, XVT_ENUM_CHILDREN func, long data, { for (wxWindowList::iterator i = list.begin(); i != list.end(); ++i) { - WINDOW win = (WINDOW)&(wxWindow&)*i; - if (!func(win, data)) - break; + wxWindow* tw = wxDynamicCast(*i, wxWindow); + if (tw != NULL) + { + if (!func((WINDOW)tw, data)) + break; + } } } return ok; @@ -4408,16 +4398,15 @@ long xvt_win_get_children_count(WINDOW parent_win) void xvt_win_post_event(WINDOW win, EVENT* event_p) { - // Per ora funziona solo con la task window - XVT_ASSERT(win == (WINDOW)_task_win && event_p != NULL); - + // Per ora e' garantito che funzioni solo con la task window + CAST_WIN(win, w); switch (event_p->type) { case E_COMMAND: { wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, event_p->v.cmd.tag); - e.SetEventObject(_task_win); - wxPostEvent(_task_win, e); + e.SetEventObject(&w); + wxPostEvent(&w, e); } break; default: @@ -4431,7 +4420,7 @@ void xvt_win_release_pointer(void) if (_mouse_trapper != NULL) { // cap SHOULD be equal to _mouse_trapper :-) - wxWindow* cap = _mouse_trapper->GetCapture(); + wxWindow* cap = wxWindow::GetCapture(); if (cap != NULL) cap->ReleaseMouse(); _mouse_trapper = NULL; @@ -4482,11 +4471,11 @@ static wxStatusBar* WIN2StatBar(WINDOW win) wxStatusBar* pStatusBar = NULL; if (win == NULL_WIN || win == TASK_WIN) { - wxFrame* w = (wxFrame*)_task_win; + wxFrame* w = wxStaticCast(_task_win, wxFrame); pStatusBar = w->GetStatusBar(); } else - pStatusBar = (wxStatusBar*)win; + pStatusBar = wxDynamicCast((wxObject*)win, wxStatusBar); return pStatusBar; } @@ -4510,34 +4499,33 @@ const char* statbar_set_default_title(WINDOW win, const char *text) return statbar_set_title(win, text); } -XVT_FNTID statbar_set_fontid(WINDOW win, XVT_FNTID fontid) +XVT_FNTID statbar_set_fontid(WINDOW win, XVT_FNTID font_id) { wxStatusBar* pStatBar = WIN2StatBar(win); - if (pStatBar != NULL && fontid != NULL) + if (pStatBar != NULL && font_id != NULL) { - const TFontId& font = *(const TFontId*)fontid; + CAST_FONT(font_id, font); pStatBar->SetFont(font.Font(NULL, win)); } - return fontid; + return font_id; } -XVT_FNTID statbar_get_fontid(WINDOW win, XVT_FNTID fontid) +XVT_FNTID statbar_get_fontid(WINDOW win, XVT_FNTID font_id) { wxStatusBar* pStatBar = WIN2StatBar(win); - if (pStatBar != NULL && fontid != NULL) + if (pStatBar != NULL && font_id != NULL) { - TFontId& font = *(TFontId*)fontid; + CAST_FONT(font_id, font); font.Copy(pStatBar->GetFont()); } - return fontid; + return font_id; } WINDOW statbar_create(int cid, int left, int top, int right, int bottom, int prop_count, char **prop_list, WINDOW parent_win, int parent_rid, long parent_flags, char *parent_class) { - XVT_ASSERT(parent_win == TASK_WIN); - wxFrame& w = *(wxFrame*)_task_win; + wxFrame& w = *wxStaticCast((wxObject*)parent_win, wxFrame); const int nStyle = 0; // not wxST_SIZEGRIP wxStatusBar* pStatusBar = w.CreateStatusBar(2, nStyle); @@ -4555,7 +4543,7 @@ BOOLEAN statbar_destroy(WINDOW win) wxStatusBar* pStatusBar = WIN2StatBar(win); if (pStatusBar != NULL) { - wxFrame& w = *(wxFrame*)_task_win; + wxFrame& w = *wxStaticCast(_task_win, wxFrame); if (w.GetStatusBar() == pStatusBar) w.SetStatusBar(NULL); pStatusBar->Destroy(); diff --git a/xvaga/xvt.h b/xvaga/xvt.h index 4f5cc9689..650a133ff 100755 --- a/xvaga/xvt.h +++ b/xvaga/xvt.h @@ -163,7 +163,6 @@ XVTDLL BOOLEAN xvt_fsys_convert_str_to_dir(const char *path, DIRECTORY *dirp); XVTDLL BOOLEAN xvt_fsys_convert_fspec_to_str(const FILE_SPEC *fs, char *path, int sz_path); XVTDLL BOOLEAN xvt_fsys_convert_str_to_fspec(const char *mbs, FILE_SPEC *fs); - XVTDLL BOOLEAN xvt_fsys_get_dir(DIRECTORY *dirp); XVTDLL void xvt_fsys_get_default_dir(DIRECTORY *dirp); XVTDLL SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs); @@ -354,7 +353,6 @@ XVTDLL BOOLEAN xvt_chr_is_digit(int c); XVTDLL BOOLEAN xvt_chr_is_alpha(int c); XVTDLL BOOLEAN xvt_chr_is_alnum(int c); - // System calls by XVAGA XVTDLL void xvt_sys_beep(int severity); XVTDLL long xvt_sys_execute(const char* cmdline, BOOLEAN sync, BOOLEAN iconizetask); diff --git a/xvaga/xvtctl.cpp b/xvaga/xvtctl.cpp index 368c85657..4fcc847c6 100755 --- a/xvaga/xvtctl.cpp +++ b/xvaga/xvtctl.cpp @@ -499,18 +499,13 @@ long TwxNoteBook::Flags2Style(long flags) const TwxNoteBook::TwxNoteBook(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long flags) : wxAuiNotebook(parent, id, pos, size, Flags2Style(flags)), m_bSuspended(false) -{ _nice_windows.Put((WINDOW)this, this); } +{ + _nice_windows.Put((WINDOW)this, this); // Serve per poter fare la xvt_vobj_destroy +} TwxNoteBook::~TwxNoteBook() { - // Il wxAuiNotebook non gradisce le pagine doppie, per cui ... le ammazzo io. m_bSuspended = true; - for (int i = GetPageCount()-1; i > 0; i--) - { - wxWindow* page = GetPage(i); // Pagina corrente a partire dall'ultima - if (GetPageIndex(page) < i) // C'e' anche prima ... - RemovePage(i); // ... allora la rimuovo (senza delete!) - } _nice_windows.Delete((WINDOW)this); } @@ -522,7 +517,10 @@ short xvt_notebk_add_page(WINDOW notebk, WINDOW page, const char* title, XVT_IMA CAST_NOTEBOOK(notebk, nb); wxString strTitle = title; if (strTitle.IsEmpty() && page != NULL_WIN) - strTitle = ((wxWindow*)page)->GetLabel(); + { + wxWindow* pg = wxStaticCast((wxObject*)page, wxWindow); + strTitle = pg->GetLabel(); + } idx = nb.AddTab((wxWindow*)page, strTitle, image, tab_no); } return idx; diff --git a/xvaga/xvtextra.cpp b/xvaga/xvtextra.cpp index 5bc434b87..3598fd1bb 100755 --- a/xvaga/xvtextra.cpp +++ b/xvaga/xvtextra.cpp @@ -414,7 +414,7 @@ BOOLEAN xvt_app_escape(int esc_code, PRINT_RCD* rcd, long* ph, long* pw, long* p TPRINT_RCD* prcd = (TPRINT_RCD*)rcd; #ifdef WIN32 - RCD2data(prcd, data); + RCD2data(prcd, data); data.SetOrientation(*ph > *pw ? 1 : 2); data.ConvertToNative(); @@ -614,7 +614,6 @@ WINDOW xvt_print_create_win(PRINT_RCD* precp, const char* title) po.InitDC(rcd, title); } return PRINTER_WIN; - } void xvt_print_destroy(PRINT_RCD* precp) @@ -649,7 +648,6 @@ BOOLEAN xvt_print_is_pdf(PRINT_RCD* precp) } BOOLEAN xvt_print_is_valid(const PRINT_RCD* precp) - { BOOLEAN ok = precp != NULL && precp->pr == NULL; if (ok) @@ -672,7 +670,6 @@ int xvt_print_get_name(const PRINT_RCD* precp, char* name, int sz_s) if (!xvt_print_is_valid(precp)) return 0; - #ifdef WIN32 wxString n = ((const char*)precp) + 4; if (n.Length() >= 30) @@ -1129,7 +1126,7 @@ BOOLEAN xvt_str_md5(const char* instr, char* outstr) BOOLEAN ok = instr && *instr && outstr; if (ok) { - strcpy(outstr, wxMD5Checksum::GetMD5((unsigned char*)instr, strlen(instr))); + wxStrcpy(outstr, wxMD5Checksum::GetMD5((unsigned char*)instr, strlen(instr))); ok = *outstr != '\0'; } return ok; @@ -1141,7 +1138,7 @@ BOOLEAN xvt_fsys_file_md5(const char* path, char* outstr) BOOLEAN ok = path && *path && outstr; if (ok) { - strcpy(outstr, wxMD5Checksum::GetMD5(wxString(path))); + wxStrcpy(outstr, wxMD5Checksum::GetMD5(wxString(path))); ok = *outstr != '\0'; } return ok; diff --git a/xvaga/xvtwin.cpp b/xvaga/xvtwin.cpp index b391cbf5b..39f9bd8a4 100755 --- a/xvaga/xvtwin.cpp +++ b/xvaga/xvtwin.cpp @@ -726,22 +726,28 @@ void TwxWindow::OnMouseWheel(wxMouseEvent& evt) void TwxWindow::OnPaint(wxPaintEvent& WXUNUSED(evt)) { - EVENT e; memset(&e, 0, sizeof(EVENT)); - e.type = E_UPDATE; + const wxRect rctDamaged = GetUpdateRegion().GetBox(); + if (!rctDamaged.IsEmpty()) + { + EVENT e; memset(&e, 0, sizeof(EVENT)); + e.type = E_UPDATE; - RCT& rct = e.v.update.rct; + RCT& rct = e.v.update.rct; - wxRect rctDamaged = GetUpdateRegion().GetBox(); - rct.left = rctDamaged.x; - rct.top = rctDamaged.y; - rct.right = rctDamaged.GetRight()+1; - rct.bottom = rctDamaged.GetBottom()+1; + //wxRect rctDamaged = GetUpdateRegion().GetBox(); + rct.left = rctDamaged.x; + rct.top = rctDamaged.y; + rct.right = rctDamaged.GetRight()+1; + rct.bottom = rctDamaged.GetBottom()+1; - TDC& tdc = GetTDCMapper().GetTDC((WINDOW)this); - tdc.GetDC(true); // Forza la creazione di un wxPaintDC - DoXvtEvent(e); - tdc.KillDC(); // Distrugge il wxPaintDC - GetTDCMapper().DestroyDC(NULL_WIN); // Distrugge davvero tutti i wxClientDC residui (risolve molte "porcate" del video) + TDC& tdc = GetTDCMapper().GetTDC((WINDOW)this); + tdc.GetDC(true); // Forza la creazione di un wxPaintDC + DoXvtEvent(e); + tdc.KillDC(); // Distrugge il wxPaintDC + GetTDCMapper().DestroyDC(NULL_WIN); // Distrugge davvero tutti i wxClientDC residui (risolve molte "porcate" del video) + } + else + int keku = 1; } static SCROLL_CONTROL ConvertScrollToXVT(wxEventType et) @@ -770,7 +776,7 @@ void TwxWindow::OnScroll(wxScrollEvent& evt) SCROLL_CONTROL sc = ConvertScrollToXVT(evt.GetEventType()); if (sc != SC_NONE) { - wxWindow* ctl = (wxWindow*)evt.GetEventObject(); + wxScrollBar* ctl = wxStaticCast(evt.GetEventObject(), wxScrollBar); const wxSize sz = ctl->GetSize(); EVENT e; memset(&e, 0, sizeof(EVENT)); @@ -859,7 +865,8 @@ void TwxWindow::SetMenuTree(const MENU_ITEM* tree) if (m_menu) xvt_res_free_menu_tree(m_menu); m_menu = xvt_menu_duplicate_tree(tree); - ((TTaskWin*)_task_win)->PushMenuTree(tree, this); + TTaskWin* tw = wxStaticCast(_task_win, TTaskWin); + tw->PushMenuTree(tree, this); } } @@ -917,26 +924,31 @@ BOOLEAN TwxWindow::AddPane(wxWindow* wnd, const char* caption, int nDock, int nF } TwxWindow::TwxWindow() - : m_menu(NULL), _type(W_DOC), _eh(NULL), _app_data(0L), - _timer(NULL), m_pManager(NULL) + : m_menu(NULL), _type(W_DOC), _eh(NULL), _app_data(0L), + _timer(NULL), m_pManager(NULL) { } TwxWindow::TwxWindow(wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : TwxWindowBase(parent, id, title, pos, size, style), - m_menu(NULL), _eh(NULL), _timer(NULL), m_pManager(NULL) + m_menu(NULL), _eh(NULL), _app_data(0L), _timer(NULL), m_pManager(NULL) { _nice_windows.Put((WINDOW)this, this); } TwxWindow::~TwxWindow() { - if (HasCapture()) - ReleaseMouse(); - EVENT e; memset(&e, 0, sizeof(EVENT)); - e.type = E_DESTROY; - DoXvtEvent(e); + // Rendo praticamente impossibile risalire a questo oggetto d'ora in poi + _eh = NULL; + _app_data = 0L; + _nice_windows.Delete((WINDOW)this); + if (HasCapture()) + { + ReleaseMouse(); + xvt_win_release_pointer(); // Paranoid? + } + if (_timer != NULL) delete _timer; @@ -949,10 +961,9 @@ TwxWindow::~TwxWindow() if (m_menu) { xvt_res_free_menu_tree(m_menu); + m_menu = NULL; ((TTaskWin*)_task_win)->PopMenuTree(); } - - _nice_windows.Delete((WINDOW)this); } /////////////////////////////////////////////////////////// @@ -991,7 +1002,11 @@ void TTaskWin::OnMenu(wxCommandEvent& evt) if (m_MenuOwner == NULL || m_MenuOwner == this) _task_win_handler((WINDOW)this, &e); else - ((TwxWindow*)m_MenuOwner)->_eh((WINDOW)m_MenuOwner, &e); + { + TwxWindow* w = wxDynamicCast(m_MenuOwner, TwxWindow); + if (w != NULL) + w->_eh((WINDOW)m_MenuOwner, &e); + } } void TTaskWin::OnPaint(wxPaintEvent& WXUNUSED(evt)) @@ -1170,11 +1185,7 @@ TwxTaskBarIcon::TwxTaskBarIcon(wxWindow* owned, short icon, wxString strTip) } if (strTip.IsEmpty()) - { - const wxWindow* pWin = wxDynamicCast(_owned, wxWindow); - if (pWin != NULL) - strTip = pWin->GetLabel(); - } + strTip = _owned->GetLabel(); SetIcon(*pIcon, strTip); } diff --git a/xvaga/xvtwin.h b/xvaga/xvtwin.h index 518f71b6c..0d22b3d0f 100755 --- a/xvaga/xvtwin.h +++ b/xvaga/xvtwin.h @@ -1,12 +1,13 @@ #ifndef __XVTWIN_H #define __XVTWIN_H -class TFontId +class TFontId : public wxObject { wxString m_strFace; int m_nSize; XVT_FONT_STYLE_MASK m_wMask; WINDOW m_win; + DECLARE_DYNAMIC_CLASS(TFontId); protected: void Copy(const TFontId& pFont); @@ -124,7 +125,7 @@ public: TwxWindowBase() { } TwxWindowBase(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint & pos, const wxSize & size, long style); - + virtual ~TwxWindowBase() { } DECLARE_DYNAMIC_CLASS(TwxWindowBase) };