bool SFTPTreeView::DoExpandItem(const wxTreeItemId& item) { MyClientData* cd = GetItemData(item); CHECK_PTR_RET_FALSE(cd); // already initialized this folder before? if(cd->IsInitialized()) { return true; } // get list of files and populate the tree SFTPAttribute::List_t attributes; try { attributes = m_sftp->List(cd->GetFullPath(), clSFTP::SFTP_BROWSE_FILES | clSFTP::SFTP_BROWSE_FOLDERS); } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxOK | wxICON_ERROR | wxCENTER, EventNotifier::Get()->TopFrame()); return false; } // Remove the dummy item and replace it with real items wxTreeItemIdValue cookie; wxTreeItemId dummyItem = m_treeCtrl->GetFirstChild(item, cookie); m_treeCtrl->Delete(dummyItem); cd->SetInitialized(true); int nNumOfRealChildren = 0; SFTPAttribute::List_t::iterator iter = attributes.begin(); for(; iter != attributes.end(); ++iter) { SFTPAttribute::Ptr_t attr = (*iter); if(attr->GetName() == "." || attr->GetName() == "..") continue; ++nNumOfRealChildren; // determine the icon index int imgIdx = wxNOT_FOUND; if(attr->IsFolder()) { imgIdx = m_bmpLoader->GetMimeImageId(FileExtManager::TypeFolder); } else { imgIdx = m_bmpLoader->GetMimeImageId(attr->GetName()); } if(imgIdx == wxNOT_FOUND) { imgIdx = m_bmpLoader->GetMimeImageId(FileExtManager::TypeText); } wxString path; path << cd->GetFullPath() << "/" << attr->GetName(); while(path.Replace("//", "/")) {} MyClientData* childClientData = new MyClientData(path); childClientData->SetIsFolder(attr->IsFolder()); wxTreeItemId child = m_treeCtrl->AppendItem(item, attr->GetName(), imgIdx, imgIdx, childClientData); // if its type folder, add a fake child item if(attr->IsFolder()) { m_treeCtrl->AppendItem(child, "<dummy>"); } } return nNumOfRealChildren > 0; }
bool BuildSettingsConfig::Load(const wxString &version) { m_version = version; wxString initialSettings = ConfFileLocator::Instance()->Locate(wxT("config/build_settings.xml")); bool loaded = m_doc->Load(initialSettings); CHECK_PTR_RET_FALSE( m_doc->GetRoot() ); wxString xmlVersion = m_doc->GetRoot()->GetPropVal(wxT("Version"), wxEmptyString); if ( xmlVersion != version ) { loaded = m_doc->Load(ConfFileLocator::Instance()->GetDefaultCopy(wxT("config/build_settings.xml"))); } m_fileName = ConfFileLocator::Instance()->GetLocalCopy(wxT("config/build_settings.xml")); return loaded; }
bool WebTools::IsHTMLFile(IEditor* editor) { CHECK_PTR_RET_FALSE(editor); if(FileExtManager::GetType(editor->GetFileName().GetFullName()) == FileExtManager::TypeHtml) return true; // We should also support Code Completion when inside a mixed PHP and HTML file if(FileExtManager::IsPHPFile(editor->GetFileName())) { // Check to see if we are inside a PHP section or not wxStyledTextCtrl* ctrl = editor->GetCtrl(); wxString buffer = ctrl->GetTextRange(0, ctrl->GetCurrentPos()); return !PHPSourceFile::IsInPHPSection(buffer); } return false; }
bool WebTools::IsJavaScriptFile(IEditor* editor) { CHECK_PTR_RET_FALSE(editor); if(FileExtManager::IsJavascriptFile(editor->GetFileName())) return true; // We should also support Code Completion when inside a PHP/HTML file, but within a script area if(FileExtManager::IsPHPFile(editor->GetFileName())) { wxStyledTextCtrl* ctrl = editor->GetCtrl(); int styleAtCurPos = ctrl->GetStyleAt(ctrl->GetCurrentPos()); if(styleAtCurPos >= wxSTC_HJ_START && styleAtCurPos <= wxSTC_HJA_REGEX) { return true; } } return false; }
bool PHPWorkspace::RunProject(bool debugging, const wxString& urlOrFilePath, const wxString& projectName, const wxString& xdebugSessionName) { wxString projectToRun = projectName; if(projectToRun.IsEmpty()) { projectToRun = GetActiveProjectName(); } PHPProject::Ptr_t proj = PHPWorkspace::Get()->GetProject(projectToRun); CHECK_PTR_RET_FALSE(proj); // Error is reported inside 'Exec' return m_executor.Exec(projectToRun, urlOrFilePath, xdebugSessionName, debugging); }
bool CodeFormatter::ClangBatchFormat(const std::vector<wxFileName>& files, const FormatOptions& options) { if(options.GetClangFormatExe().IsEmpty()) { return false; } wxProgressDialog dlg( _("Source Code Formatter"), _("Formatting files..."), (int)files.size(), m_mgr->GetTheApp()->GetTopWindow()); clClangFormatLocator locator; double version = locator.GetVersion(options.GetClangFormatExe()); for(size_t i = 0; i < files.size(); ++i) { wxString command, file; command << options.GetClangFormatExe(); ::WrapWithQuotes(command); command << " -i "; // inline editing command << options.ClangFormatOptionsAsString(files.at(i), version); file = files.at(i).GetFullPath(); ::WrapWithQuotes(file); command << " " << file; // Wrap the command in the local shell ::WrapInShell(command); // Log the command CL_DEBUG("CodeForamtter: running:\n%s\n", command); wxString msg; msg << "[ " << i << " / " << files.size() << " ] " << files.at(i).GetFullName(); dlg.Update(i, msg); // Execute clang-format and read the output IProcess::Ptr_t clangFormatProc( ::CreateSyncProcess(command, IProcessCreateDefault | IProcessCreateWithHiddenConsole)); CHECK_PTR_RET_FALSE(clangFormatProc); wxString output; clangFormatProc->WaitForTerminate(output); CL_DEBUG("clang-format returned with:\n%s\n", output); } EventNotifier::Get()->PostReloadExternallyModifiedEvent(false); return true; }
bool CodeFormatter::DoClangFormat(const wxFileName& filename, wxString& formattedOutput, int& cursorPosition, int startOffset, int length, const FormatOptions& options) { // clang-format // Build the command line to run if(options.GetClangFormatExe().IsEmpty()) { return false; } wxString command, file; clClangFormatLocator locator; double version = locator.GetVersion(options.GetClangFormatExe()); command << options.GetClangFormatExe(); file = filename.GetFullPath(); ::WrapWithQuotes(command); ::WrapWithQuotes(file); command << options.ClangFormatOptionsAsString(filename, version); if(cursorPosition != wxNOT_FOUND) { command << " -cursor=" << cursorPosition; } if(startOffset != wxNOT_FOUND && length != wxNOT_FOUND) { command << " -offset=" << startOffset << " -length=" << length; } command << " " << file; // Wrap the command in the local shell ::WrapInShell(command); // Log the command CL_DEBUG("CodeForamtter: running:\n%s\n", command); // Execute clang-format and reand the output formattedOutput.Clear(); IProcess::Ptr_t clangFormatProc( ::CreateSyncProcess(command, IProcessCreateDefault | IProcessCreateWithHiddenConsole)); CHECK_PTR_RET_FALSE(clangFormatProc); clangFormatProc->WaitForTerminate(formattedOutput); CL_DEBUG("clang-format returned with:\n%s\n", formattedOutput); if(formattedOutput.IsEmpty()) { // crash? return false; } // The first line contains the cursor position if(cursorPosition != wxNOT_FOUND) { wxString metadata = formattedOutput.BeforeFirst('\n'); JSONRoot root(metadata); cursorPosition = root.toElement().namedObject("cursor").toInt(wxNOT_FOUND); formattedOutput = formattedOutput.AfterFirst('\n'); } return true; }
bool CodeCompletionManager::GetDefinitionsAndSearchPaths(LEditor* editor, wxArrayString& searchPaths, wxArrayString& definitions) { // Sanity CHECK_PTR_RET_FALSE(editor); if(editor->GetProjectName().IsEmpty()) return false; if(!WorkspaceST::Get()->IsOpen()) return false; // Support only C/C++ files if(!FileExtManager::IsCxxFile(editor->GetFileName().GetFullName())) return false; // Get the file's project and get the build configuration settings // for it ProjectPtr proj = WorkspaceST::Get()->GetProject(editor->GetProjectName()); CHECK_PTR_RET_FALSE(proj); BuildConfigPtr buildConf = proj->GetBuildConfiguration(); CHECK_PTR_RET_FALSE(buildConf); CompilerPtr compiler = buildConf->GetCompiler(); CHECK_PTR_RET_FALSE(compiler); if(buildConf->IsCustomBuild()) { // Custom builds are handled differently CompilationDatabase compileDb; compileDb.Open(); if(compileDb.IsOpened()) { // we have compilation database for this workspace wxString compileLine, cwd; compileDb.CompilationLine(editor->GetFileName().GetFullPath(), compileLine, cwd); CL_DEBUG("Pre Processor dimming: %s\n", compileLine); CompilerCommandLineParser cclp(compileLine, cwd); searchPaths = cclp.GetIncludes(); // get the mcros definitions = cclp.GetMacros(); } else { // we will probably will fail... return false; } } else { // get the include paths based on the project settings (this is per build configuration) searchPaths = proj->GetIncludePaths(); CL_DEBUG("CxxPreProcessor will use the following include paths:"); CL_DEBUG_ARR(searchPaths); // get the compiler include paths // wxArrayString compileIncludePaths = compiler->GetDefaultIncludePaths(); // includePaths.insert(includePaths.end(), compileIncludePaths.begin(), compileIncludePaths.end()); definitions = proj->GetPreProcessors(); CL_DEBUG("CxxPreProcessor will use the following macros:"); CL_DEBUG_ARR(definitions); } // Append the compiler builtin macros wxArrayString builtinMacros = compiler->GetBuiltinMacros(); definitions.insert(definitions.end(), builtinMacros.begin(), builtinMacros.end()); return true; }
bool CodeCompletionManager::GetDefinitionsAndSearchPaths(clEditor* editor, wxArrayString& searchPaths, wxArrayString& definitions) { // Sanity CHECK_PTR_RET_FALSE(editor); if(editor->GetProjectName().IsEmpty()) return false; if(!clCxxWorkspaceST::Get()->IsOpen()) return false; // Support only C/C++ files if(!FileExtManager::IsCxxFile(editor->GetFileName().GetFullName())) return false; // Get the file's project and get the build configuration settings // for it ProjectPtr proj = clCxxWorkspaceST::Get()->GetProject(editor->GetProjectName()); CHECK_PTR_RET_FALSE(proj); BuildConfigPtr buildConf = proj->GetBuildConfiguration(); CHECK_PTR_RET_FALSE(buildConf); CompilerPtr compiler = buildConf->GetCompiler(); CHECK_PTR_RET_FALSE(compiler); #if 0 if(buildConf->IsCustomBuild()) { definitions = proj->GetPreProcessors(); CL_DEBUG("CxxPreProcessor will use the following macros:"); CL_DEBUG_ARR(definitions); // Custom builds are handled differently CompilationDatabase compileDb; compileDb.Open(); if(compileDb.IsOpened()) { // we have compilation database for this workspace wxString compileLine, cwd; compileDb.CompilationLine(editor->GetFileName().GetFullPath(), compileLine, cwd); CL_DEBUG("Pre Processor dimming: %s\n", compileLine); CompilerCommandLineParser cclp(compileLine, cwd); searchPaths = cclp.GetIncludes(); // get the mcros definitions << cclp.GetMacros(); } } #endif // get the include paths based on the project settings (this is per build configuration) searchPaths = proj->GetIncludePaths(); CL_DEBUG("CxxPreProcessor will use the following include paths:"); CL_DEBUG_ARR(searchPaths); // get the compiler include paths // wxArrayString compileIncludePaths = compiler->GetDefaultIncludePaths(); // includePaths.insert(includePaths.end(), compileIncludePaths.begin(), compileIncludePaths.end()); definitions = proj->GetPreProcessors(); // get macros out of workspace wxString strWorkspaceMacros = clCxxWorkspaceST::Get()->GetParserMacros(); wxArrayString workspaceMacros = wxStringTokenize(strWorkspaceMacros, wxT("\n\r"), wxTOKEN_STRTOK); for(size_t i = 0; i < workspaceMacros.GetCount(); i++) definitions.Add(workspaceMacros.Item(i).Trim().Trim(false).c_str()); CL_DEBUG("CxxPreProcessor will use the following macros:"); CL_DEBUG_ARR(definitions); // Append the compiler builtin macros wxArrayString builtinMacros = compiler->GetBuiltinMacros(); definitions.insert(definitions.end(), builtinMacros.begin(), builtinMacros.end()); return true; }