OSDN Git Service

Auto MsysGit Path and use git.exe replace git.cmd
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / ExportDlg.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseSVN\r
4 \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
9 \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
14 \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
18 //\r
19 #include "stdafx.h"\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
27 \r
28 \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
36         , m_pLogDlg(NULL)\r
37 {\r
38 }\r
39 \r
40 CExportDlg::~CExportDlg()\r
41 {\r
42         if (m_pLogDlg)\r
43                 delete m_pLogDlg;\r
44 }\r
45 \r
46 void CExportDlg::DoDataExchange(CDataExchange* pDX)\r
47 {\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
58 }\r
59 \r
60 \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
71 END_MESSAGE_MAP()\r
72 \r
73 BOOL CExportDlg::OnInitDialog()\r
74 {\r
75         CResizableStandAloneDialog::OnInitDialog();\r
76 \r
77         m_sExportDirOrig = m_strExportDirectory;\r
78         m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sExportDirOrig);\r
79 \r
80         AdjustControlSize(IDC_NOEXTERNALS);\r
81         AdjustControlSize(IDC_REVISION_HEAD);\r
82         AdjustControlSize(IDC_REVISION_N);\r
83 \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
95 \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
101 \r
102         AddAnchor(IDOK, BOTTOM_RIGHT);\r
103         AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
104         AddAnchor(IDHELP, BOTTOM_RIGHT);\r
105 \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
109 \r
110         if (!m_URL.IsEmpty())\r
111         {\r
112                 m_URLCombo.SetWindowText(m_URL);\r
113         }\r
114 \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
120 \r
121         // set radio buttons according to the revision\r
122         SetRevision(Revision);\r
123 \r
124         m_editRevision.SetWindowText(_T(""));\r
125 \r
126         if (!m_URL.IsEmpty())\r
127                 m_URLCombo.SetWindowText(m_URL);\r
128 \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
132 \r
133         SHAutoComplete(GetDlgItem(IDC_CHECKOUTDIRECTORY)->m_hWnd, SHACF_FILESYSTEM);\r
134 \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
141 \r
142         if (!Revision.IsHead())\r
143         {\r
144                 // if the revision is not HEAD, change the radio button and\r
145                 // fill in the revision in the edit box\r
146                 CString temp;\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
150         }\r
151 \r
152         if ((m_pParentWnd==NULL)&&(hWndExplorer))\r
153                 CenterWindow(CWnd::FromHandle(hWndExplorer));\r
154         EnableSaveRestore(_T("ExportDlg"));\r
155         return TRUE;\r
156 }\r
157 \r
158 void CExportDlg::OnOK()\r
159 {\r
160         if (!UpdateData(TRUE))\r
161                 return; // don't dismiss dialog (error message already shown by MFC framework)\r
162 \r
163         // check it the export path is a valid windows path\r
164         CTSVNPath ExportDirectory;\r
165         if (::PathIsRelative(m_strExportDirectory))\r
166         {\r
167                 ExportDirectory = CTSVNPath(sOrigCWD);\r
168                 ExportDirectory.AppendPathString(_T("\\") + m_strExportDirectory);\r
169                 m_strExportDirectory = ExportDirectory.GetWinPathString();\r
170         }\r
171         else\r
172                 ExportDirectory = CTSVNPath(m_strExportDirectory);\r
173         if (!ExportDirectory.IsValidOnWindows())\r
174         {\r
175                 ShowBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH);\r
176                 return;\r
177         }\r
178 \r
179         // check if the specified revision is valid\r
180         if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)\r
181         {\r
182                 Revision = SVNRev(_T("HEAD"));\r
183         }\r
184         else\r
185                 Revision = SVNRev(m_sRevision);\r
186         if (!Revision.IsValid())\r
187         {\r
188                 ShowBalloon(IDC_REVISION_NUM, IDS_ERR_INVALIDREV);\r
189                 return;\r
190         }\r
191         bool bAutoCreateTargetName = m_bAutoCreateTargetName;\r
192         m_bAutoCreateTargetName = false;\r
193 \r
194         m_URLCombo.SaveHistory();\r
195         m_URL = m_URLCombo.GetString();\r
196 \r
197         // we need an url to export from - local paths won't work\r
198         if (!SVN::PathIsURL(CTSVNPath(m_URL)))\r
199         {\r
200                 ShowBalloon(IDC_URLCOMBO, IDS_ERR_MUSTBEURL, IDI_ERROR);\r
201                 m_bAutoCreateTargetName = bAutoCreateTargetName;\r
202                 return;\r
203         }\r
204 \r
205         if (m_strExportDirectory.IsEmpty())\r
206         {\r
207                 m_bAutoCreateTargetName = bAutoCreateTargetName;\r
208                 return;\r
209         }\r
210 \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
214         {\r
215                 CString temp;\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
218                 {\r
219                         CPathUtils::MakeSureDirectoryPathExists(m_strExportDirectory);\r
220                 }\r
221                 else\r
222                 {\r
223                         m_bAutoCreateTargetName = bAutoCreateTargetName;\r
224                         return;\r
225                 }\r
226         }\r
227 \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
231         {\r
232                 CString message;\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
235                 {\r
236                         m_bAutoCreateTargetName = bAutoCreateTargetName;\r
237                         return;\r
238                 }\r
239         }\r
240         m_eolCombo.GetWindowText(m_eolStyle);\r
241         if (m_eolStyle.Compare(_T("default"))==0)\r
242                 m_eolStyle.Empty();\r
243 \r
244         switch (m_depthCombo.GetCurSel())\r
245         {\r
246         case 0:\r
247                 m_depth = svn_depth_infinity;\r
248                 break;\r
249         case 1:\r
250                 m_depth = svn_depth_immediates;\r
251                 break;\r
252         case 2:\r
253                 m_depth = svn_depth_files;\r
254                 break;\r
255         case 3:\r
256                 m_depth = svn_depth_empty;\r
257                 break;\r
258         default:\r
259                 m_depth = svn_depth_empty;\r
260                 break;\r
261         }\r
262 \r
263         UpdateData(FALSE);\r
264         CResizableStandAloneDialog::OnOK();\r
265 }\r
266 \r
267 void CExportDlg::OnBnClickedBrowse()\r
268 {\r
269         m_tooltips.Pop();       // hide the tooltips\r
270         SVNRev rev;\r
271         UpdateData();\r
272         if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)\r
273         {\r
274                 rev = SVNRev::REV_HEAD;\r
275         }\r
276         else\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
281         SetRevision(rev);\r
282 }\r
283 \r
284 void CExportDlg::OnBnClickedCheckoutdirectoryBrowse()\r
285 {\r
286         m_tooltips.Pop();       // hide the tooltips\r
287         //\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
292         //\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
297         {\r
298                 UpdateData(TRUE);\r
299                 m_strExportDirectory = strCheckoutDirectory;\r
300                 m_sExportDirOrig = m_strExportDirectory;\r
301                 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sExportDirOrig);\r
302                 UpdateData(FALSE);\r
303         }\r
304 }\r
305 \r
306 BOOL CExportDlg::PreTranslateMessage(MSG* pMsg)\r
307 {\r
308         m_tooltips.RelayEvent(pMsg);\r
309         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
310 }\r
311 \r
312 void CExportDlg::OnEnChangeCheckoutdirectory()\r
313 {\r
314         UpdateData(TRUE);\r
315         DialogEnableWindow(IDOK, !m_strExportDirectory.IsEmpty());\r
316 }\r
317 \r
318 void CExportDlg::OnBnClickedHelp()\r
319 {\r
320         OnHelp();\r
321 }\r
322 \r
323 void CExportDlg::OnBnClickedShowlog()\r
324 {\r
325         m_tooltips.Pop();       // hide the tooltips\r
326         UpdateData(TRUE);\r
327         m_URL = m_URLCombo.GetString();\r
328         if ((m_pLogDlg)&&(m_pLogDlg->IsWindowVisible()))\r
329                 return;\r
330         AfxGetApp()->DoWaitCursor(1);\r
331         //now show the log dialog for working copy\r
332         if (!m_URL.IsEmpty())\r
333         {\r
334                 delete m_pLogDlg;\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
342         }\r
343         AfxGetApp()->DoWaitCursor(-1);\r
344 }\r
345 \r
346 LPARAM CExportDlg::OnRevSelected(WPARAM /*wParam*/, LPARAM lParam)\r
347 {\r
348         CString temp;\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
352         return 0;\r
353 }\r
354 \r
355 void CExportDlg::OnEnChangeRevisionNum()\r
356 {\r
357         UpdateData();\r
358         if (m_sRevision.IsEmpty())\r
359                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
360         else\r
361                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
362 }\r
363 \r
364 void CExportDlg::OnCbnSelchangeEolcombo()\r
365 {\r
366 }\r
367 \r
368 void CExportDlg::SetRevision(const SVNRev& rev)\r
369 {\r
370         if (rev.IsHead())\r
371                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
372         else\r
373         {\r
374                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
375                 CString sRev;\r
376                 sRev.Format(_T("%ld"), (LONG)rev);\r
377                 SetDlgItemText(IDC_REVISION_NUM, sRev);\r
378         }\r
379 }\r
380 \r
381 void CExportDlg::OnCbnEditchangeUrlcombo()\r
382 {\r
383         if (!m_bAutoCreateTargetName)\r
384                 return;\r
385         if (m_sExportDirOrig.IsEmpty())\r
386                 return;\r
387         // find out what to use as the checkout directory name\r
388         UpdateData();\r
389         m_URLCombo.GetWindowText(m_URL);\r
390         if (m_URL.IsEmpty())\r
391                 return;\r
392         CString name = CAppUtils::GetProjectNameFromURL(m_URL);\r
393         m_strExportDirectory = m_sExportDirOrig+_T('\\')+name;\r
394         UpdateData(FALSE);\r
395 }\r