Add Setting Dialog
[TortoiseGit.git] / src / TortoiseProc / MergeWizardTree.cpp
blob8c073720869a988a494aa3ae3ac2122be2860633
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.
19 #include "stdafx.h"
20 #include "TortoiseProc.h"
21 #include "MergeWizard.h"
22 #include "MergeWizardTree.h"
24 #include "Balloon.h"
25 #include "AppUtils.h"
26 #include "PathUtils.h"
29 IMPLEMENT_DYNAMIC(CMergeWizardTree, CMergeWizardBasePage)
31 CMergeWizardTree::CMergeWizardTree()
32 : CMergeWizardBasePage(CMergeWizardTree::IDD)
33 , m_URLFrom(_T(""))
34 , m_URLTo(_T(""))
35 , StartRev(0)
36 , EndRev(_T("HEAD"))
37 , m_pLogDlg(NULL)
38 , m_pLogDlg2(NULL)
39 , m_pLogDlg3(NULL)
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()
48 if (m_pLogDlg)
50 m_pLogDlg->DestroyWindow();
51 delete m_pLogDlg;
53 if (m_pLogDlg2)
55 m_pLogDlg2->DestroyWindow();
56 delete m_pLogDlg2;
58 if (m_pLogDlg3)
60 m_pLogDlg3->DestroyWindow();
61 delete m_pLogDlg3;
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)
84 END_MESSAGE_MAP()
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);
115 else
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);
123 else
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);
135 return TRUE;
138 BOOL CMergeWizardTree::CheckData(bool bShowErrors /* = true */)
140 if (!UpdateData(TRUE))
141 return FALSE;
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())
151 if (bShowErrors)
152 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_START), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);
153 return FALSE;
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())
163 if (bShowErrors)
164 CBalloon::ShowBalloon(this, CBalloon::GetCtrlCentre(this, IDC_REVISION_END), IDS_ERR_INVALIDREV, TRUE, IDI_EXCLAMATION);
165 return FALSE;
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;
179 UpdateData(FALSE);
180 return TRUE;
183 void CMergeWizardTree::OnEnChangeRevisionEnd()
185 UpdateData();
186 if (m_sEndRev.IsEmpty())
187 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
188 else
189 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
192 void CMergeWizardTree::OnEnChangeRevisionStart()
194 UpdateData();
195 if (m_sStartRev.IsEmpty())
196 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);
197 else
198 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);
201 void CMergeWizardTree::SetStartRevision(const SVNRev& rev)
203 if (rev.IsHead())
204 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_HEAD1);
205 else
207 CheckRadioButton(IDC_REVISION_HEAD1, IDC_REVISION_N1, IDC_REVISION_N1);
208 m_sStartRev = rev.ToString();
209 UpdateData(FALSE);
213 void CMergeWizardTree::SetEndRevision(const SVNRev& rev)
215 if (rev.IsHead())
216 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
217 else
219 CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
220 m_sEndRev = rev.ToString();
221 UpdateData(FALSE);
225 void CMergeWizardTree::OnBnClickedBrowse()
227 CheckData(false);
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()
238 CheckData(false);
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()
249 CheckData(false);
250 if ((!StartRev.IsValid())||(StartRev == 0))
251 StartRev = SVNRev::REV_HEAD;
252 if (::IsWindow(m_pLogDlg->GetSafeHwnd())&&(m_pLogDlg->IsWindowVisible()))
253 return;
254 CString url;
255 m_URLCombo.GetWindowText(url);
256 //now show the log dialog for the main trunk
257 if (!url.IsEmpty())
259 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
260 if (m_pLogDlg)
262 m_pLogDlg->DestroyWindow();
263 delete m_pLogDlg;
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()
283 CheckData(false);
285 if ((!EndRev.IsValid())||(EndRev == 0))
286 EndRev = SVNRev::REV_HEAD;
287 if (::IsWindow(m_pLogDlg2->GetSafeHwnd())&&(m_pLogDlg2->IsWindowVisible()))
288 return;
289 CString url;
291 m_URLCombo2.GetWindowText(url);
292 //now show the log dialog for the main trunk
293 if (!url.IsEmpty())
295 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
296 if (m_pLogDlg2)
298 m_pLogDlg2->DestroyWindow();
299 delete m_pLogDlg2;
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)
319 CString temp;
321 if (wParam & MERGE_REVSELECTSTART)
323 if (wParam & MERGE_REVSELECTMINUSONE)
324 lParam--;
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);
335 return 0;
339 LRESULT CMergeWizardTree::OnWizardNext()
341 if (!CheckData(true))
342 return -1;
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);
356 SetButtonTexts();
358 return CMergeWizardBasePage::OnSetActive();
361 void CMergeWizardTree::OnBnClickedShowlogwc()
363 CTSVNPath wcPath = ((CMergeWizard*)GetParent())->wcPath;
364 if (m_pLogDlg3)
365 m_pLogDlg3->DestroyWindow();
366 delete m_pLogDlg3;
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);