#include "wxinc.h" #include "xvt.h" #include "xvtart.h" #ifdef __WXMSW__ #include "oswin32.h" #endif #include #include wxString xvtart_GetResourceIni() { DIRECTORY dir; xvt_fsys_get_default_dir(&dir); wxString str = dir.path; str += "/res/resource.ini"; return str; } wxString xvtart_GetResourceName(const char* type, int rid) { wxString strName(type); strName << "s"; wxString strKey; strKey.Printf("%d", rid); DIRECTORY dir; xvt_fsys_get_default_dir(&dir); wxString startup_dir = dir.path; if ((rid == ICON_RSRC || rid == 0) && strName == "Icons") { char name[MAX_PATH]; if (xvt_sys_get_oem_string("Icon", "", name, sizeof(name))) { wxFileName fname(startup_dir + "/setup/" + name); if (fname.FileExists()) { fname.Normalize(); strName = fname.GetFullPath().Lower(); return strName; } } } wxString val; char* buff = val.GetWriteBuf(MAX_PATH); xvt_sys_get_profile_string(xvtart_GetResourceIni(), strName, strKey, "", buff, MAX_PATH); val.UngetWriteBuf(); if (!val.IsEmpty()) { strName = startup_dir; strName += "/custom/"; strName += val; if (!wxFileExists(strName)) { strName = startup_dir; strName += "/res/"; strName += val; } wxFileName fname(strName.Lower()); fname.Normalize(); strName = fname.GetFullPath(); } else strName.Empty(); return strName; } /////////////////////////////////////////////////////////// // TArtProvider /////////////////////////////////////////////////////////// class TArtProvider : public wxArtProvider { #if !wxCHECK_VERSION(2,9,0) WX_DECLARE_STRING_HASH_MAP(wxIconBundle, TIconBundleHashTable); TIconBundleHashTable m_hmBundles; WX_DECLARE_STRING_HASH_MAP(unsigned, TIconIdHashTable); TIconIdHashTable m_hmIds; #endif protected: virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size); virtual wxIconBundle CreateIconBundle(const wxArtID& id, const wxArtClient& client); public: #if !wxCHECK_VERSION(2,9,0) wxIconBundle GetIconBundle(const wxArtID& id, const wxArtClient& client); wxIcon GetIcon(const wxArtID& id, const wxArtClient& client = wxART_OTHER, const wxSize& size = wxDefaultSize); wxSize GetNativeSizeHint(const wxArtClient& client); #endif unsigned int GetIconBundleNumber(const wxArtID& id); }; TArtProvider* _TheArtProvider = NULL; void xvtart_Init() { if (_TheArtProvider == NULL) _TheArtProvider = new TArtProvider; wxArtProvider::Push(_TheArtProvider); } wxBitmap TArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size) { wxString strName; long tool = -1; if (id.StartsWith(wxT("wxART"))) { if (id == wxART_ERROR) tool = 201; else if (id == wxART_HELP) tool = 163; else if (id == wxART_INFORMATION) tool = 162; else if (id == wxART_NEW) tool = 105; else if (id == wxART_QUESTION) tool = 202; else if (id == wxART_QUIT) tool = 114; else if (id == wxART_WARNING) tool = 203; else ; } else id.ToLong(&tool); if (tool > 0) { strName = xvtart_GetResourceName("Tool", tool); if (strName.IsEmpty() || !::wxFileExists(strName)) strName = xvtart_GetResourceName("Tool", 100); // Default empty icon } else strName = id; if (!strName.IsEmpty() && ::wxFileExists(strName)) { if (strName.EndsWith(".ico")) { const wxIcon ico = GetIcon(strName, client, size); return wxBitmap(ico); } else { int sx = size.x, sy = size.y; if (sx <= 0 || sy <= 0) { const wxSize sz = GetNativeSizeHint(client); if (sx <= 0) sx = sz.x; if (sy <= 0) sy = sz.y; } wxImage img(strName, wxBITMAP_TYPE_ANY); img.Rescale(sx, sy, wxIMAGE_QUALITY_HIGH); return wxBitmap(img); } } return wxNullBitmap; } wxIconBundle TArtProvider::CreateIconBundle(const wxArtID& id, const wxArtClient& WXUNUSED(client)) { wxString strName = id; long nIco = -1; if (id.StartsWith(wxT("wxART"))) { if (id == wxART_EXECUTABLE_FILE) nIco = ICON_RSRC; else ; } else id.ToLong(&nIco); if (nIco > 0) strName = xvtart_GetResourceName("Icon", nIco); wxIconBundle ib; bool bFound = false; if (::wxFileExists(strName)) { const bool bLog = wxLog::EnableLogging(false); // Evita segnalazione di errore di formato icona if (strName.EndsWith(wxT(".ico"))) { ib.AddIcon(strName, wxBITMAP_TYPE_ICO); bFound = true; } #ifdef __WXMSW__ else { ib.AddIcon(OsWin32_LoadIcon(strName)); bFound = true; } #endif wxLog::EnableLogging(bLog); } #ifdef __WXMSW__ else { if (!strName.IsEmpty()) // Getione caso strName=".ext" { ib.AddIcon(OsWin32_LoadIcon(strName)); bFound = true; } } #endif if (!bFound && nIco == ICON_RSRC) { strName.Printf("%d", ICON_RSRC); // id puo' essere wxART_EXECUTABLE_FILE ib.AddIcon(wxIcon(strName, wxBITMAP_TYPE_ICO_RESOURCE)); } return ib; } #if !wxCHECK_VERSION(2,9,0) wxSize TArtProvider::GetNativeSizeHint(const wxArtClient& client) { if (client == wxART_FRAME_ICON) return wxSize(16,16); if (client == wxART_MESSAGE_BOX) return wxSize(64,64); return wxSize(32,32); } wxIconBundle TArtProvider::GetIconBundle(const wxArtID& id, const wxArtClient& client) { TIconBundleHashTable::iterator it = m_hmBundles.find(id); if (it == m_hmBundles.end()) { const wxIconBundle b = CreateIconBundle(id, client); m_hmBundles[id] = b; unsigned long uid = 0; if (!id.ToULong(&uid)) { wxString numid; numid.Printf(wxT("%lu"), GetIconBundleNumber(id)); m_hmBundles[numid] = b; } return b; } return it->second; } wxIcon TArtProvider::GetIcon(const wxArtID& id, const wxArtClient& client, const wxSize& size) { const wxIconBundle bundle = GetIconBundle(id, client); return bundle.GetIcon(size == wxDefaultSize ? GetNativeSizeHint(client) : size); } // Metodo fichissimo per assegnare un identificatore univoco alle icone chiamate per nome del file.* unsigned int TArtProvider::GetIconBundleNumber(const wxArtID& id) { unsigned int num = m_hmIds[id]; if (num == 0) { num = 60000+m_hmIds.size(); m_hmIds[id] = num; } return num; } #endif /////////////////////////////////////////////////////////// // xvt_sys_load_icon /////////////////////////////////////////////////////////// const wxBitmap xvtart_GetToolResource(int nIcon, int nDesiredSize) { if (nDesiredSize < 16) nDesiredSize = 16; else if (nDesiredSize > 128) nDesiredSize = 128; wxArtID id; id.Printf("%d", nIcon); return wxArtProvider::GetBitmap(id, wxART_TOOLBAR, wxSize(nDesiredSize, nDesiredSize)); } const wxIcon xvtart_GetIconResource(int nIcon, const char* client, const int size) { wxASSERT(_TheArtProvider != NULL); if (nIcon <= 0) nIcon = ICON_RSRC; wxArtID id; id.Printf("%d", nIcon); wxArtClient cl = client && * client ? client : wxART_OTHER; wxSize sz(size, size); return _TheArtProvider->GetIcon(id, cl, sz); } unsigned int xvt_sys_load_icon(const char* file) { wxASSERT(_TheArtProvider != NULL); const wxArtID id = file; _TheArtProvider->GetIcon(id); return _TheArtProvider->GetIconBundleNumber(id); } WX_DECLARE_HASH_MAP(int, wxCursor, wxIntegerHash, wxIntegerEqual, TCursorHashTable); const wxCursor xvtart_GetCursorResource(int rid) { static TCursorHashTable _nice_cursors; wxCursor cursor = _nice_cursors[rid]; if (!cursor.IsOk()) { switch (rid) { case CURSOR_CROCE: cursor = wxCURSOR_CROSS; break; case CURSOR_IBEAM: cursor = wxCURSOR_IBEAM; break; default: { const wxString strName = xvtart_GetResourceName("Cursor", rid); if (::wxFileExists(strName)) { if (strName.Find(".ico") > 0) cursor = wxCursor(strName, wxBITMAP_TYPE_ICO); else cursor = wxCursor(strName, wxBITMAP_TYPE_CUR); } } break; } if (!cursor.IsOk()) { wxFAIL_MSG(_("Invalid cursor")); cursor = *wxSTANDARD_CURSOR; } _nice_cursors[rid] = cursor; } return cursor; }