1 // ProgressDlg.cpp : implementation file
5 #include "TortoiseProc.h"
6 #include "ProgressDlg.h"
11 IMPLEMENT_DYNAMIC(CProgressDlg
, CResizableStandAloneDialog
)
13 CProgressDlg::CProgressDlg(CWnd
* pParent
/*=NULL*/)
14 : CResizableStandAloneDialog(CProgressDlg::IDD
, pParent
), m_bShowCommand(true)
19 CProgressDlg::~CProgressDlg()
27 void CProgressDlg::DoDataExchange(CDataExchange
* pDX
)
29 CDialog::DoDataExchange(pDX
);
30 DDX_Control(pDX
, IDC_CURRENT
, this->m_CurrentWork
);
31 DDX_Control(pDX
, IDC_TITLE_ANIMATE
, this->m_Animate
);
32 DDX_Control(pDX
, IDC_RUN_PROGRESS
, this->m_Progress
);
33 DDX_Control(pDX
, IDC_LOG
, this->m_Log
);
37 BEGIN_MESSAGE_MAP(CProgressDlg
, CResizableStandAloneDialog
)
38 ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI
, OnProgressUpdateUI
)
39 ON_BN_CLICKED(IDOK
, &CProgressDlg::OnBnClickedOk
)
42 BOOL
CProgressDlg::OnInitDialog()
44 CResizableStandAloneDialog::OnInitDialog();
46 AddAnchor(IDC_TITLE_ANIMATE
, TOP_LEFT
, TOP_RIGHT
);
47 AddAnchor(IDC_RUN_PROGRESS
, TOP_LEFT
,TOP_RIGHT
);
48 AddAnchor(IDC_LOG
, TOP_LEFT
,BOTTOM_RIGHT
);
50 AddAnchor(IDOK
,BOTTOM_RIGHT
);
51 AddAnchor(IDCANCEL
,BOTTOM_RIGHT
);
53 m_Animate
.Open(IDR_DOWNLOAD
);
56 if ( !m_PreText
.IsEmpty() )
58 InitialText
= m_PreText
+ _T("\r\n");
60 if (m_bShowCommand
&& (!m_GitCmd
.IsEmpty() ))
62 InitialText
+= m_GitCmd
+_T("\r\n\r\n");
64 m_Log
.SetWindowTextW(InitialText
);
65 m_CurrentWork
.SetWindowTextW(_T(""));
67 m_pThread
= AfxBeginThread(ProgressThreadEntry
, this, THREAD_PRIORITY_NORMAL
,0,CREATE_SUSPENDED
);
70 // ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));
74 m_pThread
->m_bAutoDelete
= FALSE
;
75 m_pThread
->ResumeThread();
78 if(!m_Title
.IsEmpty())
79 this->SetWindowText(m_Title
);
83 UINT
CProgressDlg::ProgressThreadEntry(LPVOID pVoid
)
85 return ((CProgressDlg
*)pVoid
)->ProgressThread();
88 UINT
CProgressDlg::ProgressThread()
90 PROCESS_INFORMATION pi
;
93 this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI
,MSG_PROGRESSDLG_START
,0);
96 if(m_LogFile
.IsEmpty())
101 m_GitCmdList
.push_back(m_GitCmd
);
105 for(int i
=0;i
<m_GitCmdList
.size();i
++)
107 if(m_GitCmdList
[i
].IsEmpty())
110 if (m_bShowCommand
&& m_GitCmdList
[i
]!= m_GitCmd
)
113 str
+= m_GitCmdList
[i
]+_T("\r\n\r\n");
114 for(int j
=0;j
<str
.GetLength();j
++)
115 this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI
,MSG_PROGRESSDLG_RUN
,str
[j
]);
118 g_Git
.RunAsync(this->m_GitCmdList
[i
],&pi
, &hRead
,pfilename
);
123 while(ReadFile(hRead
,buffer
,1,&readnumber
,NULL
))
125 buffer
[readnumber
]=0;
126 this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI
,MSG_PROGRESSDLG_RUN
,(TCHAR
)buffer
[0]);
129 CloseHandle(pi
.hThread
);
131 WaitForSingleObject(pi
.hProcess
, INFINITE
);
134 if(!GetExitCodeProcess(pi
.hProcess
,&status
))
136 return GIT_ERROR_GET_EXIT_CODE
;
138 m_GitStatus
|= status
;
141 CloseHandle(pi
.hProcess
);
145 this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI
,MSG_PROGRESSDLG_END
,0);
150 LRESULT
CProgressDlg::OnProgressUpdateUI(WPARAM wParam
,LPARAM lParam
)
152 if(wParam
== MSG_PROGRESSDLG_START
)
154 m_Animate
.Play(0,-1,-1);
155 this->DialogEnableWindow(IDOK
,FALSE
);
157 if(wParam
== MSG_PROGRESSDLG_END
)
160 m_Progress
.SetPos(100);
161 this->DialogEnableWindow(IDOK
,TRUE
);
165 ParserCmdOutput((TCHAR
)lParam
);
169 int CProgressDlg::FindPercentage(CString
&log
)
171 int s1
=log
.Find(_T('%'));
176 for(int i
=s1
-1;i
>=0;i
--)
178 if(log
[i
]>=_T('0') && log
[i
]<=_T('9'))
183 return _ttol(log
.Mid(s2
,s1
-s2
));
186 void CProgressDlg::ParserCmdOutput(TCHAR ch
)
189 if( ch
== _T('\r') || ch
== _T('\n'))
191 TRACE(_T("End Char %s \r\n"),ch
==_T('\r')?_T("lf"):_T(""));
192 TRACE(_T("End Char %s \r\n"),ch
==_T('\n')?_T("cr"):_T(""));
195 m_Log
.GetWindowTextW(text
);
198 RemoveLastLine(text
);
200 text
+=_T("\r\n")+m_LogText
;
201 m_Log
.SetWindowTextW(text
);
203 m_Log
.LineScroll(m_Log
.GetLineCount());
205 int s1
=m_LogText
.Find(_T(':'));
206 int s2
=m_LogText
.Find(_T('%'));
209 this->m_CurrentWork
.SetWindowTextW(m_LogText
.Left(s1
));
210 int pos
=FindPercentage(m_LogText
);
211 TRACE(_T("Pos %d\r\n"),pos
);
213 this->m_Progress
.SetPos(pos
);
224 void CProgressDlg::RemoveLastLine(CString
&str
)
227 start
=str
.ReverseFind(_T('\n'));
232 // CProgressDlg message handlers
234 void CProgressDlg::OnBnClickedOk()
236 // TODO: Add your control notification handler code here
237 m_Log
.GetWindowText(this->m_LogText
);