void wxFileCtrl::GoToParentDir() { if (!IsTopMostDir(m_dirName)) { size_t len = m_dirName.Len(); if (wxEndsWithPathSeparator(m_dirName)) m_dirName.Remove( len-1, 1 ); wxString fname( wxFileNameFromPath(m_dirName) ); m_dirName = wxPathOnly( m_dirName ); #if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) if (!m_dirName.empty()) { if (m_dirName.Last() == wxT('.')) m_dirName = wxEmptyString; } #elif defined(__UNIX__) if (m_dirName.empty()) m_dirName = wxT("/"); #endif UpdateFiles(); long id = FindItem( 0, fname ); if (id != wxNOT_FOUND) { ignoreChanges = true; SetItemState( id, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); EnsureVisible( id ); ignoreChanges = false; } } }
void wxGenericFileDialog::OnSelected( wxListEvent &event ) { static bool inSelected = false; if (inSelected) return; inSelected = true; wxString filename( event.m_item.m_text ); #ifdef __WXWINCE__ // No double-click on most WinCE devices, so do action immediately. HandleAction( filename ); #else if (filename == wxT("..")) return; wxString dir = m_list->GetDir(); if (!IsTopMostDir(dir)) dir += wxFILE_SEP_PATH; dir += filename; if (wxDirExists(dir)) return; ignoreChanges = true; m_text->SetValue( filename ); ignoreChanges = false; #endif inSelected = false; }
void wxGenericFileDialog::OnUpdateButtonsUI(wxUpdateUIEvent& event) { // surprisingly, we can be called before m_filectrl is set in Create() as // wxFileCtrl ctor itself can generate idle events, so we need this test if ( m_filectrl ) event.Enable( !IsTopMostDir(m_filectrl->GetShownDirectory()) ); }
void wxGenericFileDialog::UpdateControls() { wxString dir = m_list->GetDir(); m_static->SetLabel(dir); bool enable = !IsTopMostDir(dir); m_upDirButton->Enable(enable); #if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) m_newDirButton->Enable(enable); #endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) }
void wxGenericFileCtrl::OnSelected( wxListEvent &event ) { if ( m_ignoreChanges ) return; if ( m_inSelected ) return; m_inSelected = true; const wxString filename( event.m_item.m_text ); #ifdef __WXWINCE__ // No double-click on most WinCE devices, so do action immediately. HandleAction( filename ); #else if ( filename == wxT( ".." ) ) { m_inSelected = false; return; } wxString dir = m_list->GetDir(); if ( !IsTopMostDir( dir ) ) dir += wxFILE_SEP_PATH; dir += filename; if ( wxDirExists( dir ) ) { m_inSelected = false; return; } m_ignoreChanges = true; m_text->SetValue( filename ); if ( m_list->GetSelectedItemCount() > 1 ) { m_text->Clear(); } if ( !m_noSelChgEvent ) GenerateSelectionChangedEvent( this, this ); m_ignoreChanges = false; #endif m_inSelected = false; }
void wxGenericFileCtrl::OnSelected( wxListEvent &event ) { if ( m_ignoreChanges ) return; if ( m_inSelected ) return; m_inSelected = true; const wxString filename( event.m_item.m_text ); if ( filename == wxT( ".." ) ) { m_inSelected = false; return; } wxString dir = m_list->GetDir(); if ( !IsTopMostDir( dir ) ) dir += wxFILE_SEP_PATH; dir += filename; if ( wxDirExists( dir ) ) { m_inSelected = false; return; } m_ignoreChanges = true; m_text->SetValue( filename ); if ( m_list->GetSelectedItemCount() > 1 ) { m_text->Clear(); } if ( !m_noSelChgEvent ) GenerateSelectionChangedEvent( this, this ); m_ignoreChanges = false; m_inSelected = false; }
void wxFileCtrl::UpdateFiles() { // don't do anything before ShowModal() call which sets m_dirName if ( m_dirName == wxT("*") ) return; wxBusyCursor bcur; // this may take a while... DeleteAllItems(); wxListItem item; item.m_itemId = 0; item.m_col = 0; #if (defined(__WINDOWS__) || defined(__DOS__) || defined(__WXMAC__) || defined(__OS2__)) && !defined(__WXWINCE__) if ( IsTopMostDir(m_dirName) ) { wxArrayString names, paths; wxArrayInt icons; size_t n, count = wxGetAvailableDrives(paths, names, icons); for (n=0; n<count; n++) { wxFileData *fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; } } else #endif // defined(__DOS__) || defined(__WINDOWS__) { // Real directory... if ( !IsTopMostDir(m_dirName) && !m_dirName.empty() ) { wxString p(wxPathOnly(m_dirName)); #if (defined(__UNIX__) || defined(__WXWINCE__)) && !defined(__OS2__) if (p.empty()) p = wxT("/"); #endif // __UNIX__ wxFileData *fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; } wxString dirname(m_dirName); #if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) if (dirname.length() == 2 && dirname[1u] == wxT(':')) dirname << wxT('\\'); #endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) if (dirname.empty()) dirname = wxFILE_SEP_PATH; wxLogNull logNull; wxDir dir(dirname); if ( dir.IsOpened() ) { wxString dirPrefix(dirname); if (dirPrefix.Last() != wxFILE_SEP_PATH) dirPrefix += wxFILE_SEP_PATH; int hiddenFlag = m_showHidden ? wxDIR_HIDDEN : 0; bool cont; wxString f; // Get the directories first (not matched against wildcards): cont = dir.GetFirst(&f, wxEmptyString, wxDIR_DIRS | hiddenFlag); while (cont) { wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; cont = dir.GetNext(&f); } // Tokenize the wildcard string, so we can handle more than 1 // search pattern in a wildcard. wxStringTokenizer tokenWild(m_wild, wxT(";")); while ( tokenWild.HasMoreTokens() ) { cont = dir.GetFirst(&f, tokenWild.GetNextToken(), wxDIR_FILES | hiddenFlag); while (cont) { wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; cont = dir.GetNext(&f); } } } } SortItems(m_sort_field, m_sort_foward); }
void wxGenericFileDialog::HandleAction( const wxString &fn ) { if (ignoreChanges) return; wxString filename( fn ); wxString dir = m_list->GetDir(); if (filename.empty()) return; if (filename == wxT(".")) return; // "some/place/" means they want to chdir not try to load "place" bool want_dir = filename.Last() == wxFILE_SEP_PATH; if (want_dir) filename = filename.RemoveLast(); if (filename == wxT("..")) { ignoreChanges = true; m_list->GoToParentDir(); m_list->SetFocus(); UpdateControls(); ignoreChanges = false; return; } #ifdef __UNIX__ if (filename == wxT("~")) { ignoreChanges = true; m_list->GoToHomeDir(); m_list->SetFocus(); UpdateControls(); ignoreChanges = false; return; } if (filename.BeforeFirst(wxT('/')) == wxT("~")) { filename = wxString(wxGetUserHome()) + filename.Remove(0, 1); } #endif // __UNIX__ if (!(m_dialogStyle & wxSAVE)) { if ((filename.Find(wxT('*')) != wxNOT_FOUND) || (filename.Find(wxT('?')) != wxNOT_FOUND)) { if (filename.Find(wxFILE_SEP_PATH) != wxNOT_FOUND) { wxMessageBox(_("Illegal file specification."), _("Error"), wxOK | wxICON_ERROR ); return; } m_list->SetWild( filename ); return; } } if (!IsTopMostDir(dir)) dir += wxFILE_SEP_PATH; if (!wxIsAbsolutePath(filename)) { dir += filename; filename = dir; } if (wxDirExists(filename)) { ignoreChanges = true; m_list->GoToDir( filename ); UpdateControls(); ignoreChanges = false; return; } // they really wanted a dir, but it doesn't exist if (want_dir) { wxMessageBox(_("Directory doesn't exist."), _("Error"), wxOK | wxICON_ERROR ); return; } // append the default extension to the filename if it doesn't have any // // VZ: the logic of testing for !wxFileExists() only for the open file // dialog is not entirely clear to me, why don't we allow saving to a // file without extension as well? if ( !(m_dialogStyle & wxOPEN) || !wxFileExists(filename) ) { filename = AppendExtension(filename, m_filterExtension); } // check that the file [doesn't] exist if necessary if ( (m_dialogStyle & wxSAVE) && (m_dialogStyle & wxOVERWRITE_PROMPT) && wxFileExists( filename ) ) { wxString msg; msg.Printf( _("File '%s' already exists, do you really want to overwrite it?"), filename.c_str() ); if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES) return; } else if ( (m_dialogStyle & wxOPEN) && (m_dialogStyle & wxFILE_MUST_EXIST) && !wxFileExists(filename) ) { wxMessageBox(_("Please choose an existing file."), _("Error"), wxOK | wxICON_ERROR ); } SetPath( filename ); // change to the directory where the user went if asked if ( m_dialogStyle & wxCHANGE_DIR ) { wxString cwd; wxSplitPath(filename, &cwd, NULL, NULL); if ( cwd != wxGetCwd() ) { wxSetWorkingDirectory(cwd); } } wxCommandEvent event; wxDialog::OnOK(event); }
void wxFileListCtrl::UpdateFiles() { // don't do anything before ShowModal() call which sets m_dirName if ( m_dirName == wxT("*") ) return; wxBusyCursor bcur; // this may take a while... DeleteAllItems(); wxListItem item; item.m_itemId = 0; item.m_col = 0; #if (defined(__WINDOWS__) || defined(__DOS__) || defined(__WXMAC__) || defined(__OS2__)) && !defined(__WXWINCE__) if ( IsTopMostDir(m_dirName) ) { wxArrayString names, paths; wxArrayInt icons; const size_t count = wxGetAvailableDrives(paths, names, icons); for ( size_t n = 0; n < count; n++ ) { // use paths[n] as the drive name too as our HandleAction() can't // deal with the drive names (of the form "System (C:)") currently // as it mistakenly treats them as file names // // it would be preferable to show names, and not paths, in the // dialog just as the native dialog does but for this we must: // a) store the item type as item data and modify HandleAction() // to use it instead of wxDirExists() to check whether the item // is a directory // b) store the drives by their drive letters and not their // descriptions as otherwise it's pretty confusing to the user wxFileData *fd = new wxFileData(paths[n], paths[n], wxFileData::is_drive, icons[n]); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; } } else #endif // defined(__DOS__) || defined(__WINDOWS__) { // Real directory... if ( !IsTopMostDir(m_dirName) && !m_dirName.empty() ) { wxString p(wxPathOnly(m_dirName)); #if (defined(__UNIX__) || defined(__WXWINCE__)) && !defined(__OS2__) if (p.empty()) p = wxT("/"); #endif // __UNIX__ wxFileData *fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; } wxString dirname(m_dirName); #if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) if (dirname.length() == 2 && dirname[1u] == wxT(':')) dirname << wxT('\\'); #endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) if (dirname.empty()) dirname = wxFILE_SEP_PATH; wxLogNull logNull; wxDir dir(dirname); if ( dir.IsOpened() ) { wxString dirPrefix(dirname); if (dirPrefix.Last() != wxFILE_SEP_PATH) dirPrefix += wxFILE_SEP_PATH; int hiddenFlag = m_showHidden ? wxDIR_HIDDEN : 0; bool cont; wxString f; // Get the directories first (not matched against wildcards): cont = dir.GetFirst(&f, wxEmptyString, wxDIR_DIRS | hiddenFlag); while (cont) { wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; cont = dir.GetNext(&f); } // Tokenize the wildcard string, so we can handle more than 1 // search pattern in a wildcard. wxStringTokenizer tokenWild(m_wild, wxT(";")); while ( tokenWild.HasMoreTokens() ) { cont = dir.GetFirst(&f, tokenWild.GetNextToken(), wxDIR_FILES | hiddenFlag); while (cont) { wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file); if (Add(fd, item) != -1) item.m_itemId++; else delete fd; cont = dir.GetNext(&f); } } } } SortItems(m_sort_field, m_sort_forward); }
void wxGenericFileCtrl::HandleAction( const wxString &fn ) { if ( m_ignoreChanges ) return; wxString filename( fn ); if ( filename.empty() ) { return; } if ( filename == wxT( "." ) ) return; wxString dir = m_list->GetDir(); // "some/place/" means they want to chdir not try to load "place" const bool want_dir = filename.Last() == wxFILE_SEP_PATH; if ( want_dir ) filename = filename.RemoveLast(); if ( filename == wxT( ".." ) ) { m_ignoreChanges = true; m_list->GoToParentDir(); GenerateFolderChangedEvent( this, this ); UpdateControls(); m_ignoreChanges = false; return; } #ifdef __UNIX__ if ( filename == wxT( "~" ) ) { m_ignoreChanges = true; m_list->GoToHomeDir(); GenerateFolderChangedEvent( this, this ); UpdateControls(); m_ignoreChanges = false; return; } if ( filename.BeforeFirst( wxT( '/' ) ) == wxT( "~" ) ) { filename = wxString( wxGetUserHome() ) + filename.Remove( 0, 1 ); } #endif // __UNIX__ if ( !( m_style & wxFC_SAVE ) ) { if ( ( filename.Find( wxT( '*' ) ) != wxNOT_FOUND ) || ( filename.Find( wxT( '?' ) ) != wxNOT_FOUND ) ) { if ( filename.Find( wxFILE_SEP_PATH ) != wxNOT_FOUND ) { wxMessageBox( _( "Illegal file specification." ), _( "Error" ), wxOK | wxICON_ERROR, this ); return; } m_list->SetWild( filename ); return; } } if ( !IsTopMostDir( dir ) ) dir += wxFILE_SEP_PATH; if ( !wxIsAbsolutePath( filename ) ) { dir += filename; filename = dir; } if ( wxDirExists( filename ) ) { m_ignoreChanges = true; m_list->GoToDir( filename ); UpdateControls(); GenerateFolderChangedEvent( this, this ); m_ignoreChanges = false; return; } // they really wanted a dir, but it doesn't exist if ( want_dir ) { wxMessageBox( _( "Directory doesn't exist." ), _( "Error" ), wxOK | wxICON_ERROR, this ); return; } // append the default extension to the filename if it doesn't have any // // VZ: the logic of testing for !wxFileExists() only for the open file // dialog is not entirely clear to me, why don't we allow saving to a // file without extension as well? if ( !( m_style & wxFC_OPEN ) || !wxFileExists( filename ) ) { filename = wxFileDialogBase::AppendExtension( filename, m_filterExtension ); GenerateFileActivatedEvent( this, this, wxFileName( filename ).GetFullName() ); return; } GenerateFileActivatedEvent( this, this ); }