Updates to MIME-types and wxFileDialog code for better
native looking image handling. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1534,7 +1534,9 @@ wxImageList *wxFileIconsTable::GetSmallImageList()
|
|||||||
|
|
||||||
static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
|
static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
|
||||||
{
|
{
|
||||||
wxImage smallimg (16, 16);
|
const unsigned int size = 16;
|
||||||
|
|
||||||
|
wxImage smallimg (size, size);
|
||||||
unsigned char *p1, *p2, *ps;
|
unsigned char *p1, *p2, *ps;
|
||||||
unsigned char mr = img.GetMaskRed(),
|
unsigned char mr = img.GetMaskRed(),
|
||||||
mg = img.GetMaskGreen(),
|
mg = img.GetMaskGreen(),
|
||||||
@@ -1543,12 +1545,12 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
|
|||||||
unsigned x, y;
|
unsigned x, y;
|
||||||
unsigned sr, sg, sb, smask;
|
unsigned sr, sg, sb, smask;
|
||||||
|
|
||||||
p1 = img.GetData(), p2 = img.GetData() + 3 * 32, ps = smallimg.GetData();
|
p1 = img.GetData(), p2 = img.GetData() + 3 * size*2, ps = smallimg.GetData();
|
||||||
smallimg.SetMaskColour(mr, mr, mr);
|
smallimg.SetMaskColour(mr, mr, mr);
|
||||||
|
|
||||||
for (y = 0; y < 16; y++)
|
for (y = 0; y < size; y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < 16; x++)
|
for (x = 0; x < size; x++)
|
||||||
{
|
{
|
||||||
sr = sg = sb = smask = 0;
|
sr = sg = sb = smask = 0;
|
||||||
if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
|
if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
|
||||||
@@ -1574,9 +1576,9 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
|
|||||||
ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
|
ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
|
||||||
ps += 3;
|
ps += 3;
|
||||||
}
|
}
|
||||||
p1 += 32 * 3, p2 += 32 * 3;
|
p1 += size*2 * 3, p2 += size*2 * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wxBitmap(smallimg);
|
return wxBitmap(smallimg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1648,10 +1650,10 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
|
|||||||
wxLogNull logNull;
|
wxLogNull logNull;
|
||||||
if ( ft && ft->GetIcon(&iconLoc) )
|
if ( ft && ft->GetIcon(&iconLoc) )
|
||||||
{
|
{
|
||||||
ic = wxIcon(iconLoc);
|
ic = wxIcon( iconLoc.GetFileName() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete ft;
|
delete ft;
|
||||||
|
|
||||||
if ( !ic.Ok() )
|
if ( !ic.Ok() )
|
||||||
@@ -1671,18 +1673,24 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
|
|||||||
return newid;
|
return newid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unsigned int size = 16;
|
||||||
|
|
||||||
int id = m_smallImageList->GetImageCount();
|
int id = m_smallImageList->GetImageCount();
|
||||||
if ((bmp.GetWidth() == 16) && (bmp.GetHeight() == 16))
|
if ((bmp.GetWidth() == size) && (bmp.GetHeight() == size))
|
||||||
|
{
|
||||||
m_smallImageList->Add(bmp);
|
m_smallImageList->Add(bmp);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxImage img = bmp.ConvertToImage();
|
wxImage img = bmp.ConvertToImage();
|
||||||
|
|
||||||
if ((img.GetWidth() != 32) || (img.GetHeight() != 32))
|
if ((img.GetWidth() != size*2) || (img.GetHeight() != size*2))
|
||||||
m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32)));
|
// m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(size*2, size*2)));
|
||||||
|
m_smallImageList->Add(CreateAntialiasedBitmap(img.Rescale(size*2, size*2)));
|
||||||
else
|
else
|
||||||
m_smallImageList->Add(CreateAntialiasedBitmap(img));
|
m_smallImageList->Add(CreateAntialiasedBitmap(img));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_HashTable->Put(extension, new wxFileIconEntry(id));
|
m_HashTable->Put(extension, new wxFileIconEntry(id));
|
||||||
return id;
|
return id;
|
||||||
|
|
||||||
|
@@ -208,10 +208,13 @@ void wxFileData::ReadData()
|
|||||||
// try to get a better icon
|
// try to get a better icon
|
||||||
if (m_image == wxFileIconsTable::file)
|
if (m_image == wxFileIconsTable::file)
|
||||||
{
|
{
|
||||||
if (IsExe())
|
if (m_fileName.Find(wxT('.'), TRUE) != wxNOT_FOUND)
|
||||||
|
{
|
||||||
|
m_image = wxTheFileIconsTable->GetIconID( m_fileName.AfterLast(wxT('.')));
|
||||||
|
} else if (IsExe())
|
||||||
|
{
|
||||||
m_image = wxFileIconsTable::executable;
|
m_image = wxFileIconsTable::executable;
|
||||||
else if (m_fileName.Find(wxT('.'), TRUE) != wxNOT_FOUND)
|
}
|
||||||
m_image = wxTheFileIconsTable->GetIconID(m_fileName.AfterLast(wxT('.')));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_size = buff.st_size;
|
m_size = buff.st_size;
|
||||||
|
@@ -74,6 +74,8 @@
|
|||||||
#include "wx/utils.h"
|
#include "wx/utils.h"
|
||||||
#include "wx/tokenzr.h"
|
#include "wx/tokenzr.h"
|
||||||
#include "wx/iconloc.h"
|
#include "wx/iconloc.h"
|
||||||
|
#include "wx/filename.h"
|
||||||
|
#include "wx/fileconf.h"
|
||||||
|
|
||||||
#include "wx/unix/mimetype.h"
|
#include "wx/unix/mimetype.h"
|
||||||
|
|
||||||
@@ -571,17 +573,19 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
|||||||
else if (sTmp.Contains( wxT("icon_filename=") ) )
|
else if (sTmp.Contains( wxT("icon_filename=") ) )
|
||||||
{
|
{
|
||||||
curIconFile = sTmp.AfterFirst(wxT('='));
|
curIconFile = sTmp.AfterFirst(wxT('='));
|
||||||
|
|
||||||
if (!wxFileExists(curIconFile))
|
if (!wxFileExists(curIconFile))
|
||||||
{
|
{
|
||||||
size_t nDirs = dirs.GetCount();
|
size_t nDirs = dirs.GetCount();
|
||||||
for (size_t nDir = 0; nDir < nDirs; nDir++)
|
for (size_t nDir = 0; nDir < nDirs; nDir++)
|
||||||
{
|
{
|
||||||
wxString newFile;
|
wxFileName newFile( curIconFile );
|
||||||
newFile.Printf(wxT("%s/pixmaps/document-icons/%s.png"),
|
newFile.SetPath( dirs[nDir] );
|
||||||
dirs[nDir].c_str(),
|
newFile.AppendDir( wxT("pixmaps") );
|
||||||
curIconFile.c_str());
|
newFile.AppendDir( wxT("document-icons") );
|
||||||
if (wxFileExists(newFile))
|
newFile.SetExt( wxT("png") );
|
||||||
curIconFile = newFile;
|
if (newFile.FileExists())
|
||||||
|
curIconFile = newFile.GetFullPath();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -628,11 +632,9 @@ void wxMimeTypesManagerImpl::LoadGnomeDataFromKeyFile(const wxString& filename,
|
|||||||
// ignore blank lines
|
// ignore blank lines
|
||||||
nLine ++;
|
nLine ++;
|
||||||
} // end of while, save any data
|
} // end of while, save any data
|
||||||
|
|
||||||
if (! curMimeType.empty())
|
if (! curMimeType.empty())
|
||||||
{
|
|
||||||
AddToMimeData ( curMimeType, curIconFile, entry, strExtensions, strDesc);
|
AddToMimeData ( curMimeType, curIconFile, entry, strExtensions, strDesc);
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -677,7 +679,7 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeTypesFromMimeFile(const wxString& file
|
|||||||
wxLogTrace(TRACE_MIME,
|
wxLogTrace(TRACE_MIME,
|
||||||
wxT("--- At end of Gnome file finding mimetype %s ---"),
|
wxT("--- At end of Gnome file finding mimetype %s ---"),
|
||||||
curMimeType.c_str());
|
curMimeType.c_str());
|
||||||
|
|
||||||
AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString);
|
AddMimeTypeInfo(curMimeType, curExtList, wxEmptyString);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -735,7 +737,7 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
|
|||||||
|
|
||||||
wxString dirname = dirbase;
|
wxString dirname = dirbase;
|
||||||
dirname << wxT("/mime-info");
|
dirname << wxT("/mime-info");
|
||||||
|
|
||||||
if ( !wxDir::Exists(dirname) )
|
if ( !wxDir::Exists(dirname) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -747,7 +749,8 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
|
|||||||
dirname += wxT('/');
|
dirname += wxT('/');
|
||||||
|
|
||||||
wxString filename;
|
wxString filename;
|
||||||
bool cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
|
bool cont;
|
||||||
|
cont = dir.GetFirst(&filename, _T("*.mime"), wxDIR_FILES);
|
||||||
while ( cont )
|
while ( cont )
|
||||||
{
|
{
|
||||||
LoadGnomeMimeTypesFromMimeFile(dirname + filename);
|
LoadGnomeMimeTypesFromMimeFile(dirname + filename);
|
||||||
@@ -762,14 +765,45 @@ void wxMimeTypesManagerImpl::LoadGnomeMimeFilesFromDir(
|
|||||||
|
|
||||||
cont = dir.GetNext(&filename);
|
cont = dir.GetNext(&filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hack alert: We scan all icons and deduce the
|
||||||
|
// mime-type from the file name.
|
||||||
|
dirname = dirbase;
|
||||||
|
dirname << wxT("/pixmaps/document-icons");
|
||||||
|
|
||||||
|
// these are always empty in this file
|
||||||
|
wxArrayString strExtensions;
|
||||||
|
wxString strDesc;
|
||||||
|
|
||||||
|
if ( !wxDir::Exists(dirname) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxDir dir2( dirname );
|
||||||
|
|
||||||
|
cont = dir2.GetFirst(&filename, wxT("gnome-*.png"), wxDIR_FILES);
|
||||||
|
while ( cont )
|
||||||
|
{
|
||||||
|
wxString mimeType = filename;
|
||||||
|
mimeType.Remove( 0, 6 ); // remove "gnome-"
|
||||||
|
mimeType.Remove( mimeType.Len()-4, 4 ); // remove ".png"
|
||||||
|
int pos = mimeType.Find( wxT("-") );
|
||||||
|
if (pos != wxNOT_FOUND)
|
||||||
|
{
|
||||||
|
mimeType.SetChar( pos, wxT('/') );
|
||||||
|
wxString iconFile = dirname;
|
||||||
|
iconFile << wxT("/");
|
||||||
|
iconFile << filename;
|
||||||
|
AddToMimeData ( mimeType, iconFile, NULL, strExtensions, strDesc, TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
cont = dir2.GetNext(&filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir)
|
void wxMimeTypesManagerImpl::GetGnomeMimeInfo(const wxString& sExtraDir)
|
||||||
{
|
{
|
||||||
wxArrayString dirs;
|
wxArrayString dirs;
|
||||||
|
dirs.Add(wxT("/opt/gnome/share"));
|
||||||
dirs.Add(wxT("/usr/share"));
|
dirs.Add(wxT("/usr/share"));
|
||||||
dirs.Add(wxT("/usr/local/share"));
|
dirs.Add(wxT("/usr/local/share"));
|
||||||
|
|
||||||
@@ -1012,6 +1046,8 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
|||||||
strIcon = file.GetCmd(nIndex);
|
strIcon = file.GetCmd(nIndex);
|
||||||
wxLogTrace(TRACE_MIME, wxT(" icon %s"), strIcon.c_str());
|
wxLogTrace(TRACE_MIME, wxT(" icon %s"), strIcon.c_str());
|
||||||
//it could be the real path, but more often a short name
|
//it could be the real path, but more often a short name
|
||||||
|
|
||||||
|
|
||||||
if (!wxFileExists(strIcon))
|
if (!wxFileExists(strIcon))
|
||||||
{
|
{
|
||||||
// icon is just the short name
|
// icon is just the short name
|
||||||
@@ -1021,12 +1057,16 @@ void wxMimeTypesManagerImpl::LoadKDELinksForMimeSubtype(const wxString& dirbase,
|
|||||||
// in many locations, at least ~/.kde and $KDEDIR
|
// in many locations, at least ~/.kde and $KDEDIR
|
||||||
size_t nDir, nDirs = icondirs.GetCount();
|
size_t nDir, nDirs = icondirs.GetCount();
|
||||||
for ( nDir = 0; nDir < nDirs; nDir++ )
|
for ( nDir = 0; nDir < nDirs; nDir++ )
|
||||||
if (wxFileExists(icondirs[nDir] + strIcon))
|
{
|
||||||
|
wxFileName fname( icondirs[nDir], strIcon );
|
||||||
|
fname.SetExt( wxT("png") );
|
||||||
|
if (fname.FileExists())
|
||||||
{
|
{
|
||||||
strIcon.Prepend(icondirs[nDir]);
|
strIcon = fname.GetFullPath();
|
||||||
wxLogTrace(TRACE_MIME, wxT(" iconfile %s"), strIcon.c_str());
|
wxLogTrace(TRACE_MIME, wxT(" iconfile %s"), strIcon.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1119,13 +1159,55 @@ void wxMimeTypesManagerImpl::GetKDEMimeInfo(const wxString& sExtraDir)
|
|||||||
{
|
{
|
||||||
wxArrayString dirs;
|
wxArrayString dirs;
|
||||||
wxArrayString icondirs;
|
wxArrayString icondirs;
|
||||||
|
|
||||||
|
// the variable KDEDIR is set when KDE is running
|
||||||
|
const wxChar *kdedir = wxGetenv( wxT("KDEDIR") );
|
||||||
|
|
||||||
|
if (kdedir)
|
||||||
|
{
|
||||||
|
wxFileName configFile( kdedir, wxEmptyString );
|
||||||
|
configFile.AppendDir( wxT("share") );
|
||||||
|
#if 0
|
||||||
|
configFile.AppendDir( wxT("config") );
|
||||||
|
configFile.SetName( wxT("kdeglobals") );
|
||||||
|
|
||||||
|
wxFileConfig config( wxEmptyString, wxEmptyString, configFile.GetFullPath() );
|
||||||
|
wxString theme;
|
||||||
|
config.SetPath( wxT("Icons") );
|
||||||
|
config.Read( wxT("Theme"), theme );
|
||||||
|
|
||||||
|
configFile.RemoveDir( configFile.GetDirCount()-1 );
|
||||||
|
configFile.AppendDir( wxT("icons") );
|
||||||
|
configFile.AppendDir( theme );
|
||||||
|
#else
|
||||||
|
configFile.AppendDir( wxT("icons") );
|
||||||
|
configFile.AppendDir( wxT("crystalsvg") );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!wxDir::Exists(configFile.GetPath()))
|
||||||
|
{
|
||||||
|
configFile.RemoveDir( configFile.GetDirCount()-1 );
|
||||||
|
configFile.AppendDir( wxT("crystal") );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wxDir::Exists(configFile.GetPath()))
|
||||||
|
{
|
||||||
|
configFile.RemoveDir( configFile.GetDirCount()-1 );
|
||||||
|
configFile.AppendDir( wxT("default.kde") );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wxDir::Exists(configFile.GetPath()))
|
||||||
|
{
|
||||||
|
configFile.AppendDir( wxT("32x32") );
|
||||||
|
configFile.AppendDir( wxT("mimetypes") );
|
||||||
|
icondirs.Add( configFile.GetFullPath() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// settings in ~/.kde have maximal priority
|
// settings in ~/.kde have maximal priority
|
||||||
dirs.Add(wxGetHomeDir() + wxT("/.kde/share"));
|
dirs.Add(wxGetHomeDir() + wxT("/.kde/share"));
|
||||||
icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/"));
|
icondirs.Add(wxGetHomeDir() + wxT("/.kde/share/icons/"));
|
||||||
|
|
||||||
// the variable KDEDIR is set when KDE is running
|
|
||||||
const wxChar *kdedir = wxGetenv( wxT("KDEDIR") );
|
|
||||||
if ( kdedir )
|
if ( kdedir )
|
||||||
{
|
{
|
||||||
dirs.Add( wxString(kdedir) + wxT("/share") );
|
dirs.Add( wxString(kdedir) + wxT("/share") );
|
||||||
@@ -1341,6 +1423,26 @@ wxMimeTypesManagerImpl::wxMimeTypesManagerImpl()
|
|||||||
m_mailcapStylesInited = 0;
|
m_mailcapStylesInited = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxMimeTypesManagerImpl::InitIfNeeded()
|
||||||
|
{
|
||||||
|
if ( !m_initialized )
|
||||||
|
{
|
||||||
|
// set the flag first to prevent recursion
|
||||||
|
m_initialized = TRUE;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
wxString wm = wxGetenv( wxT("WINDOWMANAGER") );
|
||||||
|
|
||||||
|
if (wm.Find( wxT("kde") ) != wxNOT_FOUND)
|
||||||
|
Initialize( wxMAILCAP_KDE|wxMAILCAP_STANDARD );
|
||||||
|
else if (wm.Find( wxT("gnome") ) != wxNOT_FOUND)
|
||||||
|
Initialize( wxMAILCAP_GNOME|wxMAILCAP_STANDARD );
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// read system and user mailcaps and other files
|
// read system and user mailcaps and other files
|
||||||
void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
|
void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
|
||||||
const wxString& sExtraDir)
|
const wxString& sExtraDir)
|
||||||
@@ -1351,11 +1453,11 @@ void wxMimeTypesManagerImpl::Initialize(int mailcapStyles,
|
|||||||
GetMimeInfo(sExtraDir);
|
GetMimeInfo(sExtraDir);
|
||||||
|
|
||||||
// read GNOME tables
|
// read GNOME tables
|
||||||
if ( mailcapStyles & wxMAILCAP_GNOME)
|
if (mailcapStyles & wxMAILCAP_GNOME)
|
||||||
GetGnomeMimeInfo(sExtraDir);
|
GetGnomeMimeInfo(sExtraDir);
|
||||||
|
|
||||||
// read KDE tables
|
// read KDE tables
|
||||||
if ( mailcapStyles & wxMAILCAP_KDE)
|
if (mailcapStyles & wxMAILCAP_KDE)
|
||||||
GetKDEMimeInfo(sExtraDir);
|
GetKDEMimeInfo(sExtraDir);
|
||||||
|
|
||||||
m_mailcapStylesInited |= mailcapStyles;
|
m_mailcapStylesInited |= mailcapStyles;
|
||||||
|
Reference in New Issue
Block a user