OSDN Git Service

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