OSDN Git Service

ProgressDlg: Disable 'Abort' button when command is done.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / ProgressDlg.cpp
index e1a86dd..a218184 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), m_bDone(false)\r
 {\r
 \r
 }\r
@@ -36,6 +36,7 @@ void CProgressDlg::DoDataExchange(CDataExchange* pDX)
 \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
@@ -130,8 +131,13 @@ UINT CProgressDlg::ProgressThread()
                WaitForSingleObject(pi.hProcess, INFINITE);\r
                \r
                DWORD status=0;\r
-               if(!GetExitCodeProcess(pi.hProcess,&status))\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
@@ -153,11 +159,25 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
                m_Animate.Play(0,-1,-1);\r
                this->DialogEnableWindow(IDOK,FALSE);\r
        }\r
-       if(wParam == MSG_PROGRESSDLG_END)\r
+       if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
        {\r
+               m_bDone = true;\r
                m_Animate.Stop();\r
                m_Progress.SetPos(100);\r
                this->DialogEnableWindow(IDOK,TRUE);\r
+               if(wParam == MSG_PROGRESSDLG_END && m_GitStatus == 0)\r
+               {\r
+                       if(m_bAutoCloseOnSuccess)\r
+                               EndDialog(IDOK);\r
+                       if(!m_changeAbortButtonOnSuccessTo.IsEmpty())\r
+                       {\r
+                               GetDlgItem(IDCANCEL)->SetWindowText(m_changeAbortButtonOnSuccessTo);\r
+                       }\r
+                       else\r
+                               DialogEnableWindow(IDCANCEL, FALSE);\r
+               }\r
+               else\r
+                       DialogEnableWindow(IDCANCEL, FALSE);\r
        }\r
 \r
        if(lParam != 0)\r
@@ -229,3 +249,21 @@ 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
+       if(m_bDone)\r
+       {\r
+               CResizableStandAloneDialog::OnCancel();\r
+               return;\r
+       }\r
+\r
+       m_bAbort = true;\r
+}\r