Notepad enhancements
1. Implemented "Goto line"
2. Partially implemented Replace (dialog comes up, need to have it
actually do the replace )
Modified: trunk/reactos/subsys/system/notepad/En.rc
Modified: trunk/reactos/subsys/system/notepad/dialog.c
Modified: trunk/reactos/subsys/system/notepad/dialog.h
Modified: trunk/reactos/subsys/system/notepad/main.c
Modified: trunk/reactos/subsys/system/notepad/main.h
Modified: trunk/reactos/subsys/system/notepad/notepad_res.h
_____
Modified: trunk/reactos/subsys/system/notepad/En.rc
--- trunk/reactos/subsys/system/notepad/En.rc 2005-09-26 22:57:48 UTC
(rev 18113)
+++ trunk/reactos/subsys/system/notepad/En.rc 2005-09-27 00:46:19 UTC
(rev 18114)
@@ -51,8 +51,10 @@
MENUITEM "&Font...", CMD_FONT
}
POPUP "&Search" {
- MENUITEM "&Search\tCtrl+F", CMD_SEARCH
- MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT
+ MENUITEM "&Find...\tCtrl+F", CMD_SEARCH
+ MENUITEM "Find &next\tF3", CMD_SEARCH_NEXT
+ MENUITEM "Replace\tCtrl+H", CMD_REPLACE
+ MENUITEM "Go To...\tCtrl+G", CMD_GOTO
}
POPUP "&Help" {
MENUITEM "&Contents", CMD_HELP_CONTENTS
@@ -107,6 +109,18 @@
LTEXT "Endlines:",0x156,5,20,41,12
}
+/* Dialog 'Go To' */
+DIALOG_GOTO DIALOG 0,0,165,50
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Goto line"
+{
+EDITTEXT ID_LINENUMBER,54,10,106,12,WS_CHILD | WS_BORDER |
WS_TABSTOP
+LTEXT "Line number:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP |
ES_NUMBER
+DEFPUSHBUTTON "OK", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP
+PUSHBUTTON "Cancel", IDCANCEL, 120, 30, 40, 15, WS_CHILD |
WS_TABSTOP
+}
+
STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE, "&n" /* FIXME */
@@ -138,6 +152,7 @@
STRING_OUT_OF_MEMORY, "Not enough memory to complete
this \
task. \nClose one or more applications to increase the amount of \nfree
\
memory."
+STRING_CANNOTFIND "Cannot find '%s'"
STRING_ANSI, "ANSI"
STRING_UNICODE, "Unicode"
STRING_UNICODE_BE, "Unicode (big endian)"
_____
Modified: trunk/reactos/subsys/system/notepad/dialog.c
--- trunk/reactos/subsys/system/notepad/dialog.c 2005-09-26
22:57:48 UTC (rev 18113)
+++ trunk/reactos/subsys/system/notepad/dialog.c 2005-09-27
00:46:19 UTC (rev 18114)
@@ -21,11 +21,13 @@
*/
#define UNICODE
+#define _UNICODE
#include <assert.h>
#include <stdio.h>
#include <windows.h>
#include <commdlg.h>
+#include <tchar.h>
#include "main.h"
#include "license.h"
@@ -669,29 +671,115 @@
}
}
-VOID DIALOG_Search(VOID)
+typedef HWND (STDCALL *FINDPROC)(LPFINDREPLACE lpfr);
+
+static VOID DIALOG_SearchDialog(FINDPROC pfnProc)
{
- ZeroMemory(&Globals.find, sizeof(Globals.find));
- Globals.find.lStructSize = sizeof(Globals.find);
- Globals.find.hwndOwner = Globals.hMainWnd;
- Globals.find.hInstance = Globals.hInstance;
- Globals.find.lpstrFindWhat = Globals.szFindText;
- Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
- Globals.find.Flags = FR_DOWN;
+ ZeroMemory(&Globals.find, sizeof(Globals.find));
+ Globals.find.lStructSize = sizeof(Globals.find);
+ Globals.find.hwndOwner = Globals.hMainWnd;
+ Globals.find.hInstance = Globals.hInstance;
+ Globals.find.lpstrFindWhat = Globals.szFindText;
+ Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
+ Globals.find.lpstrReplaceWith = Globals.szReplaceText;
+ Globals.find.wReplaceWithLen = SIZEOF(Globals.szReplaceText);
+ Globals.find.Flags = FR_DOWN;
- /* We only need to create the modal FindReplace dialog which
will */
- /* notify us of incoming events using hMainWnd Window Messages
*/
+ /* We only need to create the modal FindReplace dialog which will
*/
+ /* notify us of incoming events using hMainWnd Window Messages
*/
- Globals.hFindReplaceDlg = FindText(&Globals.find);
- assert(Globals.hFindReplaceDlg !=0);
+ Globals.hFindReplaceDlg = pfnProc(&Globals.find);
+ assert(Globals.hFindReplaceDlg !=0);
}
+VOID DIALOG_Search(VOID)
+{
+ DIALOG_SearchDialog(FindText);
+}
+
VOID DIALOG_SearchNext(VOID)
{
/* FIXME: Search Next */
DIALOG_Search();
}
+VOID DIALOG_Replace(VOID)
+{
+ DIALOG_SearchDialog(ReplaceText);
+}
+
+static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT
uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL bResult = FALSE;
+ HWND hTextBox;
+ TCHAR szText[32];
+
+ switch(uMsg) {
+ case WM_INITDIALOG:
+ hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
+ _sntprintf(szText, sizeof(szText) / sizeof(szText[0]),
_T("%d"), lParam);
+ SetWindowText(hTextBox, szText);
+ break;
+ case WM_COMMAND:
+ if (HIWORD(wParam) == BN_CLICKED)
+ {
+ if (LOWORD(wParam) == IDOK)
+ {
+ hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
+ GetWindowText(hTextBox, szText, sizeof(szText) /
sizeof(szText[0]));
+ EndDialog(hwndDialog, _ttoi(szText));
+ bResult = TRUE;
+ }
+ else if (LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hwndDialog, 0);
+ bResult = TRUE;
+ }
+ }
+ break;
+ }
+
+ return bResult;
+}
+
+VOID DIALOG_GoTo(VOID)
+{
+ INT_PTR nLine;
+ LPTSTR pszText;
+ int nLength, i;
+ DWORD dwStart, dwEnd;
+
+ nLength = GetWindowTextLength(Globals.hEdit);
+ pszText = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (nLength + 1) *
sizeof(*pszText));
+ if (!pszText)
+ return;
+
+ /* Retrieve current text */
+ GetWindowText(Globals.hEdit, pszText, nLength + 1);
+ SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM) &dwStart, (LPARAM)
&dwEnd);
+
+ nLine = 1;
+ for (i = 0; pszText[i] && (i < dwStart); i++)
+ {
+ if (pszText[i] == '\n')
+ nLine++;
+ }
+
+ nLine = DialogBoxParam(Globals.hInstance,
MAKEINTRESOURCE(DIALOG_GOTO),
+ Globals.hMainWnd, DIALOG_GoTo_DialogProc, nLine);
+
+ if (nLine >= 1)
+ {
+ for (i = 0; pszText[i] && (nLine > 1) && (i < dwStart -
1);
i++)
+ {
+ if (pszText[i] == '\n')
+ nLine--;
+ }
+ SendMessage(Globals.hEdit, EM_SETSEL, i, i);
+ }
+ HeapFree(GetProcessHeap(), 0, pszText);
+}
+
VOID DIALOG_HelpContents(VOID)
{
WinHelp(Globals.hMainWnd, helpfileW, HELP_INDEX, 0);
_____
Modified: trunk/reactos/subsys/system/notepad/dialog.h
--- trunk/reactos/subsys/system/notepad/dialog.h 2005-09-26
22:57:48 UTC (rev 18113)
+++ trunk/reactos/subsys/system/notepad/dialog.h 2005-09-27
00:46:19 UTC (rev 18114)
@@ -38,6 +38,8 @@
VOID DIALOG_Search(VOID);
VOID DIALOG_SearchNext(VOID);
+VOID DIALOG_Replace(VOID);
+VOID DIALOG_GoTo(VOID);
VOID DIALOG_SelectFont(VOID);
_____
Modified: trunk/reactos/subsys/system/notepad/main.c
--- trunk/reactos/subsys/system/notepad/main.c 2005-09-26 22:57:48 UTC
(rev 18113)
+++ trunk/reactos/subsys/system/notepad/main.c 2005-09-27 00:46:19 UTC
(rev 18114)
@@ -78,6 +78,8 @@
case CMD_SEARCH: DIALOG_Search(); break;
case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break;
+ case CMD_REPLACE: DIALOG_Replace(); break;
+ case CMD_GOTO: DIALOG_GoTo(); break;
case CMD_WRAP: DIALOG_EditWrap(); break;
case CMD_FONT: DIALOG_SelectFont(); break;
@@ -106,6 +108,7 @@
LPTSTR pszText = NULL;
DWORD dwPosition, dwDummy;
BOOL bMatches = FALSE;
+ TCHAR szResource[128], szText[128];
iTargetLength = _tcslen(pFindReplace->lpstrFindWhat);
@@ -149,9 +152,18 @@
if (bMatches)
{
+ /* Found target */
SendMessage(Globals.hEdit, EM_SETSEL, dwPosition, dwPosition +
iTargetLength);
SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0);
}
+ else
+ {
+ /* Can't find target */
+ LoadString(Globals.hInstance, STRING_CANNOTFIND, szResource,
SIZEOF(szResource));
+ _sntprintf(szText, SIZEOF(szText), szResource,
pFindReplace->lpstrFindWhat);
+ LoadString(Globals.hInstance, STRING_NOTEPAD, szResource,
SIZEOF(szResource));
+ MessageBox(Globals.hEdit, szText, szResource, MB_OK);
+ }
if (pszText)
HeapFree(GetProcessHeap(), 0, pszText);
_____
Modified: trunk/reactos/subsys/system/notepad/main.h
--- trunk/reactos/subsys/system/notepad/main.h 2005-09-26 22:57:48 UTC
(rev 18113)
+++ trunk/reactos/subsys/system/notepad/main.h 2005-09-27 00:46:19 UTC
(rev 18114)
@@ -49,6 +49,7 @@
LOGFONT lfFont;
BOOL bWrapLongLines;
WCHAR szFindText[MAX_PATH];
+ WCHAR szReplaceText[MAX_PATH];
WCHAR szFileName[MAX_PATH];
WCHAR szFileTitle[MAX_PATH];
WCHAR szFilter[2 * MAX_STRING_LEN + 100];
_____
Modified: trunk/reactos/subsys/system/notepad/notepad_res.h
--- trunk/reactos/subsys/system/notepad/notepad_res.h 2005-09-26
22:57:48 UTC (rev 18113)
+++ trunk/reactos/subsys/system/notepad/notepad_res.h 2005-09-27
00:46:19 UTC (rev 18114)
@@ -25,6 +25,8 @@
#define DIALOG_ENCODING 0x204
#define ID_ENCODING 0x205
#define ID_EOLN 0x206
+#define DIALOG_GOTO 0x207
+#define ID_LINENUMBER 0x208
/* Commands */
#define CMD_NEW 0x100
@@ -46,6 +48,8 @@
#define CMD_SEARCH 0x120
#define CMD_SEARCH_NEXT 0x121
+#define CMD_REPLACE 0x122
+#define CMD_GOTO 0x123
#define CMD_WRAP 0x119
#define CMD_FONT 0x140
@@ -79,12 +83,13 @@
#define STRING_NOTFOUND 0x17B
#define STRING_OUT_OF_MEMORY 0x17C
+#define STRING_CANNOTFIND 0x17D
-#define STRING_ANSI 0x17D
-#define STRING_UNICODE 0x17E
-#define STRING_UNICODE_BE 0x17F
-#define STRING_UTF8 0x180
+#define STRING_ANSI 0x17E
+#define STRING_UNICODE 0x17F
+#define STRING_UNICODE_BE 0x180
+#define STRING_UTF8 0x181
-#define STRING_CRLF 0x181
-#define STRING_LF 0x182
-#define STRING_CR 0x183
+#define STRING_CRLF 0x182
+#define STRING_LF 0x183
+#define STRING_CR 0x184