OSDN Git Service

Parse output at SyncDialog
authorFrank Li <lznuaa@gmail.com>
Wed, 22 Jul 2009 14:33:25 +0000 (22:33 +0800)
committerFrank Li <lznuaa@gmail.com>
Wed, 22 Jul 2009 14:33:25 +0000 (22:33 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/TortoiseProc/SyncDlg.cpp
src/TortoiseProc/SyncDlg.h

index 7f87a6a..c15b328 100644 (file)
@@ -23,7 +23,7 @@
 #include "stdafx.h"\r
 #include "TortoiseProc.h"\r
 #include "SyncDlg.h"\r
-\r
+#include "progressdlg.h"\r
 \r
 // CSyncDlg dialog\r
 \r
@@ -66,9 +66,18 @@ BEGIN_MESSAGE_MAP(CSyncDlg, CResizableStandAloneDialog)
        BRANCH_COMBOX_EVENT\r
        ON_NOTIFY(CBEN_ENDEDIT, IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbenEndeditComboboxexUrl)\r
        ON_CBN_EDITCHANGE(IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbnEditchangeComboboxexUrl)\r
+       ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
 END_MESSAGE_MAP()\r
 \r
 \r
+void CSyncDlg::EnableControlButton(bool bEnabled)\r
+{\r
+       GetDlgItem(IDC_BUTTON_PULL)->EnableWindow(bEnabled);\r
+       GetDlgItem(IDC_BUTTON_PUSH)->EnableWindow(bEnabled);\r
+       GetDlgItem(IDC_BUTTON_APPLY)->EnableWindow(bEnabled);\r
+       GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(bEnabled);\r
+       GetDlgItem(IDOK)->EnableWindow(bEnabled);\r
+}\r
 // CSyncDlg message handlers\r
 \r
 void CSyncDlg::OnBnClickedButtonPull()\r
@@ -82,6 +91,40 @@ void CSyncDlg::OnBnClickedButtonPush()
        // TODO: Add your control notification handler code here\r
        this->m_regPushButton=this->m_ctrlPush.GetCurrentEntry();\r
        this->SwitchToRun();\r
+       this->m_bAbort=false;\r
+       this->m_GitCmdList.clear();\r
+\r
+       CString cmd;\r
+       CString tags;\r
+       CString force;\r
+       this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
+       this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
+       this->m_ctrlURL.GetWindowText(this->m_strURL);\r
+       m_strRemoteBranch=m_strRemoteBranch.Trim();\r
+       \r
+       cmd.Format(_T("git.exe push %s %s \"%s\" %s"),\r
+                               tags,force,\r
+                               m_strURL,\r
+                               m_strLocalBranch);\r
+\r
+       if (!m_strRemoteBranch.IsEmpty())\r
+       {\r
+               cmd += _T(":") + m_strRemoteBranch;\r
+       }\r
+       \r
+       m_GitCmdList.push_back(cmd);\r
+\r
+       m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);\r
+       if (m_pThread==NULL)\r
+       {\r
+//             ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));\r
+       }\r
+       else\r
+       {\r
+               m_pThread->m_bAutoDelete = TRUE;\r
+               m_pThread->ResumeThread();\r
+       }\r
+       \r
 }\r
 \r
 void CSyncDlg::OnBnClickedButtonApply()\r
@@ -351,3 +394,70 @@ void CSyncDlg::OnCbnEditchangeComboboxexUrl()
        this->FetchOutList();\r
        // TODO: Add your control notification handler code here\r
 }\r
