|
|
1.1 root 1: #include "PortTool.h"
2:
3: // global search string
4: char lpszSearch[MAXSEARCHSTRING+1] = "";
5: HWND hDlgSearch;
6:
7: FINDREPLACE frSearch;
8:
9:
10: // compare two substrings
11: BOOL WINAPI RealSlowCompare (WORD, char *, char *);
12: BOOL WINAPI RealSlowCompare (
13: WORD wCase,
14: char *lpszSubject,
15: char *lpszTarget)
16: {
17: if (wCase)
18: {
19: while (*lpszTarget)
20: if (*lpszTarget++ != *lpszSubject++)
21: return FALSE;
22: }
23: else
24: {
25: // convert to lower case before comparing
26: CharLower ((char *)lpszTarget);
27: while (*lpszTarget)
28: if (*lpszTarget++ != (CHAR)(DWORD)CharLower ((char *)(DWORD)(BYTE)*lpszSubject++))
29: return FALSE;
30: }
31: return TRUE;
32: }
33:
34:
35:
36:
37: // invoke the common search/replace dialog
38: BOOL WINAPI FindDialog (
39: HWND hWnd,
40: WORD wCase,
41: WORD wDir,
42: char *lpszInit)
43: {
44: frSearch.lStructSize = sizeof (FINDREPLACE);
45: frSearch.hwndOwner = hWnd;
46: frSearch.hInstance = (HANDLE)GetWindowLong (hWnd, GWL_HINSTANCE);
47: frSearch.Flags = 0;
48:
49: // if wCase, case sensitive
50: if (wCase)
51: frSearch.Flags |= FR_MATCHCASE;
52: // if wDir, search forward
53: if (wDir)
54: frSearch.Flags |= FR_DOWN;
55:
56: frSearch.lpstrFindWhat = lpszInit;
57: frSearch.lpstrReplaceWith = NULL;
58: frSearch.wFindWhatLen = MAXSEARCHSTRING+1;
59: frSearch.wReplaceWithLen = 0;
60: frSearch.lCustData = NULL;
61: frSearch.lpfnHook = NULL;
62: frSearch.lpTemplateName = NULL;
63:
64: // call common search dialog
65: if (hDlgSearch = FindText (&frSearch))
66: return TRUE;
67: else
68: return FALSE;
69: }
70:
71:
72:
73: // perform the actual text searching in the edit control data
74: BOOL WINAPI LocateText (
75: HWND hWnd,
76: WORD wCase,
77: WORD wDir,
78: char *lpszStr)
79: {
80: UINT uBegSel, uEndSel, uOrgBegSel, uOrgEndSel;
81: HANDLE hEditData;
82: HWND hWndEdit = (HANDLE)GetWindowLong (hWnd, WL_HWNDEDIT);
83: char *lpEditData;
84: UINT uLen;
85: int nStrLen = strlen (lpszStr);
86: int nChars;
87:
88: // test for valid string
89: if (!*lpszStr)
90: return FALSE;
91:
92: // locate beginning of selected text
93: SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
94: uOrgBegSel = uBegSel;
95: uOrgEndSel = uEndSel;
96:
97: // get length of the text
98: uLen = (UINT)SendMessage (hWndEdit, WM_GETTEXTLENGTH, 0, 0);
99:
100: // Get handle to edit text data and lock it
101: hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
102: lpEditData = LocalLock (hEditData);
103:
104: // advance starting point past selection one char
105: lpEditData += (wDir ? ++uBegSel : --uBegSel);
106:
107: // count characters to search (either forward to end of file or back to beginning)
108: if (wDir)
109: nChars = (int)(uLen - uBegSel + 1 - nStrLen);
110: else
111: nChars = (int)uBegSel;
112:
113: // compare character by character for a substring match
114: while (nChars >= nStrLen)
115: {
116: // compare this substring for a match
117: if (RealSlowCompare (wCase, lpEditData, lpszStr))
118: {
119: // string found, cleanup and go away
120: LocalUnlock(hEditData);
121:
122: // scroll parent edit control and select offending text
123: SendMessage (hWndEdit, EM_LINESCROLL, 0,
124: SendMessage (hWndEdit, EM_LINEFROMCHAR, uBegSel, 0) -
125: SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0));
126:
127: // Select the located string
128: uEndSel = uBegSel + nStrLen;
129: SendMessage(hWndEdit, EM_SETSEL, uBegSel, uEndSel);
130:
131: // return success
132: return TRUE;
133: }
134:
135: nChars--;
136:
137: // increment/decrement start position by 1
138: lpEditData += (wDir ? 1 : -1);
139: wDir ? uBegSel++ : uBegSel--;
140: }
141:
142: LocalUnlock (hEditData);
143: SendMessage (hWndEdit, EM_SETSEL, uOrgBegSel, uOrgEndSel);
144:
145: // return failed search
146: return FALSE;
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.