1 // TortoiseSVN - a Windows shell extension for easy version control
3 // Copyright (C) 2007-2008 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "TortoiseProc.h"
21 #include "MergeWizard.h"
22 #include "MergeWizardTree.h"
26 #include "PathUtils.h"
29 IMPLEMENT_DYNAMIC(CMergeWizardTree
, CMergeWizardBasePage
)
31 CMergeWizardTree::CMergeWizardTree()
32 : CMergeWizardBasePage(CMergeWizardTree::IDD
)
41 m_psp
.dwFlags
|= PSP_DEFAULT
|PSP_USEHEADERTITLE
|PSP_USEHEADERSUBTITLE
;
42 m_psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_MERGEWIZARD_TREETITLE
);
43 m_psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_MERGEWIZARD_TREESUBTITLE
);
46 CMergeWizardTree::~CMergeWizardTree()
50 m_pLogDlg
->DestroyWindow();
55 m_pLogDlg2
->DestroyWindow();
60 m_pLogDlg3
->DestroyWindow();
65 void CMergeWizardTree::DoDataExchange(CDataExchange
* pDX
)
67 CMergeWizardBasePage::DoDataExchange(pDX
);
68 DDX_Control(pDX
, IDC_URLCOMBO
, m_URLCombo
);
69 DDX_Text(pDX
, IDC_REVISION_START
, m_sStartRev
);
70 DDX_Text(pDX
, IDC_REVISION_END
, m_sEndRev
);
71 DDX_Control(pDX
, IDC_URLCOMBO2
, m_URLCombo2
);
75 BEGIN_MESSAGE_MAP(CMergeWizardTree
, CMergeWizardBasePage
)
76 ON_REGISTERED_MESSAGE(WM_REVSELECTED
, OnRevSelected
)
77 ON_BN_CLICKED(IDC_BROWSE
, OnBnClickedBrowse
)
78 ON_BN_CLICKED(IDC_BROWSE2
, OnBnClickedBrowse2
)
79 ON_BN_CLICKED(IDC_FINDBRANCHSTART
, OnBnClickedFindbranchstart
)
80 ON_BN_CLICKED(IDC_FINDBRANCHEND
, OnBnClickedFindbranchend
)
81 ON_EN_CHANGE(IDC_REVISION_END
, &CMergeWizardTree::OnEnChangeRevisionEnd
)
82 ON_EN_CHANGE(IDC_REVISION_START
, &CMergeWizardTree::OnEnChangeRevisionStart
)
83 ON_BN_CLICKED(IDC_SHOWLOGWC
, &CMergeWizardTree::OnBnClickedShowlogwc
)
87 BOOL
CMergeWizardTree::OnInitDialog()
89 CMergeWizardBasePage::OnInitDialog();
91 CMergeWizard
* pWizard
= (CMergeWizard
*)GetParent();
92 CString sUUID
= pWizard
->sUUID
;
93 m_URLCombo
.SetURLHistory(TRUE
);
94 m_URLCombo
.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS\\")+sUUID
, _T("url"));
95 if (!(DWORD
)CRegDWORD(_T("Software\\TortoiseGit\\MergeWCURL"), FALSE
))
96 m_URLCombo
.SetCurSel(0);
97 // Only set the "From" Url if there is no url history available
98 if (m_URLCombo
.GetString().IsEmpty())
99 m_URLCombo
.SetWindowText(CPathUtils::PathUnescape(pWizard
->url
));
100 m_URLCombo2
.SetURLHistory(TRUE
);
101 m_URLCombo2
.LoadHistory(_T("Software\\TortoiseGit\\History\\repoURLS\\")+sUUID
, _T("url"));
102 m_URLCombo2
.SetCurSel(0);
103 if (m_URLCombo2
.GetString().IsEmpty())
104 m_URLCombo2
.SetWindowText(CPathUtils::PathUnescape(pWizard
->url
));
105 if (!pWizard
->URL1
.IsEmpty())
106 m_URLCombo
.SetWindowText(CPathUtils::PathUnescape(pWizard
->URL1
));
107 if (!pWizard
->URL2
.IsEmpty())
108 m_URLCombo2
.SetWindowText(CPathUtils::PathUnescape(pWizard
->URL2
));
110 SetDlgItemText(IDC_WCEDIT
, ((CMergeWizard
*)GetParent())->wcPath
.GetWinPath());
112 // set head revision as default revision
113 if (pWizard
->startRev
.IsHead() || !pWizard
->startRev
.IsValid())
114 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_HEAD1
);
117 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_N1
);
118 m_sStartRev
= pWizard
->startRev
.ToString();
119 SetDlgItemText(IDC_REVISION_START
, m_sStartRev
);
121 if (pWizard
->endRev
.IsHead() || !pWizard
->endRev
.IsValid())
122 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_HEAD
);
125 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_N
);
126 m_sEndRev
= pWizard
->endRev
.ToString();
127 SetDlgItemText(IDC_REVISION_END
, m_sEndRev
);
130 AdjustControlSize(IDC_REVISION_HEAD1
);
131 AdjustControlSize(IDC_REVISION_N1
);
132 AdjustControlSize(IDC_REVISION_HEAD
);
133 AdjustControlSize(IDC_REVISION_N
);
138 BOOL
CMergeWizardTree::CheckData(bool bShowErrors
/* = true */)
140 if (!UpdateData(TRUE
))
143 StartRev
= SVNRev(m_sStartRev
);
144 EndRev
= SVNRev(m_sEndRev
);
145 if (GetCheckedRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
) == IDC_REVISION_HEAD1
)
147 StartRev
= SVNRev(_T("HEAD"));
149 if (!StartRev
.IsValid())
152 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_START
), IDS_ERR_INVALIDREV
, TRUE
, IDI_EXCLAMATION
);
156 // if head revision, set revision as -1
157 if (GetCheckedRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
) == IDC_REVISION_HEAD
)
159 EndRev
= SVNRev(_T("HEAD"));
161 if (!EndRev
.IsValid())
164 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_END
), IDS_ERR_INVALIDREV
, TRUE
, IDI_EXCLAMATION
);
168 m_URLCombo
.SaveHistory();
169 m_URLFrom
= m_URLCombo
.GetString();
171 m_URLCombo2
.SaveHistory();
172 m_URLTo
= m_URLCombo2
.GetString();
174 ((CMergeWizard
*)GetParent())->URL1
= m_URLFrom
;
175 ((CMergeWizard
*)GetParent())->URL2
= m_URLTo
;
176 ((CMergeWizard
*)GetParent())->startRev
= StartRev
;
177 ((CMergeWizard
*)GetParent())->endRev
= EndRev
;
183 void CMergeWizardTree::OnEnChangeRevisionEnd()
186 if (m_sEndRev
.IsEmpty())
187 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_HEAD
);
189 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_N
);
192 void CMergeWizardTree::OnEnChangeRevisionStart()
195 if (m_sStartRev
.IsEmpty())
196 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_HEAD1
);
198 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_N1
);
201 void CMergeWizardTree::SetStartRevision(const SVNRev
& rev
)
204 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_HEAD1
);
207 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_N1
);
208 m_sStartRev
= rev
.ToString();
213 void CMergeWizardTree::SetEndRevision(const SVNRev
& rev
)
216 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_HEAD
);
219 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_N
);
220 m_sEndRev
= rev
.ToString();
225 void CMergeWizardTree::OnBnClickedBrowse()
228 if ((!StartRev
.IsValid())||(StartRev
== 0))
229 StartRev
= SVNRev::REV_HEAD
;
230 if (CAppUtils::BrowseRepository(m_URLCombo
, this, StartRev
))
232 SetStartRevision(StartRev
);
236 void CMergeWizardTree::OnBnClickedBrowse2()
240 if ((!EndRev
.IsValid())||(EndRev
== 0))
241 EndRev
= SVNRev::REV_HEAD
;
243 CAppUtils::BrowseRepository(m_URLCombo2
, this, EndRev
);
244 SetEndRevision(EndRev
);
247 void CMergeWizardTree::OnBnClickedFindbranchstart()
250 if ((!StartRev
.IsValid())||(StartRev
== 0))
251 StartRev
= SVNRev::REV_HEAD
;
252 if (::IsWindow(m_pLogDlg
->GetSafeHwnd())&&(m_pLogDlg
->IsWindowVisible()))
255 m_URLCombo
.GetWindowText(url
);
256 //now show the log dialog for the main trunk
259 CTSVNPath wcPath
= ((CMergeWizard
*)GetParent())->wcPath
;
262 m_pLogDlg
->DestroyWindow();
265 m_pLogDlg
= new CLogDlg();
266 CRegDWORD reg
= CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100);
267 int limit
= (int)(LONG
)reg
;
268 m_pLogDlg
->m_wParam
= MERGE_REVSELECTSTART
;
269 m_pLogDlg
->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTSTARTREVISION
)));
270 m_pLogDlg
->SetSelect(true);
271 m_pLogDlg
->m_pNotifyWindow
= this;
272 m_pLogDlg
->SetParams(CTSVNPath(url
), StartRev
, StartRev
, 1, limit
, TRUE
, FALSE
);
273 m_pLogDlg
->SetProjectPropertiesPath(wcPath
);
274 m_pLogDlg
->ContinuousSelection(true);
275 m_pLogDlg
->SetMergePath(wcPath
);
276 m_pLogDlg
->Create(IDD_LOGMESSAGE
, this);
277 m_pLogDlg
->ShowWindow(SW_SHOW
);
281 void CMergeWizardTree::OnBnClickedFindbranchend()
285 if ((!EndRev
.IsValid())||(EndRev
== 0))
286 EndRev
= SVNRev::REV_HEAD
;
287 if (::IsWindow(m_pLogDlg2
->GetSafeHwnd())&&(m_pLogDlg2
->IsWindowVisible()))
291 m_URLCombo2
.GetWindowText(url
);
292 //now show the log dialog for the main trunk
295 CTSVNPath wcPath
= ((CMergeWizard
*)GetParent())->wcPath
;
298 m_pLogDlg2
->DestroyWindow();
301 m_pLogDlg2
= new CLogDlg();
302 CRegDWORD reg
= CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100);
303 int limit
= (int)(LONG
)reg
;
304 m_pLogDlg2
->m_wParam
= MERGE_REVSELECTEND
;
305 m_pLogDlg2
->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTENDREVISION
)));
306 m_pLogDlg2
->SetSelect(true);
307 m_pLogDlg2
->m_pNotifyWindow
= this;
308 m_pLogDlg2
->SetProjectPropertiesPath(wcPath
);
309 m_pLogDlg2
->SetParams(CTSVNPath(url
), EndRev
, EndRev
, 1, limit
, TRUE
, FALSE
);
310 m_pLogDlg2
->ContinuousSelection(true);
311 m_pLogDlg2
->SetMergePath(wcPath
);
312 m_pLogDlg2
->Create(IDD_LOGMESSAGE
, this);
313 m_pLogDlg2
->ShowWindow(SW_SHOW
);
317 LPARAM
CMergeWizardTree::OnRevSelected(WPARAM wParam
, LPARAM lParam
)
321 if (wParam
& MERGE_REVSELECTSTART
)
323 if (wParam
& MERGE_REVSELECTMINUSONE
)
325 temp
.Format(_T("%ld"), lParam
);
326 SetDlgItemText(IDC_REVISION_START
, temp
);
327 CheckRadioButton(IDC_REVISION_HEAD1
, IDC_REVISION_N1
, IDC_REVISION_N1
);
329 if (wParam
& MERGE_REVSELECTEND
)
331 temp
.Format(_T("%ld"), lParam
);
332 SetDlgItemText(IDC_REVISION_END
, temp
);
333 CheckRadioButton(IDC_REVISION_HEAD
, IDC_REVISION_N
, IDC_REVISION_N
);
339 LRESULT
CMergeWizardTree::OnWizardNext()
341 if (!CheckData(true))
344 return IDD_MERGEWIZARD_OPTIONS
;
347 LRESULT
CMergeWizardTree::OnWizardBack()
349 return IDD_MERGEWIZARD_START
;
352 BOOL
CMergeWizardTree::OnSetActive()
354 CPropertySheet
* psheet
= (CPropertySheet
*) GetParent();
355 psheet
->SetWizardButtons(PSWIZB_NEXT
|PSWIZB_BACK
);
358 return CMergeWizardBasePage::OnSetActive();
361 void CMergeWizardTree::OnBnClickedShowlogwc()
363 CTSVNPath wcPath
= ((CMergeWizard
*)GetParent())->wcPath
;
365 m_pLogDlg3
->DestroyWindow();
367 m_pLogDlg3
= new CLogDlg();
368 CRegDWORD reg
= CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100);
369 int limit
= (int)(LONG
)reg
;
370 m_pLogDlg3
->SetDialogTitle(CString(MAKEINTRESOURCE(IDS_MERGE_SELECTRANGE
)));
372 m_pLogDlg3
->m_pNotifyWindow
= NULL
;
373 m_pLogDlg3
->SetParams(wcPath
, SVNRev::REV_HEAD
, SVNRev::REV_HEAD
, 1, limit
, TRUE
, FALSE
);
374 m_pLogDlg3
->SetProjectPropertiesPath(wcPath
);
375 m_pLogDlg3
->SetMergePath(wcPath
);
376 m_pLogDlg3
->Create(IDD_LOGMESSAGE
, this);
377 m_pLogDlg3
->ShowWindow(SW_SHOW
);