+\r
+UINT CSyncDlg::ProgressThread()\r
+{\r
+       m_GitCmdStatus=CProgressDlg::RunCmdList(this,m_GitCmdList,true,NULL,&this->m_bAbort);\r
+       return 0;\r
+}\r
+\r
+\r
+LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)\r
+{\r
+       if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
+       {\r
+               //m_bDone = true;\r
+               m_ctrlAnimate.Stop();\r
+               m_ctrlProgress.SetPos(100);\r
+               //this->DialogEnableWindow(IDOK,TRUE);\r
+\r
+               if(wParam == MSG_PROGRESSDLG_END)\r
+               {\r
+                       EnableControlButton(true);\r
+                       SwitchToInput();\r
+               }\r
+       }\r
+\r
+       if(lParam != 0)\r
+               ParserCmdOutput((TCHAR)lParam);\r
+\r
+       return 0;\r
+}\r
+\r
+void CSyncDlg::ParserCmdOutput(TCHAR ch)\r
+{\r
+       TRACE(_T("%c"),ch);\r
+       if( ch == _T('\r') || ch == _T('\n'))\r
+       {\r
+               TRACE(_T("End Char %s \r\n"),ch==_T('\r')?_T("lf"):_T(""));\r
+               TRACE(_T("End Char %s \r\n"),ch==_T('\n')?_T("cr"):_T(""));\r
+\r
+               int linenum = this->m_ctrlCmdOut.GetLineCount();\r
+               int index = this->m_ctrlCmdOut.LineIndex(linenum-1);\r
+               if(linenum == 0)\r
+                       index = 0;\r
+\r
+               this->m_ctrlCmdOut.SetSel(index,-1);\r
+                       \r
+               this->m_ctrlCmdOut.ReplaceSel(m_LogText);\r
+               \r
+               this->m_ctrlCmdOut.LineScroll(linenum-1);\r
+               \r
+               int s1=m_LogText.Find(_T(':'));\r
+               int s2=m_LogText.Find(_T('%'));\r
+               if(s1>0 && s2>0)\r
+               {\r
+               //      this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));\r
+                       int pos=CProgressDlg::FindPercentage(m_LogText);\r
+                       TRACE(_T("Pos %d\r\n"),pos);\r
+                       if(pos>0)\r
+                               this->m_ctrlProgress.SetPos(pos);\r
+               }\r
+\r
+               m_LogText=_T("");\r
+\r
+       }else\r
+       {\r
+               m_LogText+=ch;\r
+       }\r
+}
\ No newline at end of file
index 4c83628..a08f50f 100644 (file)
@@ -65,6 +65,10 @@ protected:
 \r
        CTGitPathList   m_arOutChangeList;\r
 \r
+       CWinThread*                             m_pThread;      \r
+\r
+       void            ParserCmdOutput(TCHAR ch);\r
+\r
        virtual void LocalBranchChange(){FetchOutList();};\r
        virtual void RemoteBranchChange(){FetchOutList();};\r
 \r
@@ -79,7 +83,12 @@ protected:
                        this->m_ctrlURL.AddString(remote);\r
                }\r
        }\r
+\r
+       std::vector<CString> m_GitCmdList;\r
+       bool m_bAbort;\r
+       int  m_GitCmdStatus;\r
        \r
+       CString m_LogText;\r
        CString m_OutLocalBranch;\r
        CString m_OutRemoteBranch;\r
        \r
@@ -87,10 +96,16 @@ protected:
        void ShowInputCtrl(bool bShow=true);\r
        void SwitchToRun(){ShowProgressCtrl(true);ShowInputCtrl(false);}\r
        void SwitchToInput(){ShowProgressCtrl(false);ShowInputCtrl(true);}\r
+       LRESULT OnProgressUpdateUI(WPARAM wParam,LPARAM lParam);\r
+\r
 \r
        DECLARE_MESSAGE_MAP()\r
 public:\r
        BOOL m_bAutoLoadPuttyKey;\r
+       CString m_strURL;\r
+\r
+       static UINT ProgressThreadEntry(LPVOID pVoid){ return ((CSyncDlg*)pVoid) ->ProgressThread(); };\r
+       UINT            ProgressThread();\r
        \r
        CHistoryCombo m_ctrlURL;\r
        CButton m_ctrlDumyButton;\r
@@ -108,4 +123,6 @@ public:
        virtual BOOL PreTranslateMessage(MSG* pMsg);\r
        afx_msg void OnCbenEndeditComboboxexUrl(NMHDR *pNMHDR, LRESULT *pResult);\r
        afx_msg void OnCbnEditchangeComboboxexUrl();\r
+\r
+       void EnableControlButton(bool bEnabled=true);\r
 };\r