OSDN Git Service

Add color success and fail at ProgressDlg
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CloneDlg.cpp
1 // CloneDlg.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "TortoiseProc.h"\r
6 #include "CloneDlg.h"\r
7 #include "BrowseFolder.h"\r
8 #include "MessageBox.h"\r
9 #include "AppUtils.h"\r
10 // CCloneDlg dialog\r
11 \r
12 IMPLEMENT_DYNCREATE(CCloneDlg, CResizableStandAloneDialog)\r
13 \r
14 CCloneDlg::CCloneDlg(CWnd* pParent /*=NULL*/)\r
15         : CResizableStandAloneDialog(CCloneDlg::IDD, pParent)\r
16         , m_Directory(_T(""))\r
17 {\r
18     m_bAutoloadPuttyKeyFile = CAppUtils::IsSSHPutty();\r
19 \r
20         m_bSVN = FALSE;\r
21         m_bSVNTrunk = FALSE;\r
22         m_bSVNTags = FALSE;\r
23         m_bSVNBranch = FALSE;;\r
24         m_strSVNTrunk = _T("trunk");\r
25         m_strSVNTags = _T("tags");\r
26         m_strSVNBranchs = _T("branches");\r
27 \r
28         m_nSVNFrom = 0;\r
29 }\r
30 \r
31 CCloneDlg::~CCloneDlg()\r
32 {\r
33 }\r
34 \r
35 void CCloneDlg::DoDataExchange(CDataExchange* pDX)\r
36 {\r
37         CResizableStandAloneDialog::DoDataExchange(pDX);\r
38         DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);\r
39     DDX_Control(pDX, IDC_PUTTYKEYFILE, m_PuttyKeyCombo);\r
40         DDX_Text(pDX, IDC_CLONE_DIR, m_Directory);\r
41     DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD, m_bAutoloadPuttyKeyFile);\r
42 \r
43         DDX_Check(pDX,IDC_CHECK_SVN, m_bSVN);\r
44         DDX_Check(pDX,IDC_CHECK_SVN_TRUNK, m_bSVNTrunk);\r
45         DDX_Check(pDX,IDC_CHECK_SVN_TAG, m_bSVNTags);\r
46         DDX_Check(pDX,IDC_CHECK_SVN_BRANCH, m_bSVNBranch);\r
47         DDX_Check(pDX,IDC_CHECK_SVN_FROM, m_bSVNFrom);\r
48 \r
49         DDX_Text(pDX, IDC_EDIT_SVN_TRUNK, m_strSVNTrunk);\r
50         DDX_Text(pDX, IDC_EDIT_SVN_TAG, m_strSVNTags);\r
51         DDX_Text(pDX, IDC_EDIT_SVN_BRANCH, m_strSVNBranchs);\r
52         DDX_Text(pDX, IDC_EDIT_SVN_FROM, this->m_nSVNFrom);\r
53 \r
54 }\r
55 \r
56 BOOL CCloneDlg::OnInitDialog()\r
57 {\r
58         CResizableStandAloneDialog::OnInitDialog();\r
59         AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);\r
60         AddAnchor(IDC_CLONE_BROWSE_URL, TOP_RIGHT);\r
61         AddAnchor(IDC_CLONE_DIR, TOP_LEFT,TOP_RIGHT);\r
62         AddAnchor(IDC_CLONE_DIR_BROWSE, TOP_RIGHT);\r
63         AddAnchor(IDOK,BOTTOM_RIGHT);\r
64         AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
65 \r
66     AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,TOP_RIGHT);\r
67     AddAnchor(IDC_PUTTYKEYFILE_BROWSE,TOP_RIGHT);\r
68     AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);\r
69     AddAnchor(IDC_PUTTYKEYFILE,TOP_LEFT,TOP_RIGHT);\r
70         AddAnchor(IDC_CLONE_GROUP_SVN,TOP_LEFT,TOP_RIGHT);\r
71         AddAnchor(IDHELP, BOTTOM_RIGHT);\r
72 \r
73         this->AddOthersToAnchor();\r
74 \r
75         m_URLCombo.SetURLHistory(TRUE);\r
76         m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url"));\r
77         if(m_URL.IsEmpty())\r
78         {\r
79                 CString str=CAppUtils::GetClipboardLink();\r
80                 if(str.IsEmpty())\r
81                         m_URLCombo.SetCurSel(0);\r
82                 else\r
83                         m_URLCombo.SetWindowText(str);\r
84         }\r
85         else\r
86                 m_URLCombo.SetWindowText(m_URL);\r
87 \r
88         CWnd *window=this->GetDlgItem(IDC_CLONE_DIR);\r
89         if(window)\r
90                 SHAutoComplete(window->m_hWnd, SHACF_FILESYSTEM);\r
91 \r
92     m_PuttyKeyCombo.SetPathHistory(TRUE);\r
93     m_PuttyKeyCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\puttykey"), _T("key"));\r
94     m_PuttyKeyCombo.SetCurSel(0);\r
95 \r
96     this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD)->EnableWindow( CAppUtils::IsSSHPutty() );\r
97     this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
98     this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
99        \r
100     EnableSaveRestore(_T("CloneDlg"));\r
101         \r
102         OnBnClickedCheckSvn();\r
103 \r
104         return TRUE;  // return TRUE  unless you set the focus to a control\r
105 }\r
106 \r
107 BEGIN_MESSAGE_MAP(CCloneDlg, CResizableStandAloneDialog)\r
108         ON_BN_CLICKED(IDC_CLONE_BROWSE_URL, &CCloneDlg::OnBnClickedCloneBrowseUrl)\r
109         ON_BN_CLICKED(IDC_CLONE_DIR_BROWSE, &CCloneDlg::OnBnClickedCloneDirBrowse)\r
110     ON_BN_CLICKED(IDC_PUTTYKEYFILE_BROWSE, &CCloneDlg::OnBnClickedPuttykeyfileBrowse)\r
111     ON_BN_CLICKED(IDC_PUTTYKEY_AUTOLOAD, &CCloneDlg::OnBnClickedPuttykeyAutoload)\r
112         ON_CBN_SELCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnSelchangeUrlcombo)\r
113         ON_NOTIFY(CBEN_BEGINEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenBegineditUrlcombo)\r
114         ON_NOTIFY(CBEN_ENDEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenEndeditUrlcombo)\r
115         ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnEditchangeUrlcombo)\r
116         ON_BN_CLICKED(IDC_CHECK_SVN, &CCloneDlg::OnBnClickedCheckSvn)\r
117         ON_BN_CLICKED(IDC_CHECK_SVN_TRUNK, &CCloneDlg::OnBnClickedCheckSvnTrunk)\r
118         ON_BN_CLICKED(IDC_CHECK_SVN_TAG, &CCloneDlg::OnBnClickedCheckSvnTag)\r
119         ON_BN_CLICKED(IDC_CHECK_SVN_BRANCH, &CCloneDlg::OnBnClickedCheckSvnBranch)\r
120         ON_BN_CLICKED(IDC_CHECK_SVN_FROM, &CCloneDlg::OnBnClickedCheckSvnFrom)\r
121 END_MESSAGE_MAP()\r
122 \r
123 \r
124 \r
125 // CCloneDlg message handlers\r
126 \r
127 void CCloneDlg::OnOK()\r
128 {\r
129         this->m_URLCombo.GetWindowTextW(m_URL);\r
130         m_URL.Trim();\r
131         UpdateData(TRUE);\r
132         if(m_URL.IsEmpty() || m_Directory.IsEmpty())\r
133         {\r
134                 CMessageBox::Show(NULL, _T("URL or Directory can't be empty"), _T("TortoiseGit"), MB_OK);\r
135                 return;\r
136         }\r
137 \r
138         m_URLCombo.SaveHistory();\r
139     m_PuttyKeyCombo.SaveHistory();\r
140 \r
141     this->m_PuttyKeyCombo.GetWindowText(m_strPuttyKeyFile);\r
142         CResizableDialog::OnOK();\r
143 \r
144 }\r
145 \r
146 void CCloneDlg::OnCancel()\r
147 {\r
148         CResizableDialog::OnCancel();\r
149 }\r
150 \r
151 void CCloneDlg::OnBnClickedCloneBrowseUrl()\r
152 {\r
153         // TODO: Add your control notification handler code here\r
154         CBrowseFolder browseFolder;\r
155         browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
156         CString strCloneDirectory;\r
157         this->m_URLCombo.GetWindowTextW(strCloneDirectory);\r
158         if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) \r
159         {\r
160                 this->m_URLCombo.SetWindowTextW(strCloneDirectory);\r
161         }\r
162 }\r
163 \r
164 void CCloneDlg::OnBnClickedCloneDirBrowse()\r
165 {\r
166         // TODO: Add your control notification handler code here\r
167         CBrowseFolder browseFolder;\r
168         browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
169         CString strCloneDirectory = this->m_Directory;\r
170         if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) \r
171         {\r
172                 UpdateData(TRUE);\r
173                 m_Directory = strCloneDirectory;\r
174                 UpdateData(FALSE);\r
175         }\r
176 }\r
177 \r
178 void CCloneDlg::OnEnChangeCloneDir()\r
179 {\r
180         // TODO:  If this is a RICHEDIT control, the control will not\r
181         // send this notification unless you override the CDHtmlDialog::OnInitDialog()\r
182         // function and call CRichEditCtrl().SetEventMask()\r
183         // with the ENM_CHANGE flag ORed into the mask.\r
184 \r
185         // TODO:  Add your control notification handler code here\r
186 }\r
187 \r
188 void CCloneDlg::OnBnClickedPuttykeyfileBrowse()\r
189 {\r
190     // TODO: Add your control notification handler code here\r
191     CFileDialog dlg(TRUE,NULL,\r
192                                         NULL,\r
193                                         OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
194                                         _T("Putty Private Key(*.ppk)|*.ppk|All Files(*.*)|*.*||"));\r
195         \r
196         this->UpdateData();\r
197         if(dlg.DoModal()==IDOK)\r
198         {\r
199         this->m_PuttyKeyCombo.SetWindowText( dlg.GetPathName() );\r
200         }\r
201 \r
202 }\r
203 \r
204 void CCloneDlg::OnBnClickedPuttykeyAutoload()\r
205 {\r
206     // TODO: Add your control notification handler code here\r
207     this->UpdateData();\r
208     this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
209     this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);\r
210 \r
211 }\r
212 \r
213 void CCloneDlg::OnCbnSelchangeUrlcombo()\r
214 {\r
215         // TODO: Add your control notification handler code here\r
216 }\r
217 \r
218 void CCloneDlg::OnCbenBegineditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)\r
219 {\r
220         // TODO: Add your control notification handler code here\r
221         *pResult = 0;\r
222 }\r
223 \r
224 void CCloneDlg::OnCbenEndeditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)\r
225 {\r
226         // TODO: Add your control notification handler code here\r
227         *pResult = 0;\r
228 }\r
229 \r
230 void CCloneDlg::OnCbnEditchangeUrlcombo()\r
231 {\r
232         // TODO: Add your control notification handler code here\r
233         this->UpdateData();\r
234         CString url;\r
235         m_URLCombo.GetWindowText(url);\r
236 \r
237         if(m_OldURL == url )\r
238                 return;\r
239 \r
240         m_OldURL=url;\r
241 \r
242         //if(url.IsEmpty())\r
243         //      return;\r
244 \r
245         CString old;\r
246         old=m_ModuleName;\r
247 \r
248         url.Replace(_T('\\'),_T('/'));\r
249         int start=url.ReverseFind(_T('/'));\r
250         if(start<0)\r
251         {\r
252                 start = url.ReverseFind(_T(':'));\r
253                 if(start <0)\r
254                         start = url.ReverseFind(_T('@'));\r
255 \r
256                 if(start<0)\r
257                         start = 0;\r
258         }\r
259         CString temp;\r
260         temp=url.Mid(start+1);\r
261         \r
262         temp=temp.MakeLower();\r
263 \r
264         int end;\r
265         end=temp.Find(_T(".git"));\r
266         if(end<0)\r
267                 end=temp.GetLength();\r
268 \r
269         //CString modulename;\r
270         m_ModuleName=url.Mid(start+1,end);\r
271         \r
272         start = m_Directory.ReverseFind(_T('\\'));\r
273         if(start <0 )\r
274                 start = m_Directory.ReverseFind(_T('/'));\r
275         if(start <0 )\r
276                 start =0;\r
277 \r
278         int dirstart=m_Directory.Find(old,start);\r
279         if(dirstart>=0 && (dirstart+old.GetLength() == m_Directory.GetLength()) )\r
280         {\r
281                 m_Directory=m_Directory.Left(dirstart);\r
282                 m_Directory+=m_ModuleName;\r
283 \r
284         }else\r
285         {\r
286                 if(m_Directory.GetLength()>0 && \r
287                         (m_Directory[m_Directory.GetLength()-1] != _T('\\') ||\r
288                         m_Directory[m_Directory.GetLength()-1] != _T('/') ) )\r
289                 {\r
290                         m_Directory+=_T('\\');\r
291                 }\r
292                 m_Directory += m_ModuleName;\r
293         }\r
294 \r
295         if(m_Directory.GetLength()>0)\r
296         {\r
297                 if( m_Directory[m_Directory.GetLength()-1] == _T('\\') ||\r
298                         m_Directory[m_Directory.GetLength()-1] == _T('/')\r
299                    )\r
300                 {\r
301                         m_Directory=m_Directory.Left(m_Directory.GetLength()-1);\r
302                 }\r
303 \r
304         }\r
305         this->UpdateData(FALSE);\r
306 }\r
307 \r
308 void CCloneDlg::OnBnClickedCheckSvn()\r
309 {\r
310         this->UpdateData();\r
311 \r
312         if(this->m_bSVN)\r
313         {\r
314                 CString str;\r
315                 m_URLCombo.GetWindowText(str);\r
316 \r
317                 while(str.GetLength()>=1 && \r
318                         str[str.GetLength()-1] == _T('\\') &&\r
319                         str[str.GetLength()-1] == _T('/'))\r
320                 {\r
321                         str=str.Left(str.GetLength()-1);\r
322                 }\r
323                 if(str.GetLength()>=5 && (str.Right(5).MakeLower() == _T("trunk") ))\r
324                 {\r
325                         this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = FALSE;\r
326                         this->UpdateData(FALSE);\r
327                 }else\r
328                 {\r
329                         this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = TRUE;\r
330                         this->UpdateData(FALSE);\r
331                 }\r
332 \r
333         }\r
334 \r
335         // TODO: Add your control notification handler code here\r
336         OnBnClickedCheckSvnTrunk();\r
337         OnBnClickedCheckSvnTag();\r
338         OnBnClickedCheckSvnBranch();\r
339         OnBnClickedCheckSvnFrom();\r
340 }\r
341 \r
342 void CCloneDlg::OnBnClickedCheckSvnTrunk()\r
343 {\r
344         // TODO: Add your control notification handler code here\r
345         UpdateData(TRUE);\r
346         this->GetDlgItem(IDC_CHECK_SVN_TRUNK)->EnableWindow(this->m_bSVN);\r
347         this->GetDlgItem(IDC_EDIT_SVN_TRUNK)->EnableWindow(this->m_bSVNTrunk&&this->m_bSVN);\r
348 }\r
349 \r
350 void CCloneDlg::OnBnClickedCheckSvnTag()\r
351 {\r
352         // TODO: Add your control notification handler code here\r
353         UpdateData(TRUE);\r
354         this->GetDlgItem(IDC_CHECK_SVN_TAG)->EnableWindow(this->m_bSVN);\r
355         this->GetDlgItem(IDC_EDIT_SVN_TAG)->EnableWindow(this->m_bSVNTags&&this->m_bSVN);\r
356 }\r
357 \r
358 void CCloneDlg::OnBnClickedCheckSvnBranch()\r
359 {\r
360         // TODO: Add your control notification handler code here\r
361         UpdateData(TRUE);\r
362         this->GetDlgItem(IDC_CHECK_SVN_BRANCH)->EnableWindow(this->m_bSVN);\r
363         this->GetDlgItem(IDC_EDIT_SVN_BRANCH)->EnableWindow(this->m_bSVNBranch&&this->m_bSVN);\r
364 }\r
365 \r
366 void CCloneDlg::OnBnClickedCheckSvnFrom()\r
367 {\r
368         // TODO: Add your control notification handler code here\r
369         UpdateData(TRUE);\r
370         this->GetDlgItem(IDC_CHECK_SVN_FROM)->EnableWindow(this->m_bSVN);\r
371         this->GetDlgItem(IDC_EDIT_SVN_FROM)->EnableWindow(this->m_bSVNFrom&&this->m_bSVN);\r
372 }\r