OSDN Git Service

Fix CStringList TortoiseShell build problem
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / CheckoutDlg.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 "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
27 \r
28 \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
36         , m_pLogDlg(NULL)\r
37 {\r
38 }\r
39 \r
40 CCheckoutDlg::~CCheckoutDlg()\r
41 {\r
42         if (m_pLogDlg)\r
43                 delete m_pLogDlg;\r
44 }\r
45 \r
46 void CCheckoutDlg::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_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
57 }\r
58 \r
59 \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
69 END_MESSAGE_MAP()\r
70 \r
71 BOOL CCheckoutDlg::OnInitDialog()\r
72 {\r
73         CResizableStandAloneDialog::OnInitDialog();\r
74 \r
75         AdjustControlSize(IDC_NOEXTERNALS);\r
76         AdjustControlSize(IDC_REVISION_HEAD);\r
77         AdjustControlSize(IDC_REVISION_N);\r
78 \r
79         m_sCheckoutDirOrig = m_strCheckoutDirectory;\r
80 \r
81         CString sUrlSave = m_URL;\r
82         m_URLCombo.SetURLHistory(TRUE);\r
83         m_bAutoCreateTargetName = FALSE;\r
84         m_URLCombo.LoadHistory(_T("Software\\TortoiseSVN\\History\\repoURLS"), _T("url"));\r
85         m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sCheckoutDirOrig);\r
86         m_URLCombo.SetCurSel(0);\r
87 \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
93 \r
94         // set radio buttons according to the revision\r
95         SetRevision(Revision);\r
96 \r
97         m_editRevision.SetWindowText(_T(""));\r
98 \r
99         if (!sUrlSave.IsEmpty())\r
100         {\r
101                 SetDlgItemText(IDC_CHECKOUTDIRECTORY, m_sCheckoutDirOrig);\r
102                 m_URLCombo.SetWindowText(sUrlSave);\r
103         }\r
104         m_tooltips.Create(this);\r
105         m_tooltips.AddTool(IDC_CHECKOUTDIRECTORY, IDS_CHECKOUT_TT_DIR);\r
106 \r
107         SHAutoComplete(GetDlgItem(IDC_CHECKOUTDIRECTORY)->m_hWnd, SHACF_FILESYSTEM);\r
108 \r
109         if (!Revision.IsHead())\r
110         {\r
111                 CString temp;\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
115         }\r
116         if (m_strCheckoutDirectory.IsEmpty())\r
117         {\r
118                 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseSVN\\History\\lastCheckoutPath"));\r
119                 m_strCheckoutDirectory = lastCheckoutPath;\r
120                 if (m_strCheckoutDirectory.GetLength() <= 2)\r
121                         m_strCheckoutDirectory += _T("\\");\r
122         }\r
123         UpdateData(FALSE);\r
124 \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
143 \r
144         // prevent resizing vertically\r
145         CRect rect;\r
146         GetWindowRect(&rect);\r
147         CSize size;\r
148         size.cx = MAXLONG;\r
149         size.cy = rect.Height();\r
150         SetMaxTrackSize(size);\r
151 \r
152         if ((m_pParentWnd==NULL)&&(hWndExplorer))\r
153                 CenterWindow(CWnd::FromHandle(hWndExplorer));\r
154         EnableSaveRestore(_T("CheckoutDlg"));\r
155         return TRUE;\r
156 }\r
157 \r
158 void CCheckoutDlg::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         CTSVNPath checkoutDirectory;\r
164         if (::PathIsRelative(m_strCheckoutDirectory))\r
165         {\r
166                 checkoutDirectory = CTSVNPath(sOrigCWD);\r
167                 checkoutDirectory.AppendPathString(_T("\\") + m_strCheckoutDirectory);\r
168                 m_strCheckoutDirectory = checkoutDirectory.GetWinPathString();\r
169         }\r
170         else\r
171                 checkoutDirectory = CTSVNPath(m_strCheckoutDirectory);\r
172         if (!checkoutDirectory.IsValidOnWindows())\r
173         {\r
174                 ShowBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH);\r
175                 return;\r
176         }\r
177 \r
178         if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)\r
179         {\r
180                 Revision = SVNRev(_T("HEAD"));\r
181         }\r
182         else\r
183                 Revision = SVNRev(m_sRevision);\r
184         if (!Revision.IsValid())\r
185         {\r
186                 ShowBalloon(IDC_REVISION_NUM, IDS_ERR_INVALIDREV);\r
187                 return;\r
188         }\r
189 \r
190         bool bAutoCreateTargetName = m_bAutoCreateTargetName;\r
191         m_bAutoCreateTargetName = false;\r
192         m_URLCombo.SaveHistory();\r
193         m_URL = m_URLCombo.GetString();\r
194 \r
195         if (!SVN::PathIsURL(CTSVNPath(m_URL)))\r
196         {\r
197                 ShowBalloon(IDC_URLCOMBO, IDS_ERR_MUSTBEURL, IDI_ERROR);\r
198                 m_bAutoCreateTargetName = bAutoCreateTargetName;\r
199                 return;\r
200         }\r
201 \r
202         if (m_strCheckoutDirectory.IsEmpty())\r
203         {\r
204                 return;                 //don't dismiss the dialog\r
205         }\r
206         if (!PathFileExists(m_strCheckoutDirectory))\r
207         {\r
208                 CString temp;\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
211                 {\r
212                         CPathUtils::MakeSureDirectoryPathExists(m_strCheckoutDirectory);\r
213                 }\r
214                 else\r
215                 {\r
216                         m_bAutoCreateTargetName = bAutoCreateTargetName;\r
217                         return;         //don't dismiss the dialog\r
218                 }\r
219         }\r
220         if (!PathIsDirectoryEmpty(m_strCheckoutDirectory))\r
221         {\r
222                 CString message;\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
225                 {\r
226                         m_bAutoCreateTargetName = bAutoCreateTargetName;\r
227                         return;         //don't dismiss the dialog\r
228                 }\r
229         }\r
230         switch (m_depthCombo.GetCurSel())\r
231         {\r
232         case 0:\r
233                 m_depth = svn_depth_infinity;\r
234                 break;\r
235         case 1:\r
236                 m_depth = svn_depth_immediates;\r
237                 break;\r
238         case 2:\r
239                 m_depth = svn_depth_files;\r
240                 break;\r
241         case 3:\r
242                 m_depth = svn_depth_empty;\r
243                 break;\r
244         default:\r
245                 m_depth = svn_depth_empty;\r
246                 break;\r
247         }\r
248         UpdateData(FALSE);\r
249         CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseSVN\\History\\lastCheckoutPath"));\r
250         lastCheckoutPath = m_strCheckoutDirectory.Left(m_strCheckoutDirectory.ReverseFind('\\'));\r
251         CResizableStandAloneDialog::OnOK();\r
252 }\r
253 \r
254 void CCheckoutDlg::OnBnClickedBrowse()\r
255 {\r
256         m_tooltips.Pop();       // hide the tooltips\r
257         SVNRev rev;\r
258         UpdateData();\r
259         if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)\r
260         {\r
261                 rev = SVNRev(_T("HEAD"));\r
262         }\r
263         else\r
264                 rev = SVNRev(m_sRevision);\r
265 \r
266         if (!rev.IsValid())\r
267                 rev = SVNRev::REV_HEAD;\r
268         if (CAppUtils::BrowseRepository(m_URLCombo, this, rev))\r
269         {\r
270                 SetRevision(rev);\r
271 \r
272                 CRegString regDefCheckoutUrl(_T("Software\\TortoiseSVN\\DefaultCheckoutUrl"));\r
273                 CRegString regDefCheckoutPath(_T("Software\\TortoiseSVN\\DefaultCheckoutPath"));\r
274                 if (!CString(regDefCheckoutUrl).IsEmpty())\r
275                 {\r
276                         m_URL = m_URLCombo.GetString();\r
277                 }\r
278                 else\r
279                 {\r
280                         m_URLCombo.GetWindowText(m_URL);\r
281                         if (m_URL.IsEmpty())\r
282                                 return;\r
283                 }\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
288                 {\r
289                         CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseSVN\\History\\lastCheckoutPath"));\r
290                         m_strCheckoutDirectory = lastCheckoutPath;\r
291                         if (m_strCheckoutDirectory.GetLength() <= 2)\r
292                                 m_strCheckoutDirectory += _T("\\");\r
293                 }\r
294                 UpdateData(FALSE);\r
295         }\r
296 }\r
297 \r
298 void CCheckoutDlg::OnBnClickedCheckoutdirectoryBrowse()\r
299 {\r
300         m_tooltips.Pop();       // hide the tooltips\r
301         //\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
306         //\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
311         {\r
312                 UpdateData(TRUE);\r
313                 m_strCheckoutDirectory = strCheckoutDirectory;\r
314                 m_sCheckoutDirOrig = m_strCheckoutDirectory;\r
315                 m_bAutoCreateTargetName = !PathIsDirectoryEmpty(m_sCheckoutDirOrig);\r
316                 UpdateData(FALSE);\r
317         }\r
318 }\r
319 \r
320 BOOL CCheckoutDlg::PreTranslateMessage(MSG* pMsg)\r
321 {\r
322         m_tooltips.RelayEvent(pMsg);\r
323         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
324 }\r
325 \r
326 void CCheckoutDlg::OnEnChangeCheckoutdirectory()\r
327 {\r
328         UpdateData(TRUE);               \r
329         DialogEnableWindow(IDOK, !m_strCheckoutDirectory.IsEmpty());\r
330 }\r
331 \r
332 void CCheckoutDlg::OnBnClickedHelp()\r
333 {\r
334         OnHelp();\r
335 }\r
336 \r
337 void CCheckoutDlg::OnBnClickedShowlog()\r
338 {\r
339         m_tooltips.Pop();       // hide the tooltips\r
340         UpdateData(TRUE);\r
341         m_URL = m_URLCombo.GetString();\r
342         if ((m_pLogDlg)&&(m_pLogDlg->IsWindowVisible()))\r
343                 return;\r
344         AfxGetApp()->DoWaitCursor(1);\r
345         //now show the log dialog for working copy\r
346         if (!m_URL.IsEmpty())\r
347         {\r
348                 delete m_pLogDlg;\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\\TortoiseSVN\\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
356         }\r
357         AfxGetApp()->DoWaitCursor(-1);\r
358 }\r
359 \r
360 LPARAM CCheckoutDlg::OnRevSelected(WPARAM /*wParam*/, LPARAM lParam)\r
361 {\r
362         CString temp;\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
366         return 0;\r
367 }\r
368 \r
369 void CCheckoutDlg::OnEnChangeRevisionNum()\r
370 {\r
371         UpdateData();\r
372         if (m_sRevision.IsEmpty())\r
373                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
374         else\r
375                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
376 }\r
377 \r
378 void CCheckoutDlg::SetRevision(const SVNRev& rev)\r
379 {\r
380         if (rev.IsHead() || !rev.IsValid())\r
381                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
382         else\r
383         {\r
384                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
385                 CString sRev;\r
386                 sRev.Format(_T("%ld"), (LONG)rev);\r
387                 SetDlgItemText(IDC_REVISION_NUM, sRev);\r
388         }\r
389 }\r
390 \r
391 void CCheckoutDlg::OnCbnEditchangeUrlcombo()\r
392 {\r
393         if (!m_bAutoCreateTargetName)\r
394                 return;\r
395         if (m_sCheckoutDirOrig.IsEmpty())\r
396                 return;\r
397         // find out what to use as the checkout directory name\r
398         UpdateData();\r
399         m_URLCombo.GetWindowText(m_URL);\r
400         if (m_URL.IsEmpty())\r
401                 return;\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
407         {\r
408                 CRegString lastCheckoutPath = CRegString(_T("Software\\TortoiseSVN\\History\\lastCheckoutPath"));\r
409                 m_strCheckoutDirectory = lastCheckoutPath;\r
410                 if (m_strCheckoutDirectory.GetLength() <= 2)\r
411                         m_strCheckoutDirectory += _T("\\");\r
412         }\r
413         UpdateData(FALSE);\r
414 }\r
415 \r