OSDN Git Service

ProgressDlg: Changed 'OK' into 'Close' and 'Cancel' into 'Abort'
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / ProgressDlg.cpp
index 83dfd50..ce8ff32 100644 (file)
@@ -11,7 +11,7 @@
 IMPLEMENT_DYNAMIC(CProgressDlg, CResizableStandAloneDialog)\r
 \r
 CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)\r
-       : CResizableStandAloneDialog(CProgressDlg::IDD, pParent), m_bShowCommand(true)\r
+       : CResizableStandAloneDialog(CProgressDlg::IDD, pParent), m_bShowCommand(true), m_bAutoCloseOnSuccess(false), m_bAbort(false)\r
 {\r
 \r
 }\r
@@ -35,6 +35,8 @@ void CProgressDlg::DoDataExchange(CDataExchange* pDX)
 \r
 \r
 BEGIN_MESSAGE_MAP(CProgressDlg, CResizableStandAloneDialog)\r
+       ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
+       ON_BN_CLICKED(IDOK, &CProgressDlg::OnBnClickedOk)\r
 END_MESSAGE_MAP()\r
 \r
 BOOL CProgressDlg::OnInitDialog()\r
@@ -55,7 +57,7 @@ BOOL CProgressDlg::OnInitDialog()
        {\r
                InitialText = m_PreText + _T("\r\n");\r
        }\r
-       if (m_bShowCommand)\r
+       if (m_bShowCommand && (!m_GitCmd.IsEmpty() ))\r
        {\r
                InitialText += m_GitCmd+_T("\r\n\r\n");\r
        }\r
@@ -72,6 +74,9 @@ BOOL CProgressDlg::OnInitDialog()
                m_pThread->m_bAutoDelete = FALSE;\r
                m_pThread->ResumeThread();\r
        }\r
+\r
+       if(!m_Title.IsEmpty())\r
+               this->SetWindowText(m_Title);\r
        return TRUE;\r
 }\r
 \r
@@ -85,7 +90,7 @@ UINT CProgressDlg::ProgressThread()
        PROCESS_INFORMATION pi;\r
        HANDLE hRead;\r
 \r
-       m_Animate.Play(0,-1,-1);\r
+       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_START,0);\r
 \r
        CString *pfilename;\r
        if(m_LogFile.IsEmpty())\r
@@ -93,39 +98,90 @@ UINT CProgressDlg::ProgressThread()
        else\r
                pfilename=&m_LogFile;\r
 \r
-       g_Git.RunAsync(this->m_GitCmd,&pi, &hRead,pfilename);\r
-       this->DialogEnableWindow(IDOK,FALSE);\r
+       m_GitCmdList.push_back(m_GitCmd);\r
+\r
+       m_GitStatus =0;\r
 \r
-       DWORD readnumber;\r
-       char buffer[2];\r
-       CString output;\r
-       while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
+       for(int i=0;i<m_GitCmdList.size();i++)\r
        {\r
-               buffer[readnumber]=0;\r
-               ParserCmdOutput((TCHAR)buffer[0]);\r
-       }\r
+               if(m_GitCmdList[i].IsEmpty())\r
+                       continue;\r
 \r
-       CloseHandle(pi.hThread);\r
+               if (m_bShowCommand && m_GitCmdList[i]!= m_GitCmd)\r
+               {\r
+                       CString str;\r
+                       str+= m_GitCmdList[i]+_T("\r\n\r\n");\r
+                       for(int j=0;j<str.GetLength();j++)\r
+                               this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]);\r
+               }\r
 \r
-       WaitForSingleObject(pi.hProcess, INFINITE);\r
-       m_GitStatus =0;\r
+               g_Git.RunAsync(this->m_GitCmdList[i],&pi, &hRead,pfilename);\r
 \r
-       if(!GetExitCodeProcess(pi.hProcess,&m_GitStatus))\r
-       {\r
-               return GIT_ERROR_GET_EXIT_CODE;\r
+               DWORD readnumber;\r
+               char buffer[2];\r
+               CString output;\r
+               while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
+               {\r
+                       buffer[readnumber]=0;\r
+                       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,(TCHAR)buffer[0]);\r
+               }\r
+       \r
+               CloseHandle(pi.hThread);\r
+\r
+               WaitForSingleObject(pi.hProcess, INFINITE);\r
+               \r
+               DWORD status=0;\r
+               if(!GetExitCodeProcess(pi.hProcess,&status) || m_bAbort)\r
+               {\r
+                       CloseHandle(pi.hProcess);\r
+\r
+                       CloseHandle(hRead);\r
+\r
+                       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_FAILED,0);\r
+                       return GIT_ERROR_GET_EXIT_CODE;\r
+               }\r
+               m_GitStatus |= status;\r
        }\r
 \r
        CloseHandle(pi.hProcess);\r
 \r
        CloseHandle(hRead);\r
 \r
-       m_Progress.SetPos(100);\r
-       this->DialogEnableWindow(IDOK,TRUE);\r
+       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_END,0);\r
 \r
-       m_Animate.Stop();\r
        return 0;\r
 }\r
 \r
+LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)\r
+{\r
+       if(wParam == MSG_PROGRESSDLG_START)\r
+       {\r
+               m_Animate.Play(0,-1,-1);\r
+               this->DialogEnableWindow(IDOK,FALSE);\r
+       }\r
+       if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
+       {\r
+               m_Animate.Stop();\r
+               m_Progress.SetPos(100);\r
+               this->DialogEnableWindow(IDOK,TRUE);\r
+               if(wParam == MSG_PROGRESSDLG_END)\r
+               {\r
+                       if(m_bAutoCloseOnSuccess)\r
+                               EndDialog(IDOK);\r
+                       if(m_changeAbortButtonOnSuccessTo.IsEmpty())\r
+                       {\r
+                               GetDlgItem(IDCANCEL)->SetWindowText(m_changeAbortButtonOnSuccessTo);\r
+                       }\r
+               }\r
+               else\r
+                       DialogEnableWindow(IDCANCEL, FALSE);\r
+       }\r
+\r
+       if(lParam != 0)\r
+               ParserCmdOutput((TCHAR)lParam);\r
+\r
+       return 0;\r
+}\r
 int CProgressDlg::FindPercentage(CString &log)\r
 {\r
        int s1=log.Find(_T('%'));\r
@@ -190,3 +246,15 @@ void CProgressDlg::RemoveLastLine(CString &str)
        return;\r
 }\r
 // CProgressDlg message handlers\r
+\r
+void CProgressDlg::OnBnClickedOk()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       m_Log.GetWindowText(this->m_LogText);\r
+       OnOK();\r
+}\r
+\r
+void CProgressDlg::OnCancel()\r
+{\r
+       m_bAbort = true;\r
+}\r