📄 editbox.c
字号:
case PGUP:
case PGDN:
if (isMultiLine(wnd))
BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
break;
case CTRL_PGUP:
case CTRL_PGDN:
BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
break;
case HOME:
Home(wnd);
break;
case END:
End(wnd);
break;
case CTRL_RARROW:
NextWord(wnd);
break;
case CTRL_LARROW:
case CTRL_BS:
PrevWord(wnd);
break;
case CTRL_HOME:
if (isMultiLine(wnd)) {
SendMessage(wnd, SCROLLDOC, TRUE, 0);
wnd->CurrLine = 0;
wnd->WndRow = 0;
}
Home(wnd);
break;
case CTRL_END:
if (isMultiLine(wnd) &&
wnd->WndRow+wnd->wtop+1 < wnd->wlines
&& wnd->wlines > 0) {
SendMessage(wnd, SCROLLDOC, FALSE, 0);
SetLinePointer(wnd, wnd->wlines-1);
wnd->WndRow=min(ClientHeight(wnd)-1, wnd->wlines-1);
Home(wnd);
}
End(wnd);
break;
case UP:
if (isMultiLine(wnd))
Upward(wnd);
break;
case DN:
if (isMultiLine(wnd))
Downward(wnd);
break;
case FWD:
Forward(wnd);
break;
case LARROW:
Backward(wnd);
break;
default:
return FALSE;
}
if (!KeyBoardMarking && TextBlockMarked(wnd)) {
ClearTextBlock(wnd);
SendMessage(wnd, PAINT, 0, 0);
}
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
return TRUE;
}
/* -------------- Del key ---------------- */
static void DelKey(WINDOW wnd)
{
char *currchar = CurrChar;
int repaint = *currchar == '\n';
if (TextBlockMarked(wnd)) {
SendMessage(wnd, COMMAND, ID_DELETETEXT, 0);
SendMessage(wnd, PAINT, 0, 0);
return;
}
if (isMultiLine(wnd) && *currchar == '\n' && *(currchar+1) == '\0')
return;
strcpy(currchar, currchar+1);
if (repaint) {
BuildTextPointers(wnd);
SendMessage(wnd, PAINT, 0, 0);
}
else {
ModTextPointers(wnd, wnd->CurrLine+1, -1);
WriteTextLine(wnd, NULL, wnd->WndRow+wnd->wtop, FALSE);
}
wnd->TextChanged = TRUE;
}
/* ------------ Tab key ------------ */
static void TabKey(WINDOW wnd, PARAM p2)
{
int insmd = wnd->InsertMode;
if (isMultiLine(wnd))
{
do
{
char *cc = CurrChar+1;
if (!insmd && *cc == '\0')
break;
if (wnd->textlen == wnd->MaxTextLength)
break;
SendMessage(wnd,KEYBOARD,insmd ? ' ' : FWD,0);
}
while (wnd->CurrCol % cfg.Tabs);
}
else
PostMessage(GetParent(wnd), KEYBOARD, '\t', p2);
}
/* ------------ Shift+Tab key ------------ */
static void ShiftTabKey(WINDOW wnd, PARAM p2)
{
if (isMultiLine(wnd)) {
do {
if (CurrChar == GetText(wnd))
break;
SendMessage(wnd,KEYBOARD,BS,0);
} while (wnd->CurrCol % cfg.Tabs);
}
else
PostMessage(GetParent(wnd), KEYBOARD, SHIFT_HT, p2);
}
/* --------- All displayable typed keys ------------- */
static void KeyTyped(WINDOW wnd, int c)
{
char *currchar = CurrChar;
if (cfg.read_only)
{
MessageBox("Edit", "You cannot modify a read only file");
wnd->TextChanged=FALSE;
return TRUE;
}
if ((c=='\0') || ((c & FKEY) != 0))
return;
if (!isMultiLine(wnd) && TextBlockMarked(wnd)) {
SendMessage(wnd, CLEARTEXT, 0, 0);
currchar = CurrChar;
}
/* ---- test typing at end of text ---- */
if (currchar == wnd->text+wnd->MaxTextLength) {
/* ---- typing at the end of maximum buffer ---- */
beep();
return;
}
if (*currchar == '\0') {
/* --- insert a newline at end of text --- */
*currchar = '\n';
*(currchar+1) = '\0';
BuildTextPointers(wnd);
}
/* --- displayable char or newline --- */
if (c == '\n' || wnd->InsertMode || *currchar == '\n') {
/* ------ inserting the keyed character ------ */
if (wnd->text[wnd->textlen-1] != '\0') {
/* --- the current text buffer is full --- */
if (wnd->textlen == wnd->MaxTextLength) {
/* --- text buffer is at maximum size --- */
beep();
return;
}
/* ---- increase the text buffer size ---- */
wnd->textlen += GROWLENGTH;
/* --- but not above maximum size --- */
if (wnd->textlen > wnd->MaxTextLength)
wnd->textlen = wnd->MaxTextLength;
wnd->text = DFrealloc(wnd->text, wnd->textlen+2);
wnd->text[wnd->textlen-1] = '\0';
currchar = CurrChar;
}
memmove(currchar+1, currchar, strlen(currchar)+1);
ModTextPointers(wnd, wnd->CurrLine+1, 1);
if (isMultiLine(wnd) && wnd->wlines > 1)
wnd->textwidth = max(wnd->textwidth, (int) (TextLine(wnd, wnd->CurrLine+1)-TextLine(wnd, wnd->CurrLine)));
else
wnd->textwidth = max(wnd->textwidth,strlen(wnd->text));
WriteTextLine(wnd, NULL, wnd->wtop+wnd->WndRow, FALSE);
}
/* ----- put the char in the buffer ----- */
*currchar = c;
wnd->TextChanged = TRUE;
if (c == '\n') {
wnd->wleft = 0;
BuildTextPointers(wnd);
End(wnd);
Forward(wnd);
SendMessage(wnd, PAINT, 0, 0);
return;
}
/* ---------- test end of window --------- */
if (WndCol == ClientWidth(wnd)-1) {
if (!isMultiLine(wnd)) {
if (!(currchar == wnd->text+wnd->MaxTextLength-2))
SendMessage(wnd, HORIZSCROLL, TRUE, 0);
}
else {
char *cp = currchar;
while (*cp != ' ' && cp != TextLine(wnd, wnd->CurrLine))
--cp;
if (cp == TextLine(wnd, wnd->CurrLine) || !wnd->WordWrapMode)
SendMessage(wnd, HORIZSCROLL, TRUE, 0);
else {
int dif = 0;
if (c != ' ') {
dif = (int) (currchar - cp);
wnd->CurrCol -= dif;
SendMessage(wnd, KEYBOARD, DEL, 0);
--dif;
}
SendMessage(wnd, KEYBOARD, '\n', 0);
currchar = CurrChar;
wnd->CurrCol = dif;
if (c == ' ')
return;
}
}
}
/* ------ display the character ------ */
SetStandardColor(wnd);
if (wnd->protect)
c = '*';
PutWindowChar(wnd, c, WndCol, wnd->WndRow);
/* ----- advance the pointers ------ */
wnd->CurrCol++;
}
/* ------------ screen changing key strokes ------------- */
static void DoKeyStroke(WINDOW wnd, int c, PARAM p2)
{
if (((unsigned int)p2) == SYSRQKEY)
goto doNormalKey; /* verbatim type mode: ^P + any key */
switch (c)
{
case BS:
if (wnd->CurrCol == 0 && wnd->CurrLine == 0)
break;
SendMessage(wnd, KEYBOARD, LARROW, 0);
SendMessage(wnd, KEYBOARD, DEL, 0);
break;
case DEL:
DelKey(wnd);
break;
case SHIFT_HT:
ShiftTabKey(wnd, p2);
break;
case '\t':
TabKey(wnd, p2);
break;
case '\r':
if (!isMultiLine(wnd))
{
PostMessage(GetParent(wnd), KEYBOARD, c, p2);
break;
}
c='\n';
default:
doNormalKey:
if (TextBlockMarked(wnd) && ((c & FKEY) == 0))
{
SendMessage(wnd, COMMAND, ID_DELETETEXT, 0);
SendMessage(wnd, PAINT, 0, 0);
}
KeyTyped(wnd, c);
break;
}
}
/* ----------- KEYBOARD Message ---------- */
static int KeyboardMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
int c=(int) p1;
if (WindowMoving || WindowSizing || ((int)p2 & ALTKEY))
return FALSE;
switch (c)
{
/* These keys get processed by lower classes */
case ESC:
case F1:
case F2:
case F3:
case F4:
case F5:
case F6:
case F7:
case F8:
case F9:
case F10:
case INS:
return FALSE;
/* --- these keys get processed here --- */
case CTRL_RARROW:
case CTRL_LARROW:
case CTRL_BS:
case CTRL_HOME:
case CTRL_END:
case CTRL_PGUP:
case CTRL_PGDN:
break;
case CTRL_F:
case CTRL_N:
case CTRL_O:
case CTRL_S:
return FALSE;
case CTRL_V:
case CTRL_X:
case CTRL_C:
case CTRL_Z:
case CTRL_F4:
{
BOOL tmb=TextMarking;
if (((int)p2 & (CTRLKEY|ALTKEY|LEFTSHIFT|RIGHTSHIFT)) == 0)
{
p2 = SYSRQKEY;
break;
}
StopMarking(wnd);
TextMarking=tmb;
}
return FALSE;
case CTRL_P:
#ifdef FANCY_CTRL_P
SendMessage(GetParent(wnd), ADDSTATUS, (PARAM) "Enter the control key to insert", 0);
while (!keyhit())
dispatch_message(); /* let (nested!) messages flow */
#endif
c=getkey() & 0xff; /* not elegant, of course! */
p2=SYSRQKEY; /* magic shift status */
#ifdef FANCY_CTRL_P
SendMessage(wnd,KEYBOARD_CURSOR,WndCol,wnd->WndRow);
#endif
break;
default:
/* other ctrl keys get processed by lower classes */
if ((int)p2 & CTRLKEY)
if (p1 > CTRL_Z)
return FALSE;
/* --- all other keys get processed here --- */
break;
}
if (p2 == SYSRQKEY) { /* special "type verbatim" mode */
DoKeyStroke(wnd, c, p2);
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
return TRUE; /* consume key event */
}
DoMultiLines(wnd, c, p2);
if (DoScrolling(wnd, c, p2)) {
if (KeyBoardMarking)
ExtendBlock(wnd, WndCol, wnd->WndRow);
}
else if (!TestAttribute(wnd, READONLY)) {
DoKeyStroke(wnd, c, p2);
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
}
else if (c == '\t')
PostMessage(GetParent(wnd), KEYBOARD, '\t', p2);
else
beep();
return TRUE;
}
/* ----------- SHIFT_CHANGED Message ---------- */
static void ShiftChangedMsg(WINDOW wnd, PARAM p1)
{
if (!((int)p1 & (LEFTSHIFT | RIGHTSHIFT)) && KeyBoardMarking)
{
StopMarking(wnd);
KeyBoardMarking = FALSE;
}
}
/* ----------- ID_DELETETEXT Command ---------- */
static void DeleteTextCmd(WINDOW wnd)
{
if (TextBlockMarked(wnd)) {
char *bbl=TextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
char *bel=TextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
int len = (int) (bel - bbl);
SaveDeletedText(wnd, bbl, len);
wnd->TextChanged = TRUE;
strcpy(bbl, bel);
wnd->CurrLine = TextLineNumber(wnd, bbl-wnd->BlkBegCol);
wnd->CurrCol = wnd->BlkBegCol;
wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
if (wnd->WndRow < 0) {
wnd->wtop = wnd->BlkBegLine;
wnd->WndRow = 0;
}
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
ClearTextBlock(wnd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -