-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-// the list ctrl fields in report view
-enum FileListField
-{
- FileList_Name,
- FileList_Type,
- FileList_Date,
- FileList_Time,
-#ifdef __UNIX__
- FileList_Perm,
-#endif // __UNIX__
- FileList_Max
-};
-
-//-----------------------------------------------------------------------------
-// wxFileData
-//-----------------------------------------------------------------------------
-
-class wxFileData
-{
-public:
- wxFileData( const wxString &name, const wxString &fname );
- wxString GetName() const;
- wxString GetFullName() const;
- wxString GetHint() const;
- wxString GetEntry( FileListField num ) const;
-
- bool IsDir() const { return m_isDir; }
- bool IsLink() const { return m_isLink; }
- bool IsExe() const { return m_isExe; }
- long GetSize() const { return m_size; }
-
- void MakeItem( wxListItem &item );
- void SetNewName( const wxString &name, const wxString &fname );
-
-private:
- wxString m_name;
- wxString m_fileName;
- long m_size;
- int m_hour;
- int m_minute;
- int m_year;
- int m_month;
- int m_day;
- wxString m_permissions;
- bool m_isDir;
- bool m_isLink;
- bool m_isExe;
-};
-
-//-----------------------------------------------------------------------------
-// wxFileCtrl
-//-----------------------------------------------------------------------------
-
-class wxFileCtrl : public wxListCtrl
-{
-public:
- wxFileCtrl();
- wxFileCtrl( wxWindow *win,
- wxStaticText *labelDir,
- wxWindowID id,
- const wxString &wild,
- bool showHidden,
- const wxPoint &pos = wxDefaultPosition,
- const wxSize &size = wxDefaultSize,
- long style = wxLC_LIST,
- const wxValidator &validator = wxDefaultValidator,
- const wxString &name = wxT("filelist") );
- virtual ~wxFileCtrl();
-
- void ChangeToListMode();
- void ChangeToReportMode();
- void ChangeToIconMode();
- void ShowHidden( bool show = TRUE );
- long Add( wxFileData *fd, wxListItem &item );
- void UpdateFiles();
- virtual void StatusbarText( wxChar *WXUNUSED(text) ) {};
- void MakeDir();
- void GoToParentDir();
- void GoToHomeDir();
- void GoToDir( const wxString &dir );
- void SetWild( const wxString &wild );
- void GetDir( wxString &dir );
- void OnListDeleteItem( wxListEvent &event );
- void OnListEndLabelEdit( wxListEvent &event );
-
- // Associate commonly used UI controls with wxFileCtrl so that they can be
- // disabled when they cannot be used (e.g. can't go to parent directory
- // if wxFileCtrl already is in the root dir):
- void SetGoToParentControl(wxWindow *ctrl) { m_goToParentControl = ctrl; }
- void SetNewDirControl(wxWindow *ctrl) { m_newDirControl = ctrl; }
-
-private:
- void FreeItemData(const wxListItem& item);
- void FreeAllItemsData();
-
- wxString m_dirName;
- bool m_showHidden;
- wxString m_wild;
-
- wxWindow *m_goToParentControl;
- wxWindow *m_newDirControl;
-
- // the label showing the current directory
- wxStaticText *m_labelDir;
-
- DECLARE_DYNAMIC_CLASS(wxFileCtrl);
- DECLARE_EVENT_TABLE()
-};
-
-// ----------------------------------------------------------------------------
-// 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;
- }
-#ifdef __WIN32__
- wxBitmap myBitmap (ic.GetWidth(), ic.GetHeight() ) ;
- wxMemoryDC memDC;
- memDC.SelectObject( myBitmap );
- memDC.DrawIcon(ic,0,0);
- memDC.SelectObject( wxNullBitmap );
- wxImage img = myBitmap.ConvertToImage();