OSDN Git Service

SyncDlg Fix no patch created problem
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / SyncDlg.cpp
1 // TortoiseGit - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2008-2009 - TortoiseGit\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 \r
20 // SyncDlg.cpp : implementation file\r
21 //\r
22 \r
23 #include "stdafx.h"\r
24 #include "TortoiseProc.h"\r
25 #include "SyncDlg.h"\r
26 #include "progressdlg.h"\r
27 #include "MessageBox.h"\r
28 \r
29 // CSyncDlg dialog\r
30 \r
31 IMPLEMENT_DYNAMIC(CSyncDlg, CResizableStandAloneDialog)\r
32 \r
33 CSyncDlg::CSyncDlg(CWnd* pParent /*=NULL*/)\r
34         : CResizableStandAloneDialog(CSyncDlg::IDD, pParent)\r
35 {\r
36         m_pTooltip=&this->m_tooltips;\r
37         m_bInited=false;\r
38         m_CmdOutCurrentPos=0;\r
39         m_bAutoLoadPuttyKey = CAppUtils::IsSSHPutty();\r
40 }\r
41 \r
42 CSyncDlg::~CSyncDlg()\r
43 {\r
44 }\r
45 \r
46 void CSyncDlg::DoDataExchange(CDataExchange* pDX)\r
47 {\r
48         CDialog::DoDataExchange(pDX);\r
49         DDX_Check(pDX, IDC_CHECK_PUTTY_KEY, m_bAutoLoadPuttyKey);\r
50         DDX_Check(pDX, IDC_CHECK_FORCE,m_bForce);\r
51         DDX_Control(pDX, IDC_COMBOBOXEX_URL, m_ctrlURL);\r
52         DDX_Control(pDX, IDC_BUTTON_TABCTRL, m_ctrlDumyButton);\r
53         DDX_Control(pDX, IDC_BUTTON_PULL, m_ctrlPull);\r
54         DDX_Control(pDX, IDC_BUTTON_PUSH, m_ctrlPush);\r
55         DDX_Control(pDX, IDC_STATIC_STATUS, m_ctrlStatus);\r
56         DDX_Control(pDX, IDC_PROGRESS_SYNC, m_ctrlProgress);\r
57         DDX_Control(pDX, IDC_ANIMATE_SYNC, m_ctrlAnimate);\r
58 \r
59         BRANCH_COMBOX_DDX;\r
60 }\r
61 \r
62 \r
63 BEGIN_MESSAGE_MAP(CSyncDlg, CResizableStandAloneDialog)\r
64         ON_BN_CLICKED(IDC_BUTTON_PULL, &CSyncDlg::OnBnClickedButtonPull)\r
65         ON_BN_CLICKED(IDC_BUTTON_PUSH, &CSyncDlg::OnBnClickedButtonPush)\r
66         ON_BN_CLICKED(IDC_BUTTON_APPLY, &CSyncDlg::OnBnClickedButtonApply)\r
67         ON_BN_CLICKED(IDC_BUTTON_EMAIL, &CSyncDlg::OnBnClickedButtonEmail)\r
68         ON_BN_CLICKED(IDC_BUTTON_MANAGE, &CSyncDlg::OnBnClickedButtonManage)\r
69         BRANCH_COMBOX_EVENT\r
70         ON_NOTIFY(CBEN_ENDEDIT, IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbenEndeditComboboxexUrl)\r
71         ON_CBN_EDITCHANGE(IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbnEditchangeComboboxexUrl)\r
72         ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
73 END_MESSAGE_MAP()\r
74 \r
75 \r
76 void CSyncDlg::EnableControlButton(bool bEnabled)\r
77 {\r
78         GetDlgItem(IDC_BUTTON_PULL)->EnableWindow(bEnabled);\r
79         GetDlgItem(IDC_BUTTON_PUSH)->EnableWindow(bEnabled);\r
80         GetDlgItem(IDC_BUTTON_APPLY)->EnableWindow(bEnabled);\r
81         GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(bEnabled);\r
82         GetDlgItem(IDOK)->EnableWindow(bEnabled);\r
83 }\r
84 // CSyncDlg message handlers\r
85 \r
86 void CSyncDlg::OnBnClickedButtonPull()\r
87 {\r
88         // TODO: Add your control notification handler code here\r
89         this->m_regPullButton =this->m_ctrlPull.GetCurrentEntry();\r
90 }\r
91 \r
92 void CSyncDlg::OnBnClickedButtonPush()\r
93 {\r
94         // TODO: Add your control notification handler code here\r
95         this->UpdateData();\r
96 \r
97         this->m_regPushButton=this->m_ctrlPush.GetCurrentEntry();\r
98         this->SwitchToRun();\r
99         this->m_bAbort=false;\r
100         this->m_GitCmdList.clear();\r
101 \r
102         ShowTab(IDC_CMD_LOG);\r
103 \r
104         CString cmd;\r
105         CString tags;\r
106         CString force;\r
107         CString all;\r
108         this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
109         this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
110         this->m_ctrlURL.GetWindowText(this->m_strURL);\r
111         m_strRemoteBranch=m_strRemoteBranch.Trim();\r
112         \r
113         this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->EnableWindow(this->m_bAutoLoadPuttyKey);\r
114 \r
115         switch (m_ctrlPush.GetCurrentEntry())\r
116         {\r
117         case 1:\r
118                 tags = _T(" --tags ");\r
119                 break;\r
120         case 2:\r
121                 all = _T(" --all ");\r
122                 break;\r
123         }\r
124 \r
125         if(this->m_bForce)\r
126                 force = _T(" --force ");\r
127 \r
128         cmd.Format(_T("git.exe push %s %s %s \"%s\" %s"),\r
129                                 tags,force,all,\r
130                                 m_strURL,\r
131                                 m_strLocalBranch);\r
132 \r
133         if (!m_strRemoteBranch.IsEmpty())\r
134         {\r
135                 cmd += _T(":") + m_strRemoteBranch;\r
136         }\r
137         \r
138         m_GitCmdList.push_back(cmd);\r
139 \r
140         m_CurrentCmd = GIT_COMMAND_PUSH;\r
141 \r
142         if(this->m_bAutoLoadPuttyKey)\r
143         {\r
144                 CAppUtils::LaunchPAgent(NULL,&this->m_strURL);\r
145         }\r
146 \r
147         m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);\r
148         if (m_pThread==NULL)\r
149         {\r
150 //              ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));\r
151         }\r
152         else\r
153         {\r
154                 m_pThread->m_bAutoDelete = TRUE;\r
155                 m_pThread->ResumeThread();\r
156         }\r
157         \r
158 }\r
159 \r
160 void CSyncDlg::OnBnClickedButtonApply()\r
161 {\r
162         // TODO: Add your control notification handler code here\r
163 }\r
164 \r
165 void CSyncDlg::OnBnClickedButtonEmail()\r
166 {\r
167         // TODO: Add your control notification handler code here\r
168         CString cmd,out;\r
169         \r
170         this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
171         this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
172         this->m_ctrlURL.GetWindowText(this->m_strURL);\r
173         m_strURL=m_strURL.Trim();\r
174         m_strRemoteBranch=m_strRemoteBranch.Trim();\r
175         \r
176         cmd.Format(_T("git.exe  format-patch -o \"%s\" %s..%s"),\r
177                                         g_Git.m_CurrentDir,\r
178                                         m_strURL+_T('/')+m_strRemoteBranch,m_strLocalBranch);\r
179         \r
180         if(g_Git.Run(cmd,&out,CP_ACP))\r
181         {\r
182                 CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
183                 return ;\r
184         }\r
185 \r
186         CAppUtils::SendPatchMail(cmd,out);      \r
187 \r
188 }\r
189 void CSyncDlg::ShowProgressCtrl(bool bShow)\r
190 {\r
191         int b=bShow?SW_NORMAL:SW_HIDE;\r
192         this->m_ctrlAnimate.ShowWindow(b);\r
193         this->m_ctrlProgress.ShowWindow(b);\r
194         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
195         if(b == SW_NORMAL)\r
196                 this->m_ctrlAnimate.Play(0,-1,-1);\r
197         else\r
198                 this->m_ctrlAnimate.Stop();\r
199 }\r
200 void CSyncDlg::ShowInputCtrl(bool bShow)\r
201 {\r
202         int b=bShow?SW_NORMAL:SW_HIDE;\r
203         this->m_ctrlURL.ShowWindow(b);\r
204         this->m_ctrlLocalBranch.ShowWindow(b);\r
205         this->m_ctrlRemoteBranch.ShowWindow(b);\r
206         this->GetDlgItem(IDC_BUTTON_LOCAL_BRANCH)->ShowWindow(b);\r
207         this->GetDlgItem(IDC_BUTTON_REMOTE_BRANCH)->ShowWindow(b);\r
208         this->GetDlgItem(IDC_STATIC_LOCAL_BRANCH)->ShowWindow(b);\r
209         this->GetDlgItem(IDC_STATIC_REMOTE_BRANCH)->ShowWindow(b);\r
210         this->GetDlgItem(IDC_BUTTON_MANAGE)->ShowWindow(b);\r
211         this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->ShowWindow(b);\r
212         this->GetDlgItem(IDC_CHECK_FORCE)->ShowWindow(b);\r
213         this->GetDlgItem(IDC_STATIC_REMOTE_URL)->ShowWindow(b);\r
214         \r
215 }\r
216 BOOL CSyncDlg::OnInitDialog()\r
217 {\r
218         CResizableStandAloneDialog::OnInitDialog();\r
219 \r
220         /*\r
221         this->m_ctrlAnimate.ShowWindow(SW_NORMAL);\r
222         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
223         this->m_ctrlAnimate.Play(0,-1,-1);\r
224     */\r
225 \r
226         // ------------------ Create Tabctrl -----------\r
227         CWnd *pwnd=this->GetDlgItem(IDC_BUTTON_TABCTRL);\r
228         CRect rectDummy;\r
229         pwnd->GetWindowRect(&rectDummy);\r
230         this->ScreenToClient(rectDummy);\r
231 \r
232         if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_SYNC_TAB))\r
233         {\r
234                 TRACE0("Failed to create output tab window\n");\r
235                 return FALSE;      // fail to create\r
236         }\r
237         m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);\r
238 \r
239         // -------------Create Command Log Ctrl ---------\r
240         DWORD dwStyle;\r
241         dwStyle= ES_MULTILINE | ES_READONLY | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL |WS_VSCROLL  ;\r
242 \r
243         if( !m_ctrlCmdOut.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_CMD_LOG))\r
244         {\r
245                 TRACE0("Failed to create Log commits window\n");\r
246                 return FALSE;      // fail to create\r
247         }\r
248 \r
249         m_ctrlTabCtrl.InsertTab(&m_ctrlCmdOut,_T("Log"),-1);\r
250         \r
251         //m_ctrlCmdOut.ReplaceSel(_T("Hello"));\r
252 \r
253         //----------  Create Commit List Ctrl---------------\r
254                         \r
255         dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;;\r
256 \r
257         if( !m_OutLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_LOGLIST))\r
258         {\r
259                 TRACE0("Failed to create output commits window\n");\r
260                 return FALSE;      // fail to create\r
261 \r
262         }\r
263 \r
264         m_ctrlTabCtrl.InsertTab(&m_OutLogList,_T("Out Commits"),-1);\r
265         \r
266 \r
267         m_OutLogList.InsertGitColumn();\r
268 \r
269         //------------- Create Change File List Control ----------------\r
270 \r
271         dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
272         \r
273         if( !m_OutChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_CHANGELIST))\r
274         {\r
275                 TRACE0("Failed to create output change files window\n");\r
276                 return FALSE;      // fail to create\r
277         }\r
278         m_ctrlTabCtrl.InsertTab(&m_OutChangeFileList,_T("Out ChangeList"),-1);\r
279 \r
280         m_OutChangeFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
281                                     (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
282                                                         CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
283 \r
284         this->m_tooltips.Create(this);\r
285 \r
286         AddAnchor(IDC_SYNC_TAB,TOP_LEFT,BOTTOM_RIGHT);\r
287 \r
288         AddAnchor(IDC_GROUP_INFO,TOP_LEFT,TOP_RIGHT);\r
289         AddAnchor(IDC_COMBOBOXEX_URL,TOP_LEFT,TOP_RIGHT);\r
290         AddAnchor(IDC_BUTTON_MANAGE,TOP_RIGHT);\r
291         AddAnchor(IDC_BUTTON_PULL,BOTTOM_LEFT);\r
292         AddAnchor(IDC_BUTTON_PUSH,BOTTOM_LEFT);\r
293         AddAnchor(IDC_BUTTON_APPLY,BOTTOM_LEFT);\r
294         AddAnchor(IDC_BUTTON_EMAIL,BOTTOM_LEFT);\r
295         AddAnchor(IDC_PROGRESS_SYNC,TOP_LEFT,TOP_RIGHT);\r
296         AddAnchor(IDOK,BOTTOM_RIGHT);\r
297         AddAnchor(IDHELP,BOTTOM_RIGHT);\r
298         AddAnchor(IDC_STATIC_STATUS,BOTTOM_LEFT);\r
299         AddAnchor(IDC_ANIMATE_SYNC,TOP_LEFT);\r
300         \r
301         BRANCH_COMBOX_ADD_ANCHOR();\r
302 \r
303         CString WorkingDir=g_Git.m_CurrentDir;\r
304         WorkingDir.Replace(_T(':'),_T('_'));\r
305         m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir;\r
306 \r
307 \r
308         this->AddOthersToAnchor();\r
309         // TODO:  Add extra initialization here\r
310 \r
311         this->m_ctrlPush.AddEntry(CString(_T("Push")));\r
312         this->m_ctrlPush.AddEntry(CString(_T("Push tags")));\r
313         ///this->m_ctrlPush.AddEntry(CString(_T("Push All")));\r
314 \r
315         this->m_ctrlPull.AddEntry(CString(_T("&Pull")));\r
316         this->m_ctrlPull.AddEntry(CString(_T("&Fetch")));\r
317         this->m_ctrlPull.AddEntry(CString(_T("Fetch&&Rebase")));\r
318 \r
319         \r
320         WorkingDir.Replace(_T(':'),_T('_'));\r
321 \r
322         CString regkey ;\r
323         regkey.Format(_T("Software\\TortoiseGit\\TortoiseProc\\Sync\\%s"),WorkingDir);\r
324 \r
325         this->m_regPullButton = CRegDWORD(regkey+_T("\\Pull"),0);\r
326         this->m_regPushButton = CRegDWORD(regkey+_T("\\Push"),0);\r
327 \r
328         this->m_ctrlPull.SetCurrentEntry(this->m_regPullButton);\r
329         this->m_ctrlPush.SetCurrentEntry(this->m_regPushButton);\r
330 \r
331         CString str;\r
332         this->GetWindowText(str);\r
333         str += _T(" - ") + g_Git.m_CurrentDir;\r
334         this->SetWindowText(str);\r
335 \r
336         EnableSaveRestore(_T("SyncDlg"));\r
337 \r
338         this->LoadBranchInfo();\r
339 \r
340         this->m_bInited=true;\r
341         FetchOutList();\r
342         \r
343         m_ctrlTabCtrl.ShowTab(IDC_CMD_LOG-1,false);\r
344 \r
345         return TRUE;  // return TRUE unless you set the focus to a control\r
346         // EXCEPTION: OCX Property Pages should return FALSE\r
347 }\r
348 \r
349 void CSyncDlg::OnBnClickedButtonManage()\r
350 {\r
351         // TODO: Add your control notification handler code here\r
352         CAppUtils::LaunchRemoteSetting();\r
353 }\r
354 \r
355 BOOL CSyncDlg::PreTranslateMessage(MSG* pMsg)\r
356 {\r
357         // TODO: Add your specialized code here and/or call the base class\r
358         m_tooltips.RelayEvent(pMsg);\r
359         return __super::PreTranslateMessage(pMsg);\r
360 }\r
361 void CSyncDlg::FetchOutList(bool force)\r
362 {\r
363         if(!m_bInited)\r
364                 return;\r
365         m_OutChangeFileList.Clear();\r
366         this->m_OutLogList.Clear();\r
367 \r
368         CString remote;\r
369         this->m_ctrlURL.GetWindowText(remote);\r
370         CString remotebranch;\r
371         this->m_ctrlRemoteBranch.GetWindowText(remotebranch);\r
372         remotebranch=remote+_T("/")+remotebranch;\r
373 \r
374         if(IsURL())\r
375         {\r
376                 CString str;\r
377                 str=_T("Don't know what will push befause you enter URL");\r
378                 m_OutLogList.ShowText(str);\r
379                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
380                 m_OutLocalBranch.Empty();\r
381                 m_OutRemoteBranch.Empty();\r
382 \r
383                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
384                 return ;\r
385         \r
386         }else if(g_Git.GetHash(remotebranch).GetLength()<40)\r
387         {\r
388                 CString str;\r
389                 str.Format(_T("Don't know what will push befause unkown \"%s\""),remotebranch);\r
390                 m_OutLogList.ShowText(str);\r
391                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
392                 m_OutLocalBranch.Empty();\r
393                 m_OutRemoteBranch.Empty();\r
394 \r
395                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
396                 return ;\r
397         }\r
398         else\r
399         {\r
400                 CString localbranch;\r
401                 localbranch=this->m_ctrlLocalBranch.GetString();\r
402 \r
403                 if(localbranch != m_OutLocalBranch || m_OutRemoteBranch != remotebranch || force)\r
404                 {\r
405                         m_OutLogList.ClearText();\r
406                         m_OutLogList.FillGitLog(NULL,CGit::     LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
407                                 &remotebranch,&localbranch);\r
408                         \r
409                         CString str;\r
410                         if(m_OutLogList.GetItemCount() == 0)\r
411                         {                       \r
412                                 str.Format(_T("No commits ahead \"%s\""),remotebranch);\r
413                                 m_OutLogList.ShowText(str);\r
414                                 this->m_ctrlStatus.SetWindowText(str);\r
415                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
416                                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(FALSE);\r
417                         }\r
418                         else\r
419                         {\r
420                                 str.Format(_T("%d commits ahead \"%s\""),m_OutLogList.GetItemCount(),remotebranch);\r
421                                 this->m_ctrlStatus.SetWindowText(str);\r
422                                 g_Git.GetCommitDiffList(localbranch,remotebranch,m_arOutChangeList);\r
423                                 m_OutChangeFileList.m_Rev1=localbranch;\r
424                                 m_OutChangeFileList.m_Rev2=remotebranch;\r
425                                 m_OutChangeFileList.Show(0,this->m_arOutChangeList);\r
426                                 m_OutChangeFileList.SetEmptyString(CString(_T("No changed file")));\r
427                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,TRUE);\r
428                                 this->GetDlgItem(IDC_BUTTON_EMAIL)->EnableWindow(TRUE);\r
429                         }\r
430                 }\r
431                 this->m_OutLocalBranch=localbranch;\r
432                 this->m_OutRemoteBranch=remotebranch;\r
433         }\r
434 \r
435 }\r
436 \r
437 bool CSyncDlg::IsURL()\r
438 {\r
439         CString str;\r
440         this->m_ctrlURL.GetWindowText(str);\r
441         if(str.Find(_T('\\'))>=0 || str.Find(_T('/'))>=0)\r
442                 return true;\r
443         else\r
444                 return false;\r
445 }\r
446 void CSyncDlg::OnCbenEndeditComboboxexUrl(NMHDR *pNMHDR, LRESULT *pResult)\r
447 {\r
448         // TODO: Add your control notification handler code here\r
449         *pResult = 0;\r
450 }\r
451 \r
452 void CSyncDlg::OnCbnEditchangeComboboxexUrl()\r
453 {\r
454         this->FetchOutList();\r
455         // TODO: Add your control notification handler code here\r
456 }\r
457 \r
458 UINT CSyncDlg::ProgressThread()\r
459 {\r
460         m_GitCmdStatus=CProgressDlg::RunCmdList(this,m_GitCmdList,true,NULL,&this->m_bAbort);\r
461         return 0;\r
462 }\r
463 \r
464 \r
465 LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)\r
466 {\r
467         if(wParam == MSG_PROGRESSDLG_START)\r
468         {\r
469                 m_ctrlAnimate.Play(0,-1,-1);\r
470                 this->m_ctrlProgress.SetPos(0);\r
471         }\r
472 \r
473         if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
474         {\r
475                 //m_bDone = true;\r
476                 m_ctrlAnimate.Stop();\r
477                 m_ctrlProgress.SetPos(100);\r
478                 //this->DialogEnableWindow(IDOK,TRUE);\r
479 \r
480                 //if(wParam == MSG_PROGRESSDLG_END)\r
481                 {\r
482                         EnableControlButton(true);\r
483                         SwitchToInput();\r
484                         this->FetchOutList(true);\r
485                 }\r
486         }\r
487 \r
488         if(lParam != 0)\r
489                 ParserCmdOutput((TCHAR)lParam);\r
490 \r
491         return 0;\r
492 }\r
493 \r
494 void CSyncDlg::ParserCmdOutput(TCHAR ch)\r
495 {\r
496         //TRACE(_T("%c"),ch);\r
497         int linenum;\r
498         int index;\r
499         linenum = this->m_ctrlCmdOut.GetLineCount();\r
500 \r
501         if( ch == _T('\r') )\r
502         {\r
503                 if(linenum>0)\r
504                         m_CmdOutCurrentPos = this->m_ctrlCmdOut.LineIndex(linenum-1);\r
505                 else\r
506                         m_CmdOutCurrentPos = 0;\r
507 \r
508                 //TRACE(_T("line %d - %d\n"),index,m_ctrlCmdOut.GetTextLength());\r
509         }else\r
510                 m_CmdOutCurrentPos++;\r
511                 \r
512         this->m_ctrlCmdOut.SetSel(m_CmdOutCurrentPos,m_CmdOutCurrentPos+1);\r
513         \r
514         if( ch != _T('\r') )\r
515                 this->m_ctrlCmdOut.ReplaceSel(CString(ch));\r
516         \r
517         int firstline = m_ctrlCmdOut.GetFirstVisibleLine();\r
518         if( linenum - firstline > 4 )\r
519                 this->m_ctrlCmdOut.LineScroll(linenum - firstline -4);\r
520 \r
521         if( ch == _T('\r') || ch == _T('\n') )\r
522         {\r
523                 int s1=m_LogText.Find(_T(':'));\r
524                 int s2=m_LogText.Find(_T('%'));\r
525                 if(s1>0 && s2>0)\r
526                 {\r
527                         //      this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));\r
528                         int pos=CProgressDlg::FindPercentage(m_LogText);\r
529                         TRACE(_T("Pos %d\r\n"),pos);\r
530                         if(pos>0)\r
531                                 this->m_ctrlProgress.SetPos(pos);\r
532                 }\r
533                 m_LogText=_T("");       \r
534         }\r
535         m_LogText+=ch;\r
536 \r
537 }