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.
20 #include "TortoiseMerge.h"
26 IMPLEMENT_DYNAMIC(CFindDlg
, CDialog
)
28 CFindDlg::CFindDlg(CWnd
* pParent
/*=nullptr*/)
29 : CDialog(CFindDlg::IDD
, pParent
)
31 , m_bTerminating(false)
34 , m_bLimitToDiffs(FALSE
)
38 , m_clrFindStatus(RGB(0, 0, 255))
40 , m_regMatchCase(L
"Software\\TortoiseGitMerge\\FindMatchCase", FALSE
)
41 , m_regLimitToDiffs(L
"Software\\TortoiseGitMerge\\FindLimitToDiffs", FALSE
)
42 , m_regWholeWord(L
"Software\\TortoiseGitMerge\\FindWholeWord", FALSE
)
51 void CFindDlg::Create(CWnd
* pParent
, int id
/* = 0 */)
53 CDialog::Create(IDD
, pParent
);
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
);
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
)
89 ON_BN_CLICKED(IDC_REPLACE
, &CFindDlg::OnBnClickedReplace
)
90 ON_BN_CLICKED(IDC_REPLACEALL
, &CFindDlg::OnBnClickedReplaceall
)
94 // CFindDlg message handlers
96 void CFindDlg::OnCancel()
98 CWnd
* pParent
= m_pParent
;
100 pParent
= GetParent();
101 SaveWindowPos(pParent
);
103 m_bTerminating
= true;
106 pParent
->SendMessage(m_FindMsg
);
110 void CFindDlg::PostNcDestroy()
115 void CFindDlg::OnOK()
117 CWnd
* pParent
= m_pParent
;
119 pParent
= GetParent();
120 SaveWindowPos(pParent
);
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())
133 pParent
->SendMessage(m_FindMsg
);
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
;
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();
162 void CFindDlg::OnCbnEditchangeFindcombo()
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()
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())
184 m_pParent
->SendMessage(m_FindMsg
, FindType::Count
);
185 else if (GetParent())
186 GetParent()->SendMessage(m_FindMsg
, FindType::Count
);
190 HBRUSH
CFindDlg::OnCtlColor(CDC
* pDC
, CWnd
*pWnd
, UINT 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
);
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()
226 m_FindCombo
.SaveHistory();
227 m_ReplaceCombo
.SaveHistory();
228 m_regMatchCase
= m_bMatchCase
;
229 m_regLimitToDiffs
= m_bLimitToDiffs
;
230 m_regWholeWord
= m_bWholeWord
;
234 m_pParent
->SendMessage(m_FindMsg
, FindType::Replace
);
235 else if (GetParent())
236 GetParent()->SendMessage(m_FindMsg
, FindType::Replace
);
240 void CFindDlg::OnBnClickedReplaceall()
244 m_FindCombo
.SaveHistory();
245 m_ReplaceCombo
.SaveHistory();
246 m_regMatchCase
= m_bMatchCase
;
247 m_regLimitToDiffs
= m_bLimitToDiffs
;
248 m_regWholeWord
= m_bWholeWord
;
252 m_pParent
->SendMessage(m_FindMsg
, FindType::ReplaceAll
);
253 else if (GetParent())
254 GetParent()->SendMessage(m_FindMsg
, FindType::ReplaceAll
);
258 void CFindDlg::SaveWindowPos(CWnd
* pParent
)
264 pParent
->ScreenToClient(rc
);
266 sRegPath
.Format(L
"Software\\TortoiseGitMerge\\FindDlgPosX%d", m_id
);
267 CRegDWORD
regX(sRegPath
);
269 sRegPath
.Format(L
"Software\\TortoiseGitMerge\\FindDlgPosY%d", m_id
);
270 CRegDWORD
regY(sRegPath
);