1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\r
5 // This program is free software; you can redistribute it and/or
\r
6 // modify it under the terms of the GNU General Public License
\r
7 // as published by the Free Software Foundation; either version 2
\r
8 // of the License, or (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, write to the Free Software Foundation,
\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
20 #include "TortoiseProc.h"
\r
21 #include "CheckoutDlg.h"
\r
22 #include "RepositoryBrowser.h"
\r
23 #include "Messagebox.h"
\r
24 #include "PathUtils.h"
\r
25 #include "BrowseFolder.h"
\r
26 #include "AppUtils.h"
\r
29 IMPLEMENT_DYNAMIC(CCheckoutDlg, CResizableStandAloneDialog)
\r
30 CCheckoutDlg::CCheckoutDlg(CWnd* pParent /*=NULL*/)
\r
31 : CResizableStandAloneDialog(CCheckoutDlg::IDD, pParent)
\r
32 , Revision(_T("HEAD"))
\r
33 , m_strCheckoutDirectory(_T(""))
\r
34 , m_sCheckoutDirOrig(_T(""))
\r
35 , m_bNoExternals(FALSE)
\r
40 CCheckoutDlg::~CCheckoutDlg()
\r
46 void CCheckoutDlg::DoDataExchange(CDataExchange* pDX)
\r
48 CResizableStandAloneDialog::DoDataExchange(pDX);
\r
49 DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);
\r
50 DDX_Control(pDX, IDC_REVISION_NUM, m_editRevision);
\r
51 DDX_Control(pDX, IDC_BROWSE, m_butBrowse);
\r
52 DDX_Text(pDX, IDC_REVISION_NUM, m_sRevision);
\r
53 DDX_Text(pDX, IDC_CHECKOUTDIRECTORY, m_strCheckoutDirectory);
\r
54 DDX_Check(pDX, IDC_NOEXTERNALS, m_bNoExternals);
\r
55 DDX_Control(pDX, IDC_CHECKOUTDIRECTORY, m_cCheckoutEdit);
\r
56 DDX_Control(pDX, IDC_DEPTH, m_depthCombo);
\r
60 BEGIN_MESSAGE_MAP(CCheckoutDlg, CResizableStandAloneDialog)
\r
61 ON_REGISTERED_MESSAGE(WM_REVSELECTED, OnRevSelected)
\r
62 ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)
\r
63 ON_BN_CLICKED(IDC_CHECKOUTDIRECTORY_BROWSE, OnBnClickedCheckoutdirectoryBrowse)
\r
64 ON_EN_CHANGE(IDC_CHECKOUTDIRECTORY, OnEnChangeCheckoutdirectory)
\r
65 ON_BN_CLICKED(IDHELP, OnBnClickedHelp)
\r
66 ON_BN_CLICKED(IDC_SHOW_LOG, OnBnClickedShowlog)
\r
67 ON_EN_CHANGE(IDC_REVISION_NUM, &CCheckoutDlg::OnEnChangeRevisionNum)
\r
68 ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CCheckoutDlg::OnCbnEditchangeUrlcombo)
\r
71 BOOL CCheckoutDlg::OnInitDialog()
\r
73 CResizableStandAloneDialog::OnInitDialog();
\r
75 AdjustControlSize(IDC_NOEXTERNALS);
\r
76 AdjustControlSize(IDC_REVISION_HEAD);
\r
77 AdjustControlSize(IDC_REVISION_N);
\r
79 m_sCheckoutDirOrig = m_strCheckoutDirectory;
\r
81 CString sUrlSave = m_URL;
\r
82 m_URLCombo.SetURLHistory(TRUE);
\r
83 m_bAutoCreateTargetName = FALSE;
\r
84 m_URLCombo.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS"), _T("url"));
\r
85 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sCheckoutDirOrig);
\r
86 m_URLCombo.SetCurSel(0);
\r
88 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_INFINITE)));
\r
89 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_IMMEDIATE)));
\r
90 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_FILES)));
\r
91 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_EMPTY)));
\r
92 m_depthCombo.SetCurSel(0);
\r
94 // set radio buttons according to the revision
\r
95 SetRevision(Revision);
\r
97 m_editRevision.SetWindowText(_T(""));
\r
99 if (!sUrlSave.IsEmpty())
\r
101 SetDlgItemText(IDC_CHECKOUTDIRECTORY, m_sCheckoutDirOrig);
\r
102 m_URLCombo.SetWindowText(sUrlSave);
\r
104 m_tooltips.Create(this);
\r
105 m_tooltips.AddTool(IDC_CHECKOUTDIRECTORY, IDS_CHECKOUT_TT_DIR);
\r
107 SHAutoComplete(GetDlgItem(IDC_CHECKOUTDIRECTORY)->m_hWnd, SHACF_FILESYSTEM);
\r
109 if (!Revision.IsHead())
\r
112 temp.Format(_T("%ld"), (LONG)Revision);
\r
113 m_editRevision.SetWindowText(temp);
\r
114 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
116 if (m_strCheckoutDirectory.IsEmpty())
\r
118 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseGit\\History\\lastCheckoutPath"));
\r
119 m_strCheckoutDirectory = lastCheckoutPath;
\r
120 if (m_strCheckoutDirectory.GetLength() <= 2)
\r
121 m_strCheckoutDirectory += _T("\\");
\r
125 AddAnchor(IDC_GROUPTOP, TOP_LEFT, TOP_RIGHT);
\r
126 AddAnchor(IDC_URLOFREPO, TOP_LEFT, TOP_RIGHT);
\r
127 AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);
\r
128 AddAnchor(IDC_BROWSE, TOP_RIGHT);
\r
129 AddAnchor(IDC_EXPORT_CHECKOUTDIR, TOP_LEFT, TOP_RIGHT);
\r
130 AddAnchor(IDC_CHECKOUTDIRECTORY, TOP_LEFT, TOP_RIGHT);
\r
131 AddAnchor(IDC_CHECKOUTDIRECTORY_BROWSE, TOP_RIGHT);
\r
132 AddAnchor(IDC_GROUPMIDDLE, TOP_LEFT, TOP_RIGHT);
\r
133 AddAnchor(IDC_DEPTH, TOP_LEFT, TOP_RIGHT);
\r
134 AddAnchor(IDC_NOEXTERNALS, TOP_LEFT);
\r
135 AddAnchor(IDC_GROUPBOTTOM, TOP_LEFT, TOP_RIGHT);
\r
136 AddAnchor(IDC_REVISION_HEAD, TOP_LEFT);
\r
137 AddAnchor(IDC_REVISION_N, TOP_LEFT);
\r
138 AddAnchor(IDC_REVISION_NUM, TOP_LEFT);
\r
139 AddAnchor(IDC_SHOW_LOG, TOP_LEFT);
\r
140 AddAnchor(IDOK, TOP_RIGHT);
\r
141 AddAnchor(IDCANCEL, TOP_RIGHT);
\r
142 AddAnchor(IDHELP, TOP_RIGHT);
\r
144 // prevent resizing vertically
\r
146 GetWindowRect(&rect);
\r
149 size.cy = rect.Height();
\r
150 SetMaxTrackSize(size);
\r
152 if ((m_pParentWnd==NULL)&&(hWndExplorer))
\r
153 CenterWindow(CWnd::FromHandle(hWndExplorer));
\r
154 EnableSaveRestore(_T("CheckoutDlg"));
\r
158 void CCheckoutDlg::OnOK()
\r
160 if (!UpdateData(TRUE))
\r
161 return; // don't dismiss dialog (error message already shown by MFC framework)
\r
163 CTSVNPath checkoutDirectory;
\r
164 if (::PathIsRelative(m_strCheckoutDirectory))
\r
166 checkoutDirectory = CTSVNPath(sOrigCWD);
\r
167 checkoutDirectory.AppendPathString(_T("\\") + m_strCheckoutDirectory);
\r
168 m_strCheckoutDirectory = checkoutDirectory.GetWinPathString();
\r
171 checkoutDirectory = CTSVNPath(m_strCheckoutDirectory);
\r
172 if (!checkoutDirectory.IsValidOnWindows())
\r
174 ShowBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH);
\r
178 if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
\r
180 Revision = SVNRev(_T("HEAD"));
\r
183 Revision = SVNRev(m_sRevision);
\r
184 if (!Revision.IsValid())
\r
186 ShowBalloon(IDC_REVISION_NUM, IDS_ERR_INVALIDREV);
\r
190 bool bAutoCreateTargetName = m_bAutoCreateTargetName;
\r
191 m_bAutoCreateTargetName = false;
\r
192 m_URLCombo.SaveHistory();
\r
193 m_URL = m_URLCombo.GetString();
\r
195 if (!SVN::PathIsURL(CTSVNPath(m_URL)))
\r
197 ShowBalloon(IDC_URLCOMBO, IDS_ERR_MUSTBEURL, IDI_ERROR);
\r
198 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
202 if (m_strCheckoutDirectory.IsEmpty())
\r
204 return; //don't dismiss the dialog
\r
206 if (!PathFileExists(m_strCheckoutDirectory))
\r
209 temp.Format(IDS_WARN_FOLDERNOTEXIST, (LPCTSTR)m_strCheckoutDirectory);
\r
210 if (CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION) == IDYES)
\r
212 CPathUtils::MakeSureDirectoryPathExists(m_strCheckoutDirectory);
\r
216 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
217 return; //don't dismiss the dialog
\r
220 if (!PathIsDirectoryEmpty(m_strCheckoutDirectory))
\r
223 message.Format(CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY)),(LPCTSTR)m_strCheckoutDirectory);
\r
224 if (CMessageBox::Show(this->m_hWnd, message, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION) != IDYES)
\r
226 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
227 return; //don't dismiss the dialog
\r
230 switch (m_depthCombo.GetCurSel())
\r
233 m_depth = svn_depth_infinity;
\r
236 m_depth = svn_depth_immediates;
\r
239 m_depth = svn_depth_files;
\r
242 m_depth = svn_depth_empty;
\r
245 m_depth = svn_depth_empty;
\r
249 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseGit\\History\\lastCheckoutPath"));
\r
250 lastCheckoutPath = m_strCheckoutDirectory.Left(m_strCheckoutDirectory.ReverseFind('\\'));
\r
251 CResizableStandAloneDialog::OnOK();
\r
254 void CCheckoutDlg::OnBnClickedBrowse()
\r
256 m_tooltips.Pop(); // hide the tooltips
\r
259 if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
\r
261 rev = SVNRev(_T("HEAD"));
\r
264 rev = SVNRev(m_sRevision);
\r
266 if (!rev.IsValid())
\r
267 rev = SVNRev::REV_HEAD;
\r
268 if (CAppUtils::BrowseRepository(m_URLCombo, this, rev))
\r
272 CRegString regDefCheckoutUrl(_T("Software\\TortoiseGit\\DefaultCheckoutUrl"));
\r
273 CRegString regDefCheckoutPath(_T("Software\\TortoiseGit\\DefaultCheckoutPath"));
\r
274 if (!CString(regDefCheckoutUrl).IsEmpty())
\r
276 m_URL = m_URLCombo.GetString();
\r
280 m_URLCombo.GetWindowText(m_URL);
\r
281 if (m_URL.IsEmpty())
\r
284 CString name = CAppUtils::GetProjectNameFromURL(m_URL);
\r
285 if (CPathUtils::GetFileNameFromPath(m_strCheckoutDirectory).CompareNoCase(name))
\r
286 m_strCheckoutDirectory = m_sCheckoutDirOrig.TrimRight('\\')+_T('\\')+name;
\r
287 if (m_strCheckoutDirectory.IsEmpty())
\r
289 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseGit\\History\\lastCheckoutPath"));
\r
290 m_strCheckoutDirectory = lastCheckoutPath;
\r
291 if (m_strCheckoutDirectory.GetLength() <= 2)
\r
292 m_strCheckoutDirectory += _T("\\");
\r
298 void CCheckoutDlg::OnBnClickedCheckoutdirectoryBrowse()
\r
300 m_tooltips.Pop(); // hide the tooltips
\r
302 // Create a folder browser dialog. If the user selects OK, we should update
\r
303 // the local data members with values from the controls, copy the checkout
\r
304 // directory from the browse folder, then restore the local values into the
\r
305 // dialog controls.
\r
307 CBrowseFolder browseFolder;
\r
308 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
\r
309 CString strCheckoutDirectory = m_strCheckoutDirectory;
\r
310 if (browseFolder.Show(GetSafeHwnd(), strCheckoutDirectory) == CBrowseFolder::OK)
\r
313 m_strCheckoutDirectory = strCheckoutDirectory;
\r
314 m_sCheckoutDirOrig = m_strCheckoutDirectory;
\r
315 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sCheckoutDirOrig);
\r
320 BOOL CCheckoutDlg::PreTranslateMessage(MSG* pMsg)
\r
322 m_tooltips.RelayEvent(pMsg);
\r
323 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
\r
326 void CCheckoutDlg::OnEnChangeCheckoutdirectory()
\r
329 DialogEnableWindow(IDOK, !m_strCheckoutDirectory.IsEmpty());
\r
332 void CCheckoutDlg::OnBnClickedHelp()
\r
337 void CCheckoutDlg::OnBnClickedShowlog()
\r
339 m_tooltips.Pop(); // hide the tooltips
\r
341 m_URL = m_URLCombo.GetString();
\r
342 if ((m_pLogDlg)&&(m_pLogDlg->IsWindowVisible()))
\r
344 AfxGetApp()->DoWaitCursor(1);
\r
345 //now show the log dialog for working copy
\r
346 if (!m_URL.IsEmpty())
\r
349 m_pLogDlg = new CLogDlg();
\r
350 m_pLogDlg->SetParams(CTSVNPath(m_URL), SVNRev::REV_HEAD, SVNRev::REV_HEAD, 1, (int)(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100));
\r
351 m_pLogDlg->m_wParam = 1;
\r
352 m_pLogDlg->SetSelect(true);
\r
353 m_pLogDlg->m_pNotifyWindow = this;
\r
354 m_pLogDlg->Create(IDD_LOGMESSAGE, this);
\r
355 m_pLogDlg->ShowWindow(SW_SHOW);
\r
357 AfxGetApp()->DoWaitCursor(-1);
\r
360 LPARAM CCheckoutDlg::OnRevSelected(WPARAM /*wParam*/, LPARAM lParam)
\r
363 temp.Format(_T("%ld"), lParam);
\r
364 SetDlgItemText(IDC_REVISION_NUM, temp);
\r
365 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
369 void CCheckoutDlg::OnEnChangeRevisionNum()
\r
372 if (m_sRevision.IsEmpty())
\r
373 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
375 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
378 void CCheckoutDlg::SetRevision(const SVNRev& rev)
\r
380 if (rev.IsHead() || !rev.IsValid())
\r
381 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
384 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
386 sRev.Format(_T("%ld"), (LONG)rev);
\r
387 SetDlgItemText(IDC_REVISION_NUM, sRev);
\r
391 void CCheckoutDlg::OnCbnEditchangeUrlcombo()
\r
393 if (!m_bAutoCreateTargetName)
\r
395 if (m_sCheckoutDirOrig.IsEmpty())
\r
397 // find out what to use as the checkout directory name
\r
399 m_URLCombo.GetWindowText(m_URL);
\r
400 if (m_URL.IsEmpty())
\r
402 CString tempURL = m_URL;
\r
403 CString name = CAppUtils::GetProjectNameFromURL(m_URL);
\r
404 if (CPathUtils::GetFileNameFromPath(m_strCheckoutDirectory).CompareNoCase(name))
\r
405 m_strCheckoutDirectory = m_sCheckoutDirOrig.TrimRight('\\')+_T('\\')+name;
\r
406 if (m_strCheckoutDirectory.IsEmpty())
\r
408 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseGit\\History\\lastCheckoutPath"));
\r
409 m_strCheckoutDirectory = lastCheckoutPath;
\r
410 if (m_strCheckoutDirectory.GetLength() <= 2)
\r
411 m_strCheckoutDirectory += _T("\\");
\r