Doc: Fix broken link
[TortoiseGit.git] / src / TortoiseMerge / FindDlg.cpp
blob56e7e5b5bf80bd4abd4e7ee80b3d7963f8f2d1f2
1 // TortoiseGitMerge - a Diff/Patch program
3 // Copyright (C) 2006, 2011-2014, 2016 - 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 "TortoiseMerge.h"
21 #include "FindDlg.h"
24 // CFindDlg dialog
26 IMPLEMENT_DYNAMIC(CFindDlg, CDialog)
28 CFindDlg::CFindDlg(CWnd* pParent /*=nullptr*/)
29 : CDialog(CFindDlg::IDD, pParent)
30 , m_pParent(pParent)
31 , m_bTerminating(false)
32 , m_bFindNext(false)
33 , m_bMatchCase(FALSE)
34 , m_bLimitToDiffs(FALSE)
35 , m_bWholeWord(FALSE)
36 , m_bSearchUp(FALSE)
37 , m_FindMsg(0)
38 , m_clrFindStatus(RGB(0, 0, 255))
39 , m_bReadonly(false)
40 , m_regMatchCase(L"Software\\TortoiseGitMerge\\FindMatchCase", FALSE)
41 , m_regLimitToDiffs(L"Software\\TortoiseGitMerge\\FindLimitToDiffs", FALSE)
42 , m_regWholeWord(L"Software\\TortoiseGitMerge\\FindWholeWord", FALSE)
43 , m_id(0)
47 CFindDlg::~CFindDlg()
51 void CFindDlg::Create(CWnd* pParent, int id /* = 0 */)
53 CDialog::Create(IDD, pParent);
54 if (id && pParent)
56 m_id = id;
57 POINT pt = { 0 };
58 CString sRegPath;
59 sRegPath.Format(L"Software\\TortoiseGitMerge\\FindDlgPosX%d", id);
60 pt.x = (int)(DWORD)CRegDWORD(sRegPath, 0);
61 sRegPath.Format(L"Software\\TortoiseGitMerge\\FindDlgPosY%d", id);
62 pt.y = (int)(DWORD)CRegDWORD(sRegPath, 0);
63 pParent->ClientToScreen(&pt);
64 if (MonitorFromPoint(pt, MONITOR_DEFAULTTONULL))
65 SetWindowPos(nullptr, pt.x, pt.y, 0, 0, SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOSIZE);
67 ShowWindow(SW_SHOW);
68 UpdateWindow();
71 void CFindDlg::DoDataExchange(CDataExchange* pDX)
73 CDialog::DoDataExchange(pDX);
74 DDX_Check(pDX, IDC_MATCHCASE, m_bMatchCase);
75 DDX_Check(pDX, IDC_LIMITTODIFFS, m_bLimitToDiffs);
76 DDX_Check(pDX, IDC_WHOLEWORD, m_bWholeWord);
77 DDX_Check(pDX, IDC_SEARCHUP, m_bSearchUp);
78 DDX_Control(pDX, IDC_FINDCOMBO, m_FindCombo);
79 DDX_Control(pDX, IDC_REPLACECOMBO, m_ReplaceCombo);
80 DDX_Control(pDX, IDC_FINDSTATUS, m_FindStatus);
84 BEGIN_MESSAGE_MAP(CFindDlg, CDialog)
85 ON_CBN_EDITCHANGE(IDC_FINDCOMBO, &CFindDlg::OnCbnEditchangeFindcombo)
86 ON_CBN_EDITCHANGE(IDC_REPLACECOMBO, &CFindDlg::OnCbnEditchangeFindcombo)
87 ON_BN_CLICKED(IDC_COUNT, &CFindDlg::OnBnClickedCount)
88 ON_WM_CTLCOLOR()
89 ON_BN_CLICKED(IDC_REPLACE, &CFindDlg::OnBnClickedReplace)
90 ON_BN_CLICKED(IDC_REPLACEALL, &CFindDlg::OnBnClickedReplaceall)
91 END_MESSAGE_MAP()
94 // CFindDlg message handlers
96 void CFindDlg::OnCancel()
98 CWnd* pParent = m_pParent;
99 if (!pParent)
100 pParent = GetParent();
101 SaveWindowPos(pParent);
103 m_bTerminating = true;
104 SetStatusText(L"");
105 if (pParent)
106 pParent->SendMessage(m_FindMsg);
107 DestroyWindow();
110 void CFindDlg::PostNcDestroy()
112 delete this;
115 void CFindDlg::OnOK()
117 CWnd* pParent = m_pParent;
118 if (!pParent)
119 pParent = GetParent();
120 SaveWindowPos(pParent);
122 UpdateData();
123 SetStatusText(L"");
124 m_FindCombo.SaveHistory();
125 m_regMatchCase = m_bMatchCase;
126 m_regLimitToDiffs = m_bLimitToDiffs;
127 m_regWholeWord = m_bWholeWord;
129 if (m_FindCombo.GetString().IsEmpty())
130 return;
131 m_bFindNext = true;
132 if (pParent)
133 pParent->SendMessage(m_FindMsg);
134 m_bFindNext = false;
137 BOOL CFindDlg::OnInitDialog()
139 CDialog::OnInitDialog();
140 m_FindMsg = RegisterWindowMessage(FINDMSGSTRING);
142 m_bMatchCase = (BOOL)(DWORD)m_regMatchCase;
143 m_bLimitToDiffs = (BOOL)(DWORD)m_regLimitToDiffs;
144 m_bWholeWord = (BOOL)(DWORD)m_regWholeWord;
145 UpdateData(FALSE);
147 m_FindCombo.SetCaseSensitive(TRUE);
148 m_FindCombo.DisableTrimming();
149 m_FindCombo.LoadHistory(L"Software\\TortoiseGitMerge\\History\\Find", L"Search");
150 m_FindCombo.SetCurSel(0);
152 m_ReplaceCombo.SetCaseSensitive(TRUE);
153 m_ReplaceCombo.DisableTrimming();
154 m_ReplaceCombo.LoadHistory(L"Software\\TortoiseGitMerge\\History\\Find", L"Replace");
155 m_ReplaceCombo.SetCurSel(0);
157 m_FindCombo.SetFocus();
159 return FALSE;
162 void CFindDlg::OnCbnEditchangeFindcombo()
164 UpdateData();
165 auto s = m_FindCombo.GetString();
166 GetDlgItem(IDOK)->EnableWindow(!s.IsEmpty());
167 GetDlgItem(IDC_REPLACE)->EnableWindow(!m_bReadonly && !s.IsEmpty());
168 GetDlgItem(IDC_REPLACEALL)->EnableWindow(!m_bReadonly && !s.IsEmpty());
171 void CFindDlg::OnBnClickedCount()
173 UpdateData();
174 SetStatusText(L"");
175 m_FindCombo.SaveHistory();
176 m_regMatchCase = m_bMatchCase;
177 m_regLimitToDiffs = m_bLimitToDiffs;
178 m_regWholeWord = m_bWholeWord;
180 if (m_FindCombo.GetString().IsEmpty())
181 return;
182 m_bFindNext = true;
183 if (m_pParent)
184 m_pParent->SendMessage(m_FindMsg, FindType::Count);
185 else if (GetParent())
186 GetParent()->SendMessage(m_FindMsg, FindType::Count);
187 m_bFindNext = false;
190 HBRUSH CFindDlg::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
192 switch (nCtlColor)
194 case CTLCOLOR_STATIC:
195 if (pWnd == &m_FindStatus)
197 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
198 pDC->SetTextColor(m_clrFindStatus);
199 pDC->SetBkMode(TRANSPARENT);
200 return hbr;
202 default:
203 break;
205 return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
208 void CFindDlg::SetStatusText(const CString& str, COLORREF color)
210 m_clrFindStatus = color;
211 m_FindStatus.SetWindowText(str);
214 void CFindDlg::SetReadonly(bool bReadonly)
216 m_bReadonly = bReadonly;
217 m_ReplaceCombo.EnableWindow(bReadonly ? FALSE : TRUE);
218 GetDlgItem(IDC_REPLACE)->EnableWindow(!m_bReadonly && !m_FindCombo.GetString().IsEmpty());
219 GetDlgItem(IDC_REPLACEALL)->EnableWindow(!m_bReadonly && !m_FindCombo.GetString().IsEmpty());
222 void CFindDlg::OnBnClickedReplace()
224 UpdateData();
225 SetStatusText(L"");
226 m_FindCombo.SaveHistory();
227 m_ReplaceCombo.SaveHistory();
228 m_regMatchCase = m_bMatchCase;
229 m_regLimitToDiffs = m_bLimitToDiffs;
230 m_regWholeWord = m_bWholeWord;
232 m_bFindNext = true;
233 if (m_pParent)
234 m_pParent->SendMessage(m_FindMsg, FindType::Replace);
235 else if (GetParent())
236 GetParent()->SendMessage(m_FindMsg, FindType::Replace);
237 m_bFindNext = false;
240 void CFindDlg::OnBnClickedReplaceall()
242 UpdateData();
243 SetStatusText(L"");
244 m_FindCombo.SaveHistory();
245 m_ReplaceCombo.SaveHistory();
246 m_regMatchCase = m_bMatchCase;
247 m_regLimitToDiffs = m_bLimitToDiffs;
248 m_regWholeWord = m_bWholeWord;
250 m_bFindNext = true;
251 if (m_pParent)
252 m_pParent->SendMessage(m_FindMsg, FindType::ReplaceAll);
253 else if (GetParent())
254 GetParent()->SendMessage(m_FindMsg, FindType::ReplaceAll);
255 m_bFindNext = false;
258 void CFindDlg::SaveWindowPos(CWnd* pParent)
260 if (pParent && m_id)
262 CRect rc;
263 GetWindowRect(&rc);
264 pParent->ScreenToClient(rc);
265 CString sRegPath;
266 sRegPath.Format(L"Software\\TortoiseGitMerge\\FindDlgPosX%d", m_id);
267 CRegDWORD regX(sRegPath);
268 regX = rc.left;
269 sRegPath.Format(L"Software\\TortoiseGitMerge\\FindDlgPosY%d", m_id);
270 CRegDWORD regY(sRegPath);
271 regY = rc.top;