-// ----------------------------------------------------------------------------
-// private classes - icons list management
-// ----------------------------------------------------------------------------
-
-class wxFileIconEntry : public wxObject
-{
-public:
- wxFileIconEntry(int i) { id = i; }
-
- int id;
-};
-
-
-class wxFileIconsTable
-{
-public:
- wxFileIconsTable();
-
- int GetIconID(const wxString& extension, const wxString& mime = wxEmptyString);
- wxImageList *GetImageList() { return &m_ImageList; }
-
-protected:
- wxImageList m_ImageList;
- wxHashTable m_HashTable;
-};
-
-static wxFileIconsTable *g_IconsTable = NULL;
-
-#define FI_FOLDER 0
-#define FI_UNKNOWN 1
-#define FI_EXECUTABLE 2
-
-wxFileIconsTable::wxFileIconsTable() :
- m_ImageList(16, 16),
- m_HashTable(wxKEY_STRING)
-{
- m_HashTable.DeleteContents(TRUE);
- // FI_FOLDER:
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG));
- // FI_UNKNOWN:
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, wxART_CMN_DIALOG));
- // FI_EXECUTABLE:
- if (GetIconID(wxEmptyString, _T("application/x-executable")) == FI_UNKNOWN)
- {
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG));
- m_HashTable.Delete(_T("exe"));
- m_HashTable.Put(_T("exe"), new wxFileIconEntry(FI_EXECUTABLE));
- }
- /* else put into list by GetIconID
- (KDE defines application/x-executable for *.exe and has nice icon)
- */
-}
-
-
-
-#if wxUSE_MIMETYPE
-// VS: we don't need this function w/o wxMimeTypesManager because we'll only have
-// one icon and we won't resize it
-
-static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
-{
- wxImage smallimg (16, 16);
- unsigned char *p1, *p2, *ps;
- unsigned char mr = img.GetMaskRed(),
- mg = img.GetMaskGreen(),
- mb = img.GetMaskBlue();
-
- unsigned x, y;
- unsigned sr, sg, sb, smask;
-
- p1 = img.GetData(), p2 = img.GetData() + 3 * 32, ps = smallimg.GetData();
- smallimg.SetMaskColour(mr, mr, mr);
-
- for (y = 0; y < 16; y++)
- {
- for (x = 0; x < 16; x++)
- {
- sr = sg = sb = smask = 0;
- if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
- sr += p1[0], sg += p1[1], sb += p1[2];
- else smask++;
- p1 += 3;
- if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
- sr += p1[0], sg += p1[1], sb += p1[2];
- else smask++;
- p1 += 3;
- if (p2[0] != mr || p2[1] != mg || p2[2] != mb)
- sr += p2[0], sg += p2[1], sb += p2[2];
- else smask++;
- p2 += 3;
- if (p2[0] != mr || p2[1] != mg || p2[2] != mb)
- sr += p2[0], sg += p2[1], sb += p2[2];
- else smask++;
- p2 += 3;
-
- if (smask > 2)
- ps[0] = ps[1] = ps[2] = mr;
- else
- ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
- ps += 3;
- }
- p1 += 32 * 3, p2 += 32 * 3;
- }
-
- return wxBitmap(smallimg);
-}
-
-// finds empty borders and return non-empty area of image:
-static wxImage CutEmptyBorders(const wxImage& img)
-{
- unsigned char mr = img.GetMaskRed(),
- mg = img.GetMaskGreen(),
- mb = img.GetMaskBlue();
- unsigned char *dt = img.GetData(), *dttmp;
- unsigned w = img.GetWidth(), h = img.GetHeight();
-
- unsigned top, bottom, left, right, i;
- bool empt;
-
-#define MK_DTTMP(x,y) dttmp = dt + ((x + y * w) * 3)
-#define NOEMPTY_PIX(empt) if (dttmp[0] != mr || dttmp[1] != mg || dttmp[2] != mb) {empt = FALSE; break;}
-
- for (empt = TRUE, top = 0; empt && top < h; top++)
- {
- MK_DTTMP(0, top);
- for (i = 0; i < w; i++, dttmp+=3)
- NOEMPTY_PIX(empt)
- }
- for (empt = TRUE, bottom = h-1; empt && bottom > top; bottom--)
- {
- MK_DTTMP(0, bottom);
- for (i = 0; i < w; i++, dttmp+=3)
- NOEMPTY_PIX(empt)
- }
- for (empt = TRUE, left = 0; empt && left < w; left++)
- {
- MK_DTTMP(left, 0);
- for (i = 0; i < h; i++, dttmp+=3*w)
- NOEMPTY_PIX(empt)
- }
- for (empt = TRUE, right = w-1; empt && right > left; right--)
- {
- MK_DTTMP(right, 0);
- for (i = 0; i < h; i++, dttmp+=3*w)
- NOEMPTY_PIX(empt)
- }
- top--, left--, bottom++, right++;
-
- return img.GetSubImage(wxRect(left, top, right - left + 1, bottom - top + 1));
-}
-#endif // wxUSE_MIMETYPE
-
-
-
-int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
-{
-#if wxUSE_MIMETYPE
- if (!extension.IsEmpty())
- {
- wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable.Get(extension);
- if (entry) return (entry -> id);
- }
-
- wxFileType *ft = (mime.IsEmpty()) ?
- wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) :
- wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime);
- wxIcon ic;
- if (ft == NULL || (!ft -> GetIcon(&ic)) || (!ic.Ok()))
- {
- int newid = FI_UNKNOWN;
- m_HashTable.Put(extension, new wxFileIconEntry(newid));
- return newid;
- }
-
- wxBitmap tmpBmp;
- tmpBmp.CopyFromIcon(ic);
- wxImage img = tmpBmp.ConvertToImage();
-
- delete ft;
-
- int id = m_ImageList.GetImageCount();
- if (img.GetWidth() == 16 && img.GetHeight() == 16)
- m_ImageList.Add(wxBitmap(img));
- else
- {
- if (img.GetWidth() != 32 || img.GetHeight() != 32)
- m_ImageList.Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32)));
- else
- m_ImageList.Add(CreateAntialiasedBitmap(img));
- }
- m_HashTable.Put(extension, new wxFileIconEntry(id));
- return id;
-
-#else // !wxUSE_MIMETYPE
-
- if (extension == wxT("exe"))
- return FI_EXECUTABLE;
- else
- return FI_UNKNOWN;
-#endif // wxUSE_MIMETYPE/!wxUSE_MIMETYPE
-}
-
-
-
-// ----------------------------------------------------------------------------
-// private functions
-// ----------------------------------------------------------------------------
-
-static
-int wxFileDataNameCompare( long data1, long data2, long data)
-{
- wxFileData *fd1 = (wxFileData*)data1;
- wxFileData *fd2 = (wxFileData*)data2;
- if (fd1->GetName() == wxT("..")) return -data;
- if (fd2->GetName() == wxT("..")) return data;
- if (fd1->IsDir() && !fd2->IsDir()) return -data;
- if (fd2->IsDir() && !fd1->IsDir()) return data;
- return data*wxStrcmp( fd1->GetName(), fd2->GetName() );
-}
-
-static
-int wxFileDataTypeCompare( long data1, long data2, long data)
-{
- wxFileData *fd1 = (wxFileData*)data1;
- wxFileData *fd2 = (wxFileData*)data2;
- if (fd1->GetName() == wxT("..")) return -data;
- if (fd2->GetName() == wxT("..")) return data;
- if (fd1->IsDir() && !fd2->IsDir()) return -data;
- if (fd2->IsDir() && !fd1->IsDir()) return data;
- if (fd1->IsLink() && !fd2->IsLink()) return -data;
- if (fd2->IsLink() && !fd1->IsLink()) return data;
- return data*(fd1->GetSize() - fd2->GetSize());
-}
-
-static
-int wxFileDataTimeCompare( long data1, long data2, long data)
-{
- wxFileData *fd1 = (wxFileData*)data1;
- wxFileData *fd2 = (wxFileData*)data2;
- if (fd1->GetName() == wxT("..")) return -data;
- if (fd2->GetName() == wxT("..")) return data;
- if (fd1->IsDir() && !fd2->IsDir()) return -data;
- if (fd2->IsDir() && !fd1->IsDir()) return data;
-
- int val = fd1->GetYear() - fd2->GetYear();
- if (val) return data*val;
- val = fd1->GetMonth() - fd2->GetMonth();
- if (val) return data*val;
- val = fd1->GetDay() - fd2->GetDay();
- if (val) return data*val;
- val = fd1->GetHour() - fd2->GetHour();
- if (val) return data*val;
- val = fd1->GetMinute() - fd2->GetMinute();
- return data*val;
-}
-
-#ifdef __UNIX__