From 55949aedd45e9aacabdc9e2816a2e192b29349bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Nicolaysen=20S=C3=B8rnes?= Date: Wed, 18 Jul 2007 15:41:33 +0200 Subject: [PATCH] wordpad: Add search functionality. --- programs/wordpad/De.rc | 4 + programs/wordpad/En.rc | 4 + programs/wordpad/Fr.rc | 4 + programs/wordpad/Hu.rc | 4 + programs/wordpad/Ko.rc | 4 + programs/wordpad/Nl.rc | 4 + programs/wordpad/No.rc | 6 +- programs/wordpad/Pl.rc | 4 + programs/wordpad/Ru.rc | 4 + programs/wordpad/Tr.rc | 4 + programs/wordpad/resource.h | 2 + programs/wordpad/rsrc.rc | 2 + programs/wordpad/wordpad.c | 148 +++++++++++++++++++++++++++++++++++- 13 files changed, 192 insertions(+), 2 deletions(-) diff --git a/programs/wordpad/De.rc b/programs/wordpad/De.rc index ddf57a04228..4647a21ce52 100644 --- a/programs/wordpad/De.rc +++ b/programs/wordpad/De.rc @@ -40,6 +40,9 @@ BEGIN MENUITEM "&Löschen\tDEL", ID_EDIT_CLEAR MENUITEM "&Alles markieren\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Schreibgeschü&tzt", ID_EDIT_READONLY MENUITEM "&Geändert", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/En.rc b/programs/wordpad/En.rc index c7e12e8430c..14c1a3e041c 100644 --- a/programs/wordpad/En.rc +++ b/programs/wordpad/En.rc @@ -40,6 +40,9 @@ BEGIN MENUITEM "&Clear\tDEL", ID_EDIT_CLEAR MENUITEM "&Select all\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Read-&only", ID_EDIT_READONLY MENUITEM "&Modified", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Fr.rc b/programs/wordpad/Fr.rc index 00a110b7557..14527e30a99 100644 --- a/programs/wordpad/Fr.rc +++ b/programs/wordpad/Fr.rc @@ -40,6 +40,9 @@ BEGIN MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Lecture-&seule", ID_EDIT_READONLY MENUITEM "&Modifié", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Hu.rc b/programs/wordpad/Hu.rc index 95cbf11cdb5..c3b220d2500 100644 --- a/programs/wordpad/Hu.rc +++ b/programs/wordpad/Hu.rc @@ -40,6 +40,9 @@ BEGIN MENUITEM "Tör&lés\tDel", ID_EDIT_CLEAR MENUITEM "M&indet kijelöli\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Csak &olvasható", ID_EDIT_READONLY MENUITEM "Mó&dosítva", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Ko.rc b/programs/wordpad/Ko.rc index 260d16db8f3..2712d5216b1 100644 --- a/programs/wordpad/Ko.rc +++ b/programs/wordpad/Ko.rc @@ -41,6 +41,9 @@ BEGIN MENUITEM "Áö¿ì±â(&C)\tDEL", ID_EDIT_CLEAR MENUITEM "¸ðµÎ ¼±ÅÃ(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Àбâ Àü¿ë(&O)", ID_EDIT_READONLY MENUITEM "¼öÁ¤ °¡´É(&M)", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -101,4 +104,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "¹®¼­" STRING_PROMPT_SAVE_CHANGES, "'%s'ÀÇ ¹Ù²ï °ÍÀ» ÀúÀåÇÏ°Ú½À´Ï±î?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Nl.rc b/programs/wordpad/Nl.rc index 389e1df0f42..72a73c0fe10 100644 --- a/programs/wordpad/Nl.rc +++ b/programs/wordpad/Nl.rc @@ -40,6 +40,9 @@ BEGIN MENUITEM "&Verwijderen\tDel", ID_EDIT_CLEAR MENUITEM "&Alles selecteren\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Alleen &lezen", ID_EDIT_READONLY MENUITEM "&Gewijzigd", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/No.rc b/programs/wordpad/No.rc index ca60146d59c..3e8a9a57c54 100644 --- a/programs/wordpad/No.rc +++ b/programs/wordpad/No.rc @@ -40,7 +40,10 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Skrivebeskyttet", ID_EDIT_READONLY + MENUITEM "&Søk etter . . .\tCrtl+F", ID_FIND + MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR + MENUITEM "Sk&rivebeskyttet", ID_EDIT_READONLY MENUITEM "E&ndret", ID_EDIT_MODIFIED MENUITEM SEPARATOR POPUP "&Ekstra" @@ -100,4 +103,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" + STRING_SEARCH_FINISHED, "Ferdig med å søke i dokumentet." END diff --git a/programs/wordpad/Pl.rc b/programs/wordpad/Pl.rc index d18855b5593..10563758d48 100644 --- a/programs/wordpad/Pl.rc +++ b/programs/wordpad/Pl.rc @@ -41,6 +41,9 @@ BEGIN MENUITEM "&Usuñ\tDel", ID_EDIT_CLEAR MENUITEM "&Zaznacz wszystko\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Tylko do &odczytu", ID_EDIT_READONLY MENUITEM "&Zmodifykowany", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -101,4 +104,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Ru.rc b/programs/wordpad/Ru.rc index 05927351a5e..800bf3fd969 100644 --- a/programs/wordpad/Ru.rc +++ b/programs/wordpad/Ru.rc @@ -38,6 +38,9 @@ BEGIN MENUITEM "&Âûðåçàòü\tCtrl+X", ID_EDIT_CUT MENUITEM "&Êîïèðîâàòü\tCtrl+C", ID_EDIT_COPY MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "&Òîëüêî äëÿ ÷òåíèÿ", ID_EDIT_READONLY MENUITEM "&Èçìåíåí", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -98,4 +101,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/Tr.rc b/programs/wordpad/Tr.rc index 0681a8f0b43..fd25eafd94e 100644 --- a/programs/wordpad/Tr.rc +++ b/programs/wordpad/Tr.rc @@ -42,6 +42,9 @@ BEGIN MENUITEM "&Sil\tDel", ID_EDIT_CLEAR MENUITEM "&Tümünü seç\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM "&Find . . .\tCrtl+F", ID_FIND + MENUITEM "Find &next\tF3", ID_FIND_NEXT + MENUITEM SEPARATOR MENUITEM "Salt-&okunur", ID_EDIT_READONLY MENUITEM "&Deðiþmiþ", ID_EDIT_MODIFIED MENUITEM SEPARATOR @@ -102,4 +105,5 @@ STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" STRING_PROMPT_SAVE_CHANGES, "Save changes to '%s'?" + STRING_SEARCH_FINISHED, "Finished searching the document." END diff --git a/programs/wordpad/resource.h b/programs/wordpad/resource.h index eb329e35ebc..8ee71569510 100644 --- a/programs/wordpad/resource.h +++ b/programs/wordpad/resource.h @@ -26,6 +26,7 @@ #define ID_PREVIEW 1006 #define ID_FIND 1007 +#define ID_FIND_NEXT 1008 #define ID_ALIGN_LEFT 1100 #define ID_ALIGN_CENTER 1101 @@ -83,3 +84,4 @@ #define STRING_DEFAULT_FILENAME 1403 #define STRING_PROMPT_SAVE_CHANGES 1404 +#define STRING_SEARCH_FINISHED 1405 diff --git a/programs/wordpad/rsrc.rc b/programs/wordpad/rsrc.rc index 89fb4f21321..85d74346602 100644 --- a/programs/wordpad/rsrc.rc +++ b/programs/wordpad/rsrc.rc @@ -28,6 +28,8 @@ BEGIN "L", ID_ALIGN_LEFT, VIRTKEY, CONTROL "E", ID_ALIGN_CENTER, VIRTKEY, CONTROL "R", ID_ALIGN_RIGHT, VIRTKEY, CONTROL + "F", ID_FIND, VIRTKEY, CONTROL + VK_F3, ID_FIND_NEXT, VIRTKEY "A", ID_EDIT_SELECTALL, VIRTKEY, CONTROL "X", ID_EDIT_CUT, VIRTKEY, CONTROL "C", ID_EDIT_COPY, VIRTKEY, CONTROL diff --git a/programs/wordpad/wordpad.c b/programs/wordpad/wordpad.c index e3806281610..0c384bd67f5 100644 --- a/programs/wordpad/wordpad.c +++ b/programs/wordpad/wordpad.c @@ -45,6 +45,9 @@ static const WCHAR wszAppTitle[] = {'W','i','n','e',' ','W','o','r','d','p','a', static HWND hMainWnd; static HWND hEditorWnd; +static HWND hFindWnd; + +static UINT ID_FINDMSGSTRING; static WCHAR wszFilter[MAX_STRING_LEN]; static WCHAR wszDefaultFileName[MAX_STRING_LEN]; @@ -375,6 +378,109 @@ static void HandleCommandLine(LPWSTR cmdline) MessageBox(hMainWnd, "Printing not implemented", "WordPad", MB_OK); } +static LRESULT handle_findmsg(LPFINDREPLACEW pFr) +{ + if(pFr->Flags & FR_DIALOGTERM) + { + hFindWnd = 0; + pFr->Flags = FR_FINDNEXT; + return 0; + } else if(pFr->Flags & FR_FINDNEXT) + { + DWORD flags = FR_DOWN; + FINDTEXTW ft; + static CHARRANGE cr; + LRESULT end, ret; + GETTEXTLENGTHEX gt; + LRESULT length; + int startPos; + HMENU hMenu = GetMenu(hMainWnd); + MENUITEMINFOW mi; + + mi.cbSize = sizeof(mi); + mi.fMask = MIIM_DATA; + mi.dwItemData = 1; + SetMenuItemInfoW(hMenu, ID_FIND_NEXT, FALSE, &mi); + + gt.flags = GTL_NUMCHARS; + gt.codepage = 1200; + + length = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + + if(pFr->lCustData == -1) + { + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&startPos, (LPARAM)&end); + cr.cpMin = startPos; + pFr->lCustData = startPos; + cr.cpMax = length; + if(cr.cpMin == length) + cr.cpMin = 0; + } else + { + startPos = pFr->lCustData; + } + + if(cr.cpMax > length) + { + startPos = 0; + cr.cpMin = 0; + cr.cpMax = length; + } + + ft.chrg = cr; + ft.lpstrText = pFr->lpstrFindWhat; + + if(pFr->Flags & FR_MATCHCASE) + flags |= FR_MATCHCASE; + if(pFr->Flags & FR_WHOLEWORD) + flags |= FR_WHOLEWORD; + + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + + if(ret == -1) + { + if(cr.cpMax == length && cr.cpMax != startPos) + { + ft.chrg.cpMin = cr.cpMin = 0; + ft.chrg.cpMax = cr.cpMax = startPos; + + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + } + } + + if(ret == -1) + { + pFr->lCustData = -1; + MessageBoxW(hMainWnd, MAKEINTRESOURCEW(STRING_SEARCH_FINISHED), wszAppTitle, + MB_OK | MB_ICONASTERISK); + } else + { + end = ret + lstrlenW(pFr->lpstrFindWhat); + cr.cpMin = end; + SendMessageW(hEditorWnd, EM_SETSEL, (WPARAM)ret, (LPARAM)end); + SendMessageW(hEditorWnd, EM_SCROLLCARET, 0, 0); + } + } + + return 0; +} + +static void dialog_find(LPFINDREPLACEW fr) +{ + static WCHAR findBuffer[MAX_STRING_LEN]; + + ZeroMemory(fr, sizeof(FINDREPLACEW)); + fr->lStructSize = sizeof(FINDREPLACEW); + fr->hwndOwner = hMainWnd; + fr->Flags = FR_HIDEUPDOWN; + fr->lpstrFindWhat = findBuffer; + fr->lCustData = -1; + fr->wFindWhatLen = MAX_STRING_LEN*sizeof(WCHAR); + + hFindWnd = FindTextW(fr); +} + + static void DoDefaultFont(void) { static const WCHAR szFaceName[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0}; @@ -592,6 +698,8 @@ static LRESULT OnCreate( HWND hWnd, WPARAM wParam, LPARAM lParam) DoLoadStrings(); SendMessageW(hEditorWnd, EM_SETMODIFY, FALSE, 0); + ID_FINDMSGSTRING = RegisterWindowMessageW(FINDMSGSTRINGW); + return 0; } @@ -604,6 +712,7 @@ static LRESULT OnUser( HWND hWnd, WPARAM wParam, LPARAM lParam) int from, to; CHARFORMAT2W fmt; PARAFORMAT2 pf; + GETTEXTLENGTHEX gt; ZeroMemory(&fmt, sizeof(fmt)); fmt.cbSize = sizeof(fmt); @@ -611,6 +720,12 @@ static LRESULT OnUser( HWND hWnd, WPARAM wParam, LPARAM lParam) ZeroMemory(&pf, sizeof(pf)); pf.cbSize = sizeof(pf); + gt.flags = GTL_NUMCHARS; + gt.codepage = 1200; + + SendMessageW(hwndToolBar, TB_ENABLEBUTTON, ID_FIND, + SendMessageW(hwndEditor, EM_GETTEXTLENGTHEX, (WPARAM)>, 0) ? 1 : 0); + SendMessageW(hwndEditor, EM_GETCHARFORMAT, TRUE, (LPARAM)&fmt); SendMessageW(hwndEditor, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); @@ -666,12 +781,14 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) { HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR); HWND hwndStatus = GetDlgItem(hWnd, IDC_STATUSBAR); + static FINDREPLACEW findreplace; if ((HWND)lParam == hwndEditor) return 0; switch(LOWORD(wParam)) { + case ID_FILE_EXIT: PostMessageW(hWnd, WM_CLOSE, 0, 0); break; @@ -703,9 +820,16 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) DialogSaveFile(); break; + case ID_FIND: + dialog_find(&findreplace); + break; + + case ID_FIND_NEXT: + handle_findmsg(&findreplace); + break; + case ID_PRINT: case ID_PREVIEW: - case ID_FIND: { static const WCHAR wszNotImplemented[] = {'N','o','t',' ', 'i','m','p','l','e','m','e','n','t','e','d','\0'}; @@ -908,6 +1032,9 @@ static LRESULT OnInitPopupMenu( HWND hWnd, WPARAM wParam, LPARAM lParam ) int nAlignment = -1; REBARBANDINFOW rbbinfo; int selFrom, selTo; + GETTEXTLENGTHEX gt; + LRESULT textLength; + MENUITEMINFOW mi; SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&selFrom, (LPARAM)&selTo); EnableMenuItem(hMenu, ID_EDIT_COPY, MF_BYCOMMAND|(selFrom == selTo) ? MF_GRAYED : MF_ENABLED); @@ -946,6 +1073,19 @@ static LRESULT OnInitPopupMenu( HWND hWnd, WPARAM wParam, LPARAM lParam ) CheckMenuItem(hMenu, ID_TOGGLE_STATUSBAR, MF_BYCOMMAND|IsWindowVisible(hwndStatus) ? MF_CHECKED : MF_UNCHECKED); + + gt.flags = GTL_NUMCHARS; + gt.codepage = 1200; + textLength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + EnableMenuItem(hMenu, ID_FIND, MF_BYCOMMAND|(textLength ? MF_ENABLED : MF_GRAYED)); + + mi.cbSize = sizeof(mi); + mi.fMask = MIIM_DATA; + + GetMenuItemInfoW(hMenu, ID_FIND_NEXT, FALSE, &mi); + + EnableMenuItem(hMenu, ID_FIND_NEXT, MF_BYCOMMAND|((textLength && mi.dwItemData) ? + MF_ENABLED : MF_GRAYED)); return 0; } @@ -1003,6 +1143,9 @@ static LRESULT OnSize( HWND hWnd, WPARAM wParam, LPARAM lParam ) static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + if(msg == ID_FINDMSGSTRING) + return handle_findmsg((LPFINDREPLACEW)lParam); + switch(msg) { case WM_CREATE: @@ -1079,6 +1222,9 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar while(GetMessageW(&msg,0,0,0)) { + if (IsDialogMessage(hFindWnd, &msg)) + continue; + if (TranslateAcceleratorW(hMainWnd, hAccel, &msg)) continue; TranslateMessage(&msg);