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 "ExportDlg.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(CExportDlg, CResizableStandAloneDialog)
\r
30 CExportDlg::CExportDlg(CWnd* pParent /*=NULL*/)
\r
31 : CResizableStandAloneDialog(CExportDlg::IDD, pParent)
\r
32 , Revision(_T("HEAD"))
\r
33 , m_strExportDirectory(_T(""))
\r
34 , m_sExportDirOrig(_T(""))
\r
35 , m_bNoExternals(FALSE)
\r
40 CExportDlg::~CExportDlg()
\r
46 void CExportDlg::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_strExportDirectory);
\r
54 DDX_Check(pDX, IDC_NOEXTERNALS, m_bNoExternals);
\r
55 DDX_Control(pDX, IDC_CHECKOUTDIRECTORY, m_cCheckoutEdit);
\r
56 DDX_Control(pDX, IDC_EOLCOMBO, m_eolCombo);
\r
57 DDX_Control(pDX, IDC_DEPTH, m_depthCombo);
\r
61 BEGIN_MESSAGE_MAP(CExportDlg, CResizableStandAloneDialog)
\r
62 ON_REGISTERED_MESSAGE(WM_REVSELECTED, OnRevSelected)
\r
63 ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)
\r
64 ON_BN_CLICKED(IDC_CHECKOUTDIRECTORY_BROWSE, OnBnClickedCheckoutdirectoryBrowse)
\r
65 ON_EN_CHANGE(IDC_CHECKOUTDIRECTORY, OnEnChangeCheckoutdirectory)
\r
66 ON_BN_CLICKED(IDHELP, OnBnClickedHelp)
\r
67 ON_BN_CLICKED(IDC_SHOW_LOG, OnBnClickedShowlog)
\r
68 ON_EN_CHANGE(IDC_REVISION_NUM, &CExportDlg::OnEnChangeRevisionNum)
\r
69 ON_CBN_SELCHANGE(IDC_EOLCOMBO, &CExportDlg::OnCbnSelchangeEolcombo)
\r
70 ON_CBN_EDITCHANGE(IDC_URLCOMBO, &CExportDlg::OnCbnEditchangeUrlcombo)
\r
73 BOOL CExportDlg::OnInitDialog()
\r
75 CResizableStandAloneDialog::OnInitDialog();
\r
77 m_sExportDirOrig = m_strExportDirectory;
\r
78 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sExportDirOrig);
\r
80 AdjustControlSize(IDC_NOEXTERNALS);
\r
81 AdjustControlSize(IDC_REVISION_HEAD);
\r
82 AdjustControlSize(IDC_REVISION_N);
\r
84 AddAnchor(IDC_REPOGROUP, TOP_LEFT, TOP_RIGHT);
\r
85 AddAnchor(IDC_REPOLABEL, TOP_LEFT);
\r
86 AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);
\r
87 AddAnchor(IDC_BROWSE, TOP_RIGHT);
\r
88 AddAnchor(IDC_EXPORT_CHECKOUTDIR, TOP_LEFT);
\r
89 AddAnchor(IDC_CHECKOUTDIRECTORY, TOP_LEFT, TOP_RIGHT);
\r
90 AddAnchor(IDC_CHECKOUTDIRECTORY_BROWSE, TOP_RIGHT);
\r
91 AddAnchor(IDC_DEPTH, TOP_LEFT, TOP_RIGHT);
\r
92 AddAnchor(IDC_NOEXTERNALS, TOP_LEFT);
\r
93 AddAnchor(IDC_EOLLABEL, TOP_LEFT);
\r
94 AddAnchor(IDC_EOLCOMBO, TOP_LEFT);
\r
96 AddAnchor(IDC_REVISIONGROUP, TOP_LEFT, BOTTOM_RIGHT);
\r
97 AddAnchor(IDC_REVISION_HEAD, TOP_LEFT);
\r
98 AddAnchor(IDC_REVISION_N, TOP_LEFT);
\r
99 AddAnchor(IDC_REVISION_NUM, TOP_LEFT);
\r
100 AddAnchor(IDC_SHOW_LOG, TOP_LEFT);
\r
102 AddAnchor(IDOK, BOTTOM_RIGHT);
\r
103 AddAnchor(IDCANCEL, BOTTOM_RIGHT);
\r
104 AddAnchor(IDHELP, BOTTOM_RIGHT);
\r
106 m_URLCombo.SetURLHistory(TRUE);
\r
107 m_URLCombo.LoadHistory(_T("Software\\TortoiseSVN\\History\\repoURLS"), _T("url"));
\r
108 m_URLCombo.SetCurSel(0);
\r
110 if (!m_URL.IsEmpty())
\r
112 m_URLCombo.SetWindowText(m_URL);
\r
115 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_INFINITE)));
\r
116 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_IMMEDIATE)));
\r
117 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_FILES)));
\r
118 m_depthCombo.AddString(CString(MAKEINTRESOURCE(IDS_SVN_DEPTH_EMPTY)));
\r
119 m_depthCombo.SetCurSel(0);
\r
121 // set radio buttons according to the revision
\r
122 SetRevision(Revision);
\r
124 m_editRevision.SetWindowText(_T(""));
\r
126 if (!m_URL.IsEmpty())
\r
127 m_URLCombo.SetWindowText(m_URL);
\r
129 m_tooltips.Create(this);
\r
130 m_tooltips.AddTool(IDC_CHECKOUTDIRECTORY, IDS_CHECKOUT_TT_DIR);
\r
131 m_tooltips.AddTool(IDC_EOLCOMBO, IDS_EXPORT_TT_EOL);
\r
133 SHAutoComplete(GetDlgItem(IDC_CHECKOUTDIRECTORY)->m_hWnd, SHACF_FILESYSTEM);
\r
135 // fill the combobox with the choices of eol styles
\r
136 m_eolCombo.AddString(_T("default"));
\r
137 m_eolCombo.AddString(_T("CRLF"));
\r
138 m_eolCombo.AddString(_T("LF"));
\r
139 m_eolCombo.AddString(_T("CR"));
\r
140 m_eolCombo.SelectString(0, _T("default"));
\r
142 if (!Revision.IsHead())
\r
144 // if the revision is not HEAD, change the radio button and
\r
145 // fill in the revision in the edit box
\r
147 temp.Format(_T("%ld"), (LONG)Revision);
\r
148 m_editRevision.SetWindowText(temp);
\r
149 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
152 if ((m_pParentWnd==NULL)&&(hWndExplorer))
\r
153 CenterWindow(CWnd::FromHandle(hWndExplorer));
\r
154 EnableSaveRestore(_T("ExportDlg"));
\r
158 void CExportDlg::OnOK()
\r
160 if (!UpdateData(TRUE))
\r
161 return; // don't dismiss dialog (error message already shown by MFC framework)
\r
163 // check it the export path is a valid windows path
\r
164 CTSVNPath ExportDirectory;
\r
165 if (::PathIsRelative(m_strExportDirectory))
\r
167 ExportDirectory = CTSVNPath(sOrigCWD);
\r
168 ExportDirectory.AppendPathString(_T("\\") + m_strExportDirectory);
\r
169 m_strExportDirectory = ExportDirectory.GetWinPathString();
\r
172 ExportDirectory = CTSVNPath(m_strExportDirectory);
\r
173 if (!ExportDirectory.IsValidOnWindows())
\r
175 ShowBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH);
\r
179 // check if the specified revision is valid
\r
180 if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
\r
182 Revision = SVNRev(_T("HEAD"));
\r
185 Revision = SVNRev(m_sRevision);
\r
186 if (!Revision.IsValid())
\r
188 ShowBalloon(IDC_REVISION_NUM, IDS_ERR_INVALIDREV);
\r
191 bool bAutoCreateTargetName = m_bAutoCreateTargetName;
\r
192 m_bAutoCreateTargetName = false;
\r
194 m_URLCombo.SaveHistory();
\r
195 m_URL = m_URLCombo.GetString();
\r
197 // we need an url to export from - local paths won't work
\r
198 if (!SVN::PathIsURL(CTSVNPath(m_URL)))
\r
200 ShowBalloon(IDC_URLCOMBO, IDS_ERR_MUSTBEURL, IDI_ERROR);
\r
201 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
205 if (m_strExportDirectory.IsEmpty())
\r
207 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
211 // if the export directory does not exist, where should we export to?
\r
212 // We ask if the directory should be created...
\r
213 if (!PathFileExists(m_strExportDirectory))
\r
216 temp.Format(IDS_WARN_FOLDERNOTEXIST, (LPCTSTR)m_strExportDirectory);
\r
217 if (CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION) == IDYES)
\r
219 CPathUtils::MakeSureDirectoryPathExists(m_strExportDirectory);
\r
223 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
228 // if the directory we should export to is not empty, show a warning:
\r
229 // maybe the user doesn't want to overwrite the existing files.
\r
230 if (!PathIsDirectoryEmpty(m_strExportDirectory))
\r
233 message.Format(CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY)),(LPCTSTR)m_strExportDirectory);
\r
234 if (CMessageBox::Show(this->m_hWnd, message, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION) != IDYES)
\r
236 m_bAutoCreateTargetName = bAutoCreateTargetName;
\r
240 m_eolCombo.GetWindowText(m_eolStyle);
\r
241 if (m_eolStyle.Compare(_T("default"))==0)
\r
242 m_eolStyle.Empty();
\r
244 switch (m_depthCombo.GetCurSel())
\r
247 m_depth = svn_depth_infinity;
\r
250 m_depth = svn_depth_immediates;
\r
253 m_depth = svn_depth_files;
\r
256 m_depth = svn_depth_empty;
\r
259 m_depth = svn_depth_empty;
\r
264 CResizableStandAloneDialog::OnOK();
\r
267 void CExportDlg::OnBnClickedBrowse()
\r
269 m_tooltips.Pop(); // hide the tooltips
\r
272 if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
\r
274 rev = SVNRev::REV_HEAD;
\r
277 rev = SVNRev(m_sRevision);
\r
278 if (!rev.IsValid())
\r
279 rev = SVNRev::REV_HEAD;
\r
280 CAppUtils::BrowseRepository(m_URLCombo, this, rev);
\r
284 void CExportDlg::OnBnClickedCheckoutdirectoryBrowse()
\r
286 m_tooltips.Pop(); // hide the tooltips
\r
288 // Create a folder browser dialog. If the user selects OK, we should update
\r
289 // the local data members with values from the controls, copy the checkout
\r
290 // directory from the browse folder, then restore the local values into the
\r
291 // dialog controls.
\r
293 CBrowseFolder browseFolder;
\r
294 browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
\r
295 CString strCheckoutDirectory = m_strExportDirectory;
\r
296 if (browseFolder.Show(GetSafeHwnd(), strCheckoutDirectory) == CBrowseFolder::OK)
\r
299 m_strExportDirectory = strCheckoutDirectory;
\r
300 m_sExportDirOrig = m_strExportDirectory;
\r
301 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sExportDirOrig);
\r
306 BOOL CExportDlg::PreTranslateMessage(MSG* pMsg)
\r
308 m_tooltips.RelayEvent(pMsg);
\r
309 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
\r
312 void CExportDlg::OnEnChangeCheckoutdirectory()
\r
315 DialogEnableWindow(IDOK, !m_strExportDirectory.IsEmpty());
\r
318 void CExportDlg::OnBnClickedHelp()
\r
323 void CExportDlg::OnBnClickedShowlog()
\r
325 m_tooltips.Pop(); // hide the tooltips
\r
327 m_URL = m_URLCombo.GetString();
\r
328 if ((m_pLogDlg)&&(m_pLogDlg->IsWindowVisible()))
\r
330 AfxGetApp()->DoWaitCursor(1);
\r
331 //now show the log dialog for working copy
\r
332 if (!m_URL.IsEmpty())
\r
335 m_pLogDlg = new CLogDlg();
\r
336 m_pLogDlg->SetParams(CTSVNPath(m_URL), SVNRev::REV_HEAD, SVNRev::REV_HEAD, 1, (int)(DWORD)CRegDWORD(_T("Software\\TortoiseSVN\\NumberOfLogs"), 100));
\r
337 m_pLogDlg->m_wParam = 1;
\r
338 m_pLogDlg->SetSelect(true);
\r
339 m_pLogDlg->m_pNotifyWindow = this;
\r
340 m_pLogDlg->Create(IDD_LOGMESSAGE, this);
\r
341 m_pLogDlg->ShowWindow(SW_SHOW);
\r
343 AfxGetApp()->DoWaitCursor(-1);
\r
346 LPARAM CExportDlg::OnRevSelected(WPARAM /*wParam*/, LPARAM lParam)
\r
349 temp.Format(_T("%ld"), lParam);
\r
350 SetDlgItemText(IDC_REVISION_NUM, temp);
\r
351 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
355 void CExportDlg::OnEnChangeRevisionNum()
\r
358 if (m_sRevision.IsEmpty())
\r
359 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
361 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
364 void CExportDlg::OnCbnSelchangeEolcombo()
\r
368 void CExportDlg::SetRevision(const SVNRev& rev)
\r
371 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
374 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
376 sRev.Format(_T("%ld"), (LONG)rev);
\r
377 SetDlgItemText(IDC_REVISION_NUM, sRev);
\r
381 void CExportDlg::OnCbnEditchangeUrlcombo()
\r
383 if (!m_bAutoCreateTargetName)
\r
385 if (m_sExportDirOrig.IsEmpty())
\r
387 // find out what to use as the checkout directory name
\r
389 m_URLCombo.GetWindowText(m_URL);
\r
390 if (m_URL.IsEmpty())
\r
392 CString name = CAppUtils::GetProjectNameFromURL(m_URL);
\r
393 m_strExportDirectory = m_sExportDirOrig+_T('\\')+name;
\r