869692a6fd
Files correlati : xvaga.dll Ricompilazione Demo : [ ] Commento : Migliorato clipping nei PDF git-svn-id: svn://10.65.10.50/branches/R_10_00@22015 c028cbd2-c16b-5b4b-a496-9718f37d4682
392 lines
9.6 KiB
C++
Executable File
392 lines
9.6 KiB
C++
Executable File
#include "wxinc.h"
|
|
|
|
#include "xvt.h"
|
|
#include "xvtart.h"
|
|
|
|
#ifdef __WXMSW__
|
|
#include "oswin32.h"
|
|
#endif
|
|
|
|
#include <wx/artprov.h>
|
|
#include <wx/filename.h>
|
|
|
|
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")
|
|
{
|
|
int i = 1;
|
|
switch (xvt_sys_get_os_version())
|
|
{
|
|
case XVT_WS_WIN_2000:
|
|
case XVT_WS_WIN_2003: i = 0; break; // Cerco prima l'icona a 256 colori
|
|
default : i = 1; break; // Cerco solo l'icona in RGBA
|
|
}
|
|
for (; i < 2; i++)
|
|
{
|
|
const char* const oem_var = i == 0 ? "Icon256" : "Icon";
|
|
char name[MAX_PATH];
|
|
if (xvt_sys_get_oem_string(oem_var, "", 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);
|
|
fname.Normalize();
|
|
strName = fname.GetFullPath().Lower();
|
|
}
|
|
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_MISSING_IMAGE) tool = 100; 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);
|
|
|
|
for (wxCoord s = 16; s <= 48; s += 16)
|
|
{
|
|
const wxIcon smico = ib.GetIcon(s);
|
|
if (smico.GetWidth() != s)
|
|
{
|
|
wxBitmap bmpbig(ib.GetIcon());
|
|
wxImage img = bmpbig.ConvertToImage();
|
|
img.Rescale(s, s, wxIMAGE_QUALITY_HIGH);
|
|
wxBitmap bmpsmall(img);
|
|
wxIcon icosmall; icosmall.CopyFromBitmap(bmpsmall);
|
|
ib.AddIcon(icosmall);
|
|
}
|
|
}
|
|
}
|
|
#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)
|
|
{
|
|
int ix = 32, iy = 32;
|
|
|
|
if (client == wxART_FRAME_ICON)
|
|
{
|
|
const int x = wxSystemSettings::GetMetric(wxSYS_SMALLICON_X);
|
|
const int y = wxSystemSettings::GetMetric(wxSYS_SMALLICON_Y);
|
|
if (x > 0 && y > 0)
|
|
{ ix = x; iy = y; }
|
|
else
|
|
{ ix /= 2; iy /= 2; }
|
|
}
|
|
else
|
|
{
|
|
const int x = wxSystemSettings::GetMetric(wxSYS_ICON_X);
|
|
const int y = wxSystemSettings::GetMetric(wxSYS_ICON_Y);
|
|
if (x > 0 && y > 0)
|
|
{ ix = x; iy = y; }
|
|
if (client == wxART_MESSAGE_BOX)
|
|
{ ix *= 2; iy *= 2; }
|
|
}
|
|
|
|
return wxSize(ix,iy);
|
|
}
|
|
|
|
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)
|
|
{
|
|
wxIconBundle bundle = GetIconBundle(id, client);
|
|
const wxSize sz = size == wxDefaultSize ? GetNativeSizeHint(client) : size;
|
|
wxIcon ico = bundle.GetIcon(sz);
|
|
if (ico.IsOk() && sz.x != ico.GetWidth()) // Should never happen :-)
|
|
{
|
|
wxBitmap bmpbig(bundle.GetIcon());
|
|
wxImage img = bmpbig.ConvertToImage();
|
|
img.Rescale(sz.x, sz.y, wxIMAGE_QUALITY_HIGH);
|
|
wxBitmap bmpsmall(img);
|
|
wxIcon icosmall; icosmall.CopyFromBitmap(bmpsmall);
|
|
ico = icosmall;
|
|
bundle.AddIcon(ico);
|
|
}
|
|
return ico;
|
|
}
|
|
|
|
// 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;
|
|
const wxIcon ico = _TheArtProvider->GetIcon(id);
|
|
return ico.IsOk() ? _TheArtProvider->GetIconBundleNumber(id) : ICON_RSRC;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|