X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b0c5c42156cf21742a0d8de649bd5bd47bed9b8e..5333ab8e8ef81e3ae71fef22b42542c51b122258:/src/generic/filedlgg.cpp diff --git a/src/generic/filedlgg.cpp b/src/generic/filedlgg.cpp index 3ff7328060..c3b2280e4c 100644 --- a/src/generic/filedlgg.cpp +++ b/src/generic/filedlgg.cpp @@ -35,6 +35,7 @@ #include "wx/mimetype.h" #include "wx/image.h" #include "wx/module.h" +#include "wx/config.h" #if wxUSE_TOOLTIPS @@ -83,7 +84,6 @@ class wxFileIconsTable protected: wxImageList m_ImageList; wxHashTable m_HashTable; - wxMimeTypesManager m_Mime; }; static wxFileIconsTable *g_IconsTable = NULL; @@ -94,8 +94,7 @@ static wxFileIconsTable *g_IconsTable = NULL; wxFileIconsTable::wxFileIconsTable() : m_ImageList(16, 16), - m_HashTable(wxKEY_STRING), - m_Mime() + m_HashTable(wxKEY_STRING) { m_HashTable.DeleteContents(TRUE); m_ImageList.Add(wxBitmap(folder_xpm)); // FI_FOLDER @@ -157,11 +156,57 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img) } p1 += 32 * 3, p2 += 32 * 3; } - + return small.ConvertToBitmap(); } +// 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)); +} + + + int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) { if (!extension.IsEmpty()) @@ -171,10 +216,10 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) } wxFileType *ft = (mime.IsEmpty()) ? - m_Mime.GetFileTypeFromExtension(extension) : - m_Mime.GetFileTypeFromMimeType(mime); + wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) : + wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime); wxIcon ic; - if (ft == NULL || (!ft -> GetIcon(&ic))) + if (ft == NULL || (!ft -> GetIcon(&ic)) || (!ic.Ok())) { int newid = FI_UNKNOWN; m_HashTable.Put(extension, new wxFileIconEntry(newid)); @@ -189,8 +234,9 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) else { if (img.GetWidth() != 32 || img.GetHeight() != 32) - img.Rescale(32, 32); - m_ImageList.Add(CreateAntialiasedBitmap(img)); + m_ImageList.Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32))); + else + m_ImageList.Add(CreateAntialiasedBitmap(img)); } m_HashTable.Put(extension, new wxFileIconEntry(id)); return id; @@ -711,8 +757,8 @@ BEGIN_EVENT_TABLE(wxFileDialog,wxDialog) EVT_CHECKBOX(ID_CHECK,wxFileDialog::OnCheck) END_EVENT_TABLE() -long wxFileDialog::m_lastViewStyle = wxLC_LIST; -bool wxFileDialog::m_lastShowHidden = FALSE; +long wxFileDialog::s_lastViewStyle = wxLC_LIST; +bool wxFileDialog::s_lastShowHidden = FALSE; wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, @@ -725,6 +771,12 @@ wxFileDialog::wxFileDialog(wxWindow *parent, { wxBeginBusyCursor(); + if (wxConfig::Get(FALSE)) + { + wxConfig::Get() -> Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), &s_lastViewStyle); + wxConfig::Get() -> Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), &s_lastShowHidden); + } + m_message = message; m_dialogStyle = style; @@ -821,11 +873,11 @@ wxFileDialog::wxFileDialog(wxWindow *parent, if (m_dialogStyle & wxMULTIPLE) m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition, - wxSize(440,180), m_lastViewStyle | wxSUNKEN_BORDER ); + wxSize(440,180), s_lastViewStyle | wxSUNKEN_BORDER ); else m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition, - wxSize(440,180), m_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL ); - m_list -> ShowHidden(m_lastShowHidden); + wxSize(440,180), s_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL ); + m_list -> ShowHidden(s_lastShowHidden); mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 ); wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL ); @@ -838,7 +890,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, m_choice = new wxChoice( this, ID_CHOICE ); choicesizer->Add( m_choice, 1, wxCENTER|wxALL, 10 ); m_check = new wxCheckBox( this, ID_CHECK, _("Show hidden files") ); - m_check->SetValue( m_lastShowHidden ); + m_check->SetValue( s_lastShowHidden ); choicesizer->Add( m_check, 0, wxCENTER|wxALL, 10 ); choicesizer->Add( new wxButton( this, wxID_CANCEL, _("Cancel") ), 0, wxCENTER | wxALL, 10 ); mainsizer->Add( choicesizer, 0, wxEXPAND ); @@ -857,7 +909,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, mainsizer->Fit( this ); mainsizer->SetSizeHints( this ); - + Centre( wxBOTH ); if (m_fileName.IsEmpty()) @@ -870,6 +922,11 @@ wxFileDialog::wxFileDialog(wxWindow *parent, wxFileDialog::~wxFileDialog() { + if (wxConfig::Get(FALSE)) + { + wxConfig::Get() -> Write(wxT("/wxWindows/wxFileDialog/ViewStyle"), s_lastViewStyle); + wxConfig::Get() -> Write(wxT("/wxWindows/wxFileDialog/ShowHidden"), s_lastShowHidden); + } } void wxFileDialog::OnChoice( wxCommandEvent &event ) @@ -889,7 +946,7 @@ void wxFileDialog::OnChoice( wxCommandEvent &event ) void wxFileDialog::OnCheck( wxCommandEvent &event ) { - m_list->ShowHidden( (m_lastShowHidden = event.GetInt() != 0) ); + m_list->ShowHidden( (s_lastShowHidden = event.GetInt() != 0) ); } void wxFileDialog::OnActivated( wxListEvent &event ) @@ -1029,14 +1086,14 @@ void wxFileDialog::OnListOk( wxCommandEvent &WXUNUSED(event) ) void wxFileDialog::OnList( wxCommandEvent &WXUNUSED(event) ) { m_list->ChangeToListMode(); - m_lastViewStyle = wxLC_LIST; + s_lastViewStyle = wxLC_LIST; m_list->SetFocus(); } void wxFileDialog::OnReport( wxCommandEvent &WXUNUSED(event) ) { m_list->ChangeToReportMode(); - m_lastViewStyle = wxLC_REPORT; + s_lastViewStyle = wxLC_REPORT; m_list->SetFocus(); }