X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/223d09f6b523aac674ef9b72a883dfa8d37c5d4e..8c23ed4e210434ceea7edaa45382fd749a0256db:/src/generic/dirdlgg.cpp diff --git a/src/generic/dirdlgg.cpp b/src/generic/dirdlgg.cpp index 706a6320c9..454b60cc05 100644 --- a/src/generic/dirdlgg.cpp +++ b/src/generic/dirdlgg.cpp @@ -29,6 +29,7 @@ #include "wx/button.h" #include "wx/layout.h" #include "wx/msgdlg.h" +#include "wx/textctrl.h" #include "wx/textdlg.h" #include "wx/filefn.h" #include "wx/cmndata.h" @@ -38,6 +39,8 @@ #include "wx/icon.h" #include "wx/log.h" #include "wx/sizer.h" +#include "wx/tokenzr.h" +#include "wx/dir.h" #if wxUSE_STATLINE #include "wx/statline.h" @@ -50,6 +53,7 @@ #undef GetFirstChild #endif +#ifndef __WXMSW__ /* XPM */ static char * icon1_xpm[] = { /* width height ncolors chars_per_pixel */ @@ -108,6 +112,8 @@ static char * icon2_xpm[] = { " ", " "}; +#endif // !wxMSW + static const int ID_DIRCTRL = 1000; static const int ID_TEXTCTRL = 1001; static const int ID_OK = 1002; @@ -143,10 +149,7 @@ void wxDirItemData::SetNewDirName( wxString path ) bool wxDirItemData::HasSubDirs() { - wxString search = m_path + "/*"; - wxLogNull log; - wxString path = wxFindFirstFile( search, wxDIR ); - return (bool)(!path.IsNull()); + return wxDir(m_path).HasSubDirs(); } //----------------------------------------------------------------------------- @@ -167,18 +170,21 @@ wxDirCtrl::wxDirCtrl(void) m_showHidden = FALSE; } -wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUNUSED(dir), - const wxPoint& pos, const wxSize& size, - const long style, const wxString& name ) - : - wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name ) +wxDirCtrl::wxDirCtrl(wxWindow *parent, + const wxWindowID id, + const wxString &WXUNUSED(dir), + const wxPoint& pos, + const wxSize& size, + const long style, + const wxString& name ) + : wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name ) { - #ifndef __WXMSW__ +#ifndef __WXMSW__ m_imageListNormal = new wxImageList(16, 16, TRUE); m_imageListNormal->Add(wxICON(icon1)); m_imageListNormal->Add(wxICON(icon2)); SetImageList(m_imageListNormal); - #endif +#endif // !MSW m_showHidden = FALSE; m_rootId = AddRoot( _("Sections") ); @@ -204,8 +210,8 @@ void wxDirCtrl::SetupSections() wxGetHomeDir(&home); ADD_SECTION(home, _("My Home") ) ADD_SECTION(wxT("/mnt"), _("Mounted Devices") ) - ADD_SECTION(wxT("/usr"), _("User") ) ADD_SECTION(wxT("/usr/local"), _("User Local") ) + ADD_SECTION(wxT("/usr"), _("User") ) ADD_SECTION(wxT("/var"), _("Variables") ) ADD_SECTION(wxT("/etc"), _("Etcetera") ) ADD_SECTION(wxT("/tmp"), _("Temporary") ) @@ -220,13 +226,15 @@ void wxDirCtrl::CreateItems(const wxTreeItemId &parent) // wxASSERT(m_paths.Count() == m_names.Count()); ? - for (unsigned int i=0; im_hasSubDirs) SetItemHasChildren(id); } @@ -254,12 +262,12 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event) if ((event.GetLabel().IsEmpty()) || (event.GetLabel() == _(".")) || (event.GetLabel() == _("..")) || - (event.GetLabel().First( wxT("/") ) != wxNOT_FOUND)) + (event.GetLabel().First( wxT("/") ) != wxNOT_FOUND)) { wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR ); - dialog.ShowModal(); + dialog.ShowModal(); event.Veto(); - return; + return; } wxTreeItemId id = event.GetItem(); @@ -275,7 +283,7 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event) if (wxFileExists(new_name)) { wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR ); - dialog.ShowModal(); + dialog.ShowModal(); event.Veto(); } @@ -286,7 +294,7 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event) else { wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); - dialog.ShowModal(); + dialog.ShowModal(); event.Veto(); } } @@ -304,25 +312,24 @@ void wxDirCtrl::OnExpandItem(wxTreeEvent &event) wxBeginBusyCursor(); wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem()); - wxASSERT(data); - - wxString search,path,filename; m_paths.Clear(); m_names.Clear(); - search = data->m_path + "/*"; - for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull(); - path=wxFindNextFile() ) + + wxString path = data->m_path; + + wxDir dir(path); + + path += _T('/'); + + wxString filename; + bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN); + while ( cont ) { - filename = wxFileNameFromPath( path ); - /* Don't add "." and ".." to the tree. I think wxFindNextFile - * also checks this, but I don't quite understand what happens - * there. Also wxFindNextFile seems to swallow hidden dirs */ - if ((filename != ".") && (filename != "..")) - { - m_paths.Add(path); - m_names.Add(filename); - } + m_paths.Add(path + filename); + m_names.Add(filename); + + cont = dir.GetNext(&filename); } CreateItems( event.GetItem() ); @@ -352,11 +359,7 @@ void wxDirCtrl::OnCollapseItem(wxTreeEvent &event ) //----------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY -IMPLEMENT_CLASS(wxDirDialog, wxDialog) -#else IMPLEMENT_DYNAMIC_CLASS( wxDirDialog, wxDialog ) -#endif BEGIN_EVENT_TABLE( wxDirDialog, wxDialog ) EVT_TREE_KEY_DOWN (ID_DIRCTRL, wxDirDialog::OnTreeKeyDown) @@ -369,11 +372,13 @@ BEGIN_EVENT_TABLE( wxDirDialog, wxDialog ) // EVT_CHECKBOX (ID_CHECK, wxDirDialog::OnCheck) END_EVENT_TABLE() -wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, - const wxString& defaultPath, long style, - const wxPoint& pos) : - wxDialog(parent, -1, message, pos, wxSize(300,300), - wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +wxDirDialog::wxDirDialog(wxWindow *parent, + const wxString& message, + const wxString& defaultPath, + long style, + const wxPoint& pos) + : wxDialog(parent, -1, message, pos, wxSize(300,300), + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { m_message = message; m_dialogStyle = style; @@ -386,8 +391,12 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); // 1) dir ctrl - m_dir = new wxDirCtrl( this, ID_DIRCTRL, "/", wxDefaultPosition, wxSize(200,200), - wxTR_HAS_BUTTONS | wxSUNKEN_BORDER | wxTR_EDIT_LABELS); + m_dir = new wxDirCtrl( this, ID_DIRCTRL, _T("/"), + wxDefaultPosition, + wxSize(200,200), + wxTR_HAS_BUTTONS | + wxSUNKEN_BORDER | + wxTR_EDIT_LABELS ); topsizer->Add( m_dir, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 ); // 2) text ctrl @@ -424,6 +433,66 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, Centre( wxBOTH ); + if (m_path == wxT("~")) + wxGetHomeDir( &m_path ); + + // choose the directory corresponding to defaultPath in the tree + // VZ: using wxStringTokenizer is probably unsafe here (escaped slashes + // will not be processed correctly...) + wxStringTokenizer tk(m_path, wxFILE_SEP_PATH, wxTOKEN_STRTOK); + + wxString path; + + long cookie = 0; + // default to root dir + wxTreeItemId item = m_dir->GetFirstChild(m_dir->GetRootItem(), cookie); + + if (!m_path.IsEmpty() && (m_path != wxT("/")) && (m_dir->m_paths.Count() > 1)) + { + size_t count = m_dir->m_paths.GetCount(); + for ( size_t i=1; im_paths[i] ) == 0) + { + path = m_dir->m_paths[i]; + + for (size_t j = 0; j < i; j++) + item = m_dir->GetNextChild(m_dir->GetRootItem(), cookie); + + wxStringTokenizer tk2(path, wxFILE_SEP_PATH, wxTOKEN_STRTOK); + for (size_t h = 0; h < tk2.CountTokens(); h++) + tk.GetNextToken(); + + break; + } + } + } + while ( tk.HasMoreTokens() && item.IsOk() ) + { + path << wxFILE_SEP_PATH << tk.GetNextToken(); + + m_dir->Expand(item); + + wxTreeItemId child = m_dir->GetFirstChild(item, cookie); + while ( child.IsOk() ) + { + wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(child); + if ( data->m_path == path ) + break; + + child = m_dir->GetNextChild(item, cookie); + } + + item = child; + } + + if ( item.IsOk() ) + { + m_dir->Expand(item); + m_dir->SelectItem(item); + m_dir->EnsureVisible(item); + } + wxEndBusyCursor(); } @@ -510,24 +579,24 @@ void wxDirDialog::OnNew( wxCommandEvent& WXUNUSED(event) ) { // try NewName0, NewName1 etc. int i = 0; - do { + do { new_name = wxT("NewName"); - wxString num; - num.Printf( "%d", i ); - new_name += num; + wxString num; + num.Printf( wxT("%d"), i ); + new_name += num; path = data->m_path; path += wxT("/"); path += new_name; - i++; - } while (wxFileExists(path)); + i++; + } while (wxFileExists(path)); } wxLogNull log; if (!wxMkdir(path)) { wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); - dialog.ShowModal(); + dialog.ShowModal(); return; } @@ -544,4 +613,4 @@ void wxDirDialog::OnCheck( wxCommandEvent& WXUNUSED(event) ) } */ -#endif +#endif // wxUSE_DIRDLG