OSDN Git Service

Try to enable 64bit compile
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / MergeWizardTree.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2007-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 "MergeWizard.h"\r
22 #include "MergeWizardTree.h"\r
23 \r
24 #include "Balloon.h"\r
25 #include "AppUtils.h"\r
26 #include "PathUtils.h"\r
27 \r
28 \r
29 IMPLEMENT_DYNAMIC(CMergeWizardTree, CMergeWizardBasePage)\r
30 \r
31 CMergeWizardTree::CMergeWizardTree()\r
32         : CMergeWizardBasePage(CMergeWizardTree::IDD)\r
33         , m_URLFrom(_T(""))\r
34         , m_URLTo(_T(""))\r
35         , StartRev(0)\r
36         , EndRev(_T("HEAD"))\r
37         , m_pLogDlg(NULL)\r
38         , m_pLogDlg2(NULL)\r
39         , m_pLogDlg3(NULL)\r
40 {\r
41         m_psp.dwFlags |= PSP_DEFAULT|PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE;\r
42         m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_MERGEWIZARD_TREETITLE);\r
43         m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_MERGEWIZARD_TREESUBTITLE);\r
44 }\r
45 \r
46 CMergeWizardTree::~CMergeWizardTree()\r
47 {\r
48         if (m_pLogDlg)\r
49         {\r
50                 m_pLogDlg->DestroyWindow();\r
51                 delete m_pLogDlg;\r
52         }\r
53         if (m_pLogDlg2)\r
54         {\r
55                 m_pLogDlg2->DestroyWindow();\r
56                 delete m_pLogDlg2;\r
57         }\r
58         if (m_pLogDlg3)\r
59         {\r
60                 m_pLogDlg3->DestroyWindow();\r
61                 delete m_pLogDlg3;\r
62         }\r
63 }\r
64 \r
65 void CMergeWizardTree::DoDataExchange(CDataExchange* pDX)\r
66 {\r
67         CMergeWizardBasePage::DoDataExchange(pDX);\r
68         DDX_Control(pDX, IDC_URLCOMBO, m_URLCombo);\r
69         DDX_Text(pDX, IDC_REVISION_START, m_sStartRev);\r
70         DDX_Text(pDX, IDC_REVISION_END, m_sEndRev);\r
71         DDX_Control(pDX, IDC_URLCOMBO2, m_URLCombo2);\r
72 }\r
73 \r
74 \r
75 BEGIN_MESSAGE_MAP(CMergeWizardTree, CMergeWizardBasePage)\r
76         ON_REGISTERED_MESSAGE(WM_REVSELECTED, OnRevSelected)\r
77         ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)\r
78         ON_BN_CLICKED(IDC_BROWSE2, OnBnClickedBrowse2)\r
79         ON_BN_CLICKED(IDC_FINDBRANCHSTART, OnBnClickedFindbranchstart)\r
80         ON_BN_CLICKED(IDC_FINDBRANCHEND, OnBnClickedFindbranchend)\r
81         ON_EN_CHANGE(IDC_REVISION_END, &CMergeWizardTree::OnEnChangeRevisionEnd)\r
82         ON_EN_CHANGE(IDC_REVISION_START, &CMergeWizardTree::OnEnChangeRevisionStart)\r
83         ON_BN_CLICKED(IDC_SHOWLOGWC, &CMergeWizardTree::OnBnClickedShowlogwc)\r
84 END_MESSAGE_MAP()\r
85 \r
86 \r
87 BOOL CMergeWizardTree::OnInitDialog()\r
88 {\r
89         CMergeWizardBasePage::OnInitDialog();\r
90 \r
91         CMergeWizard * pWizard = (CMergeWizard*)GetParent();\r
92         CString sUUID = pWizard->sUUID;\r
93         m_URLCombo.SetURLHistory(TRUE);\r
94         m_URLCombo.LoadHistory(_T("Software\\TortoiseSVN\\History\\repoURLS\\")+sUUID, _T("url"));\r
95         if (!(DWORD)CRegDWORD(_T("Software\\TortoiseSVN\\MergeWCURL"), FALSE))\r
96                 m_URLCombo.SetCurSel(0);\r
97         // Only set the "From" Url if there is no url history available\r
98         if (m_URLCombo.GetString().IsEmpty())\r
99                 m_URLCombo.SetWindowText(CPathUtils::PathUnescape(pWizard->url));\r
100         m_URLCombo2.SetURLHistory(TRUE);\r
101         m_URLCombo2.LoadHistory(_T("Software\\TortoiseSVN\\History\\repoURLS\\")+sUUID, _T("url"));\r
102         m_URLCombo2.SetCurSel(0);\r
103         if (m_URLCombo2.GetString().IsEmpty())\r
104                 m_URLCombo2.SetWindowText(CPathUtils::PathUnescape(pWizard->url));\r
105         if (!pWizard->URL1.IsEmpty())\r
106                 m_URLCombo.SetWindowText(CPathUtils::PathUnescape(pWizard->URL1));\r
107         if (!pWizard->URL2.IsEmpty())\r
108                 m_URLCombo2.SetWindowText(CPathUtils::PathUnescape(pWizard->URL2));\r
109 \r
110         SetDlgItemText(IDC_WCEDIT, ((CMergeWizard*)GetParent())->wcPath.GetWinPath());\r
111 \r
112         // set head revision as default revision\r
113         if (pWizard->startRev.IsHead() || !pWizard->startRev.IsValid())\r
114                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);\r
115         else\r
116         {\r
117                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);\r
118                 m_sStartRev = pWizard->startRev.ToString();\r
119                 SetDlgItemText(IDC_REVISION_START, m_sStartRev);\r
120         }\r
121         if (pWizard->endRev.IsHead() || !pWizard->endRev.IsValid())\r
122                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
123         else\r
124         {\r
125                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
126                 m_sEndRev = pWizard->endRev.ToString();\r
127                 SetDlgItemText(IDC_REVISION_END, m_sEndRev);\r
128         }\r
129 \r
130         AdjustControlSize(IDC_REVISION_HEAD1);\r
131         AdjustControlSize(IDC_REVISION_N1);\r
132         AdjustControlSize(IDC_REVISION_HEAD);\r
133         AdjustControlSize(IDC_REVISION_N);\r
134 \r
135         return TRUE;\r
136 }\r
137 \r
138 BOOL CMergeWizardTree::CheckData(bool bShowErrors /* = true */)\r
139 {\r
140         if (!UpdateData(TRUE))\r
141                 return FALSE;\r
142 \r
143         StartRev = SVNRev(m_sStartRev);\r
144         EndRev = SVNRev(m_sEndRev);\r
145         if (GetCheckedRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1) == IDC_REVISION_HEAD1)\r
146         {\r
147                 StartRev = SVNRev(_T("HEAD"));\r
148         }\r
149         if (!StartRev.IsValid())\r
150         {\r
151                 if (bShowErrors)\r
152                         CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_START), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);\r
153                 return FALSE;\r
154         }\r
155 \r
156         // if head revision, set revision as -1\r
157         if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)\r
158         {\r
159                 EndRev = SVNRev(_T("HEAD"));\r
160         }\r
161         if (!EndRev.IsValid())\r
162         {\r
163                 if (bShowErrors)\r
164                         CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_END), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);\r
165                 return FALSE;\r
166         }\r
167 \r
168         m_URLCombo.SaveHistory();\r
169         m_URLFrom = m_URLCombo.GetString();\r
170 \r
171         m_URLCombo2.SaveHistory();\r
172         m_URLTo = m_URLCombo2.GetString();\r
173 \r
174         ((CMergeWizard*)GetParent())->URL1 = m_URLFrom;\r
175         ((CMergeWizard*)GetParent())->URL2 = m_URLTo;\r
176     ((CMergeWizard*)GetParent())->startRev = StartRev;\r
177     ((CMergeWizard*)GetParent())->endRev = EndRev;\r
178 \r
179         UpdateData(FALSE);\r
180         return TRUE;\r
181 }\r
182 \r
183 void CMergeWizardTree::OnEnChangeRevisionEnd()\r
184 {\r
185         UpdateData();\r
186         if (m_sEndRev.IsEmpty())\r
187                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
188         else\r
189                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
190 }\r
191 \r
192 void CMergeWizardTree::OnEnChangeRevisionStart()\r
193 {\r
194         UpdateData();\r
195         if (m_sStartRev.IsEmpty())\r
196                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);\r
197         else\r
198                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);\r
199 }\r
200 \r
201 void CMergeWizardTree::SetStartRevision(const SVNRev& rev)\r
202 {\r
203         if (rev.IsHead())\r
204                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);\r
205         else\r
206         {\r
207                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);\r
208                 m_sStartRev = rev.ToString();\r
209                 UpdateData(FALSE);\r
210         }\r
211 }\r
212 \r
213 void CMergeWizardTree::SetEndRevision(const SVNRev& rev)\r
214 {\r
215         if (rev.IsHead())\r
216                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);\r
217         else\r
218         {\r
219                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
220                 m_sEndRev = rev.ToString();\r
221                 UpdateData(FALSE);\r
222         }\r
223 }\r
224 \r
225 void CMergeWizardTree::OnBnClickedBrowse()\r
226 {\r
227         CheckData(false);\r
228         if ((!StartRev.IsValid())||(StartRev == 0))\r
229                 StartRev = SVNRev::REV_HEAD;\r
230         if (CAppUtils::BrowseRepository(m_URLCombo, this, StartRev))\r
231         {\r
232                 SetStartRevision(StartRev);\r
233         }\r
234 }\r
235 \r
236 void CMergeWizardTree::OnBnClickedBrowse2()\r
237 {\r
238         CheckData(false);\r
239 \r
240         if ((!EndRev.IsValid())||(EndRev == 0))\r
241                 EndRev = SVNRev::REV_HEAD;\r
242 \r
243         CAppUtils::BrowseRepository(m_URLCombo2, this, EndRev);\r
244         SetEndRevision(EndRev);\r
245 }\r
246 \r
247 void CMergeWizardTree::OnBnClickedFindbranchstart()\r
248 {\r
249         CheckData(false);\r
250         if ((!StartRev.IsValid())||(StartRev == 0))\r
251                 StartRev = SVNRev::REV_HEAD;\r
252         if (::IsWindow(m_pLogDlg->GetSafeHwnd())&&(m_pLogDlg->IsWindowVisible()))\r
253                 return;\r
254         CString url;\r
255         m_URLCombo.GetWindowText(url);\r
256         //now show the log dialog for the main trunk\r
257         if (!url.IsEmpty())\r
258         {\r
259                 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;\r
260                 if (m_pLogDlg)\r
261                 {\r
262                         m_pLogDlg->DestroyWindow();\r
263                         delete m_pLogDlg;\r
264                 }\r
265                 m_pLogDlg = new CLogDlg();\r
266                 CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseSVN\\NumberOfLogs"), 100);\r
267                 int limit = (int)(LONG)reg;\r
268                 m_pLogDlg->m_wParam = MERGE_REVSELECTSTART;\r
269                 m_pLogDlg->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTSTARTREVISION)));\r
270                 m_pLogDlg->SetSelect(true);\r
271                 m_pLogDlg->m_pNotifyWindow = this;\r
272                 m_pLogDlg->SetParams(CTSVNPath(url), StartRev, StartRev, 1, limit, TRUE, FALSE);\r
273                 m_pLogDlg->SetProjectPropertiesPath(wcPath);\r
274                 m_pLogDlg->ContinuousSelection(true);\r
275                 m_pLogDlg->SetMergePath(wcPath);\r
276                 m_pLogDlg->Create(IDD_LOGMESSAGE, this);\r
277                 m_pLogDlg->ShowWindow(SW_SHOW);\r
278         }\r
279 }\r
280 \r
281 void CMergeWizardTree::OnBnClickedFindbranchend()\r
282 {\r
283         CheckData(false);\r
284 \r
285         if ((!EndRev.IsValid())||(EndRev == 0))\r
286                 EndRev = SVNRev::REV_HEAD;\r
287         if (::IsWindow(m_pLogDlg2->GetSafeHwnd())&&(m_pLogDlg2->IsWindowVisible()))\r
288                 return;\r
289         CString url;\r
290 \r
291         m_URLCombo2.GetWindowText(url);\r
292         //now show the log dialog for the main trunk\r
293         if (!url.IsEmpty())\r
294         {\r
295                 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;\r
296                 if (m_pLogDlg2)\r
297                 {\r
298                         m_pLogDlg2->DestroyWindow();\r
299                         delete m_pLogDlg2;\r
300                 }\r
301                 m_pLogDlg2 = new CLogDlg();\r
302                 CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseSVN\\NumberOfLogs"), 100);\r
303                 int limit = (int)(LONG)reg;\r
304                 m_pLogDlg2->m_wParam = MERGE_REVSELECTEND;\r
305                 m_pLogDlg2->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTENDREVISION)));\r
306                 m_pLogDlg2->SetSelect(true);\r
307                 m_pLogDlg2->m_pNotifyWindow = this;\r
308                 m_pLogDlg2->SetProjectPropertiesPath(wcPath);\r
309                 m_pLogDlg2->SetParams(CTSVNPath(url), EndRev, EndRev, 1, limit, TRUE, FALSE);\r
310                 m_pLogDlg2->ContinuousSelection(true);\r
311                 m_pLogDlg2->SetMergePath(wcPath);\r
312                 m_pLogDlg2->Create(IDD_LOGMESSAGE, this);\r
313                 m_pLogDlg2->ShowWindow(SW_SHOW);\r
314         }\r
315 }\r
316 \r
317 LPARAM CMergeWizardTree::OnRevSelected(WPARAM wParam, LPARAM lParam)\r
318 {\r
319         CString temp;\r
320 \r
321         if (wParam & MERGE_REVSELECTSTART)\r
322         {\r
323                 if (wParam & MERGE_REVSELECTMINUSONE)\r
324                         lParam--;\r
325                 temp.Format(_T("%ld"), lParam);\r
326                 SetDlgItemText(IDC_REVISION_START, temp);\r
327                 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);\r
328         }\r
329         if (wParam & MERGE_REVSELECTEND)\r
330         {\r
331                 temp.Format(_T("%ld"), lParam);\r
332                 SetDlgItemText(IDC_REVISION_END, temp);\r
333                 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);\r
334         }\r
335         return 0;\r
336 }\r
337 \r
338 \r
339 LRESULT CMergeWizardTree::OnWizardNext()\r
340 {\r
341         if (!CheckData(true))\r
342                 return -1;\r
343 \r
344         return IDD_MERGEWIZARD_OPTIONS;\r
345 }\r
346 \r
347 LRESULT CMergeWizardTree::OnWizardBack()\r
348 {\r
349         return IDD_MERGEWIZARD_START;\r
350 }\r
351 \r
352 BOOL CMergeWizardTree::OnSetActive()\r
353 {\r
354         CPropertySheet* psheet = (CPropertySheet*) GetParent();   \r
355         psheet->SetWizardButtons(PSWIZB_NEXT|PSWIZB_BACK);\r
356         SetButtonTexts();\r
357 \r
358         return CMergeWizardBasePage::OnSetActive();\r
359 }\r
360 \r
361 void CMergeWizardTree::OnBnClickedShowlogwc()\r
362 {\r
363         CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;\r
364         if (m_pLogDlg3)\r
365                 m_pLogDlg3->DestroyWindow();\r
366         delete m_pLogDlg3;\r
367         m_pLogDlg3 = new CLogDlg();\r
368         CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseSVN\\NumberOfLogs"), 100);\r
369         int limit = (int)(LONG)reg;\r
370         m_pLogDlg3->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTRANGE)));\r
371 \r
372         m_pLogDlg3->m_pNotifyWindow = NULL;\r
373         m_pLogDlg3->SetParams(wcPath, SVNRev::REV_HEAD, SVNRev::REV_HEAD, 1, limit, TRUE, FALSE);\r
374         m_pLogDlg3->SetProjectPropertiesPath(wcPath);\r
375         m_pLogDlg3->SetMergePath(wcPath);\r
376         m_pLogDlg3->Create(IDD_LOGMESSAGE, this);\r
377         m_pLogDlg3->ShowWindow(SW_SHOW);\r
378 }\r