Update version number to 1.5.7.0
[TortoiseGit.git] / src / TortoiseProc / CloneDlg.cpp
blobaeaded04b3bfe22d7bf336ca4a34bab253e59e0d
1 // CloneDlg.cpp : implementation file
2 //
4 #include "stdafx.h"
5 #include "TortoiseProc.h"
6 #include "CloneDlg.h"
7 #include "BrowseFolder.h"
8 #include "MessageBox.h"
9 #include "AppUtils.h"
10 // CCloneDlg dialog
12 IMPLEMENT_DYNCREATE(CCloneDlg, CResizableStandAloneDialog)
14 CCloneDlg::CCloneDlg(CWnd* pParent /*=NULL*/)
15 : CResizableStandAloneDialog(CCloneDlg::IDD, pParent)
16 , m_Directory(_T(""))
18 m_bAutoloadPuttyKeyFile = CAppUtils::IsSSHPutty();
20 m_bSVN = FALSE;
21 m_bSVNTrunk = FALSE;
22 m_bSVNTags = FALSE;
23 m_bSVNBranch = FALSE;
24 m_bSVNUserName = FALSE;
26 m_strSVNTrunk = _T("trunk");
27 m_strSVNTags = _T("tags");
28 m_strSVNBranchs = _T("branches");
30 m_regBrowseUrl = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\CloneBrowse"),0);
31 m_nSVNFrom = 0;
33 m_nDepth = 0;
34 m_bDepth = false;
37 CCloneDlg::~CCloneDlg()
41 void CCloneDlg::DoDataExchange(CDataExchange* pDX)
43 CResizableStandAloneDialog::DoDataExchange(pDX);
44 DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);
45 DDX_Control(pDX, IDC_PUTTYKEYFILE, m_PuttyKeyCombo);
46 DDX_Control(pDX, IDC_CLONE_BROWSE_URL, m_BrowseUrl);
47 DDX_Text(pDX, IDC_CLONE_DIR, m_Directory);
48 DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD, m_bAutoloadPuttyKeyFile);
50 DDX_Check(pDX,IDC_CHECK_SVN, m_bSVN);
51 DDX_Check(pDX,IDC_CHECK_SVN_TRUNK, m_bSVNTrunk);
52 DDX_Check(pDX,IDC_CHECK_SVN_TAG, m_bSVNTags);
53 DDX_Check(pDX,IDC_CHECK_SVN_BRANCH, m_bSVNBranch);
54 DDX_Check(pDX,IDC_CHECK_SVN_FROM, m_bSVNFrom);
55 DDX_Check(pDX,IDC_CHECK_USERNAME, m_bSVNUserName);
57 DDX_Text(pDX, IDC_EDIT_SVN_TRUNK, m_strSVNTrunk);
58 DDX_Text(pDX, IDC_EDIT_SVN_TAG, m_strSVNTags);
59 DDX_Text(pDX, IDC_EDIT_SVN_BRANCH, m_strSVNBranchs);
60 DDX_Text(pDX, IDC_EDIT_SVN_FROM, this->m_nSVNFrom);
61 DDX_Text(pDX, IDC_EDIT_USERNAME,m_strUserName);
63 DDX_Check(pDX, IDC_CHECK_DEPTH, m_bDepth);
64 DDX_Text(pDX, IDC_EDIT_DEPTH,m_nDepth);
68 BOOL CCloneDlg::OnInitDialog()
70 CResizableStandAloneDialog::OnInitDialog();
71 AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);
72 AddAnchor(IDC_CLONE_BROWSE_URL, TOP_RIGHT);
73 AddAnchor(IDC_CLONE_DIR, TOP_LEFT,TOP_RIGHT);
74 AddAnchor(IDC_CLONE_DIR_BROWSE, TOP_RIGHT);
75 AddAnchor(IDOK,BOTTOM_RIGHT);
76 AddAnchor(IDCANCEL,BOTTOM_RIGHT);
78 AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,TOP_RIGHT);
79 AddAnchor(IDC_PUTTYKEYFILE_BROWSE,TOP_RIGHT);
80 AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);
81 AddAnchor(IDC_PUTTYKEYFILE,TOP_LEFT,TOP_RIGHT);
82 AddAnchor(IDC_CLONE_GROUP_SVN,TOP_LEFT,TOP_RIGHT);
83 AddAnchor(IDHELP, BOTTOM_RIGHT);
85 m_tooltips.Create(this);
86 CString tt;
87 tt.LoadString(IDS_CLONE_DEPTH_TT);
88 m_tooltips.AddTool(IDC_EDIT_DEPTH,tt);
89 m_tooltips.AddTool(IDC_CHECK_DEPTH,tt);
91 this->AddOthersToAnchor();
93 m_URLCombo.SetURLHistory(TRUE);
94 m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url"));
95 if(m_URL.IsEmpty())
97 CString str=CAppUtils::GetClipboardLink();
98 if(str.IsEmpty())
99 m_URLCombo.SetCurSel(0);
100 else
101 m_URLCombo.SetWindowText(str);
103 else
104 m_URLCombo.SetWindowText(m_URL);
106 CWnd *window=this->GetDlgItem(IDC_CLONE_DIR);
107 if(window)
108 SHAutoComplete(window->m_hWnd, SHACF_FILESYSTEM);
110 this->m_BrowseUrl.AddEntry(CString(_T("Dir...")));
111 this->m_BrowseUrl.AddEntry(CString(_T("Web")));
112 m_BrowseUrl.SetCurrentEntry(m_regBrowseUrl);
114 m_PuttyKeyCombo.SetPathHistory(TRUE);
115 m_PuttyKeyCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\puttykey"), _T("key"));
116 m_PuttyKeyCombo.SetCurSel(0);
118 this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD)->EnableWindow( CAppUtils::IsSSHPutty() );
119 this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);
120 this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);
122 EnableSaveRestore(_T("CloneDlg"));
124 OnBnClickedCheckSvn();
125 OnBnClickedCheckDepth();
126 return TRUE; // return TRUE unless you set the focus to a control
129 BEGIN_MESSAGE_MAP(CCloneDlg, CResizableStandAloneDialog)
130 ON_BN_CLICKED(IDC_CLONE_BROWSE_URL, &CCloneDlg::OnBnClickedCloneBrowseUrl)
131 ON_BN_CLICKED(IDC_CLONE_DIR_BROWSE, &CCloneDlg::OnBnClickedCloneDirBrowse)
132 ON_BN_CLICKED(IDC_PUTTYKEYFILE_BROWSE, &CCloneDlg::OnBnClickedPuttykeyfileBrowse)
133 ON_BN_CLICKED(IDC_PUTTYKEY_AUTOLOAD, &CCloneDlg::OnBnClickedPuttykeyAutoload)
134 ON_CBN_SELCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnSelchangeUrlcombo)
135 ON_NOTIFY(CBEN_BEGINEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenBegineditUrlcombo)
136 ON_NOTIFY(CBEN_ENDEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenEndeditUrlcombo)
137 ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnEditchangeUrlcombo)
138 ON_BN_CLICKED(IDC_CHECK_SVN, &CCloneDlg::OnBnClickedCheckSvn)
139 ON_BN_CLICKED(IDC_CHECK_SVN_TRUNK, &CCloneDlg::OnBnClickedCheckSvnTrunk)
140 ON_BN_CLICKED(IDC_CHECK_SVN_TAG, &CCloneDlg::OnBnClickedCheckSvnTag)
141 ON_BN_CLICKED(IDC_CHECK_SVN_BRANCH, &CCloneDlg::OnBnClickedCheckSvnBranch)
142 ON_BN_CLICKED(IDC_CHECK_SVN_FROM, &CCloneDlg::OnBnClickedCheckSvnFrom)
143 ON_BN_CLICKED(IDC_CHECK_DEPTH, &CCloneDlg::OnBnClickedCheckDepth)
144 ON_BN_CLICKED(IDC_CHECK_USERNAME, &CCloneDlg::OnBnClickedCheckUsername)
145 END_MESSAGE_MAP()
149 // CCloneDlg message handlers
151 void CCloneDlg::OnOK()
153 this->m_URLCombo.GetWindowTextW(m_URL);
154 m_URL.Trim();
155 UpdateData(TRUE);
156 if(m_URL.IsEmpty() || m_Directory.IsEmpty())
158 CMessageBox::Show(NULL, _T("URL or Directory can't be empty"), _T("TortoiseGit"), MB_OK);
159 return;
162 m_URLCombo.SaveHistory();
163 m_PuttyKeyCombo.SaveHistory();
165 this->m_PuttyKeyCombo.GetWindowText(m_strPuttyKeyFile);
166 CResizableDialog::OnOK();
170 void CCloneDlg::OnCancel()
172 CResizableDialog::OnCancel();
175 void CCloneDlg::OnBnClickedCloneBrowseUrl()
177 // TODO: Add your control notification handler code here
178 CBrowseFolder browseFolder;
179 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
180 CString strCloneDirectory;
182 int sel = this->m_BrowseUrl.GetCurrentEntry();
183 this->m_regBrowseUrl = sel;
185 if( sel == 1 )
187 CString str;
188 m_URLCombo.GetWindowText(str);
189 ShellExecute(NULL, _T("open"), str, NULL,NULL, SW_SHOW);
190 return ;
193 this->m_URLCombo.GetWindowTextW(strCloneDirectory);
194 if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK)
196 this->m_URLCombo.SetWindowTextW(strCloneDirectory);
200 void CCloneDlg::OnBnClickedCloneDirBrowse()
202 // TODO: Add your control notification handler code here
203 CBrowseFolder browseFolder;
204 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
205 CString strCloneDirectory = this->m_Directory;
206 if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK)
208 UpdateData(TRUE);
209 m_Directory = strCloneDirectory;
210 UpdateData(FALSE);
214 void CCloneDlg::OnEnChangeCloneDir()
216 // TODO: If this is a RICHEDIT control, the control will not
217 // send this notification unless you override the CDHtmlDialog::OnInitDialog()
218 // function and call CRichEditCtrl().SetEventMask()
219 // with the ENM_CHANGE flag ORed into the mask.
221 // TODO: Add your control notification handler code here
224 void CCloneDlg::OnBnClickedPuttykeyfileBrowse()
226 // TODO: Add your control notification handler code here
227 CFileDialog dlg(TRUE,NULL,
228 NULL,
229 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
230 _T("Putty Private Key(*.ppk)|*.ppk|All Files(*.*)|*.*||"));
232 this->UpdateData();
233 if(dlg.DoModal()==IDOK)
235 this->m_PuttyKeyCombo.SetWindowText( dlg.GetPathName() );
240 void CCloneDlg::OnBnClickedPuttykeyAutoload()
242 // TODO: Add your control notification handler code here
243 this->UpdateData();
244 this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);
245 this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);
249 void CCloneDlg::OnCbnSelchangeUrlcombo()
251 // TODO: Add your control notification handler code here
254 void CCloneDlg::OnCbenBegineditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)
256 // TODO: Add your control notification handler code here
257 *pResult = 0;
260 void CCloneDlg::OnCbenEndeditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)
262 // TODO: Add your control notification handler code here
263 *pResult = 0;
266 void CCloneDlg::OnCbnEditchangeUrlcombo()
268 // TODO: Add your control notification handler code here
269 this->UpdateData();
270 CString url;
271 m_URLCombo.GetWindowText(url);
273 if(m_OldURL == url )
274 return;
276 m_OldURL=url;
278 //if(url.IsEmpty())
279 // return;
281 CString old;
282 old=m_ModuleName;
284 url.Replace(_T('\\'),_T('/'));
285 int start=url.ReverseFind(_T('/'));
286 if(start<0)
288 start = url.ReverseFind(_T(':'));
289 if(start <0)
290 start = url.ReverseFind(_T('@'));
292 if(start<0)
293 start = 0;
295 CString temp;
296 temp=url.Mid(start+1);
298 temp=temp.MakeLower();
300 int end;
301 end=temp.Find(_T(".git"));
302 if(end<0)
303 end=temp.GetLength();
305 //CString modulename;
306 m_ModuleName=url.Mid(start+1,end);
308 start = m_Directory.ReverseFind(_T('\\'));
309 if(start <0 )
310 start = m_Directory.ReverseFind(_T('/'));
311 if(start <0 )
312 start =0;
314 int dirstart=m_Directory.Find(old,start);
315 if(dirstart>=0 && (dirstart+old.GetLength() == m_Directory.GetLength()) )
317 m_Directory=m_Directory.Left(dirstart);
318 m_Directory+=m_ModuleName;
320 }else
322 if(m_Directory.GetLength()>0 &&
323 (m_Directory[m_Directory.GetLength()-1] != _T('\\') ||
324 m_Directory[m_Directory.GetLength()-1] != _T('/') ) )
326 m_Directory+=_T('\\');
328 m_Directory += m_ModuleName;
331 if(m_Directory.GetLength()>0)
333 if( m_Directory[m_Directory.GetLength()-1] == _T('\\') ||
334 m_Directory[m_Directory.GetLength()-1] == _T('/')
337 m_Directory=m_Directory.Left(m_Directory.GetLength()-1);
341 this->UpdateData(FALSE);
344 void CCloneDlg::OnBnClickedCheckSvn()
346 this->UpdateData();
348 if(this->m_bSVN)
350 CString str;
351 m_URLCombo.GetWindowText(str);
353 while(str.GetLength()>=1 &&
354 str[str.GetLength()-1] == _T('\\') &&
355 str[str.GetLength()-1] == _T('/'))
357 str=str.Left(str.GetLength()-1);
359 if(str.GetLength()>=5 && (str.Right(5).MakeLower() == _T("trunk") ))
361 this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = FALSE;
362 this->UpdateData(FALSE);
363 }else
365 this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = TRUE;
366 this->UpdateData(FALSE);
371 // TODO: Add your control notification handler code here
372 OnBnClickedCheckSvnTrunk();
373 OnBnClickedCheckSvnTag();
374 OnBnClickedCheckSvnBranch();
375 OnBnClickedCheckSvnFrom();
376 OnBnClickedCheckUsername();
379 void CCloneDlg::OnBnClickedCheckSvnTrunk()
381 // TODO: Add your control notification handler code here
382 UpdateData(TRUE);
383 this->GetDlgItem(IDC_CHECK_SVN_TRUNK)->EnableWindow(this->m_bSVN);
384 this->GetDlgItem(IDC_EDIT_SVN_TRUNK)->EnableWindow(this->m_bSVNTrunk&&this->m_bSVN);
387 void CCloneDlg::OnBnClickedCheckSvnTag()
389 // TODO: Add your control notification handler code here
390 UpdateData(TRUE);
391 this->GetDlgItem(IDC_CHECK_SVN_TAG)->EnableWindow(this->m_bSVN);
392 this->GetDlgItem(IDC_EDIT_SVN_TAG)->EnableWindow(this->m_bSVNTags&&this->m_bSVN);
395 void CCloneDlg::OnBnClickedCheckSvnBranch()
397 // TODO: Add your control notification handler code here
398 UpdateData(TRUE);
399 this->GetDlgItem(IDC_CHECK_SVN_BRANCH)->EnableWindow(this->m_bSVN);
400 this->GetDlgItem(IDC_EDIT_SVN_BRANCH)->EnableWindow(this->m_bSVNBranch&&this->m_bSVN);
403 void CCloneDlg::OnBnClickedCheckSvnFrom()
405 // TODO: Add your control notification handler code here
406 UpdateData(TRUE);
407 this->GetDlgItem(IDC_CHECK_SVN_FROM)->EnableWindow(this->m_bSVN);
408 this->GetDlgItem(IDC_EDIT_SVN_FROM)->EnableWindow(this->m_bSVNFrom&&this->m_bSVN);
411 void CCloneDlg::OnBnClickedCheckDepth()
413 UpdateData(TRUE);
414 this->GetDlgItem(IDC_EDIT_DEPTH)->EnableWindow(this->m_bDepth);
416 BOOL CCloneDlg::PreTranslateMessage(MSG* pMsg)
418 // TODO: Add your specialized code here and/or call the base class
419 m_tooltips.RelayEvent(pMsg);
421 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
424 void CCloneDlg::OnBnClickedCheckUsername()
426 // TODO: Add your control notification handler code here
427 UpdateData(TRUE);
428 this->GetDlgItem(IDC_CHECK_USERNAME)->EnableWindow(this->m_bSVN);
429 this->GetDlgItem(IDC_EDIT_USERNAME)->EnableWindow(this->m_bSVNUserName && this->m_bSVN);