Fix DELETE key not working in multi-editing for EOL

Ref: https://github.com/notepad-plus-plus/notepad-plus-plus/pull/14338#issuecomment-1813006657

Close #14359
pull/14360/head
Don Ho 2023-11-16 15:30:23 +01:00
parent 3e7425f6b1
commit c517985beb
1 changed files with 53 additions and 25 deletions

View File

@ -511,7 +511,58 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa
case WM_KEYDOWN: case WM_KEYDOWN:
{ {
if ((execute(SCI_GETSELECTIONMODE) == SC_SEL_RECTANGLE) || (execute(SCI_GETSELECTIONMODE) == SC_SEL_THIN)) SHORT ctrl = GetKeyState(VK_CONTROL);
SHORT alt = GetKeyState(VK_MENU);
SHORT shift = GetKeyState(VK_SHIFT);
bool isColumnSelection = (execute(SCI_GETSELECTIONMODE) == SC_SEL_RECTANGLE) || (execute(SCI_GETSELECTIONMODE) == SC_SEL_THIN);
if (wParam == VK_DELETE)
{
// 1 shortcut:
// Shift + Delete: without selected text, it will delete the whole line.
//
if ((shift & 0x8000) && !(ctrl & 0x8000) && !(alt & 0x8000) && !hasSelection()) // Shift-DEL & no selection
{
execute(SCI_LINEDELETE);
return TRUE;
}
else if (!(shift & 0x8000) && !(ctrl & 0x8000) && !(alt & 0x8000)) // DEL & Multi-edit
{
size_t nbSelections = execute(SCI_GETSELECTIONS);
if (nbSelections > 1)
{
execute(SCI_BEGINUNDOACTION);
for (size_t i = 0; i < nbSelections; ++i)
{
LRESULT posStart = execute(SCI_GETSELECTIONNSTART, i);
LRESULT posEnd = execute(SCI_GETSELECTIONNEND, i);
if (posStart != posEnd)
{
replaceTarget(L"", posStart, posEnd);
}
else // posStart == posEnd)
{
char eolStr[3];
Sci_TextRange tr;
tr.chrg.cpMin = posStart;
tr.chrg.cpMax = posEnd + 2;
tr.lpstrText = eolStr;
execute(SCI_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr));
int len = (eolStr[0] == '\r' && eolStr[1] == '\n') ? 2 : 1;
replaceTarget(L"", posStart, posEnd + len);
}
execute(SCI_SETSELECTIONNSTART, i, posStart);
execute(SCI_SETSELECTIONNEND, i, posStart);
}
execute(SCI_ENDUNDOACTION);
return TRUE;
}
}
}
else if (isColumnSelection)
{ {
// //
// Transform the column selection to multi-edit // Transform the column selection to multi-edit
@ -541,35 +592,15 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa
else else
{ {
// //
// Add 3 shortcuts: // 2 shortcuts:
// Shift + Delete: without selected text, it will delete the whole line.
// Ctrl + C: without selected text, it will copy the whole line. // Ctrl + C: without selected text, it will copy the whole line.
// Ctrl + X: without selected text, it will cut the whole line. // Ctrl + X: without selected text, it will cut the whole line.
// //
switch (wParam) switch (wParam)
{ {
case VK_DELETE:
{
SHORT ctrl = GetKeyState(VK_CONTROL);
SHORT alt = GetKeyState(VK_MENU);
SHORT shift = GetKeyState(VK_SHIFT);
if ((shift & 0x8000) && !(ctrl & 0x8000) && !(alt & 0x8000)) // Shift-DEL
{
if (!hasSelection())
{
execute(SCI_LINEDELETE);
return TRUE;
}
}
}
break;
case 'C': case 'C':
case 'X': case 'X':
{ {
SHORT ctrl = GetKeyState(VK_CONTROL);
SHORT alt = GetKeyState(VK_MENU);
SHORT shift = GetKeyState(VK_SHIFT);
if ((ctrl & 0x8000) && !(alt & 0x8000) && !(shift & 0x8000)) if ((ctrl & 0x8000) && !(alt & 0x8000) && !(shift & 0x8000))
{ {
if (!hasSelection()) if (!hasSelection())
@ -584,9 +615,6 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa
case 'V': case 'V':
{ {
SHORT ctrl = GetKeyState(VK_CONTROL);
SHORT alt = GetKeyState(VK_MENU);
SHORT shift = GetKeyState(VK_SHIFT);
if ((ctrl & 0x8000) && !(alt & 0x8000) && !(shift & 0x8000)) if ((ctrl & 0x8000) && !(alt & 0x8000) && !(shift & 0x8000))
{ {
Buffer* buf = getCurrentBuffer(); Buffer* buf = getCurrentBuffer();