LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { m_BufStart = 0 ; m_Animate.Play(0, INT_MAX, INT_MAX); DialogEnableWindow(IDCANCEL, TRUE); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); m_pTaskbarList->SetProgressValue(m_hWnd, 0, 100); } } if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED) { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": got message: %d\n"), wParam); ULONGLONG tickSpent = GetTickCount64() - m_startTick; CString strEndTime = CLoglistUtils::FormatDateAndTime(CTime::GetCurrentTime(), DATE_SHORTDATE, true, false); if(m_bBufferAll) { m_Databuf.m_critSec.Lock(); m_Databuf.push_back(0); m_Log.SetWindowText(Convert2UnionCode((char*)&m_Databuf[0])); m_Databuf.m_critSec.Unlock(); } m_BufStart=0; m_Databuf.m_critSec.Lock(); this->m_Databuf.clear(); m_Databuf.m_critSec.Unlock(); m_bDone = true; m_Animate.Stop(); m_Progress.SetPos(100); this->DialogEnableWindow(IDOK,TRUE); m_GitStatus = (DWORD)lParam; if (m_GitCmd.IsEmpty() && m_GitCmdList.empty()) m_GitStatus = (DWORD)-1; // detect crashes of perl when performing git svn actions if (m_GitStatus == 0 && m_GitCmd.Find(_T(" svn ")) > 1) { CString log; m_Log.GetWindowText(log); if (log.GetLength() > 18 && log.Mid(log.GetLength() - 18) == _T("perl.exe.stackdump")) m_GitStatus = (DWORD)-1; } if (m_PostExecCallback) { CString extraMsg; m_PostExecCallback(m_GitStatus, extraMsg); if (!extraMsg.IsEmpty()) { int start = m_Log.GetTextLength(); m_Log.SetSel(start, start); m_Log.ReplaceSel(extraMsg); } } if(this->m_GitStatus) { if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR); m_pTaskbarList->SetProgressValue(m_hWnd, 100, 100); } CString log; log.Format(IDS_PROC_PROGRESS_GITUNCLEANEXIT, m_GitStatus); CString err; if (CRegDWORD(_T("Software\\TortoiseGit\\ShowGitexeTimings"), TRUE)) err.Format(_T("\r\n\r\n%s (%I64u ms @ %s)\r\n"), (LPCTSTR)log, tickSpent, (LPCTSTR)strEndTime); else err.Format(_T("\r\n\r\n%s\r\n"), (LPCTSTR)log); if (!m_GitCmd.IsEmpty() || !m_GitCmdList.empty()) InsertColorText(this->m_Log, err, RGB(255,0,0)); if (CRegDWORD(_T("Software\\TortoiseGit\\NoSounds"), FALSE) == FALSE) PlaySound((LPCTSTR)SND_ALIAS_SYSTEMEXCLAMATION, nullptr, SND_ALIAS_ID | SND_ASYNC); } else { if (m_pTaskbarList) m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS); CString temp; temp.LoadString(IDS_SUCCESS); CString log; if (CRegDWORD(_T("Software\\TortoiseGit\\ShowGitexeTimings"), TRUE)) log.Format(_T("\r\n%s (%I64u ms @ %s)\r\n"), (LPCTSTR)temp, tickSpent, (LPCTSTR)strEndTime); else log.Format(_T("\r\n%s\r\n"), (LPCTSTR)temp); InsertColorText(this->m_Log, log, RGB(0,0,255)); this->DialogEnableWindow(IDCANCEL,FALSE); } m_Log.PostMessage(WM_VSCROLL, SB_BOTTOM, 0); if (wParam == MSG_PROGRESSDLG_END) { if (m_PostCmdCallback) // new handling method using callback { m_PostCmdCallback(m_GitStatus, m_PostCmdList); if (!m_PostCmdList.empty()) { int i = 0; for (const auto& entry : m_PostCmdList) { ++i; m_ctrlPostCmd.AddEntry(entry.icon, entry.label); TCHAR accellerator = CStringUtils::GetAccellerator(entry.label); if (accellerator == L'\0') continue; ++m_accellerators[accellerator].cnt; if (m_accellerators[accellerator].cnt > 1) m_accellerators[accellerator].id = -1; else m_accellerators[accellerator].id = i - 1; } if (m_accellerators.size()) { LPACCEL lpaccelNew = (LPACCEL)LocalAlloc(LPTR, m_accellerators.size() * sizeof(ACCEL)); SCOPE_EXIT { LocalFree(lpaccelNew); }; i = 0; for (auto& entry : m_accellerators) { lpaccelNew[i].cmd = (WORD)(WM_USER + 1 + entry.second.id); lpaccelNew[i].fVirt = FVIRTKEY | FALT; lpaccelNew[i].key = entry.first; entry.second.wmid = lpaccelNew[i].cmd; ++i; } m_hAccel = CreateAcceleratorTable(lpaccelNew, (int)m_accellerators.size()); } GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); } }
LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { m_BufStart = 0 ; m_Animate.Play(0, INT_MAX, INT_MAX); this->DialogEnableWindow(IDOK,FALSE); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); m_pTaskbarList->SetProgressValue(m_hWnd, 0, 100); } } if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED) { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": got message: %d\n"), wParam); DWORD tickSpent = GetTickCount() - m_startTick; CString strEndTime = CLoglistUtils::FormatDateAndTime(CTime::GetCurrentTime(), DATE_SHORTDATE, true, false); if(m_bBufferAll) { m_Databuf.m_critSec.Lock(); m_Databuf.push_back(0); m_Log.SetWindowText(Convert2UnionCode((char*)&m_Databuf[0])); m_Databuf.m_critSec.Unlock(); m_Log.LineScroll(m_Log.GetLineCount() - m_Log.GetFirstVisibleLine() - 4); } m_BufStart=0; m_Databuf.m_critSec.Lock(); this->m_Databuf.clear(); m_Databuf.m_critSec.Unlock(); m_bDone = true; m_Animate.Stop(); m_Progress.SetPos(100); this->DialogEnableWindow(IDOK,TRUE); m_GitStatus = (DWORD)lParam; // detect crashes of perl when performing git svn actions if (m_GitStatus == 0 && m_GitCmd.Find(_T(" svn ")) > 1) { CString log; m_Log.GetWindowText(log); if (log.GetLength() > 18 && log.Mid(log.GetLength() - 18) == _T("perl.exe.stackdump")) m_GitStatus = (DWORD)-1; } if(this->m_GitStatus) { if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR); m_pTaskbarList->SetProgressValue(m_hWnd, 100, 100); } CString log; log.Format(IDS_PROC_PROGRESS_GITUNCLEANEXIT, m_GitStatus); CString err; err.Format(_T("\r\n\r\n%s (%lu ms @ %s)\r\n"), log, tickSpent, strEndTime); InsertColorText(this->m_Log, err, RGB(255,0,0)); CSoundUtils::PlayTGitError(); } else { if (m_pTaskbarList) m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS); CString temp; temp.LoadString(IDS_SUCCESS); CString log; log.Format(_T("\r\n%s (%lu ms @ %s)\r\n"), temp, tickSpent, strEndTime); InsertColorText(this->m_Log, log, RGB(0,0,255)); this->DialogEnableWindow(IDCANCEL,FALSE); } if (wParam == MSG_PROGRESSDLG_END) { if (m_PostCmdCallback) // new handling method using callback { m_PostCmdCallback(this, m_caller, m_GitStatus); if (m_PostCmdList.GetCount() > 0) { m_ctrlPostCmd.AddEntries(m_PostCmdList); GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); } } else if (m_GitStatus == 0) // default old behaviour on success { if (m_PostCmdList.GetCount() > 0) { m_ctrlPostCmd.AddEntries(m_PostCmdList); GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); } } else // simple method to show buttons on failed { if (m_PostFailCmdList.GetCount() > 0) { m_ctrlPostCmd.AddEntries(m_PostFailCmdList); GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); } } } if(wParam == MSG_PROGRESSDLG_END && m_GitStatus == 0) { if(m_bAutoCloseOnSuccess) { m_Log.GetWindowText(this->m_LogText); EndDialog(IDOK); } } } if(!m_bBufferAll) { if(lParam == 0) { m_Databuf.m_critSec.Lock(); for (size_t i = this->m_BufStart; i < this->m_Databuf.size(); ++i) { char c = this->m_Databuf[m_BufStart]; ++m_BufStart; m_Databuf.m_critSec.Unlock(); ParserCmdOutput(c); m_Databuf.m_critSec.Lock(); } if(m_BufStart>1000) { m_Databuf.erase(m_Databuf.begin(), m_Databuf.begin()+m_BufStart); m_BufStart =0; } m_Databuf.m_critSec.Unlock(); } else ParserCmdOutput((char)lParam); } return 0; }
LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { m_BufStart = 0 ; m_Animate.Play(0,-1,-1); this->DialogEnableWindow(IDOK,FALSE); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); m_pTaskbarList->SetProgressValue(m_hWnd, 0, 100); } } if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED) { if(m_bBufferAll) { m_Databuf.m_critSec.Lock(); m_Databuf.push_back(0); m_Databuf.m_critSec.Unlock(); InsertCRLF(); m_Databuf.m_critSec.Lock(); m_Log.SetWindowText(Convert2UnionCode((char*)&m_Databuf[0])); m_Databuf.m_critSec.Unlock(); m_Log.LineScroll(m_Log.GetLineCount() - m_Log.GetFirstVisibleLine() - 4); } m_BufStart=0; m_Databuf.m_critSec.Lock(); this->m_Databuf.clear(); m_Databuf.m_critSec.Unlock(); m_bDone = true; m_Animate.Stop(); m_Progress.SetPos(100); this->DialogEnableWindow(IDOK,TRUE); CString err; err.Format(_T("\r\nFailed 0x%x (git returned a wrong return code at some time)\r\n"),m_GitStatus); if(this->m_GitStatus) { if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR); m_pTaskbarList->SetProgressValue(m_hWnd, 100, 100); } //InsertColorText(this->m_Log,err,RGB(255,0,0)); } else { if (m_pTaskbarList) m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS); InsertColorText(this->m_Log,_T("\r\nSuccess\r\n"),RGB(0,0,255)); this->DialogEnableWindow(IDCANCEL,FALSE); } if(wParam == MSG_PROGRESSDLG_END && m_GitStatus == 0) { if(m_bAutoCloseOnSuccess) EndDialog(IDOK); if(m_PostCmdList.GetCount() > 0) { //GetDlgItem(IDC_PROGRESS_BUTTON1)->SetWindowText(m_changeAbortButtonOnSuccessTo); GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); //GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE); //Set default button is "close" rather than "push" this->SendMessage(WM_NEXTDLGCTL, (WPARAM)GetDlgItem(IDOK)->m_hWnd, TRUE); } } } if(!m_bBufferAll) { if(lParam == 0) { m_Databuf.m_critSec.Lock(); for(int i=this->m_BufStart;i<this->m_Databuf.size();i++) { char c = this->m_Databuf[m_BufStart]; m_BufStart++; m_Databuf.m_critSec.Unlock(); ParserCmdOutput(c); m_Databuf.m_critSec.Lock(); } if(m_BufStart>1000) { m_Databuf.erase(m_Databuf.begin(), m_Databuf.begin()+m_BufStart); m_BufStart =0; } m_Databuf.m_critSec.Unlock(); } else ParserCmdOutput((char)lParam); } return 0; }
LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { m_BufStart = 0 ; m_Animate.Play(0,-1,-1); this->DialogEnableWindow(IDOK,FALSE); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); m_pTaskbarList->SetProgressValue(m_hWnd, 0, 100); } } if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED) { if(m_bBufferAll) { m_Databuf.m_critSec.Lock(); m_Databuf.push_back(0); m_Databuf.m_critSec.Unlock(); InsertCRLF(); m_Databuf.m_critSec.Lock(); m_Log.SetWindowText(Convert2UnionCode((char*)&m_Databuf[0])); m_Databuf.m_critSec.Unlock(); m_Log.LineScroll(m_Log.GetLineCount() - m_Log.GetFirstVisibleLine() - 4); } m_BufStart=0; m_Databuf.m_critSec.Lock(); this->m_Databuf.clear(); m_Databuf.m_critSec.Unlock(); m_bDone = true; m_Animate.Stop(); m_Progress.SetPos(100); this->DialogEnableWindow(IDOK,TRUE); m_GitStatus = lParam; // detect crashes of perl when performing git svn actions if (m_GitStatus == 0 && m_GitCmd.Find(_T(" svn ")) > 1) { CString log; m_Log.GetWindowText(log); if (log.GetLength() > 18 && log.Mid(log.GetLength() - 18) == _T("perl.exe.stackdump")) m_GitStatus = -1; } if(this->m_GitStatus) { if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR); m_pTaskbarList->SetProgressValue(m_hWnd, 100, 100); } CString log; log.Format(IDS_PROC_PROGRESS_GITUNCLEANEXIT, m_GitStatus); CString err; err.Format(_T("\r\n\r\n%s\r\n"), log); InsertColorText(this->m_Log, err, RGB(255,0,0)); } else { if (m_pTaskbarList) m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS); CString temp; temp.LoadString(IDS_SUCCESS); CString log; log.Format(_T("\r\n%s\r\n"), temp); InsertColorText(this->m_Log, log, RGB(0,0,255)); this->DialogEnableWindow(IDCANCEL,FALSE); } if(wParam == MSG_PROGRESSDLG_END && m_GitStatus == 0) { if(m_bAutoCloseOnSuccess) { m_Log.GetWindowText(this->m_LogText); EndDialog(IDOK); } if(m_PostCmdList.GetCount() > 0) GetDlgItem(IDC_PROGRESS_BUTTON1)->ShowWindow(SW_SHOW); } } if(!m_bBufferAll) { if(lParam == 0) { m_Databuf.m_critSec.Lock(); for(int i=this->m_BufStart;i<this->m_Databuf.size();i++) { char c = this->m_Databuf[m_BufStart]; m_BufStart++; m_Databuf.m_critSec.Unlock(); ParserCmdOutput(c); m_Databuf.m_critSec.Lock(); } if(m_BufStart>1000) { m_Databuf.erase(m_Databuf.begin(), m_Databuf.begin()+m_BufStart); m_BufStart =0; } m_Databuf.m_critSec.Unlock(); } else ParserCmdOutput((char)lParam); } return 0; }