void CCDebugInfo::OnSave(cb_unused wxCommandEvent& event) { TokenTree* tree = m_Parser->GetTokenTree(); wxArrayString saveWhat; saveWhat.Add(_("Dump the tokens tree")); saveWhat.Add(_("Dump the serialised tokens tree")); saveWhat.Add(_("Dump the file list")); saveWhat.Add(_("Dump the list of include directories")); saveWhat.Add(_("Dump the token list of files")); int sel = wxGetSingleChoiceIndex(_("What do you want to save?"), _("CC Debug Info"), saveWhat, this); switch (sel) { case -1: // cancelled return; case 0: { wxString tt; { // life time of wxWindowDisabler/wxBusyInfo wxWindowDisabler disableAll; wxBusyInfo running(_("Obtaining tokens tree... please wait (this may take several seconds)..."), Manager::Get()->GetAppWindow()); tt = tree->m_Tree.dump(); } CCDebugInfoHelper::SaveCCDebugInfo(_("Save tokens tree"), tt); } break; case 1: { wxString tt_ser; { // life time of wxWindowDisabler/wxBusyInfo wxWindowDisabler disableAll; wxBusyInfo running(_("Serialising tokens tree... please wait (this may take several seconds)..."), Manager::Get()->GetAppWindow()); tt_ser = tree->m_Tree.Serialize(); } CCDebugInfoHelper::SaveCCDebugInfo(_("Save serialised tokens tree"), tt_ser); } break; case 2: { wxString files; for (size_t i = 0; i < tree->m_FilenameMap.size(); ++i) { wxString file = tree->m_FilenameMap.GetString(i); if (!file.IsEmpty()) files += file + _T("\r\n"); } CCDebugInfoHelper::SaveCCDebugInfo(_("Save file list"), files); } break; case 3: { wxString dirs; const wxArrayString& dirsArray = m_Parser->GetIncludeDirs(); for (size_t i = 0; i < dirsArray.GetCount(); ++i) { const wxString& dir = dirsArray[i]; if (!dir.IsEmpty()) dirs += dir + _T("\r\n"); } CCDebugInfoHelper::SaveCCDebugInfo(_("Save list of include directories"), dirs); } break; case 4: { wxString fileTokens; { wxWindowDisabler disableAll; wxBusyInfo running(_("Obtaining tokens tree... please wait (this may take several seconds)..."), Manager::Get()->GetAppWindow()); for (size_t i = 0; i < tree->m_FilenameMap.size(); ++i) { const wxString file = tree->m_FilenameMap.GetString(i); if (!file.IsEmpty()) { fileTokens += file + _T("\r\n"); TokenIdxSet result; tree->FindTokensInFile(file, result, tkUndefined); for (TokenIdxSet::const_iterator it = result.begin(); it != result.end(); ++it) { const Token* token = tree->at(*it); fileTokens << token->GetTokenKindString() << _T(" "); if (token->m_TokenKind == tkFunction) fileTokens << token->m_Name << token->GetFormattedArgs() << _T("\t"); else fileTokens << token->DisplayName() << _T("\t"); fileTokens << _T("[") << token->m_Line << _T(",") << token->m_ImplLine << _T("]"); fileTokens << _T("\r\n"); } } fileTokens += _T("\r\n"); } } CCDebugInfoHelper::SaveCCDebugInfo(_("Save token list of files"), fileTokens); } break; default: cbMessageBox(_("Invalid selection."), _("CC Debug Info")); } }