1 // CloneDlg.cpp : implementation file
5 #include "TortoiseProc.h"
7 #include "BrowseFolder.h"
8 #include "MessageBox.h"
12 IMPLEMENT_DYNCREATE(CCloneDlg
, CResizableStandAloneDialog
)
14 CCloneDlg::CCloneDlg(CWnd
* pParent
/*=NULL*/)
15 : CResizableStandAloneDialog(CCloneDlg::IDD
, pParent
)
18 m_bAutoloadPuttyKeyFile
= CAppUtils::IsSSHPutty();
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);
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);
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"));
97 CString str
=CAppUtils::GetClipboardLink();
99 m_URLCombo
.SetCurSel(0);
101 m_URLCombo
.SetWindowText(str
);
104 m_URLCombo
.SetWindowText(m_URL
);
106 CWnd
*window
=this->GetDlgItem(IDC_CLONE_DIR
);
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
)
149 // CCloneDlg message handlers
151 void CCloneDlg::OnOK()
153 this->m_URLCombo
.GetWindowTextW(m_URL
);
156 if(m_URL
.IsEmpty() || m_Directory
.IsEmpty())
158 CMessageBox::Show(NULL
, _T("URL or Directory can't be empty"), _T("TortoiseGit"), MB_OK
);
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
;
188 m_URLCombo
.GetWindowText(str
);
189 ShellExecute(NULL
, _T("open"), str
, NULL
,NULL
, SW_SHOW
);
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
)
209 m_Directory
= strCloneDirectory
;
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
,
229 OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT
,
230 _T("Putty Private Key(*.ppk)|*.ppk|All Files(*.*)|*.*||"));
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
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
260 void CCloneDlg::OnCbenEndeditUrlcombo(NMHDR
*pNMHDR
, LRESULT
*pResult
)
262 // TODO: Add your control notification handler code here
266 void CCloneDlg::OnCbnEditchangeUrlcombo()
268 // TODO: Add your control notification handler code here
271 m_URLCombo
.GetWindowText(url
);
284 url
.Replace(_T('\\'),_T('/'));
285 int start
=url
.ReverseFind(_T('/'));
288 start
= url
.ReverseFind(_T(':'));
290 start
= url
.ReverseFind(_T('@'));
296 temp
=url
.Mid(start
+1);
298 temp
=temp
.MakeLower();
301 end
=temp
.Find(_T(".git"));
303 end
=temp
.GetLength();
305 //CString modulename;
306 m_ModuleName
=url
.Mid(start
+1,end
);
308 start
= m_Directory
.ReverseFind(_T('\\'));
310 start
= m_Directory
.ReverseFind(_T('/'));
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
;
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()
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
);
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
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
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
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
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()
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
428 this->GetDlgItem(IDC_CHECK_USERNAME
)->EnableWindow(this->m_bSVN
);
429 this->GetDlgItem(IDC_EDIT_USERNAME
)->EnableWindow(this->m_bSVNUserName
&& this->m_bSVN
);