Module: wine Branch: master Commit: fbd30765f0659551367d78e4fbee1c0ed9c15055 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fbd30765f0659551367d78e4fb...
Author: Dylan Smith dylan.ah.smith@gmail.com Date: Mon Jul 19 18:18:08 2010 -0400
wordpad: Find dialogs intialize find field with selection.
If there is a selection that doesn't span multiple paragraphs, then the selection text initializes the find field in native wordpad, otherwise the last search is used to initialize the field. I added an extra buffer, since closing the find dialog before doing a search will preserve the last search state.
---
programs/wordpad/wordpad.c | 35 +++++++++++++++++++++++++++++++---- 1 files changed, 31 insertions(+), 4 deletions(-)
diff --git a/programs/wordpad/wordpad.c b/programs/wordpad/wordpad.c index df1b254..edee1f8 100644 --- a/programs/wordpad/wordpad.c +++ b/programs/wordpad/wordpad.c @@ -93,6 +93,7 @@ typedef struct { int endPos; BOOL wrapped; + WCHAR findBuffer[128]; } FINDREPLACE_custom;
/* Load string resources */ @@ -1234,6 +1235,14 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) mi.dwItemData = 1; SetMenuItemInfoW(hMenu, ID_FIND_NEXT, FALSE, &mi);
+ /* Make sure find field is saved. */ + if (pFr->lpstrFindWhat != custom_data->findBuffer) + { + lstrcpynW(custom_data->findBuffer, pFr->lpstrFindWhat, + sizeof(custom_data->findBuffer)); + pFr->lpstrFindWhat = custom_data->findBuffer; + } + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&sel.cpMin, (LPARAM)&sel.cpMax); if(custom_data->endPos == -1) { custom_data->endPos = sel.cpMin; @@ -1295,9 +1304,11 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
static void dialog_find(LPFINDREPLACEW fr, BOOL replace) { - static WCHAR findBuffer[MAX_STRING_LEN]; - static WCHAR replaceBuffer[MAX_STRING_LEN]; + static WCHAR selBuffer[128]; + static WCHAR replaceBuffer[128]; static FINDREPLACE_custom custom_data; + static const WCHAR endl = '\r'; + FINDTEXTW ft;
/* Allow only one search/replace dialog to open */ if(hFindWnd != NULL) @@ -1310,12 +1321,28 @@ static void dialog_find(LPFINDREPLACEW fr, BOOL replace) fr->lStructSize = sizeof(FINDREPLACEW); fr->hwndOwner = hMainWnd; fr->Flags = FR_HIDEUPDOWN; - fr->lpstrFindWhat = findBuffer; + /* Find field is filled with the selected text if it is non-empty + * and stays within the same paragraph, otherwise the previous + * find field is used. */ + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&ft.chrg.cpMin, + (LPARAM)&ft.chrg.cpMax); + ft.lpstrText = &endl; + if (ft.chrg.cpMin != ft.chrg.cpMax && + SendMessageW(hEditorWnd, EM_FINDTEXTW, FR_DOWN, (LPARAM)&ft) == -1) + { + /* Use a temporary buffer for the selected text so that the saved + * find field is only overwritten when a find/replace is clicked. */ + GETTEXTEX gt = {sizeof(selBuffer), GT_SELECTION, 1200, NULL, NULL}; + SendMessageW(hEditorWnd, EM_GETTEXTEX, (WPARAM)>, (LPARAM)selBuffer); + fr->lpstrFindWhat = selBuffer; + } else { + fr->lpstrFindWhat = custom_data.findBuffer; + } fr->lpstrReplaceWith = replaceBuffer; custom_data.endPos = -1; custom_data.wrapped = FALSE; fr->lCustData = (LPARAM)&custom_data; - fr->wFindWhatLen = sizeof(findBuffer); + fr->wFindWhatLen = sizeof(custom_data.findBuffer); fr->wReplaceWithLen = sizeof(replaceBuffer);
if(replace)