1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2007-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 "MergeWizard.h"
\r
22 #include "MergeWizardTree.h"
\r
24 #include "Balloon.h"
\r
25 #include "AppUtils.h"
\r
26 #include "PathUtils.h"
\r
29 IMPLEMENT_DYNAMIC(CMergeWizardTree, CMergeWizardBasePage)
\r
31 CMergeWizardTree::CMergeWizardTree()
\r
32 : CMergeWizardBasePage(CMergeWizardTree::IDD)
\r
36 , EndRev(_T("HEAD"))
\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
46 CMergeWizardTree::~CMergeWizardTree()
\r
50 m_pLogDlg->DestroyWindow();
\r
55 m_pLogDlg2->DestroyWindow();
\r
60 m_pLogDlg3->DestroyWindow();
\r
65 void CMergeWizardTree::DoDataExchange(CDataExchange* pDX)
\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
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
87 BOOL CMergeWizardTree::OnInitDialog()
\r
89 CMergeWizardBasePage::OnInitDialog();
\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\\TortoiseGit\\History\\repoURLS\\")+sUUID, _T("url"));
\r
95 if (!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\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\\TortoiseGit\\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
110 SetDlgItemText(IDC_WCEDIT, ((CMergeWizard*)GetParent())->wcPath.GetWinPath());
\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
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
121 if (pWizard->endRev.IsHead() || !pWizard->endRev.IsValid())
\r
122 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\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
130 AdjustControlSize(IDC_REVISION_HEAD1);
\r
131 AdjustControlSize(IDC_REVISION_N1);
\r
132 AdjustControlSize(IDC_REVISION_HEAD);
\r
133 AdjustControlSize(IDC_REVISION_N);
\r
138 BOOL CMergeWizardTree::CheckData(bool bShowErrors /* = true */)
\r
140 if (!UpdateData(TRUE))
\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
147 StartRev = SVNRev(_T("HEAD"));
\r
149 if (!StartRev.IsValid())
\r
152 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_START), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);
\r
156 // if head revision, set revision as -1
\r
157 if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
\r
159 EndRev = SVNRev(_T("HEAD"));
\r
161 if (!EndRev.IsValid())
\r
164 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_END), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);
\r
168 m_URLCombo.SaveHistory();
\r
169 m_URLFrom = m_URLCombo.GetString();
\r
171 m_URLCombo2.SaveHistory();
\r
172 m_URLTo = m_URLCombo2.GetString();
\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
183 void CMergeWizardTree::OnEnChangeRevisionEnd()
\r
186 if (m_sEndRev.IsEmpty())
\r
187 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
189 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
192 void CMergeWizardTree::OnEnChangeRevisionStart()
\r
195 if (m_sStartRev.IsEmpty())
\r
196 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);
\r
198 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);
\r
201 void CMergeWizardTree::SetStartRevision(const SVNRev& rev)
\r
204 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);
\r
207 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);
\r
208 m_sStartRev = rev.ToString();
\r
213 void CMergeWizardTree::SetEndRevision(const SVNRev& rev)
\r
216 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
\r
219 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
\r
220 m_sEndRev = rev.ToString();
\r
225 void CMergeWizardTree::OnBnClickedBrowse()
\r
228 if ((!StartRev.IsValid())||(StartRev == 0))
\r
229 StartRev = SVNRev::REV_HEAD;
\r
230 if (CAppUtils::BrowseRepository(m_URLCombo, this, StartRev))
\r
232 SetStartRevision(StartRev);
\r
236 void CMergeWizardTree::OnBnClickedBrowse2()
\r
240 if ((!EndRev.IsValid())||(EndRev == 0))
\r
241 EndRev = SVNRev::REV_HEAD;
\r
243 CAppUtils::BrowseRepository(m_URLCombo2, this, EndRev);
\r
244 SetEndRevision(EndRev);
\r
247 void CMergeWizardTree::OnBnClickedFindbranchstart()
\r
250 if ((!StartRev.IsValid())||(StartRev == 0))
\r
251 StartRev = SVNRev::REV_HEAD;
\r
252 if (::IsWindow(m_pLogDlg->GetSafeHwnd())&&(m_pLogDlg->IsWindowVisible()))
\r
255 m_URLCombo.GetWindowText(url);
\r
256 //now show the log dialog for the main trunk
\r
257 if (!url.IsEmpty())
\r
259 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
\r
262 m_pLogDlg->DestroyWindow();
\r
265 m_pLogDlg = new CLogDlg();
\r
266 CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseGit\\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
281 void CMergeWizardTree::OnBnClickedFindbranchend()
\r
285 if ((!EndRev.IsValid())||(EndRev == 0))
\r
286 EndRev = SVNRev::REV_HEAD;
\r
287 if (::IsWindow(m_pLogDlg2->GetSafeHwnd())&&(m_pLogDlg2->IsWindowVisible()))
\r
291 m_URLCombo2.GetWindowText(url);
\r
292 //now show the log dialog for the main trunk
\r
293 if (!url.IsEmpty())
\r
295 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
\r
298 m_pLogDlg2->DestroyWindow();
\r
301 m_pLogDlg2 = new CLogDlg();
\r
302 CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseGit\\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
317 LPARAM CMergeWizardTree::OnRevSelected(WPARAM wParam, LPARAM lParam)
\r
321 if (wParam & MERGE_REVSELECTSTART)
\r
323 if (wParam & MERGE_REVSELECTMINUSONE)
\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
329 if (wParam & MERGE_REVSELECTEND)
\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
339 LRESULT CMergeWizardTree::OnWizardNext()
\r
341 if (!CheckData(true))
\r
344 return IDD_MERGEWIZARD_OPTIONS;
\r
347 LRESULT CMergeWizardTree::OnWizardBack()
\r
349 return IDD_MERGEWIZARD_START;
\r
352 BOOL CMergeWizardTree::OnSetActive()
\r
354 CPropertySheet* psheet = (CPropertySheet*) GetParent();
\r
355 psheet->SetWizardButtons(PSWIZB_NEXT|PSWIZB_BACK);
\r
358 return CMergeWizardBasePage::OnSetActive();
\r
361 void CMergeWizardTree::OnBnClickedShowlogwc()
\r
363 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
\r
365 m_pLogDlg3->DestroyWindow();
\r
367 m_pLogDlg3 = new CLogDlg();
\r
368 CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100);
\r
369 int limit = (int)(LONG)reg;
\r
370 m_pLogDlg3->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTRANGE)));
\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