Fixed issue #406: Putty key can't save when clone.
[TortoiseGit.git] / src / TortoiseProc / CloneDlg.cpp
blobb0985eb295859cefc81e2b7e291b9a6943553726
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_strSVNTrunk = _T("trunk");
25 m_strSVNTags = _T("tags");
26 m_strSVNBranchs = _T("branches");
28 m_regBrowseUrl = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\CloneBrowse"),0);
29 m_nSVNFrom = 0;
31 m_nDepth = 0;
32 m_bDepth = false;
35 CCloneDlg::~CCloneDlg()
39 void CCloneDlg::DoDataExchange(CDataExchange* pDX)
41 CResizableStandAloneDialog::DoDataExchange(pDX);
42 DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);
43 DDX_Control(pDX, IDC_PUTTYKEYFILE, m_PuttyKeyCombo);
44 DDX_Control(pDX, IDC_CLONE_BROWSE_URL, m_BrowseUrl);
45 DDX_Text(pDX, IDC_CLONE_DIR, m_Directory);
46 DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD, m_bAutoloadPuttyKeyFile);
48 DDX_Check(pDX,IDC_CHECK_SVN, m_bSVN);
49 DDX_Check(pDX,IDC_CHECK_SVN_TRUNK, m_bSVNTrunk);
50 DDX_Check(pDX,IDC_CHECK_SVN_TAG, m_bSVNTags);
51 DDX_Check(pDX,IDC_CHECK_SVN_BRANCH, m_bSVNBranch);
52 DDX_Check(pDX,IDC_CHECK_SVN_FROM, m_bSVNFrom);
54 DDX_Text(pDX, IDC_EDIT_SVN_TRUNK, m_strSVNTrunk);
55 DDX_Text(pDX, IDC_EDIT_SVN_TAG, m_strSVNTags);
56 DDX_Text(pDX, IDC_EDIT_SVN_BRANCH, m_strSVNBranchs);
57 DDX_Text(pDX, IDC_EDIT_SVN_FROM, this->m_nSVNFrom);
59 DDX_Check(pDX, IDC_CHECK_DEPTH, m_bDepth);
60 DDX_Text(pDX, IDC_EDIT_DEPTH,m_nDepth);
63 BOOL CCloneDlg::OnInitDialog()
65 CResizableStandAloneDialog::OnInitDialog();
66 AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);
67 AddAnchor(IDC_CLONE_BROWSE_URL, TOP_RIGHT);
68 AddAnchor(IDC_CLONE_DIR, TOP_LEFT,TOP_RIGHT);
69 AddAnchor(IDC_CLONE_DIR_BROWSE, TOP_RIGHT);
70 AddAnchor(IDOK,BOTTOM_RIGHT);
71 AddAnchor(IDCANCEL,BOTTOM_RIGHT);
73 AddAnchor(IDC_GROUP_CLONE,TOP_LEFT,TOP_RIGHT);
74 AddAnchor(IDC_PUTTYKEYFILE_BROWSE,TOP_RIGHT);
75 AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);
76 AddAnchor(IDC_PUTTYKEYFILE,TOP_LEFT,TOP_RIGHT);
77 AddAnchor(IDC_CLONE_GROUP_SVN,TOP_LEFT,TOP_RIGHT);
78 AddAnchor(IDHELP, BOTTOM_RIGHT);
80 m_tooltips.Create(this);
81 CString tt;
82 tt.LoadString(IDS_CLONE_DEPTH_TT);
83 m_tooltips.AddTool(IDC_EDIT_DEPTH,tt);
84 m_tooltips.AddTool(IDC_CHECK_DEPTH,tt);
86 this->AddOthersToAnchor();
88 m_URLCombo.SetURLHistory(TRUE);
89 m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url"));
90 if(m_URL.IsEmpty())
92 CString str=CAppUtils::GetClipboardLink();
93 if(str.IsEmpty())
94 m_URLCombo.SetCurSel(0);
95 else
96 m_URLCombo.SetWindowText(str);
98 else
99 m_URLCombo.SetWindowText(m_URL);
101 CWnd *window=this->GetDlgItem(IDC_CLONE_DIR);
102 if(window)
103 SHAutoComplete(window->m_hWnd, SHACF_FILESYSTEM);
105 this->m_BrowseUrl.AddEntry(CString(_T("Dir...")));
106 this->m_BrowseUrl.AddEntry(CString(_T("Web")));
107 m_BrowseUrl.SetCurrentEntry(m_regBrowseUrl);
109 m_PuttyKeyCombo.SetPathHistory(TRUE);
110 m_PuttyKeyCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\puttykey"), _T("key"));
111 m_PuttyKeyCombo.SetCurSel(0);
113 this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD)->EnableWindow( CAppUtils::IsSSHPutty() );
114 this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);
115 this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);
117 EnableSaveRestore(_T("CloneDlg"));
119 OnBnClickedCheckSvn();
120 OnBnClickedCheckDepth();
121 return TRUE; // return TRUE unless you set the focus to a control
124 BEGIN_MESSAGE_MAP(CCloneDlg, CResizableStandAloneDialog)
125 ON_BN_CLICKED(IDC_CLONE_BROWSE_URL, &CCloneDlg::OnBnClickedCloneBrowseUrl)
126 ON_BN_CLICKED(IDC_CLONE_DIR_BROWSE, &CCloneDlg::OnBnClickedCloneDirBrowse)
127 ON_BN_CLICKED(IDC_PUTTYKEYFILE_BROWSE, &CCloneDlg::OnBnClickedPuttykeyfileBrowse)
128 ON_BN_CLICKED(IDC_PUTTYKEY_AUTOLOAD, &CCloneDlg::OnBnClickedPuttykeyAutoload)
129 ON_CBN_SELCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnSelchangeUrlcombo)
130 ON_NOTIFY(CBEN_BEGINEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenBegineditUrlcombo)
131 ON_NOTIFY(CBEN_ENDEDIT, IDC_URLCOMBO, &CCloneDlg::OnCbenEndeditUrlcombo)
132 ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCloneDlg::OnCbnEditchangeUrlcombo)
133 ON_BN_CLICKED(IDC_CHECK_SVN, &CCloneDlg::OnBnClickedCheckSvn)
134 ON_BN_CLICKED(IDC_CHECK_SVN_TRUNK, &CCloneDlg::OnBnClickedCheckSvnTrunk)
135 ON_BN_CLICKED(IDC_CHECK_SVN_TAG, &CCloneDlg::OnBnClickedCheckSvnTag)
136 ON_BN_CLICKED(IDC_CHECK_SVN_BRANCH, &CCloneDlg::OnBnClickedCheckSvnBranch)
137 ON_BN_CLICKED(IDC_CHECK_SVN_FROM, &CCloneDlg::OnBnClickedCheckSvnFrom)
138 ON_BN_CLICKED(IDC_CHECK_DEPTH, &CCloneDlg::OnBnClickedCheckDepth)
139 END_MESSAGE_MAP()
143 // CCloneDlg message handlers
145 void CCloneDlg::OnOK()
147 this->m_URLCombo.GetWindowTextW(m_URL);
148 m_URL.Trim();
149 UpdateData(TRUE);
150 if(m_URL.IsEmpty() || m_Directory.IsEmpty())
152 CMessageBox::Show(NULL, _T("URL or Directory can't be empty"), _T("TortoiseGit"), MB_OK);
153 return;
156 m_URLCombo.SaveHistory();
157 m_PuttyKeyCombo.SaveHistory();
159 this->m_PuttyKeyCombo.GetWindowText(m_strPuttyKeyFile);
160 CResizableDialog::OnOK();
164 void CCloneDlg::OnCancel()
166 CResizableDialog::OnCancel();
169 void CCloneDlg::OnBnClickedCloneBrowseUrl()
171 // TODO: Add your control notification handler code here
172 CBrowseFolder browseFolder;
173 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
174 CString strCloneDirectory;
176 int sel = this->m_BrowseUrl.GetCurrentEntry();
177 this->m_regBrowseUrl = sel;
179 if( sel == 1 )
181 CString str;
182 m_URLCombo.GetWindowText(str);
183 ShellExecute(NULL, _T("open"), str, NULL,NULL, SW_SHOW);
184 return ;
187 this->m_URLCombo.GetWindowTextW(strCloneDirectory);
188 if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK)
190 this->m_URLCombo.SetWindowTextW(strCloneDirectory);
194 void CCloneDlg::OnBnClickedCloneDirBrowse()
196 // TODO: Add your control notification handler code here
197 CBrowseFolder browseFolder;
198 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
199 CString strCloneDirectory = this->m_Directory;
200 if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK)
202 UpdateData(TRUE);
203 m_Directory = strCloneDirectory;
204 UpdateData(FALSE);
208 void CCloneDlg::OnEnChangeCloneDir()
210 // TODO: If this is a RICHEDIT control, the control will not
211 // send this notification unless you override the CDHtmlDialog::OnInitDialog()
212 // function and call CRichEditCtrl().SetEventMask()
213 // with the ENM_CHANGE flag ORed into the mask.
215 // TODO: Add your control notification handler code here
218 void CCloneDlg::OnBnClickedPuttykeyfileBrowse()
220 // TODO: Add your control notification handler code here
221 CFileDialog dlg(TRUE,NULL,
222 NULL,
223 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
224 _T("Putty Private Key(*.ppk)|*.ppk|All Files(*.*)|*.*||"));
226 this->UpdateData();
227 if(dlg.DoModal()==IDOK)
229 this->m_PuttyKeyCombo.SetWindowText( dlg.GetPathName() );
234 void CCloneDlg::OnBnClickedPuttykeyAutoload()
236 // TODO: Add your control notification handler code here
237 this->UpdateData();
238 this->GetDlgItem(IDC_PUTTYKEYFILE)->EnableWindow(m_bAutoloadPuttyKeyFile);
239 this->GetDlgItem(IDC_PUTTYKEYFILE_BROWSE)->EnableWindow(m_bAutoloadPuttyKeyFile);
243 void CCloneDlg::OnCbnSelchangeUrlcombo()
245 // TODO: Add your control notification handler code here
248 void CCloneDlg::OnCbenBegineditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)
250 // TODO: Add your control notification handler code here
251 *pResult = 0;
254 void CCloneDlg::OnCbenEndeditUrlcombo(NMHDR *pNMHDR, LRESULT *pResult)
256 // TODO: Add your control notification handler code here
257 *pResult = 0;
260 void CCloneDlg::OnCbnEditchangeUrlcombo()
262 // TODO: Add your control notification handler code here
263 this->UpdateData();
264 CString url;
265 m_URLCombo.GetWindowText(url);
267 if(m_OldURL == url )
268 return;
270 m_OldURL=url;
272 //if(url.IsEmpty())
273 // return;
275 CString old;
276 old=m_ModuleName;
278 url.Replace(_T('\\'),_T('/'));
279 int start=url.ReverseFind(_T('/'));
280 if(start<0)
282 start = url.ReverseFind(_T(':'));
283 if(start <0)
284 start = url.ReverseFind(_T('@'));
286 if(start<0)
287 start = 0;
289 CString temp;
290 temp=url.Mid(start+1);
292 temp=temp.MakeLower();
294 int end;
295 end=temp.Find(_T(".git"));
296 if(end<0)
297 end=temp.GetLength();
299 //CString modulename;
300 m_ModuleName=url.Mid(start+1,end);
302 start = m_Directory.ReverseFind(_T('\\'));
303 if(start <0 )
304 start = m_Directory.ReverseFind(_T('/'));
305 if(start <0 )
306 start =0;
308 int dirstart=m_Directory.Find(old,start);
309 if(dirstart>=0 && (dirstart+old.GetLength() == m_Directory.GetLength()) )
311 m_Directory=m_Directory.Left(dirstart);
312 m_Directory+=m_ModuleName;
314 }else
316 if(m_Directory.GetLength()>0 &&
317 (m_Directory[m_Directory.GetLength()-1] != _T('\\') ||
318 m_Directory[m_Directory.GetLength()-1] != _T('/') ) )
320 m_Directory+=_T('\\');
322 m_Directory += m_ModuleName;
325 if(m_Directory.GetLength()>0)
327 if( m_Directory[m_Directory.GetLength()-1] == _T('\\') ||
328 m_Directory[m_Directory.GetLength()-1] == _T('/')
331 m_Directory=m_Directory.Left(m_Directory.GetLength()-1);
335 this->UpdateData(FALSE);
338 void CCloneDlg::OnBnClickedCheckSvn()
340 this->UpdateData();
342 if(this->m_bSVN)
344 CString str;
345 m_URLCombo.GetWindowText(str);
347 while(str.GetLength()>=1 &&
348 str[str.GetLength()-1] == _T('\\') &&
349 str[str.GetLength()-1] == _T('/'))
351 str=str.Left(str.GetLength()-1);
353 if(str.GetLength()>=5 && (str.Right(5).MakeLower() == _T("trunk") ))
355 this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = FALSE;
356 this->UpdateData(FALSE);
357 }else
359 this->m_bSVNBranch=this->m_bSVNTags=this->m_bSVNTrunk = TRUE;
360 this->UpdateData(FALSE);
365 // TODO: Add your control notification handler code here
366 OnBnClickedCheckSvnTrunk();
367 OnBnClickedCheckSvnTag();
368 OnBnClickedCheckSvnBranch();
369 OnBnClickedCheckSvnFrom();
372 void CCloneDlg::OnBnClickedCheckSvnTrunk()
374 // TODO: Add your control notification handler code here
375 UpdateData(TRUE);
376 this->GetDlgItem(IDC_CHECK_SVN_TRUNK)->EnableWindow(this->m_bSVN);
377 this->GetDlgItem(IDC_EDIT_SVN_TRUNK)->EnableWindow(this->m_bSVNTrunk&&this->m_bSVN);
380 void CCloneDlg::OnBnClickedCheckSvnTag()
382 // TODO: Add your control notification handler code here
383 UpdateData(TRUE);
384 this->GetDlgItem(IDC_CHECK_SVN_TAG)->EnableWindow(this->m_bSVN);
385 this->GetDlgItem(IDC_EDIT_SVN_TAG)->EnableWindow(this->m_bSVNTags&&this->m_bSVN);
388 void CCloneDlg::OnBnClickedCheckSvnBranch()
390 // TODO: Add your control notification handler code here
391 UpdateData(TRUE);
392 this->GetDlgItem(IDC_CHECK_SVN_BRANCH)->EnableWindow(this->m_bSVN);
393 this->GetDlgItem(IDC_EDIT_SVN_BRANCH)->EnableWindow(this->m_bSVNBranch&&this->m_bSVN);
396 void CCloneDlg::OnBnClickedCheckSvnFrom()
398 // TODO: Add your control notification handler code here
399 UpdateData(TRUE);
400 this->GetDlgItem(IDC_CHECK_SVN_FROM)->EnableWindow(this->m_bSVN);
401 this->GetDlgItem(IDC_EDIT_SVN_FROM)->EnableWindow(this->m_bSVNFrom&&this->m_bSVN);
404 void CCloneDlg::OnBnClickedCheckDepth()
406 UpdateData(TRUE);
407 this->GetDlgItem(IDC_EDIT_DEPTH)->EnableWindow(this->m_bDepth);
409 BOOL CCloneDlg::PreTranslateMessage(MSG* pMsg)
411 // TODO: Add your specialized code here and/or call the base class
412 m_tooltips.RelayEvent(pMsg);
414 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);