1 /* 2 * Notepad 3 * 4 * Copyright 2000 Mike McCormack <Mike_McCormack@looksmart.com.au> 5 * Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch> 6 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr> 7 * Copyright 2002 Andriy Palamarchuk 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with this library; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 * 23 */ 24 25 #include "notepad.h" 26 27 #include <strsafe.h> 28 29 NOTEPAD_GLOBALS Globals; 30 static ATOM aFINDMSGSTRING; 31 32 VOID NOTEPAD_EnableSearchMenu() 33 { 34 EnableMenuItem(Globals.hMenu, CMD_SEARCH, 35 MF_BYCOMMAND | ((GetWindowTextLength(Globals.hEdit) == 0) ? MF_DISABLED | MF_GRAYED : MF_ENABLED)); 36 EnableMenuItem(Globals.hMenu, CMD_SEARCH_NEXT, 37 MF_BYCOMMAND | ((GetWindowTextLength(Globals.hEdit) == 0) ? MF_DISABLED | MF_GRAYED : MF_ENABLED)); 38 } 39 40 /*********************************************************************** 41 * 42 * SetFileName 43 * 44 * Sets Global File Name. 45 */ 46 VOID SetFileName(LPCTSTR szFileName) 47 { 48 StringCchCopy(Globals.szFileName, ARRAY_SIZE(Globals.szFileName), szFileName); 49 Globals.szFileTitle[0] = 0; 50 GetFileTitle(szFileName, Globals.szFileTitle, ARRAY_SIZE(Globals.szFileTitle)); 51 } 52 53 /*********************************************************************** 54 * 55 * NOTEPAD_MenuCommand 56 * 57 * All handling of main menu events 58 */ 59 static int NOTEPAD_MenuCommand(WPARAM wParam) 60 { 61 switch (wParam) 62 { 63 case CMD_NEW: DIALOG_FileNew(); break; 64 case CMD_OPEN: DIALOG_FileOpen(); break; 65 case CMD_SAVE: DIALOG_FileSave(); break; 66 case CMD_SAVE_AS: DIALOG_FileSaveAs(); break; 67 case CMD_PRINT: DIALOG_FilePrint(); break; 68 case CMD_PAGE_SETUP: DIALOG_FilePageSetup(); break; 69 case CMD_EXIT: DIALOG_FileExit(); break; 70 71 case CMD_UNDO: DIALOG_EditUndo(); break; 72 case CMD_CUT: DIALOG_EditCut(); break; 73 case CMD_COPY: DIALOG_EditCopy(); break; 74 case CMD_PASTE: DIALOG_EditPaste(); break; 75 case CMD_DELETE: DIALOG_EditDelete(); break; 76 case CMD_SELECT_ALL: DIALOG_EditSelectAll(); break; 77 case CMD_TIME_DATE: DIALOG_EditTimeDate(); break; 78 79 case CMD_SEARCH: DIALOG_Search(); break; 80 case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; 81 case CMD_REPLACE: DIALOG_Replace(); break; 82 case CMD_GOTO: DIALOG_GoTo(); break; 83 84 case CMD_WRAP: DIALOG_EditWrap(); break; 85 case CMD_FONT: DIALOG_SelectFont(); break; 86 87 case CMD_STATUSBAR: DIALOG_ViewStatusBar(); break; 88 89 case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; 90 case CMD_HELP_ABOUT_NOTEPAD: DIALOG_HelpAboutNotepad(); break; 91 92 default: 93 break; 94 } 95 return 0; 96 } 97 98 /*********************************************************************** 99 * 100 * NOTEPAD_FindTextAt 101 */ 102 103 static BOOL 104 NOTEPAD_FindTextAt(FINDREPLACE *pFindReplace, LPCTSTR pszText, int iTextLength, DWORD dwPosition) 105 { 106 BOOL bMatches; 107 size_t iTargetLength; 108 109 if ((!pFindReplace) || (!pszText)) 110 { 111 return FALSE; 112 } 113 114 iTargetLength = _tcslen(pFindReplace->lpstrFindWhat); 115 116 /* Make proper comparison */ 117 if (pFindReplace->Flags & FR_MATCHCASE) 118 bMatches = !_tcsncmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); 119 else 120 bMatches = !_tcsnicmp(&pszText[dwPosition], pFindReplace->lpstrFindWhat, iTargetLength); 121 122 if (bMatches && pFindReplace->Flags & FR_WHOLEWORD) 123 { 124 if ((dwPosition > 0) && !_istspace(pszText[dwPosition-1])) 125 bMatches = FALSE; 126 if ((dwPosition < (DWORD) iTextLength - 1) && !_istspace(pszText[dwPosition+1])) 127 bMatches = FALSE; 128 } 129 130 return bMatches; 131 } 132 133 /*********************************************************************** 134 * 135 * NOTEPAD_FindNext 136 */ 137 138 BOOL NOTEPAD_FindNext(FINDREPLACE *pFindReplace, BOOL bReplace, BOOL bShowAlert) 139 { 140 int iTextLength, iTargetLength; 141 size_t iAdjustment = 0; 142 LPTSTR pszText = NULL; 143 DWORD dwPosition, dwBegin, dwEnd; 144 BOOL bMatches = FALSE; 145 TCHAR szResource[128], szText[128]; 146 BOOL bSuccess; 147 148 iTargetLength = (int) _tcslen(pFindReplace->lpstrFindWhat); 149 150 /* Retrieve the window text */ 151 iTextLength = GetWindowTextLength(Globals.hEdit); 152 if (iTextLength > 0) 153 { 154 pszText = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (iTextLength + 1) * sizeof(TCHAR)); 155 if (!pszText) 156 return FALSE; 157 158 GetWindowText(Globals.hEdit, pszText, iTextLength + 1); 159 } 160 161 SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM) &dwBegin, (LPARAM) &dwEnd); 162 if (bReplace && ((dwEnd - dwBegin) == (DWORD) iTargetLength)) 163 { 164 if (NOTEPAD_FindTextAt(pFindReplace, pszText, iTextLength, dwBegin)) 165 { 166 SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM) pFindReplace->lpstrReplaceWith); 167 iAdjustment = _tcslen(pFindReplace->lpstrReplaceWith) - (dwEnd - dwBegin); 168 } 169 } 170 171 if (pFindReplace->Flags & FR_DOWN) 172 { 173 /* Find Down */ 174 dwPosition = dwEnd; 175 while(dwPosition < (DWORD) iTextLength) 176 { 177 bMatches = NOTEPAD_FindTextAt(pFindReplace, pszText, iTextLength, dwPosition); 178 if (bMatches) 179 break; 180 dwPosition++; 181 } 182 } 183 else 184 { 185 /* Find Up */ 186 dwPosition = dwBegin; 187 while(dwPosition > 0) 188 { 189 dwPosition--; 190 bMatches = NOTEPAD_FindTextAt(pFindReplace, pszText, iTextLength, dwPosition); 191 if (bMatches) 192 break; 193 } 194 } 195 196 if (bMatches) 197 { 198 /* Found target */ 199 if (dwPosition > dwBegin) 200 dwPosition += (DWORD) iAdjustment; 201 SendMessage(Globals.hEdit, EM_SETSEL, dwPosition, dwPosition + iTargetLength); 202 SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0); 203 bSuccess = TRUE; 204 } 205 else 206 { 207 /* Can't find target */ 208 if (bShowAlert) 209 { 210 LoadString(Globals.hInstance, STRING_CANNOTFIND, szResource, ARRAY_SIZE(szResource)); 211 _sntprintf(szText, ARRAY_SIZE(szText), szResource, pFindReplace->lpstrFindWhat); 212 LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, ARRAY_SIZE(szResource)); 213 MessageBox(Globals.hFindReplaceDlg, szText, szResource, MB_OK); 214 } 215 bSuccess = FALSE; 216 } 217 218 if (pszText) 219 HeapFree(GetProcessHeap(), 0, pszText); 220 return bSuccess; 221 } 222 223 /*********************************************************************** 224 * 225 * NOTEPAD_ReplaceAll 226 */ 227 228 static VOID NOTEPAD_ReplaceAll(FINDREPLACE *pFindReplace) 229 { 230 BOOL bShowAlert = TRUE; 231 232 SendMessage(Globals.hEdit, EM_SETSEL, 0, 0); 233 234 while (NOTEPAD_FindNext(pFindReplace, TRUE, bShowAlert)) 235 { 236 bShowAlert = FALSE; 237 } 238 } 239 240 /*********************************************************************** 241 * 242 * NOTEPAD_FindTerm 243 */ 244 245 static VOID NOTEPAD_FindTerm(VOID) 246 { 247 Globals.hFindReplaceDlg = NULL; 248 } 249 250 /*********************************************************************** 251 * Data Initialization 252 */ 253 static VOID NOTEPAD_InitData(VOID) 254 { 255 LPTSTR p = Globals.szFilter; 256 static const TCHAR txt_files[] = _T("*.txt"); 257 static const TCHAR all_files[] = _T("*.*"); 258 259 p += LoadString(Globals.hInstance, STRING_TEXT_FILES_TXT, p, MAX_STRING_LEN) + 1; 260 _tcscpy(p, txt_files); 261 p += ARRAY_SIZE(txt_files); 262 263 p += LoadString(Globals.hInstance, STRING_ALL_FILES, p, MAX_STRING_LEN) + 1; 264 _tcscpy(p, all_files); 265 p += ARRAY_SIZE(all_files); 266 *p = '\0'; 267 Globals.find.lpstrFindWhat = NULL; 268 269 Globals.hDevMode = NULL; 270 Globals.hDevNames = NULL; 271 } 272 273 /*********************************************************************** 274 * Enable/disable items on the menu based on control state 275 */ 276 static VOID NOTEPAD_InitMenuPopup(HMENU menu, LPARAM index) 277 { 278 int enable; 279 280 UNREFERENCED_PARAMETER(index); 281 282 CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, 283 MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); 284 if (!Globals.bWrapLongLines) 285 { 286 CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_STATUSBAR, 287 MF_BYCOMMAND | (Globals.bShowStatusBar ? MF_CHECKED : MF_UNCHECKED)); 288 } 289 EnableMenuItem(menu, CMD_UNDO, 290 SendMessage(Globals.hEdit, EM_CANUNDO, 0, 0) ? MF_ENABLED : MF_GRAYED); 291 EnableMenuItem(menu, CMD_PASTE, 292 IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED); 293 enable = (int) SendMessage(Globals.hEdit, EM_GETSEL, 0, 0); 294 enable = (HIWORD(enable) == LOWORD(enable)) ? MF_GRAYED : MF_ENABLED; 295 EnableMenuItem(menu, CMD_CUT, enable); 296 EnableMenuItem(menu, CMD_COPY, enable); 297 EnableMenuItem(menu, CMD_DELETE, enable); 298 299 EnableMenuItem(menu, CMD_SELECT_ALL, 300 GetWindowTextLength(Globals.hEdit) ? MF_ENABLED : MF_GRAYED); 301 DrawMenuBar(Globals.hMainWnd); 302 } 303 304 LRESULT CALLBACK EDIT_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 305 { 306 switch (msg) 307 { 308 case WM_KEYDOWN: 309 case WM_KEYUP: 310 { 311 switch (wParam) 312 { 313 case VK_UP: 314 case VK_DOWN: 315 case VK_LEFT: 316 case VK_RIGHT: 317 DIALOG_StatusBarUpdateCaretPos(); 318 break; 319 default: 320 { 321 UpdateWindowCaption(FALSE); 322 break; 323 } 324 } 325 } 326 case WM_LBUTTONUP: 327 { 328 DIALOG_StatusBarUpdateCaretPos(); 329 break; 330 } 331 } 332 return CallWindowProc( Globals.EditProc, hWnd, msg, wParam, lParam); 333 } 334 335 /*********************************************************************** 336 * 337 * NOTEPAD_WndProc 338 */ 339 static LRESULT 340 WINAPI 341 NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 342 { 343 switch (msg) 344 { 345 346 case WM_CREATE: 347 Globals.hMenu = GetMenu(hWnd); 348 349 // For now, the "Help" dialog is disabled due to the lack of HTML Help support 350 EnableMenuItem(Globals.hMenu, CMD_HELP_CONTENTS, MF_BYCOMMAND | MF_GRAYED); 351 break; 352 353 case WM_COMMAND: 354 if (HIWORD(wParam) == EN_CHANGE || HIWORD(wParam) == EN_HSCROLL || HIWORD(wParam) == EN_VSCROLL) 355 DIALOG_StatusBarUpdateCaretPos(); 356 if ((HIWORD(wParam) == EN_CHANGE)) 357 NOTEPAD_EnableSearchMenu(); 358 NOTEPAD_MenuCommand(LOWORD(wParam)); 359 break; 360 361 case WM_DESTROYCLIPBOARD: 362 /*MessageBox(Globals.hMainWnd, "Empty clipboard", "Debug", MB_ICONEXCLAMATION);*/ 363 break; 364 365 case WM_CLOSE: 366 if (DoCloseFile()) { 367 if (Globals.hFont) 368 DeleteObject(Globals.hFont); 369 if (Globals.hDevMode) 370 GlobalFree(Globals.hDevMode); 371 if (Globals.hDevNames) 372 GlobalFree(Globals.hDevNames); 373 DestroyWindow(hWnd); 374 } 375 break; 376 377 case WM_QUERYENDSESSION: 378 if (DoCloseFile()) { 379 return 1; 380 } 381 break; 382 383 case WM_DESTROY: 384 SetWindowLongPtr(Globals.hEdit, GWLP_WNDPROC, (LONG_PTR)Globals.EditProc); 385 NOTEPAD_SaveSettingsToRegistry(); 386 PostQuitMessage(0); 387 break; 388 389 case WM_SIZE: 390 { 391 if ((Globals.bShowStatusBar != FALSE) && (Globals.bWrapLongLines == FALSE)) 392 { 393 RECT rcStatusBar; 394 HDWP hdwp; 395 396 if (!GetWindowRect(Globals.hStatusBar, &rcStatusBar)) 397 break; 398 399 hdwp = BeginDeferWindowPos(2); 400 if (hdwp == NULL) 401 break; 402 403 hdwp = DeferWindowPos(hdwp, 404 Globals.hEdit, 405 NULL, 406 0, 407 0, 408 LOWORD(lParam), 409 HIWORD(lParam) - (rcStatusBar.bottom - rcStatusBar.top), 410 SWP_NOZORDER | SWP_NOMOVE); 411 412 if (hdwp == NULL) 413 break; 414 415 hdwp = DeferWindowPos(hdwp, 416 Globals.hStatusBar, 417 NULL, 418 0, 419 0, 420 LOWORD(lParam), 421 LOWORD(wParam), 422 SWP_NOZORDER); 423 424 if (hdwp != NULL) 425 EndDeferWindowPos(hdwp); 426 } 427 else 428 SetWindowPos(Globals.hEdit, 429 NULL, 430 0, 431 0, 432 LOWORD(lParam), 433 HIWORD(lParam), 434 SWP_NOZORDER | SWP_NOMOVE); 435 436 break; 437 } 438 439 /* The entire client area is covered by edit control and by 440 * the status bar. So there is no need to erase main background. 441 * This resolves the horrible flicker effect during windows resizes. */ 442 case WM_ERASEBKGND: 443 return 1; 444 445 case WM_SETFOCUS: 446 SetFocus(Globals.hEdit); 447 break; 448 449 case WM_DROPFILES: 450 { 451 TCHAR szFileName[MAX_PATH]; 452 HDROP hDrop = (HDROP) wParam; 453 454 DragQueryFile(hDrop, 0, szFileName, ARRAY_SIZE(szFileName)); 455 DragFinish(hDrop); 456 DoOpenFile(szFileName); 457 break; 458 } 459 case WM_CHAR: 460 case WM_INITMENUPOPUP: 461 NOTEPAD_InitMenuPopup((HMENU)wParam, lParam); 462 break; 463 default: 464 if (msg == aFINDMSGSTRING) 465 { 466 FINDREPLACE *pFindReplace = (FINDREPLACE *) lParam; 467 Globals.find = *(FINDREPLACE *) lParam; 468 469 if (pFindReplace->Flags & FR_FINDNEXT) 470 NOTEPAD_FindNext(pFindReplace, FALSE, TRUE); 471 else if (pFindReplace->Flags & FR_REPLACE) 472 NOTEPAD_FindNext(pFindReplace, TRUE, TRUE); 473 else if (pFindReplace->Flags & FR_REPLACEALL) 474 NOTEPAD_ReplaceAll(pFindReplace); 475 else if (pFindReplace->Flags & FR_DIALOGTERM) 476 NOTEPAD_FindTerm(); 477 break; 478 } 479 480 return DefWindowProc(hWnd, msg, wParam, lParam); 481 } 482 return 0; 483 } 484 485 static int AlertFileDoesNotExist(LPCTSTR szFileName) 486 { 487 return DIALOG_StringMsgBox(Globals.hMainWnd, STRING_DOESNOTEXIST, 488 szFileName, 489 MB_ICONEXCLAMATION | MB_YESNO); 490 } 491 492 static BOOL HandleCommandLine(LPTSTR cmdline) 493 { 494 BOOL opt_print = FALSE; 495 496 while (*cmdline == _T(' ') || *cmdline == _T('-') || *cmdline == _T('/')) 497 { 498 TCHAR option; 499 500 if (*cmdline++ == _T(' ')) continue; 501 502 option = *cmdline; 503 if (option) cmdline++; 504 while (*cmdline == _T(' ')) cmdline++; 505 506 switch(option) 507 { 508 case 'p': 509 case 'P': 510 opt_print = TRUE; 511 break; 512 } 513 } 514 515 if (*cmdline) 516 { 517 /* file name is passed in the command line */ 518 LPCTSTR file_name = NULL; 519 BOOL file_exists = FALSE; 520 TCHAR buf[MAX_PATH]; 521 522 if (cmdline[0] == _T('"')) 523 { 524 cmdline++; 525 cmdline[lstrlen(cmdline) - 1] = 0; 526 } 527 528 file_name = cmdline; 529 if (FileExists(file_name)) 530 { 531 file_exists = TRUE; 532 } 533 else if (!HasFileExtension(cmdline)) 534 { 535 static const TCHAR txt[] = _T(".txt"); 536 537 /* try to find file with ".txt" extension */ 538 if (!_tcscmp(txt, cmdline + _tcslen(cmdline) - _tcslen(txt))) 539 { 540 file_exists = FALSE; 541 } 542 else 543 { 544 _tcsncpy(buf, cmdline, MAX_PATH - _tcslen(txt) - 1); 545 _tcscat(buf, txt); 546 file_name = buf; 547 file_exists = FileExists(file_name); 548 } 549 } 550 551 if (file_exists) 552 { 553 DoOpenFile(file_name); 554 InvalidateRect(Globals.hMainWnd, NULL, FALSE); 555 if (opt_print) 556 { 557 DIALOG_FilePrint(); 558 return FALSE; 559 } 560 } 561 else 562 { 563 switch (AlertFileDoesNotExist(file_name)) { 564 case IDYES: 565 DoOpenFile(file_name); 566 break; 567 568 case IDNO: 569 break; 570 } 571 } 572 } 573 574 return TRUE; 575 } 576 577 /*********************************************************************** 578 * 579 * WinMain 580 */ 581 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE prev, LPTSTR cmdline, int show) 582 { 583 MSG msg; 584 HACCEL hAccel; 585 WNDCLASSEX wndclass; 586 HMONITOR monitor; 587 MONITORINFO info; 588 INT x, y; 589 590 static const TCHAR className[] = _T("Notepad"); 591 static const TCHAR winName[] = _T("Notepad"); 592 593 switch (GetUserDefaultUILanguage()) 594 { 595 case MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT): 596 SetProcessDefaultLayout(LAYOUT_RTL); 597 break; 598 599 default: 600 break; 601 } 602 603 UNREFERENCED_PARAMETER(prev); 604 605 aFINDMSGSTRING = (ATOM)RegisterWindowMessage(FINDMSGSTRING); 606 607 ZeroMemory(&Globals, sizeof(Globals)); 608 Globals.hInstance = hInstance; 609 NOTEPAD_LoadSettingsFromRegistry(); 610 611 ZeroMemory(&wndclass, sizeof(wndclass)); 612 wndclass.cbSize = sizeof(wndclass); 613 wndclass.lpfnWndProc = NOTEPAD_WndProc; 614 wndclass.hInstance = Globals.hInstance; 615 wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NPICON)); 616 wndclass.hCursor = LoadCursor(0, IDC_ARROW); 617 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 618 wndclass.lpszMenuName = MAKEINTRESOURCE(MAIN_MENU); 619 wndclass.lpszClassName = className; 620 wndclass.hIconSm = (HICON)LoadImage(hInstance, 621 MAKEINTRESOURCE(IDI_NPICON), 622 IMAGE_ICON, 623 16, 624 16, 625 0); 626 627 if (!RegisterClassEx(&wndclass)) return FALSE; 628 629 /* Setup windows */ 630 631 monitor = MonitorFromRect(&Globals.main_rect, MONITOR_DEFAULTTOPRIMARY); 632 info.cbSize = sizeof(info); 633 GetMonitorInfoW(monitor, &info); 634 635 x = Globals.main_rect.left; 636 y = Globals.main_rect.top; 637 if (Globals.main_rect.left >= info.rcWork.right || 638 Globals.main_rect.top >= info.rcWork.bottom || 639 Globals.main_rect.right < info.rcWork.left || 640 Globals.main_rect.bottom < info.rcWork.top) 641 x = y = CW_USEDEFAULT; 642 643 Globals.hMainWnd = CreateWindow(className, 644 winName, 645 WS_OVERLAPPEDWINDOW, 646 x, 647 y, 648 Globals.main_rect.right - Globals.main_rect.left, 649 Globals.main_rect.bottom - Globals.main_rect.top, 650 NULL, 651 NULL, 652 Globals.hInstance, 653 NULL); 654 if (!Globals.hMainWnd) 655 { 656 ShowLastError(); 657 ExitProcess(1); 658 } 659 660 DoCreateEditWindow(); 661 662 NOTEPAD_InitData(); 663 DIALOG_FileNew(); 664 665 ShowWindow(Globals.hMainWnd, show); 666 UpdateWindow(Globals.hMainWnd); 667 DragAcceptFiles(Globals.hMainWnd, TRUE); 668 669 DIALOG_ViewStatusBar(); 670 671 if (!HandleCommandLine(cmdline)) 672 { 673 return 0; 674 } 675 676 hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCEL)); 677 678 while (GetMessage(&msg, 0, 0, 0)) 679 { 680 if (!IsDialogMessage(Globals.hFindReplaceDlg, &msg) && 681 !TranslateAccelerator(Globals.hMainWnd, hAccel, &msg)) 682 { 683 TranslateMessage(&msg); 684 DispatchMessage(&msg); 685 } 686 } 687 return (int) msg.wParam; 688 } 689