annotate foosdk/wtl/Include/atlfind.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 // Windows Template Library - WTL version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // This file is a part of the Windows Template Library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // The use and distribution terms for this software are covered by the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // which can be found in the file MS-PL.txt at the root folder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifndef __ATLFIND_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLFIND_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #ifndef __ATLCTRLS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error atlfind.h requires atlctrls.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #ifndef __ATLDLGS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #error atlfind.h requires atldlgs.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #ifndef __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #error atlfind.h requires CString
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // CEditFindReplaceImplBase<T, TFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // CEditFindReplaceImpl<T, TFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 // CRichEditFindReplaceImpl<T, TFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 // CEditFindReplaceImplBase - Base class for mixin classes that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 // help implement Find/Replace for CEdit or CRichEditCtrl based window classes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 template <class T, class TFindReplaceDialog = CFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class CEditFindReplaceImplBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 // Typedefs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> thisClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 // Enumerations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 enum TranslationTextItem
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 eText_OnReplaceAllMessage = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 eText_OnReplaceAllTitle = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 eText_OnTextNotFoundMessage = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 eText_OnTextNotFoundTitle = 3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 TFindReplaceDialog* m_pFindReplaceDialog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 ATL::CString m_sFindNext, m_sReplaceWith;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 BOOL m_bFindOnly, m_bFirstSearch, m_bMatchCase, m_bWholeWord, m_bFindDown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 LONG m_nInitialSearchPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 HCURSOR m_hOldCursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 // Constructors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 CEditFindReplaceImplBase() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_pFindReplaceDialog(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 m_bFindOnly(TRUE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 m_bFirstSearch(TRUE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 m_bMatchCase(FALSE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 m_bWholeWord(FALSE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 m_bFindDown(TRUE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 m_nInitialSearchPos(0),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 m_hOldCursor(NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 // Message Handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 BEGIN_MSG_MAP(thisClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 MESSAGE_HANDLER(TFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceCmd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 COMMAND_ID_HANDLER(ID_EDIT_FIND, OnEditFind)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 COMMAND_ID_HANDLER(ID_EDIT_REPEAT, OnEditRepeat)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 COMMAND_ID_HANDLER(ID_EDIT_REPLACE, OnEditReplace)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 LRESULT OnFindReplaceCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 TFindReplaceDialog* pDialog = TFindReplaceDialog::GetNotifier(lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if(pDialog == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 ::MessageBeep(MB_ICONERROR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 ATLASSERT(pDialog == m_pFindReplaceDialog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 LPFINDREPLACE findReplace = (LPFINDREPLACE)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 if((m_pFindReplaceDialog != NULL) && (findReplace != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if(pDialog->FindNext())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 pT->OnFindNext(pDialog->GetFindString(), pDialog->SearchDown(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 pDialog->MatchCase(), pDialog->MatchWholeWord());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 else if(pDialog->ReplaceCurrent())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 pT->OnReplaceSel(pDialog->GetFindString(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 pDialog->SearchDown(), pDialog->MatchCase(), pDialog->MatchWholeWord(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 pDialog->GetReplaceString());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 else if(pDialog->ReplaceAll())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 pT->OnReplaceAll(pDialog->GetFindString(), pDialog->GetReplaceString(),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 pDialog->MatchCase(), pDialog->MatchWholeWord());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 else if(pDialog->IsTerminating())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 // Dialog is going away (but hasn't gone away yet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 // OnFinalMessage will "delete this"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 pT->OnTerminatingFindReplaceDialog(m_pFindReplaceDialog);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 m_pFindReplaceDialog = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 LRESULT OnEditFind(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 pT->FindReplace(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 LRESULT OnEditRepeat(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 // If the user is holding down SHIFT when hitting F3, we'll
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 // search in reverse. Otherwise, we'll search forward.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 // (be sure to have an accelerator mapped to ID_EDIT_REPEAT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 // for both F3 and Shift+F3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 m_bFindDown = !((::GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if(m_sFindNext.IsEmpty())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 pT->FindReplace(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 pT->TextNotFound(m_sFindNext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 LRESULT OnEditReplace(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 DWORD style = pT->GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if((style & ES_READONLY) != ES_READONLY)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 pT->FindReplace(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 // Don't allow replace when the edit control is read only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 // Operations (overrideable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 TFindReplaceDialog* CreateFindReplaceDialog(BOOL bFindOnly, // TRUE for Find, FALSE for FindReplace
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 LPCTSTR lpszFindWhat,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 LPCTSTR lpszReplaceWith = NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 DWORD dwFlags = FR_DOWN,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 HWND hWndParent = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 // You can override all of this in a derived class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 TFindReplaceDialog* findReplaceDialog = new TFindReplaceDialog();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if(findReplaceDialog == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 ::MessageBeep(MB_ICONHAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 HWND hWndFindReplace = findReplaceDialog->Create(bFindOnly,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 lpszFindWhat, lpszReplaceWith, dwFlags, hWndParent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if(hWndFindReplace == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 delete findReplaceDialog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 findReplaceDialog = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 findReplaceDialog->SetActiveWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 findReplaceDialog->ShowWindow(SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 return findReplaceDialog;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 void AdjustDialogPosition(HWND hWndDialog)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 ATLASSERT((hWndDialog != NULL) && ::IsWindow(hWndDialog));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 LONG nStartChar = 0, nEndChar = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 // Send EM_GETSEL so we can use both Edit and RichEdit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 POINT point = pT->PosFromChar(nStartChar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 pT->ClientToScreen(&point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 ::GetWindowRect(hWndDialog, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 if(::PtInRect(&rect, point) != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 if(point.y > (rect.bottom - rect.top))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 ::OffsetRect(&rect, 0, point.y - rect.bottom - 20);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 int nVertExt = GetSystemMetrics(SM_CYSCREEN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 if((point.y + (rect.bottom - rect.top)) < nVertExt)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 ::OffsetRect(&rect, 0, 40 + point.y - rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 ::MoveWindow(hWndDialog, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 DWORD GetFindReplaceDialogFlags() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 DWORD dwFlags = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 if(m_bFindDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 dwFlags |= FR_DOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 if(m_bMatchCase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 dwFlags |= FR_MATCHCASE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 if(m_bWholeWord)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 dwFlags |= FR_WHOLEWORD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 return dwFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 void FindReplace(BOOL bFindOnly)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 m_bFirstSearch = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 if(m_pFindReplaceDialog != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 if(m_bFindOnly == bFindOnly)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 m_pFindReplaceDialog->SetActiveWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 m_pFindReplaceDialog->ShowWindow(SW_SHOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 m_pFindReplaceDialog->SendMessage(WM_CLOSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 ATLASSERT(m_pFindReplaceDialog == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 ATLASSERT(m_pFindReplaceDialog == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 ATL::CString findNext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 pT->GetSelText(findNext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 // if selection is empty or spans multiple lines use old find text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 if(findNext.IsEmpty() || (findNext.FindOneOf(_T("\n\r")) != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 findNext = m_sFindNext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 ATL::CString replaceWith = m_sReplaceWith;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 DWORD dwFlags = pT->GetFindReplaceDialogFlags();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 m_pFindReplaceDialog = pT->CreateFindReplaceDialog(bFindOnly,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 findNext, replaceWith, dwFlags, pT->operator HWND());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 ATLASSERT(m_pFindReplaceDialog != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 if(m_pFindReplaceDialog != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 m_bFindOnly = bFindOnly;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 BOOL SameAsSelected(LPCTSTR lpszCompare, BOOL bMatchCase, BOOL /*bWholeWord*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 // check length first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 size_t nLen = lstrlen(lpszCompare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 LONG nStartChar = 0, nEndChar = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 // Send EM_GETSEL so we can use both Edit and RichEdit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 if(nLen != (size_t)(nEndChar - nStartChar))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 // length is the same, check contents
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 ATL::CString selectedText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 pT->GetSelText(selectedText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 return (bMatchCase && (selectedText.Compare(lpszCompare) == 0)) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 (!bMatchCase && (selectedText.CompareNoCase(lpszCompare) == 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 void TextNotFound(LPCTSTR lpszFind)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 m_bFirstSearch = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 pT->OnTextNotFound(lpszFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 ATL::CString GetTranslationText(enum TranslationTextItem eItem) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 ATL::CString text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 switch(eItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 case eText_OnReplaceAllMessage:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 text = _T("Replaced %d occurances of \"%s\" with \"%s\"");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 case eText_OnReplaceAllTitle:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 text = _T("Replace All");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 case eText_OnTextNotFoundMessage:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 text = _T("Unable to find the text \"%s\"");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 case eText_OnTextNotFoundTitle:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 text = _T("Text not found");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 return text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 // Overrideable Handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 void OnFindNext(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 m_sFindNext = lpszFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 m_bMatchCase = bMatchCase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 m_bWholeWord = bWholeWord;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 m_bFindDown = bFindDown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 pT->TextNotFound(m_sFindNext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 void OnReplaceSel(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord, LPCTSTR lpszReplace)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 m_sFindNext = lpszFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 m_sReplaceWith = lpszReplace;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 m_bMatchCase = bMatchCase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 m_bWholeWord = bWholeWord;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 m_bFindDown = bFindDown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if(pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 pT->ReplaceSel(m_sReplaceWith);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 pT->TextNotFound(m_sFindNext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 void OnReplaceAll(LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bMatchCase, BOOL bWholeWord)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 m_sFindNext = lpszFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 m_sReplaceWith = lpszReplace;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 m_bMatchCase = bMatchCase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 m_bWholeWord = bWholeWord;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 m_bFindDown = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 // no selection or different than what looking for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 if(!pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 pT->TextNotFound(m_sFindNext);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 pT->OnReplaceAllCoreBegin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 int replaceCount=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 do
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 ++replaceCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 pT->ReplaceSel(m_sReplaceWith);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 } while(pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 pT->OnReplaceAllCoreEnd(replaceCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 void OnReplaceAllCoreBegin()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 m_hOldCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 pT->HideSelection(TRUE, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 void OnReplaceAllCoreEnd(int replaceCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 pT->HideSelection(FALSE, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 ::SetCursor(m_hOldCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 ATL::CString message = pT->GetTranslationText(eText_OnReplaceAllMessage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 if(message.GetLength() > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 ATL::CString formattedMessage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 formattedMessage.Format(message, replaceCount, (LPCTSTR)m_sFindNext, (LPCTSTR)m_sReplaceWith);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 if(m_pFindReplaceDialog != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 m_pFindReplaceDialog->MessageBox(formattedMessage,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 pT->GetTranslationText(eText_OnReplaceAllTitle),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 pT->MessageBox(formattedMessage,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 pT->GetTranslationText(eText_OnReplaceAllTitle),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 void OnTextNotFound(LPCTSTR lpszFind)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 ATL::CString message = pT->GetTranslationText(eText_OnTextNotFoundMessage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 if(message.GetLength() > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 ATL::CString formattedMessage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 formattedMessage.Format(message, lpszFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 if(m_pFindReplaceDialog != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 m_pFindReplaceDialog->MessageBox(formattedMessage,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 pT->GetTranslationText(eText_OnTextNotFoundTitle),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 pT->MessageBox(formattedMessage,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 pT->GetTranslationText(eText_OnTextNotFoundTitle),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 ::MessageBeep(MB_ICONHAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 void OnTerminatingFindReplaceDialog(TFindReplaceDialog*& /*findReplaceDialog*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 // CEditFindReplaceImpl - Mixin class for implementing Find/Replace for CEdit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 // based window classes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 // Chain to CEditFindReplaceImpl message map. Your class must also derive from CEdit.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 // Example:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 // class CMyEdit : public CWindowImpl<CMyEdit, CEdit>,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 // public CEditFindReplaceImpl<CMyEdit>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 // {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 // public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 // BEGIN_MSG_MAP(CMyEdit)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 // // your handlers...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 // CHAIN_MSG_MAP_ALT(CEditFindReplaceImpl<CMyEdit>, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 // END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 // // other stuff...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 // };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 template <class T, class TFindReplaceDialog = CFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 class CEditFindReplaceImpl : public CEditFindReplaceImplBase<T, TFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 typedef CEditFindReplaceImpl<T, TFindReplaceDialog> thisClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 // Message Handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 BEGIN_MSG_MAP(thisClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 CHAIN_MSG_MAP_ALT(baseClass, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 // Supported only for RichEdit, so this does nothing for Edit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 void HideSelection(BOOL /*bHide*/ = TRUE, BOOL /*bChangeStyle*/ = FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 // Operations (overrideable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 ATLASSERT(lpszFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 ATLASSERT(*lpszFind != _T('\0'));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 UINT nLen = pT->GetBufferLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 int nStartChar = 0, nEndChar = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 pT->GetSel(nStartChar, nEndChar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 UINT nStart = nStartChar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 int iDir = bFindDown ? +1 : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 // can't find a match before the first character
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 if((nStart == 0) && (iDir < 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 LPCTSTR lpszText = pT->LockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 bool isDBCS = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 #ifdef _MBCS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 CPINFO info = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 ::GetCPInfo(::GetOEMCP(), &info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 isDBCS = (info.MaxCharSize > 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 if(iDir < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 // always go back one for search backwards
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 else if((nStartChar != nEndChar) && (pT->SameAsSelected(lpszFind, bMatchCase, bWholeWord)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 // easy to go backward/forward with SBCS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 if(::IsDBCSLeadByte(lpszText[nStart]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 nStart++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 nStart += iDir;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 // handle search with nStart past end of buffer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 UINT nLenFind = ::lstrlen(lpszFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 if((nStart + nLenFind - 1) >= nLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 if((iDir < 0) && (nLen >= nLenFind))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 if(isDBCS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 // walk back to previous character n times
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 nStart = nLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 int n = nLenFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 while(n--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 // single-byte character set is easy and fast
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 nStart = nLen - nLenFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 ATLASSERT((nStart + nLenFind - 1) <= nLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 // start the search at nStart
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 LPCTSTR lpsz = lpszText + nStart;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 typedef int (WINAPI* CompareProc)(LPCTSTR str1, LPCTSTR str2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 CompareProc pfnCompare = bMatchCase ? lstrcmp : lstrcmpi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 if(isDBCS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 // double-byte string search
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 LPCTSTR lpszStop = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 if(iDir > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 // start at current and find _first_ occurrance
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 lpszStop = lpszText + nLen - nLenFind + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 // start at top and find _last_ occurrance
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 lpszStop = lpsz;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 lpsz = lpszText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 LPCTSTR lpszFound = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 while(lpsz <= lpszStop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 if(!bMatchCase || ((*lpsz == *lpszFind) && (!::IsDBCSLeadByte(*lpsz) || (lpsz[1] == lpszFind[1]))))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 if(!bMatchCase || ((*lpsz == *lpszFind) && (lpsz[1] == lpszFind[1])))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 LPTSTR lpch = (LPTSTR)(lpsz + nLenFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 TCHAR chSave = *lpch;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 *lpch = _T('\0');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 int nResult = (*pfnCompare)(lpsz, lpszFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 *lpch = chSave;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 if(nResult == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 lpszFound = lpsz;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 if(iDir > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 lpsz = ::CharNext(lpsz);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 if(lpszFound != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 int n = (int)(lpszFound - lpszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 pT->SetSel(n, n + nLenFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 // single-byte string search
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 UINT nCompare = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 if(iDir < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 nCompare = (UINT)(lpsz - lpszText) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 while(nCompare > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 ATLASSERT(lpsz >= lpszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 ATLASSERT((lpsz + nLenFind - 1) <= (lpszText + nLen - 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 LPSTR lpch = (LPSTR)(lpsz + nLenFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 char chSave = *lpch;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 *lpch = '\0';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 int nResult = (*pfnCompare)(lpsz, lpszFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 *lpch = chSave;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 if(nResult == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 int n = (int)(lpsz - lpszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 pT->SetSel(n, n + nLenFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 // restore character at end of search
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 *lpch = chSave;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 // move on to next substring
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 nCompare--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 lpsz += iDir;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 LPCTSTR LockBuffer() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 ATLASSERT(pT->m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 // If common controls version 6 is in use (such as via theming), then EM_GETHANDLE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 // will always return a UNICODE string. You're really not supposed to superclass
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 // or subclass common controls with an ANSI windows procedure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 DWORD dwMajor = 0, dwMinor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 if(SUCCEEDED(hRet) && (dwMajor >= 6))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 ATLTRACE2(atlTraceUI, 0, _T("AtlFind Warning: You have compiled for MBCS/ANSI but are using common controls version 6 or later which are always Unicode.\r\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 #endif // !_UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 HLOCAL hLocal = pT->GetHandle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 ATLASSERT(hLocal != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 LPCTSTR lpszText = (LPCTSTR)::LocalLock(hLocal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 ATLASSERT(lpszText != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 return lpszText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 void UnlockBuffer() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 ATLASSERT(pT->m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 HLOCAL hLocal = pT->GetHandle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 ATLASSERT(hLocal != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 ::LocalUnlock(hLocal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 UINT GetBufferLength() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 ATLASSERT(pT->m_hWnd != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 UINT nLen = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 LPCTSTR lpszText = pT->LockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 if(lpszText != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 nLen = ::lstrlen(lpszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 return nLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 LONG EndOfLine(LPCTSTR lpszText, UINT nLen, UINT nIndex) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 LPCTSTR lpsz = lpszText + nIndex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 LPCTSTR lpszStop = lpszText + nLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 while((lpsz < lpszStop) && (*lpsz != _T('\r')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 ++lpsz;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 return LONG(lpsz - lpszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 LONG GetSelText(ATL::CString& strText) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 const T* pT = static_cast<const T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 int nStartChar = 0, nEndChar = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 pT->GetSel(nStartChar, nEndChar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 ATLASSERT((UINT)nEndChar <= pT->GetBufferLength());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 LPCTSTR lpszText = pT->LockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 LONG nLen = pT->EndOfLine(lpszText, nEndChar, nStartChar) - nStartChar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 ATL::Checked::memcpy_s(strText.GetBuffer(nLen), nLen * sizeof(TCHAR), lpszText + nStartChar, nLen * sizeof(TCHAR));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 strText.ReleaseBuffer(nLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 pT->UnlockBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 return nLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 // CRichEditFindReplaceImpl - Mixin class for implementing Find/Replace for CRichEditCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 // based window classes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 // Chain to CRichEditFindReplaceImpl message map. Your class must also derive from CRichEditCtrl.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 // Example:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 // class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 // public CRichEditFindReplaceImpl<CMyRichEdit>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 // {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 // public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 // BEGIN_MSG_MAP(CMyRichEdit)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 // // your handlers...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 // CHAIN_MSG_MAP_ALT(CRichEditFindReplaceImpl<CMyRichEdit>, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 // END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 // // other stuff...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 // };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 template <class T, class TFindReplaceDialog = CFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 class CRichEditFindReplaceImpl : public CEditFindReplaceImplBase<T, TFindReplaceDialog>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 typedef CRichEditFindReplaceImpl<T, TFindReplaceDialog> thisClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 BEGIN_MSG_MAP(thisClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 ALT_MSG_MAP(1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 CHAIN_MSG_MAP_ALT(baseClass, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 // Operations (overrideable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 ATLASSERT(lpszFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 FINDTEXTEX ft = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 pT->GetSel(ft.chrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 if(this->m_bFirstSearch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 if(bFindDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 this->m_nInitialSearchPos = ft.chrg.cpMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 this->m_nInitialSearchPos = ft.chrg.cpMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 this->m_bFirstSearch = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 ft.lpstrText = (LPTSTR)lpszFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 if(ft.chrg.cpMin != ft.chrg.cpMax) // i.e. there is a selection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 if(bFindDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 ft.chrg.cpMin++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 // won't wraparound backwards
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 ft.chrg.cpMin = __max(ft.chrg.cpMin, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 DWORD dwFlags = bMatchCase ? FR_MATCHCASE : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 dwFlags |= bWholeWord ? FR_WHOLEWORD : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 ft.chrg.cpMax = pT->GetTextLength() + this->m_nInitialSearchPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 if(bFindDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 if(this->m_nInitialSearchPos >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 ft.chrg.cpMax = pT->GetTextLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 dwFlags |= FR_DOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 ATLASSERT(ft.chrg.cpMax >= ft.chrg.cpMin);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 if(this->m_nInitialSearchPos >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 ft.chrg.cpMax = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 dwFlags &= ~FR_DOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 ATLASSERT(ft.chrg.cpMax <= ft.chrg.cpMin);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 if(pT->FindAndSelect(dwFlags, ft) != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 bRet = TRUE; // we found the text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 else if(this->m_nInitialSearchPos > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 // if the original starting point was not the beginning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 // of the buffer and we haven't already been here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 if(bFindDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 ft.chrg.cpMin = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 ft.chrg.cpMax = this->m_nInitialSearchPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 ft.chrg.cpMin = pT->GetTextLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 ft.chrg.cpMax = this->m_nInitialSearchPos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 this->m_nInitialSearchPos = this->m_nInitialSearchPos - pT->GetTextLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 bRet = (pT->FindAndSelect(dwFlags, ft) != -1) ? TRUE : FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 long FindAndSelect(DWORD dwFlags, FINDTEXTEX& ft)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 LONG index = pT->FindText(dwFlags, ft);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 if(index != -1) // i.e. we found something
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 pT->SetSel(ft.chrgText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 #endif // __ATLFIND_H__