You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.4 KiB
211 lines
5.4 KiB
//// TEXTEDIT.C
|
|
//
|
|
//
|
|
|
|
|
|
#include "precomp.hxx"
|
|
#include "global.h"
|
|
|
|
|
|
|
|
|
|
|
|
BOOL EditKeyDown(WCHAR wc) {
|
|
|
|
switch(wc) {
|
|
|
|
case VK_LEFT:
|
|
if (g_iCurChar) {
|
|
g_iCurChar--;
|
|
if ( g_iCurChar
|
|
&& g_wcBuf[g_iCurChar] == 0x000A
|
|
&& g_wcBuf[g_iCurChar-1] == 0x000D) {
|
|
g_iCurChar--;
|
|
}
|
|
|
|
// If shift is down, extend selection, else clear it
|
|
if (GetKeyState(VK_SHIFT) >= 0) {
|
|
g_iFrom = g_iCurChar;
|
|
}
|
|
g_iTo = g_iCurChar;
|
|
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
}
|
|
break;
|
|
|
|
|
|
case VK_RIGHT:
|
|
if (g_iCurChar < g_iTextLen) {
|
|
if ( g_iCurChar < g_iTextLen-1
|
|
&& g_wcBuf[g_iCurChar] == 0x000D
|
|
&& g_wcBuf[g_iCurChar+1] == 0x000A) {
|
|
g_iCurChar+= 2;
|
|
} else {
|
|
g_iCurChar++;
|
|
}
|
|
|
|
// If shift is down, extend selection, else clear it
|
|
if (GetKeyState(VK_SHIFT) >= 0) {
|
|
g_iFrom = g_iCurChar;
|
|
}
|
|
g_iTo = g_iCurChar;
|
|
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
}
|
|
break;
|
|
|
|
|
|
case VK_HOME:
|
|
// Implemented as - go to start of text
|
|
g_iCurChar = 0;
|
|
g_iFrom = 0;
|
|
g_iTo = 0;
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
break;
|
|
|
|
|
|
case VK_END:
|
|
// Implemented as - go to end of text
|
|
g_iCurChar = g_iTextLen;
|
|
g_iFrom = g_iTextLen;
|
|
g_iTo = g_iTextLen;
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
break;
|
|
|
|
case VK_INSERT:
|
|
if (g_RangeCount < MAX_RANGE_COUNT)
|
|
{
|
|
g_Ranges[g_RangeCount].First = g_iFrom;
|
|
g_Ranges[g_RangeCount].Length = g_iTo - g_iFrom;
|
|
g_RangeCount++;
|
|
}
|
|
InvalidateText();
|
|
break;
|
|
|
|
case VK_DELETE:
|
|
if (GetKeyState(VK_LSHIFT) & 0x8000)
|
|
{
|
|
g_RangeCount = 0;
|
|
}
|
|
else
|
|
{
|
|
if (g_iFrom != g_iTo) {
|
|
|
|
// Delete selection
|
|
|
|
if (g_iFrom < g_iTo) {
|
|
TextDelete(g_iFrom, g_iTo-g_iFrom);
|
|
g_iTo = g_iFrom;
|
|
g_iCurChar = g_iFrom;
|
|
} else {
|
|
TextDelete(g_iTo, g_iFrom-g_iTo);
|
|
g_iTo = g_iTo;
|
|
g_iCurChar = g_iTo;
|
|
}
|
|
|
|
} else {
|
|
|
|
// Delete character
|
|
|
|
if (g_iCurChar < g_iTextLen) {
|
|
if ( g_iCurChar < g_iTextLen-1
|
|
&& g_wcBuf[g_iCurChar] == 0x000D
|
|
&& g_wcBuf[g_iCurChar+1] == 0x000A) {
|
|
TextDelete(g_iCurChar, 2);
|
|
} else {
|
|
TextDelete(g_iCurChar, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL EditChar(WCHAR wc) {
|
|
|
|
switch(wc) {
|
|
|
|
case VK_RETURN:
|
|
if (!TextInsert(g_iCurChar, L"\r\n", 2))
|
|
return FALSE;
|
|
InvalidateText();
|
|
g_iCurChar+=2;
|
|
break;
|
|
|
|
|
|
case VK_BACK:
|
|
if (g_iCurChar) {
|
|
g_iCurChar--;
|
|
if ( g_iCurChar
|
|
&& g_wcBuf[g_iCurChar] == 0x000A
|
|
&& g_wcBuf[g_iCurChar-1] == 0x000D) {
|
|
g_iCurChar--;
|
|
TextDelete(g_iCurChar, 2);
|
|
} else {
|
|
TextDelete(g_iCurChar, 1);
|
|
}
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
}
|
|
break;
|
|
|
|
|
|
case 1: // Ctrl/A - select all
|
|
g_iFrom = 0;
|
|
g_iTo = g_iTextLen;
|
|
InvalidateText();
|
|
break;
|
|
|
|
|
|
default:
|
|
/*
|
|
if(!((wc >= 0x0900 && wc < 0x0d80)
|
|
|| wc == 0x200c
|
|
|| wc == 0x200d)){
|
|
TranslateCharToUnicode(&wc);
|
|
}
|
|
*/
|
|
|
|
if (!TextInsert(g_iCurChar, &wc, 1)) {
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// If there was a range marked previously, now delete that range
|
|
|
|
if (g_iFrom < g_iTo) {
|
|
TextDelete(g_iFrom, g_iTo-g_iFrom);
|
|
g_iTo = g_iFrom;
|
|
g_iCurChar = g_iFrom+1;
|
|
} else if (g_iTo < g_iFrom) {
|
|
TextDelete(g_iTo, g_iFrom-g_iTo);
|
|
g_iFrom = g_iTo;
|
|
g_iCurChar = g_iTo+1;
|
|
} else {
|
|
// No prior selected text
|
|
g_iCurChar++;
|
|
|
|
}
|
|
|
|
InvalidateText();
|
|
g_fUpdateCaret = TRUE;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|