Added a status bar to track line and column number Added a goto line dialog
-- v3: notepad: Added goto dialog function notepad: Added status bar to track line number and column
From: Jacob Czekalla jacobczekalla@gmail.com
--- programs/notepad/dialog.c | 1 + programs/notepad/main.c | 98 +++++++++++++++++++++++++++++++++- programs/notepad/main.h | 5 ++ programs/notepad/notepad.rc | 4 ++ programs/notepad/notepad_res.h | 1 + 5 files changed, 107 insertions(+), 2 deletions(-)
diff --git a/programs/notepad/dialog.c b/programs/notepad/dialog.c index 94301b82bd3..c594fe0b79b 100644 --- a/programs/notepad/dialog.c +++ b/programs/notepad/dialog.c @@ -1107,6 +1107,7 @@ VOID DIALOG_EditWrap(VOID) Globals.bWrapLongLines = !Globals.bWrapLongLines; CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); + SendMessageW(Globals.hMainWnd,WM_SIZE,0,MAKELPARAM(rc.right,rc.bottom)); }
VOID DIALOG_SelectFont(VOID) diff --git a/programs/notepad/main.c b/programs/notepad/main.c index b1cdad8156d..838fc6faaaf 100644 --- a/programs/notepad/main.c +++ b/programs/notepad/main.c @@ -63,6 +63,7 @@ static const WCHAR value_iMarginLeft[] = {'i','M','a','r','g','i','n','L',' static const WCHAR value_iMarginRight[] = {'i','M','a','r','g','i','n','R','i','g','h','t','\0'}; static const WCHAR value_szHeader[] = {'s','z','H','e','a','d','e','r','\0'}; static const WCHAR value_szFooter[] = {'s','z','T','r','a','i','l','e','r','\0'}; +static const WCHAR value_bStatusBar[] = {'b','S','t','a','t','u','s','B','a','r','\0'};
/*********************************************************************** * @@ -107,6 +108,41 @@ DWORD get_dpi(void) return dpi; }
+VOID ToggleStatusBar(VOID) +{ + RECT rc; + + Globals.bStatusBar = !Globals.bStatusBar; + CheckMenuItem(GetMenu(Globals.hMainWnd),CMD_SBAR, + MF_BYCOMMAND | (Globals.bStatusBar ? MF_CHECKED : MF_UNCHECKED)); + GetClientRect(Globals.hMainWnd, &rc); + ShowWindow(Globals.hStatusBar,Globals.bStatusBar); + SendMessageW(Globals.hMainWnd,WM_SIZE,0,MAKELPARAM(rc.right,rc.bottom)); +} + +VOID UpdateStatusBar(VOID) +{ + int currentLine; + int currentCol = -1; + wchar_t statusTxt[25]; + int lineIndex; + DWORD selStart; + DWORD selEnd; + + SendMessageW(Globals.hEdit,EM_GETSEL , (WPARAM)&selStart,(LPARAM)&selEnd); + if(selStart == selEnd) + Globals.trackedSel = selStart; + if(selStart < Globals.trackedSel) + currentCol = selStart; + else + currentCol = selEnd; + currentLine = SendMessageW(Globals.hEdit,EM_LINEFROMCHAR,currentCol,0); + lineIndex = SendMessageW(Globals.hEdit,EM_LINEINDEX, currentLine,0); + + swprintf(statusTxt,25,L"Ln %ld, Col %ld",currentLine+1,(currentCol+1) - lineIndex); + SendMessageW(Globals.hStatusBar,SB_SETTEXTW, 0, (LPARAM)statusTxt); +} + /*********************************************************************** * * NOTEPAD_SaveSettingToRegistry @@ -149,6 +185,7 @@ static VOID NOTEPAD_SaveSettingToRegistry(void) SET_NOTEPAD_REG(hkey, value_iMarginBottom, Globals.iMarginBottom); SET_NOTEPAD_REG(hkey, value_iMarginLeft, Globals.iMarginLeft); SET_NOTEPAD_REG(hkey, value_iMarginRight, Globals.iMarginRight); + SET_NOTEPAD_REG(hkey, value_bStatusBar, Globals.bStatusBar); #undef SET_NOTEPAD_REG
/* Store the current value as 10 * twips */ @@ -192,6 +229,7 @@ static VOID NOTEPAD_LoadSettingFromRegistry(void) Globals.iMarginBottom = 2500; Globals.iMarginLeft = 2000; Globals.iMarginRight = 2000; + Globals.bStatusBar = TRUE;
Globals.lfFont.lfHeight = -12; Globals.lfFont.lfWidth = 0; @@ -240,6 +278,7 @@ static VOID NOTEPAD_LoadSettingFromRegistry(void) QUERY_NOTEPAD_REG(hkey, value_iMarginBottom, Globals.iMarginBottom); QUERY_NOTEPAD_REG(hkey, value_iMarginLeft, Globals.iMarginLeft); QUERY_NOTEPAD_REG(hkey, value_iMarginRight, Globals.iMarginRight); + QUERY_NOTEPAD_REG(hkey, value_bStatusBar, Globals.bStatusBar); #undef QUERY_NOTEPAD_REG
main_rect.right = main_rect.left + dx; @@ -302,6 +341,7 @@ static int NOTEPAD_MenuCommand(WPARAM wParam)
case CMD_WRAP: DIALOG_EditWrap(); break; case CMD_FONT: DIALOG_SelectFont(); break; + case CMD_SBAR: ToggleStatusBar(); break;
case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; case CMD_HELP_ABOUT_NOTEPAD: DIALOG_HelpAboutNotepad(); break; @@ -335,6 +375,9 @@ static VOID NOTEPAD_InitData(VOID)
CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP, MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(GetMenu(Globals.hMainWnd),CMD_SBAR, + MF_BYCOMMAND | (Globals.bStatusBar ? MF_CHECKED : MF_UNCHECKED)); + ShowWindow(Globals.hStatusBar,Globals.bStatusBar); }
/*********************************************************************** @@ -492,6 +535,39 @@ static void NOTEPAD_DoReplaceAll(FINDREPLACEW *fr) } }
+LRESULT CALLBACK EDIT_CallBackProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_KEYDOWN: + UpdateStatusBar(); + break; + case WM_KEYUP: + UpdateStatusBar(); + break; + case WM_MBUTTONDOWN: + UpdateStatusBar(); + break; + case WM_MBUTTONUP: + UpdateStatusBar(); + break; + case WM_LBUTTONDOWN: + UpdateStatusBar(); + break; + case WM_LBUTTONUP: + UpdateStatusBar(); + break; + case WM_MOUSEMOVE: + if(wParam == MK_LBUTTON) + UpdateStatusBar(); + break; + + default: + break; + } + return DefSubclassProc(hWnd, msg, wParam, lParam);; +} + /*********************************************************************** * * NOTEPAD_WndProc @@ -538,10 +614,15 @@ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, Globals.hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, editW, NULL, dwStyle, 0, 0, rc.right, rc.bottom, hWnd, NULL, Globals.hInstance, NULL); - + SetWindowSubclass(Globals.hEdit, (SUBCLASSPROC)&EDIT_CallBackProc, 0, 0); Globals.hFont = CreateFontIndirectW(&Globals.lfFont); SendMessageW(Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, FALSE); SendMessageW(Globals.hEdit, EM_LIMITTEXT, 0, 0); + + Globals.hStatusBar = CreateWindowExW(0, STATUSCLASSNAMEW,NULL, + WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, NULL, + Globals.hInstance, NULL); + UpdateStatusBar(); break; }
@@ -572,9 +653,22 @@ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, break;
case WM_SIZE: - SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), + { + int StatusBarHeight = 0; + + if(Globals.bStatusBar) + { + RECT SBarRect; + + SendMessageW(Globals.hStatusBar,WM_SIZE, 0, 0); + GetWindowRect(Globals.hStatusBar, &SBarRect); + StatusBarHeight = (SBarRect.bottom-SBarRect.top); + } + + SetWindowPos(Globals.hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam) - StatusBarHeight, SWP_NOOWNERZORDER | SWP_NOZORDER); break; + }
case WM_SETFOCUS: SetFocus(Globals.hEdit); diff --git a/programs/notepad/main.h b/programs/notepad/main.h index e0efef0c080..5af513d7d92 100644 --- a/programs/notepad/main.h +++ b/programs/notepad/main.h @@ -43,6 +43,9 @@ typedef struct HWND hFindReplaceDlg; HWND hEdit; HFONT hFont; /* Font used by the edit control */ + HWND hStatusBar; + INT bStatusBar; + WNDPROC lpEditWndProc; LOGFONTW lfFont; BOOL bWrapLongLines; WCHAR szFindText[MAX_PATH]; @@ -59,6 +62,7 @@ typedef struct INT iMarginRight; WCHAR szHeader[MAX_PATH]; WCHAR szFooter[MAX_PATH]; + INT trackedSel;
FINDREPLACEW find; FINDREPLACEW lastFind; @@ -71,3 +75,4 @@ extern NOTEPAD_GLOBALS Globals; VOID SetFileNameAndEncoding(LPCWSTR szFileName, ENCODING enc); void NOTEPAD_DoFind(FINDREPLACEW *fr); DWORD get_dpi(void); +VOID UpdateStatusBar(void); diff --git a/programs/notepad/notepad.rc b/programs/notepad/notepad.rc index 6fc12dcf5cd..f29370389ad 100644 --- a/programs/notepad/notepad.rc +++ b/programs/notepad/notepad.rc @@ -56,6 +56,10 @@ POPUP "&Search" { MENUITEM "&Search next\tF3", CMD_SEARCH_NEXT MENUITEM "&Replace...\tCtrl+H", CMD_REPLACE } +POPUP "&View" +{ + MENUITEM "&Status Bar", CMD_SBAR + } POPUP "&Help" { MENUITEM "&Contents\tF1", CMD_HELP_CONTENTS MENUITEM "&About Notepad", CMD_HELP_ABOUT_NOTEPAD diff --git a/programs/notepad/notepad_res.h b/programs/notepad/notepad_res.h index 4fed2f8a3cf..bd994d9eede 100644 --- a/programs/notepad/notepad_res.h +++ b/programs/notepad/notepad_res.h @@ -52,6 +52,7 @@
#define CMD_WRAP 0x119 #define CMD_FONT 0x140 +#define CMD_SBAR 0x205
#define CMD_HELP_CONTENTS 0x130 #define CMD_HELP_ABOUT_NOTEPAD 0x134
From: Jacob Czekalla jacobczekalla@gmail.com
--- programs/notepad/dialog.c | 49 ++++++++++++++++++++++++++++++++++ programs/notepad/dialog.h | 1 + programs/notepad/main.c | 1 + programs/notepad/notepad.rc | 14 ++++++++++ programs/notepad/notepad_res.h | 3 +++ 5 files changed, 68 insertions(+)
diff --git a/programs/notepad/dialog.c b/programs/notepad/dialog.c index c594fe0b79b..9cbdc1398c3 100644 --- a/programs/notepad/dialog.c +++ b/programs/notepad/dialog.c @@ -39,6 +39,7 @@ static const WCHAR helpfileW[] = { 'n','o','t','e','p','a','d','.','h','l','p',0 };
static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); +static INT_PTR WINAPI DIALOG_GOTO_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
/* Swap bytes of WCHAR buffer (big-endian <-> little-endian). */ static inline void byteswap_wide_string(LPWSTR str, UINT num) @@ -1276,3 +1277,51 @@ static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wPara
return FALSE; } + +VOID DIALOG_EditGoTo(VOID) +{ + DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(DIALOG_GOTO), + Globals.hMainWnd, DIALOG_GOTO_DlgProc); +} + +static INT_PTR WINAPI DIALOG_GOTO_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_COMMAND: + { + switch (wParam) + { + case IDOK: + { + int lineValue = GetDlgItemInt(hDlg, IDC_GOTO_LINEVALUE, NULL, FALSE)-1; + long lineIndex = SendMessageW(Globals.hEdit,EM_LINEINDEX,lineValue,0); + + SendMessageW(Globals.hEdit,EM_SETSEL,lineIndex,lineIndex); + UpdateStatusBar(); + EndDialog(hDlg, IDOK); + return TRUE; + } + case IDCANCEL: + { + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + default: + { + break; + } + + } + break; + } + case WM_INITDIALOG: + { + int currentLine = SendMessageW(Globals.hEdit,EM_LINEFROMCHAR,-1,0) + 1; + SetDlgItemInt(hDlg, IDC_GOTO_LINEVALUE, currentLine,FALSE); + break; + } + + } + return FALSE; +} diff --git a/programs/notepad/dialog.h b/programs/notepad/dialog.h index ae41ac2762a..ec495d87893 100644 --- a/programs/notepad/dialog.h +++ b/programs/notepad/dialog.h @@ -35,6 +35,7 @@ VOID DIALOG_EditDelete(VOID); VOID DIALOG_EditSelectAll(VOID); VOID DIALOG_EditTimeDate(VOID); VOID DIALOG_EditWrap(VOID); +VOID DIALOG_EditGoTo(VOID);
VOID DIALOG_Search(VOID); VOID DIALOG_SearchNext(VOID); diff --git a/programs/notepad/main.c b/programs/notepad/main.c index 838fc6faaaf..030989564fa 100644 --- a/programs/notepad/main.c +++ b/programs/notepad/main.c @@ -338,6 +338,7 @@ static int NOTEPAD_MenuCommand(WPARAM wParam) case CMD_SEARCH: DIALOG_Search(); break; case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; case CMD_REPLACE: DIALOG_Replace(); break; + case CMD_GO_TO: DIALOG_EditGoTo(); break;
case CMD_WRAP: DIALOG_EditWrap(); break; case CMD_FONT: DIALOG_SelectFont(); break; diff --git a/programs/notepad/notepad.rc b/programs/notepad/notepad.rc index f29370389ad..02397ec830e 100644 --- a/programs/notepad/notepad.rc +++ b/programs/notepad/notepad.rc @@ -50,6 +50,7 @@ POPUP "&Edit" { MENUITEM SEPARATOR MENUITEM "&Wrap long lines", CMD_WRAP MENUITEM "&Font...", CMD_FONT + MENUITEM "&Go To...\tCtrl+G", CMD_GO_TO } POPUP "&Search" { MENUITEM "&Search...\tCtrl+F", CMD_SEARCH @@ -122,6 +123,18 @@ PUSHBUTTON "Cancel", IDCANCEL, 195, 21, 40, 15, WS_TABSTOP PUSHBUTTON "&Help", IDHELP, 195, 39, 40, 15, WS_TABSTOP }
+DIALOG_GOTO DIALOG 0, 0, 130, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Go To Line" +{ +LTEXT "&Line Number:", 0x140, 10, 07, 68, 12 +EDITTEXT IDC_GOTO_LINEVALUE, 10, 19, 110,12, WS_BORDER | WS_TABSTOP | ES_NUMBER + +DEFPUSHBUTTON "Go To", IDOK, 35, 35, 40, 15, WS_TABSTOP +PUSHBUTTON "Cancel", IDCANCEL, 80, 35, 40, 15, WS_TABSTOP +} + IDD_OFN_TEMPLATE DIALOG 50,50,300,15 STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER FONT 8, "MS Shell Dlg" @@ -143,6 +156,7 @@ ID_ACCEL ACCELERATORS "#msgctxt#accelerator Paste#V", CMD_PASTE, VIRTKEY, CONTROL "#msgctxt#accelerator Cut#X", CMD_CUT, VIRTKEY, CONTROL "#msgctxt#accelerator Undo#Z", CMD_UNDO, VIRTKEY, CONTROL + "#msgctxt#accelerator GoTo#G", CMD_GO_TO, VIRTKEY, CONTROL VK_BACK, CMD_UNDO, VIRTKEY, ALT VK_F1, CMD_HELP_CONTENTS, VIRTKEY VK_F3, CMD_SEARCH_NEXT, VIRTKEY diff --git a/programs/notepad/notepad_res.h b/programs/notepad/notepad_res.h index bd994d9eede..38b95472948 100644 --- a/programs/notepad/notepad_res.h +++ b/programs/notepad/notepad_res.h @@ -25,6 +25,7 @@ #define MAIN_MENU 0x201 #define DIALOG_PAGESETUP 0x202 #define ID_ACCEL 0x203 +#define DIALOG_GOTO 0x204
#define IDI_NOTEPAD 0x300
@@ -49,6 +50,7 @@ #define CMD_SEARCH 0x120 #define CMD_SEARCH_NEXT 0x121 #define CMD_REPLACE 0x122 +#define CMD_GO_TO 0x192
#define CMD_WRAP 0x119 #define CMD_FONT 0x140 @@ -64,6 +66,7 @@ #define IDC_PAGESETUP_RIGHTVALUE 0x14A #define IDC_PAGESETUP_TOPVALUE 0x14D #define IDC_PAGESETUP_BOTTOMVALUE 0x150 +#define IDC_GOTO_LINEVALUE 0x194
/* Strings */ #define STRING_PAGESETUP_HEADERVALUE 0x160
On Tue Sep 6 15:11:41 2022 +0000, Bernhard K��lbl wrote:
The commit messages aren't conforming to what we usually have, so those need a change.
They should be good now. Thanks.