// Find the child that matches the first part of 'path'. // E.g. if a child path is "/usr" and 'path' is "/usr/include" // then the child for /usr is returned. wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& path, bool& done) { wxString path2(path); // Make sure all separators are as per the current platform path2.Replace(wxT("\\"), wxString(wxFILE_SEP_PATH)); path2.Replace(wxT("/"), wxString(wxFILE_SEP_PATH)); // Append a separator to foil bogus substring matching path2 += wxString(wxFILE_SEP_PATH); // In MSW or PM, case is not significant #if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) path2.MakeLower(); #endif wxTreeItemIdValue cookie; wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie); while (childId.IsOk()) { wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); if (data && !data->m_path.empty()) { wxString childPath(data->m_path); if (!wxEndsWithPathSeparator(childPath)) childPath += wxString(wxFILE_SEP_PATH); // In MSW and PM, case is not significant #if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) childPath.MakeLower(); #endif if (childPath.length() <= path2.length()) { wxString path3 = path2.Mid(0, childPath.length()); if (childPath == path3) { if (path3.length() == path2.length()) done = true; else done = false; return childId; } } } childId = m_treeCtrl->GetNextChild(parentId, cookie); } wxTreeItemId invalid; return invalid; }
wxString wxPathList::FindAbsoluteValidPath (const wxString& file) const { wxString f = FindValidPath(file); if ( f.empty() || wxIsAbsolutePath(f) ) return f; wxString buf = ::wxGetCwd(); if ( !wxEndsWithPathSeparator(buf) ) { buf += wxFILE_SEP_PATH; } buf += f; return buf; }
void TemplateClassDlg::OnGenerate( wxCommandEvent& event ) { wxUnusedVar(event); wxArrayString files; wxString newClassName = m_textCtrlClassName->GetValue(); wxString baseClass = m_comboxCurrentTemplate->GetValue(); if (!wxEndsWithPathSeparator(m_projectPath)) m_projectPath += wxFILE_SEP_PATH; wxString buffer = GetStringDb()->GetString( baseClass, swHeader ); buffer.Replace( swPhClass, newClassName ); buffer.Replace(wxT("\v"), eol[m_curEol].c_str()); files.Add( m_projectPath + m_textCtrlHeaderFile->GetValue() ); SaveBufferToFile( files.Item(0), buffer ); buffer = wxString::Format( wxT( "#include \"%s\"%s%s" ), m_textCtrlHeaderFile->GetValue().c_str(), eol[m_curEol].c_str(), eol[m_curEol].c_str() ); buffer += GetStringDb()->GetString( baseClass, swSource ); buffer.Replace( swPhClass, newClassName ); buffer.Replace(wxT("\v"), eol[m_curEol].c_str()); files.Add( m_projectPath + m_textCtrlCppFile->GetValue() ); SaveBufferToFile( files.Item(1), buffer ); if ( !m_textCtrlVD->GetValue().IsEmpty() ) { // Create the Success message first, as 'files' may be altered during creation wxString msg; msg << wxString::Format( wxT( "%s%s" ), files.Item(0).c_str(), eol[m_curEol].c_str()) << wxString::Format( wxT( "%s%s%s" ), files.Item(1).c_str(), eol[m_curEol].c_str(), eol[m_curEol].c_str()) << _( "Files successfully created." ); // We have a .cpp and an .h file, and there may well be a :src and an :include folder available // So try to place the files appropriately. If that fails, dump both in the selected folder bool smartAddFiles = EditorConfigST::Get()->GetOptions()->GetOptions() & OptionsConfig::Opt_SmartAddFiles; if ( (smartAddFiles && m_pManager->AddFilesToVirtualFolderIntelligently( m_textCtrlVD->GetValue(), files )) || m_pManager->AddFilesToVirtualFolder( m_textCtrlVD->GetValue(), files ) ) { wxMessageBox(msg, _("Add template class"), wxOK|wxCENTER|wxICON_INFORMATION, this); EndModal(wxID_OK); return; } } wxMessageBox(_("Adding the template class failed"), _("Oops"), wxOK|wxCENTER|wxICON_WARNING, this); EndModal(wxID_CANCEL); // The return value isn't actually used at present, but send Cancel on failure for future-proofing }
/// /// Main function /// int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) { wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program"); // Initialize wxWidgets. wxInitializer initializer; if (!initializer.IsOk()) return -1; // Initialize configuration. wxConfigBase *cfgPrev = wxConfigBase::Set(new wxConfig(wxT(PRODUCT_CFG_APPLICATION), wxT(PRODUCT_CFG_VENDOR))); if (cfgPrev) wxDELETE(cfgPrev); // Initialize locale. wxLocale locale; wxLanguage lang_ui; if (wxInitializeLocale(locale, &lang_ui)) { // Do not add translation catalog, to keep log messages in English. // Log files are for help-desk and should remain globally intelligible. //wxVERIFY(locale.AddCatalog(wxT("Updater") wxT(wxExtendVersion))); } // Create output folder. wxString path(wxFileName::GetTempDir()); if (!wxEndsWithPathSeparator(path)) path += wxFILE_SEP_PATH; if (!wxDirExists(path)) wxMkdir(path); // Prepare log file. wxFFile log_file(path + wxT("Updater-") wxT(PRODUCT_CFG_APPLICATION) wxT(".log"), wxT("wt")); if (log_file.IsOpened()) delete wxLog::SetActiveTarget(new wxLogStderr(log_file.fp())); wxUpdCheckThread worker(lang_ui == wxLANGUAGE_DEFAULT ? wxT("en_US") : wxLocale::GetLanguageCanonicalName(lang_ui)); wxUpdCheckThread::wxResult res = worker.CheckForUpdate(); switch (res) { case wxUpdCheckThread::wxUpdUpdateAvailable: return worker.LaunchUpdate(NULL, true) ? 0 : 1; case wxUpdCheckThread::wxUpdUpToDate : return 0; default : return res; } }
wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxString& appVariableName) { wxString str; // Try appVariableName if (!appVariableName.empty()) { str = wxGetenv(appVariableName); if (!str.empty()) return str; } if (wxIsAbsolutePath(argv0)) return wxPathOnly(argv0); else { // Is it a relative path? wxString currentDir(cwd); if (!wxEndsWithPathSeparator(currentDir)) currentDir += wxFILE_SEP_PATH; str = currentDir + argv0; if ( wxFile::Exists(str) ) return wxPathOnly(str); } // OK, it's neither an absolute path nor a relative path. // Search PATH. wxPathList pathList; pathList.AddEnvList(wxT("PATH")); str = pathList.FindAbsoluteValidPath(argv0); if (!str.empty()) return wxPathOnly(str); // Failed return wxEmptyString; }
bool wxGenericFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFile, const wxString& wildCard, long style, const wxPoint& pos, bool bypassGenericImpl ) { m_bypassGenericImpl = bypassGenericImpl; if (!wxFileDialogBase::Create(parent, message, defaultDir, defaultFile, wildCard, style, pos)) { return false; } if (m_bypassGenericImpl) return true; if (!wxDialog::Create( parent, wxID_ANY, message, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )) { return false; } ignoreChanges = true; if (wxConfig::Get(false)) { wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), &ms_lastViewStyle); wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), &ms_lastShowHidden); } if (m_dialogStyle == 0) m_dialogStyle = wxOPEN; if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxOPEN)) m_dialogStyle |= wxOPEN; if ((m_dir.empty()) || (m_dir == wxT("."))) { m_dir = wxGetCwd(); if (m_dir.empty()) m_dir = wxFILE_SEP_PATH; } size_t len = m_dir.Len(); if ((len > 1) && (wxEndsWithPathSeparator(m_dir))) m_dir.Remove( len-1, 1 ); m_path = m_dir; m_path += wxFILE_SEP_PATH; m_path += defaultFile; m_filterExtension = wxEmptyString; // layout bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *but; but = new wxBitmapButton(this, ID_LIST_MODE, wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a list view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); but = new wxBitmapButton(this, ID_REPORT_MODE, wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a detailed view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); buttonsizer->Add( 30, 5, 1 ); m_upDirButton = new wxBitmapButton(this, ID_UP_DIR, wxArtProvider::GetBitmap(wxART_GO_DIR_UP, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_upDirButton->SetToolTip( _("Go to parent directory") ); #endif buttonsizer->Add( m_upDirButton, 0, wxALL, 5 ); #ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... but = new wxBitmapButton(this, ID_PARENT_DIR, wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("Go to home directory") ); #endif buttonsizer->Add( but, 0, wxALL, 5); buttonsizer->Add( 20, 20 ); #endif //!__DOS__ m_newDirButton = new wxBitmapButton(this, ID_NEW_DIR, wxArtProvider::GetBitmap(wxART_NEW_DIR, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_newDirButton->SetToolTip( _("Create new directory") ); #endif buttonsizer->Add( m_newDirButton, 0, wxALL, 5 ); if (is_pda) mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 0 ); else mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 ); wxBoxSizer *staticsizer = new wxBoxSizer( wxHORIZONTAL ); if (!is_pda) staticsizer->Add( new wxStaticText( this, wxID_ANY, _("Current directory:") ), 0, wxRIGHT, 10 ); m_static = new wxStaticText( this, wxID_ANY, m_dir ); staticsizer->Add( m_static, 1 ); mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 ); long style2 = ms_lastViewStyle; if ( !(m_dialogStyle & wxMULTIPLE) ) style2 |= wxLC_SINGLE_SEL; #ifdef __WXWINCE__ style2 |= wxSIMPLE_BORDER; #else style2 |= wxSUNKEN_BORDER; #endif wxSize list_size(500,240); if (is_pda) list_size = wxSize(50,80); m_list = new wxFileCtrl( this, ID_LIST_CTRL, wxEmptyString, ms_lastShowHidden, wxDefaultPosition, list_size, style2); if (is_pda) { // PDAs have a different screen layout mainsizer->Add( m_list, 1, wxEXPAND|wxSHRINK | wxLEFT|wxRIGHT, 5 ); wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL ); m_text = new wxTextCtrl( this, ID_TEXT, m_fileName, wxDefaultPosition, wxDefaultSize, wxPROCESS_ENTER ); textsizer->Add( m_text, 1, wxCENTER | wxALL, 5 ); mainsizer->Add( textsizer, 0, wxEXPAND ); m_check = NULL; m_choice = new wxChoice( this, ID_CHOICE ); textsizer->Add( m_choice, 1, wxCENTER|wxALL, 5 ); buttonsizer = new wxBoxSizer( wxHORIZONTAL ); buttonsizer->Add( new wxButton( this, wxID_OK ), 0, wxCENTER | wxALL, 5 ); buttonsizer->Add( new wxButton( this, wxID_CANCEL ), 0, wxCENTER | wxALL, 5 ); mainsizer->Add( buttonsizer, 0, wxALIGN_RIGHT ); } else { mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 ); wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL ); m_text = new wxTextCtrl( this, ID_TEXT, m_fileName, wxDefaultPosition, wxDefaultSize, wxPROCESS_ENTER ); textsizer->Add( m_text, 1, wxCENTER | wxLEFT|wxRIGHT|wxTOP, 10 ); textsizer->Add( new wxButton( this, wxID_OK ), 0, wxCENTER | wxLEFT|wxRIGHT|wxTOP, 10 ); mainsizer->Add( textsizer, 0, wxEXPAND ); wxBoxSizer *choicesizer = new wxBoxSizer( wxHORIZONTAL ); 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( ms_lastShowHidden ); choicesizer->Add( m_check, 0, wxCENTER|wxALL, 10 ); choicesizer->Add( new wxButton( this, wxID_CANCEL ), 0, wxCENTER | wxALL, 10 ); mainsizer->Add( choicesizer, 0, wxEXPAND ); } SetWildcard(wildCard); SetAutoLayout( true ); SetSizer( mainsizer ); if (!is_pda) { mainsizer->Fit( this ); mainsizer->SetSizeHints( this ); Centre( wxBOTH ); } m_text->SetFocus(); ignoreChanges = false; return true; }
bool wxGenericFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFile, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& sz, const wxString& name, bool bypassGenericImpl ) { m_bypassGenericImpl = bypassGenericImpl; parent = GetParentForModalDialog(parent, style); if (!wxFileDialogBase::Create(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name)) { return false; } if (m_bypassGenericImpl) return true; if (!wxDialog::Create( parent, wxID_ANY, message, pos, sz, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | style, name )) { return false; } #if wxUSE_CONFIG if (wxConfig::Get(false)) { wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), &ms_lastViewStyle); wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), &ms_lastShowHidden); } #endif if ((m_dir.empty()) || (m_dir == wxT("."))) { m_dir = wxGetCwd(); if (m_dir.empty()) m_dir = wxFILE_SEP_PATH; } const size_t len = m_dir.length(); if ((len > 1) && (wxEndsWithPathSeparator(m_dir))) m_dir.Remove( len-1, 1 ); m_filterExtension = wxEmptyString; // layout const bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); AddBitmapButton( ID_LIST_MODE, wxART_LIST_VIEW, _("View files as a list view"), buttonsizer ); AddBitmapButton( ID_REPORT_MODE, wxART_REPORT_VIEW, _("View files as a detailed view"), buttonsizer ); buttonsizer->Add( 30, 5, 1 ); m_upDirButton = AddBitmapButton( ID_UP_DIR, wxART_GO_DIR_UP, _("Go to parent directory"), buttonsizer ); #ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... AddBitmapButton( ID_HOME_DIR, wxART_GO_HOME, _("Go to home directory"), buttonsizer ); buttonsizer->Add( 20, 20 ); #endif //!__DOS__ m_newDirButton = AddBitmapButton( ID_NEW_DIR, wxART_NEW_DIR, _("Create new directory"), buttonsizer ); if (is_pda) mainsizer->Add( buttonsizer, wxSizerFlags().Expand() ); else mainsizer->Add( buttonsizer, wxSizerFlags().Expand() .Border( wxLEFT | wxRIGHT | wxTOP ) ); long style2 = 0; if ( HasFdFlag(wxFD_MULTIPLE) ) style2 |= wxFC_MULTIPLE; m_filectrl = new wxGenericFileCtrl( this, ID_FILE_CTRL, m_dir, defaultFile, wildCard, style2, wxDefaultPosition, wxSize(540,200) ); m_filectrl->ShowHidden( ms_lastShowHidden ); if (ms_lastViewStyle == wxLC_LIST) { m_filectrl->ChangeToListMode(); } else if (ms_lastViewStyle == wxLC_REPORT) { m_filectrl->ChangeToReportMode(); } mainsizer->Add(m_filectrl, wxSizerFlags(1).Expand().HorzBorder()); wxSizer *bsizer = CreateButtonSizer(wxOK | wxCANCEL); if ( bsizer ) { if (is_pda) mainsizer->Add(bsizer, wxSizerFlags().Expand().Border()); else mainsizer->Add(bsizer, wxSizerFlags().Expand().DoubleBorder()); } SetSizer( mainsizer ); if (!is_pda) { mainsizer->SetSizeHints( this ); Centre( wxBOTH ); } return true; }
bool wxGenericFileCtrl::Create( wxWindow *parent, wxWindowID id, const wxString& defaultDirectory, const wxString& defaultFileName, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& size, const wxString& name ) { this->m_style = style; m_inSelected = false; m_noSelChgEvent = false; m_check = NULL; // check that the styles are not contradictory wxASSERT_MSG( !( ( m_style & wxFC_SAVE ) && ( m_style & wxFC_OPEN ) ), wxT( "can't specify both wxFC_SAVE and wxFC_OPEN at once" ) ); wxASSERT_MSG( !( ( m_style & wxFC_SAVE ) && ( m_style & wxFC_MULTIPLE ) ), wxT( "wxFC_MULTIPLE can't be used with wxFC_SAVE" ) ); wxNavigationEnabled<wxControl>::Create( parent, id, pos, size, wxTAB_TRAVERSAL, wxDefaultValidator, name ); m_dir = defaultDirectory; m_ignoreChanges = true; if ( ( m_dir.empty() ) || ( m_dir == wxT( "." ) ) ) { m_dir = wxGetCwd(); if ( m_dir.empty() ) m_dir = wxFILE_SEP_PATH; } const size_t len = m_dir.length(); if ( ( len > 1 ) && ( wxEndsWithPathSeparator( m_dir ) ) ) m_dir.Remove( len - 1, 1 ); m_filterExtension = wxEmptyString; // layout const bool is_pda = ( wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA ); wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *staticsizer = new wxBoxSizer( wxHORIZONTAL ); if ( is_pda ) staticsizer->Add( new wxStaticText( this, wxID_ANY, _( "Current directory:" ) ), wxSizerFlags().DoubleBorder(wxRIGHT) ); m_static = new wxStaticText( this, wxID_ANY, m_dir ); staticsizer->Add( m_static, 1 ); mainsizer->Add( staticsizer, wxSizerFlags().Expand().Border()); long style2 = wxLC_LIST; if ( !( m_style & wxFC_MULTIPLE ) ) style2 |= wxLC_SINGLE_SEL; #ifdef __WXWINCE__ style2 |= wxSIMPLE_BORDER; #else style2 |= wxSUNKEN_BORDER; #endif m_list = new wxFileListCtrl( this, ID_FILELIST_CTRL, wxEmptyString, false, wxDefaultPosition, wxSize( 400, 140 ), style2 ); m_text = new wxTextCtrl( this, ID_TEXT, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); m_choice = new wxChoice( this, ID_CHOICE ); if ( is_pda ) { // PDAs have a different screen layout mainsizer->Add( m_list, wxSizerFlags( 1 ).Expand().HorzBorder() ); wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL ); textsizer->Add( m_text, wxSizerFlags( 1 ).Centre().Border() ); textsizer->Add( m_choice, wxSizerFlags( 1 ).Centre().Border() ); mainsizer->Add( textsizer, wxSizerFlags().Expand() ); } else // !is_pda { mainsizer->Add( m_list, wxSizerFlags( 1 ).Expand().Border() ); mainsizer->Add( m_text, wxSizerFlags().Expand().Border() ); wxBoxSizer *choicesizer = new wxBoxSizer( wxHORIZONTAL ); choicesizer->Add( m_choice, wxSizerFlags( 1 ).Centre() ); if ( !( m_style & wxFC_NOSHOWHIDDEN ) ) { m_check = new wxCheckBox( this, ID_CHECK, _( "Show &hidden files" ) ); choicesizer->Add( m_check, wxSizerFlags().Centre().DoubleBorder(wxLEFT) ); } mainsizer->Add( choicesizer, wxSizerFlags().Expand().Border() ); } SetWildcard( wildCard ); SetAutoLayout( true ); SetSizer( mainsizer ); if ( !is_pda ) { mainsizer->Fit( this ); } m_list->GoToDir( m_dir ); UpdateControls(); m_text->SetValue( m_fileName ); m_ignoreChanges = false; // must be after m_ignoreChanges = false SetFilename( defaultFileName ); return true; }
void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) { wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); if (data->m_isExpanded) return; data->m_isExpanded = true; if (parentId == m_treeCtrl->GetRootItem()) { SetupSections(); return; } wxASSERT(data); wxString search,path,filename; wxString dirName(data->m_path); #if (defined(__WINDOWS__) && !defined(__WXWINCE__)) || defined(__DOS__) || defined(__OS2__) // Check if this is a root directory and if so, // whether the drive is avaiable. if (!wxIsDriveAvailable(dirName)) { data->m_isExpanded = false; //wxMessageBox(wxT("Sorry, this drive is not available.")); return; } #endif // This may take a longish time. Go to busy cursor wxBusyCursor busy; #if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif wxArrayString dirs; wxArrayString filenames; wxDir d; wxString eachFilename; wxLogNull log; d.Open(dirName); if (d.IsOpened()) { int style = wxDIR_DIRS; if (m_showHidden) style |= wxDIR_HIDDEN; if (d.GetFirst(& eachFilename, wxEmptyString, style)) { do { if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) { dirs.Add(eachFilename); } } while (d.GetNext(&eachFilename)); } } dirs.Sort(wxDirCtrlStringCompareFunction); // Now do the filenames -- but only if we're allowed to if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { d.Open(dirName); if (d.IsOpened()) { int style = wxDIR_FILES; if (m_showHidden) style |= wxDIR_HIDDEN; // Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg") wxStringTokenizer strTok; wxString curFilter; strTok.SetString(m_currentFilterStr,wxT(";")); while(strTok.HasMoreTokens()) { curFilter = strTok.GetNextToken(); if (d.GetFirst(& eachFilename, curFilter, style)) { do { if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) { filenames.Add(eachFilename); } } while (d.GetNext(& eachFilename)); } } } filenames.Sort(wxDirCtrlStringCompareFunction); } // Now we really know whether we have any children so tell the tree control // about it. m_treeCtrl->SetItemHasChildren(parentId, !dirs.empty() || !filenames.empty()); // Add the sorted dirs size_t i; for (i = 0; i < dirs.GetCount(); i++) { eachFilename = dirs[i]; path = dirName; if (!wxEndsWithPathSeparator(path)) path += wxString(wxFILE_SEP_PATH); path += eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true); wxTreeItemId treeid = AppendItem( parentId, eachFilename, wxFileIconsTable::folder, -1, dir_item); m_treeCtrl->SetItemImage( treeid, wxFileIconsTable::folder_open, wxTreeItemIcon_Expanded ); // assume that it does have children by default as it can take a long // time to really check for this (think remote drives...) // // and if we're wrong, we'll correct the icon later if // the user really tries to open this item m_treeCtrl->SetItemHasChildren(treeid); } // Add the sorted filenames if (!HasFlag(wxDIRCTRL_DIR_ONLY)) { for (i = 0; i < filenames.GetCount(); i++) { eachFilename = filenames[i]; path = dirName; if (!wxEndsWithPathSeparator(path)) path += wxString(wxFILE_SEP_PATH); path += eachFilename; //path = dirName + wxString(wxT("/")) + eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,false); int image_id = wxFileIconsTable::file; if (eachFilename.Find(wxT('.')) != wxNOT_FOUND) image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.'))); (void) AppendItem( parentId, eachFilename, image_id, -1, dir_item); } } }
bool wxDirData::Read(wxString *filename) { bool first = false; WIN32_FIND_DATA finddata; #define PTR_TO_FINDDATA (&finddata) if ( !IsFindDataOk(m_finddata) ) { // open first wxString filespec = m_dirname; if ( !wxEndsWithPathSeparator(filespec) ) { filespec += wxT('\\'); } if ( !m_filespec ) filespec += wxT("*.*"); else filespec += m_filespec; m_finddata = FindFirst(filespec, PTR_TO_FINDDATA); first = true; } if ( !IsFindDataOk(m_finddata) ) { #ifdef __WIN32__ DWORD err = ::GetLastError(); if ( err != ERROR_FILE_NOT_FOUND && err != ERROR_NO_MORE_FILES ) { wxLogSysError(err, _("Can not enumerate files in directory '%s'"), m_dirname.c_str()); } #endif // __WIN32__ //else: not an error, just no (such) files return false; } const wxChar *name; FIND_ATTR attr; for ( ;; ) { if ( first ) { first = false; } else { if ( !FindNext(m_finddata, PTR_TO_FINDDATA) ) { #ifdef __WIN32__ DWORD err = ::GetLastError(); if ( err != ERROR_NO_MORE_FILES ) { wxLogLastError(wxT("FindNext")); } #endif // __WIN32__ //else: not an error, just no more (such) files return false; } } name = GetNameFromFindData(PTR_TO_FINDDATA); attr = GetAttrFromFindData(PTR_TO_FINDDATA); // don't return "." and ".." unless asked for if ( name[0] == wxT('.') && ((name[1] == wxT('.') && name[2] == wxT('\0')) || (name[1] == wxT('\0'))) ) { if ( !(m_flags & wxDIR_DOTDOT) ) continue; } // check the type now if ( !(m_flags & wxDIR_FILES) && !IsDir(attr) ) { // it's a file, but we don't want them continue; } else if ( !(m_flags & wxDIR_DIRS) && IsDir(attr) ) { // it's a dir, and we don't want it continue; } // finally, check whether it's a hidden file if ( !(m_flags & wxDIR_HIDDEN) ) { if ( IsHidden(attr) ) { // it's a hidden file, skip it continue; } } *filename = name; break; } return true; }
bool wxExFindOtherFileName( const wxFileName& filename, wxFileName* lastfile) { /* Add the base version if present. E.g. fullpath: F:\CCIS\v990308\com\atis\atis-ctrl\atis-ctrl.cc base: F:\CCIS\ append: \com\atis\atis-ctrl\atis-ctrl.cc */ const wxString fullpath = filename.GetFullPath(); const wxRegEx reg("[/|\\][a-z-]*[0-9]+\\.?[0-9]*\\.?[0-9]*\\.?[0-9]*"); if (!reg.Matches(fullpath.Lower())) { wxLogStatus(_("No version information found")); return false; } size_t start, len; if (!reg.GetMatch(&start, &len)) { wxFAIL; return false; } wxString base = fullpath.substr(0, start); if (!wxEndsWithPathSeparator(base)) { base += wxFileName::GetPathSeparator(); } wxDir dir(base); if (!dir.IsOpened()) { wxFAIL; return false; } wxString filename_string; bool cont = dir.GetFirst(&filename_string, wxEmptyString, wxDIR_DIRS); // only get dirs wxDateTime lastmodtime((time_t)0); const wxString append = fullpath.substr(start + len); bool found = false; // Readme: Maybe use a thread for this. while (cont) { wxFileName fn(base + filename_string + append); if (fn.FileExists() && fn.GetPath().CmpNoCase(filename.GetPath()) != 0 && fn.GetModificationTime() != filename.GetModificationTime()) { found = true; if (fn.GetModificationTime() > lastmodtime) { lastmodtime = fn.GetModificationTime(); *lastfile = fn; } } cont = dir.GetNext(&filename_string); if (wxTheApp != NULL) { wxTheApp->Yield(); } } if (!found) { wxLogStatus(_("No files found")); } return found; }
bool wxDirData::Read( wxString* psFilename ) { bool bFirst = false; FILEFINDBUF3 vFinddata; #define PTR_TO_FINDDATA (&vFinddata) if (!IsFindDataOk(m_vFinddata)) { // // Open first // wxString sFilespec = m_sDirname; if ( !wxEndsWithPathSeparator(sFilespec) ) { sFilespec += wxT('\\'); } sFilespec += (!m_sFilespec ? wxT("*.*") : m_sFilespec.c_str()); m_vFinddata = FindFirst( sFilespec ,PTR_TO_FINDDATA ); bFirst = true; } if ( !IsFindDataOk(m_vFinddata) ) { return false; } const wxChar* zName; FIND_ATTR vAttr; for ( ;; ) { if (bFirst) { bFirst = false; } else { if (!FindNext( m_vFinddata ,PTR_TO_FINDDATA )) { return false; } } zName = GetNameFromFindData(PTR_TO_FINDDATA); vAttr = GetAttrFromFindData(PTR_TO_FINDDATA); // // Don't return "." and ".." unless asked for // if ( zName[0] == wxT('.') && ((zName[1] == wxT('.') && zName[2] == wxT('\0')) || (zName[1] == wxT('\0'))) ) { if (!(m_nFlags & wxDIR_DOTDOT)) continue; } // // Check the type now // if (!(m_nFlags & wxDIR_FILES) && !IsDir(vAttr)) { // // It's a file, but we don't want them // continue; } else if (!(m_nFlags & wxDIR_DIRS) && IsDir(vAttr) ) { // // It's a dir, and we don't want it // continue; } // // Finally, check whether it's a hidden file // if (!(m_nFlags & wxDIR_HIDDEN)) { if (IsHidden(vAttr)) { // // It's a hidden file, skip it // continue; } } *psFilename = zName; break; } return true; } // end of wxDirData::Read