Notepad: Fixed some bugs in Search->Replace Modified: trunk/reactos/subsys/system/notepad/main.c _____
Modified: trunk/reactos/subsys/system/notepad/main.c --- trunk/reactos/subsys/system/notepad/main.c 2005-09-28 13:00:05 UTC (rev 18134) +++ trunk/reactos/subsys/system/notepad/main.c 2005-09-28 13:20:10 UTC (rev 18135) @@ -99,14 +99,44 @@
/*********************************************************************** * + * NOTEPAD_FindTextAt + */ + +static BOOL NOTEPAD_FindTextAt(FINDREPLACE *pFindReplace, LPCTSTR pszText, int iTextLength, DWORD dwPosition) +{ + BOOL bMatches; + int iTargetLength; + + iTargetLength = _tcslen(pFindReplace->lpstrFindWhat); + + /* Make proper comparison */ + if (pFindReplace->Flags & FR_MATCHCASE) + bMatches = !_tcsncmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); + else + bMatches = !_tcsnicmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); + + if (bMatches && pFindReplace->Flags & FR_WHOLEWORD) + { + if ((dwPosition > 0) && !_istspace(pszText[dwPosition-1])) + bMatches = FALSE; + if ((dwPosition < iTextLength - 1) && !_istspace(pszText[dwPosition+1])) + bMatches = FALSE; + } + + return bMatches; +} + +/********************************************************************** * + * * NOTEPAD_FindNext */
-static BOOL NOTEPAD_FindNext(FINDREPLACE *pFindReplace, BOOL bShowAlert) +static BOOL NOTEPAD_FindNext(FINDREPLACE *pFindReplace, BOOL bReplace, BOOL bShowAlert) { int iTextLength, iTargetLength; + int iAdjustment = 0; LPTSTR pszText = NULL; - DWORD dwPosition, dwDummy; + DWORD dwPosition, dwBegin, dwEnd; BOOL bMatches = FALSE; TCHAR szResource[128], szText[128]; BOOL bSuccess; @@ -124,24 +154,20 @@ GetWindowText(Globals.hEdit, pszText, iTextLength + 1); }
- SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM) &dwDummy, (LPARAM) &dwPosition); + SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM) &dwBegin, (LPARAM) &dwEnd); + if (bReplace && ((dwEnd - dwBegin) == iTargetLength)) + { + if (NOTEPAD_FindTextAt(pFindReplace, pszText, iTextLength, dwBegin)) + { + SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM) pFindReplace->lpstrReplaceWith); + iAdjustment = _tcslen(pFindReplace->lpstrReplaceWith) - (dwEnd - dwBegin); + } + }
+ dwPosition = dwEnd; while(dwPosition < iTextLength) { - /* Make proper comparison */ - if (pFindReplace->Flags & FR_MATCHCASE) - bMatches = !_tcsncmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); - else - bMatches = !_tcsnicmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); - - if (bMatches && pFindReplace->Flags & FR_WHOLEWORD) - { - if ((dwPosition > 0) && !_istspace(pszText[dwPosition-1])) - bMatches = FALSE; - if ((dwPosition < iTextLength - 1) && !_istspace(pszText[dwPosition+1])) - bMatches = FALSE; - } - + bMatches = NOTEPAD_FindTextAt(pFindReplace, pszText, iTextLength, dwPosition); if (bMatches) break;
@@ -154,6 +180,8 @@ if (bMatches) { /* Found target */ + if (dwPosition > dwBegin) + dwPosition += iAdjustment; SendMessage(Globals.hEdit, EM_SETSEL, dwPosition, dwPosition + iTargetLength); SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0); bSuccess = TRUE; @@ -178,17 +206,6 @@
/*********************************************************************** * - * NOTEPAD_Replace - */ - -static VOID NOTEPAD_Replace(FINDREPLACE *pFindReplace) -{ - if (NOTEPAD_FindNext(pFindReplace, TRUE)) - SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM) pFindReplace->lpstrReplaceWith); -} - -/********************************************************************** * - * * NOTEPAD_ReplaceAll */
@@ -198,9 +215,8 @@
SendMessage(Globals.hEdit, EM_SETSEL, 0, 0);
- while (NOTEPAD_FindNext(pFindReplace, bShowAlert)) + while (NOTEPAD_FindNext(pFindReplace, TRUE, bShowAlert)) { - SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM) pFindReplace->lpstrReplaceWith); bShowAlert = FALSE; } } @@ -333,9 +349,9 @@ FINDREPLACE *pFindReplace = (FINDREPLACE *) lParam;
if (pFindReplace->Flags & FR_FINDNEXT) - NOTEPAD_FindNext(pFindReplace, TRUE); + NOTEPAD_FindNext(pFindReplace, FALSE, TRUE); else if (pFindReplace->Flags & FR_REPLACE) - NOTEPAD_Replace(pFindReplace); + NOTEPAD_FindNext(pFindReplace, TRUE, TRUE); else if (pFindReplace->Flags & FR_REPLACEALL) NOTEPAD_ReplaceAll(pFindReplace); else if (pFindReplace->Flags & FR_DIALOGTERM)