# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1609689780 0 # Node ID 4d2619f31ebd1fcfec2fa676fcc267cf58c26b9d # Parent 7575eefcf88148c56dec260d2f0343a22857e0dc Win: Subclass richtext controls and port the OS/2 MLE context menu code to it. OS/2: Add missing Delete menu item from the MLE context menu. Reorder the menu and disable menu items instead of removing them from the menu completely. This is consistent with how these menus behave on Windows, and has the benefit of the menu items always being in the same place. ENTRY_DELETE handlers may need to be added to the special Unicode edit handler functions. The OS/2 code has not been tested yet, follow up commits may be needed. Menu identifiers 60001 to 60999 are now reserved for internal DW use. diff -r 7575eefcf881 -r 4d2619f31ebd os2/dw.c --- a/os2/dw.c Sun Jan 03 04:02:47 2021 +0000 +++ b/os2/dw.c Sun Jan 03 16:03:00 2021 +0000 @@ -2240,11 +2240,12 @@ WinSetFocus(HWND_DESKTOP, handle); } -#define ENTRY_CUT 60901 -#define ENTRY_COPY 60902 -#define ENTRY_PASTE 60903 -#define ENTRY_UNDO 60904 -#define ENTRY_SALL 60905 +#define ENTRY_CUT 60901 +#define ENTRY_COPY 60902 +#define ENTRY_PASTE 60903 +#define ENTRY_DELETE 60904 +#define ENTRY_UNDO 60905 +#define ENTRY_SALL 60906 #ifdef UNICODE void _combine_text(HWND handle, USHORT pos1, char *text, char *pastetext) @@ -2392,18 +2393,18 @@ { HMENUI hwndMenu = dw_menu_new(0L); long x, y; - - if(strncmp(tmpbuf, "#10", 4)==0 && !WinSendMsg(hWnd, MLM_QUERYREADONLY, 0, 0)) - { - dw_menu_append_item(hwndMenu, "Undo", ENTRY_UNDO, 0L, TRUE, -1, 0L); - dw_menu_append_item(hwndMenu, "", 0L, 0L, TRUE, -1, 0L); - } + unsigned long style = 0L; + + if(strncmp(tmpbuf, "#10", 4)==0 && WinSendMsg(hWnd, MLM_QUERYREADONLY, 0, 0)) + style = DW_MIS_DISABLED; + dw_menu_append_item(hwndMenu, "Undo", ENTRY_UNDO, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "", 0L, 0L, TRUE, -1, 0L); + if(strncmp(tmpbuf, "#10", 4)!=0 && dw_window_get_data(hWnd, "_dw_disabled")) + style = DW_MIS_DISABLED; + dw_menu_append_item(hwndMenu, "Cut", ENTRY_CUT, style, TRUE, -1, 0L); dw_menu_append_item(hwndMenu, "Copy", ENTRY_COPY, 0L, TRUE, -1, 0L); - if((strncmp(tmpbuf, "#10", 4)!=0 && !dw_window_get_data(hWnd, "_dw_disabled")) || (strncmp(tmpbuf, "#10", 4)==0 && !WinSendMsg(hWnd, MLM_QUERYREADONLY, 0, 0))) - { - dw_menu_append_item(hwndMenu, "Cut", ENTRY_CUT, 0L, TRUE, -1, 0L); - dw_menu_append_item(hwndMenu, "Paste", ENTRY_PASTE, 0L, TRUE, -1, 0L); - } + dw_menu_append_item(hwndMenu, "Paste", ENTRY_PASTE, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Delete", ENTRY_DELETE, style, TRUE, -1, 0L); dw_menu_append_item(hwndMenu, "", 0L, 0L, TRUE, -1, 0L); dw_menu_append_item(hwndMenu, "Select All", ENTRY_SALL, 0L, TRUE, -1, 0L); @@ -2427,6 +2428,8 @@ return WinSendMsg(hWnd, MLM_COPY, 0, 0); case ENTRY_PASTE: return WinSendMsg(hWnd, MLM_PASTE, 0, 0); + case ENTRY_DELETE: + return WinSendMsg(hWnd, MLM_DELETE, 0, 0); case ENTRY_UNDO: return WinSendMsg(hWnd, MLM_UNDO, 0, 0); case ENTRY_SALL: @@ -6086,8 +6089,8 @@ if(tempid > 65500) tempid = 61000; } - /* Special internal case */ - else if(id > 60000 && check == -1) + /* Special internal case - 60001 to 60999 reserved for DW internal use */ + else if(id > 60000 && id < 61000 && check == -1) { check = 0; } diff -r 7575eefcf881 -r 4d2619f31ebd win/dw.c --- a/win/dw.c Sun Jan 03 04:02:47 2021 +0000 +++ b/win/dw.c Sun Jan 03 16:03:00 2021 +0000 @@ -3799,6 +3799,78 @@ return ret; } +#ifdef RICHEDIT +#define ENTRY_CUT 60901 +#define ENTRY_COPY 60902 +#define ENTRY_PASTE 60903 +#define ENTRY_DELETE 60904 +#define ENTRY_UNDO 60905 +#define ENTRY_SALL 60906 + + +/* Special WM_NOTIFY handler for Rich Edit controls, to implement the context menu. */ +LRESULT CALLBACK _richeditwndproc(HWND hWnd, UINT msg, WPARAM mp1, LPARAM mp2) +{ + switch(msg) + { + case WM_CONTEXTMENU: + { + HMENUI hwndMenu = dw_menu_new(0L); + long x, y; + unsigned long style = 0L; + + /* When readonly, disable: Undo, Cut, Paste, Delete */ + if(GetWindowLongPtr(hWnd, GWL_STYLE) & ES_READONLY) + style = DW_MIS_DISABLED; + + dw_menu_append_item(hwndMenu, "Undo", ENTRY_UNDO, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "", 0L, 0L, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Cut", ENTRY_CUT, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Copy", ENTRY_COPY, 0L, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Paste", ENTRY_PASTE, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Delete", ENTRY_DELETE, style, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "", 0L, 0L, TRUE, -1, 0L); + dw_menu_append_item(hwndMenu, "Select All", ENTRY_SALL, 0L, TRUE, -1, 0L); + + dw_pointer_query_pos(&x, &y); + dw_menu_popup(&hwndMenu, hWnd, x, y); + return TRUE; + } + break; + case WM_COMMAND: + { + if(HIWORD(mp1) == 0) + { + switch(LOWORD(mp1)) + { + case ENTRY_CUT: + SendMessage(hWnd, WM_CUT, 0, 0); + break; + case ENTRY_COPY: + SendMessage(hWnd, WM_COPY, 0, 0); + break; + case ENTRY_PASTE: + SendMessage(hWnd, WM_PASTE, 0, 0); + break; + case ENTRY_DELETE: + SendMessage(hWnd, WM_CLEAR, 0, 0); + break; + case ENTRY_UNDO: + SendMessage(hWnd, EM_UNDO, 0, 0); + break; + case ENTRY_SALL: + SendMessage(hWnd, EM_SETSEL, 0, (LPARAM)-1); + break; + } + } + } + break; + } + return _simplewndproc(hWnd, msg, mp1, mp2); +} +#endif + + LRESULT CALLBACK _treewndproc(HWND hWnd, UINT msg, WPARAM mp1, LPARAM mp2) { #ifdef AEROGLASS @@ -6427,6 +6499,11 @@ if(tempid > 65500) tempid = 61000; } + /* Special internal case - 60001 to 60999 reserved for DW internal use */ + else if(id > 60000 && id < 61000 && check == -1) + { + check = 0; + } /* Second pool is larger for more static windows */ else if(!id || id >= 30000) { @@ -6890,6 +6967,11 @@ return NULL; } +#ifdef RICHEDIT + if(hrichedit || hmsftedit) + cinfo->cinfo.pOldProc = SubclassWindow(tmp, _richeditwndproc); + else +#endif cinfo->cinfo.pOldProc = SubclassWindow(tmp, _simplewndproc); cinfo->cinfo.fore = cinfo->cinfo.back = -1; cinfo->odd = cinfo->even = DW_RGB_TRANSPARENT;