📄 editbox.c
字号:
case DF_FWD:
case DF_CTRL_FWD:
KeyBoardMarking = TextMarking = TRUE;
SetAnchor(wnd, wnd->CurrCol, wnd->CurrLine);
break;
default:
break;
}
}
}
}
/* ---------- page/scroll keys ----------- */
static int DoScrolling(DFWINDOW wnd, int c, DF_PARAM p2)
{
switch (c) {
case DF_PGUP:
case DF_PGDN:
if (DfIsMultiLine(wnd))
DfBaseWndProc(DF_EDITBOX, wnd, DFM_KEYBOARD, c, p2);
break;
case DF_CTRL_PGUP:
case DF_CTRL_PGDN:
DfBaseWndProc(DF_EDITBOX, wnd, DFM_KEYBOARD, c, p2);
break;
case DF_HOME:
Home(wnd);
break;
case DF_END:
End(wnd);
break;
case DF_CTRL_FWD:
NextWord(wnd);
break;
case DF_CTRL_BS:
PrevWord(wnd);
break;
case DF_CTRL_HOME:
if (DfIsMultiLine(wnd)) {
DfSendMessage(wnd, DFM_SCROLLDOC, TRUE, 0);
wnd->CurrLine = 0;
wnd->WndRow = 0;
}
Home(wnd);
break;
case DF_CTRL_END:
if (DfIsMultiLine(wnd) &&
wnd->WndRow+wnd->wtop+1 < wnd->wlines
&& wnd->wlines > 0) {
DfSendMessage(wnd, DFM_SCROLLDOC, FALSE, 0);
SetLinePointer(wnd, wnd->wlines-1);
wnd->WndRow =
min(DfClientHeight(wnd)-1, wnd->wlines-1);
Home(wnd);
}
End(wnd);
break;
case DF_UP:
if (DfIsMultiLine(wnd))
Upward(wnd);
break;
case DF_DN:
if (DfIsMultiLine(wnd))
Downward(wnd);
break;
case DF_FWD:
Forward(wnd);
break;
case DF_BS:
Backward(wnd);
break;
default:
return FALSE;
}
if (!KeyBoardMarking && DfTextBlockMarked(wnd)) {
DfClearTextBlock(wnd);
DfSendMessage(wnd, DFM_PAINT, 0, 0);
}
DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
return TRUE;
}
/* -------------- Del key ---------------- */
static void DelKey(DFWINDOW wnd)
{
char *currchar = DfCurrChar;
int repaint = *currchar == '\n';
if (DfTextBlockMarked(wnd)) {
DfSendMessage(wnd, DFM_COMMAND, DF_ID_DELETETEXT, 0);
DfSendMessage(wnd, DFM_PAINT, 0, 0);
return;
}
if (DfIsMultiLine(wnd) && *currchar == '\n' && *(currchar+1) == '\0')
return;
strcpy(currchar, currchar+1);
if (repaint) {
DfBuildTextPointers(wnd);
DfSendMessage(wnd, DFM_PAINT, 0, 0);
}
else {
ModTextPointers(wnd, wnd->CurrLine+1, -1);
DfWriteTextLine(wnd, NULL, wnd->WndRow+wnd->wtop, FALSE);
}
wnd->TextChanged = TRUE;
}
/* ------------ Tab key ------------ */
static void TabKey(DFWINDOW wnd, DF_PARAM p2)
{
if (DfIsMultiLine(wnd)) {
int insmd = wnd->InsertMode;
do {
char *cc = DfCurrChar+1;
if (!insmd && *cc == '\0')
break;
if (wnd->textlen == wnd->MaxTextLength)
break;
DfSendMessage(wnd,DFM_KEYBOARD,insmd ? ' ' : DF_FWD,0);
} while (wnd->CurrCol % DfCfg.Tabs);
}
else
DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, '\t', p2);
}
/* ------------ Shift+Tab key ------------ */
static void ShiftTabKey(DFWINDOW wnd, DF_PARAM p2)
{
if (DfIsMultiLine(wnd)) {
do {
if (DfCurrChar == DfGetText(wnd))
break;
DfSendMessage(wnd,DFM_KEYBOARD,DF_BS,0);
} while (wnd->CurrCol % DfCfg.Tabs);
}
else
DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, DF_SHIFT_HT, p2);
}
/* --------- All displayable typed keys ------------- */
static void KeyTyped(DFWINDOW wnd, int c)
{
char *currchar = DfCurrChar;
if ((c != '\n' && c < ' ') || (c & 0x1000))
/* ---- not recognized by editor --- */
return;
if (!DfIsMultiLine(wnd) && DfTextBlockMarked(wnd)) {
DfSendMessage(wnd, DFM_CLEARTEXT, 0, 0);
currchar = DfCurrChar;
}
/* ---- test typing at end of text ---- */
if (currchar == (char*)(wnd->text+wnd->MaxTextLength)) {
/* ---- typing at the end of maximum buffer ---- */
DfBeep();
return;
}
if (*currchar == '\0') {
/* --- insert a newline at end of text --- */
*currchar = '\n';
*(currchar+1) = '\0';
DfBuildTextPointers(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 --- */
DfBeep();
return;
}
/* ---- increase the text buffer size ---- */
wnd->textlen += DF_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 = DfCurrChar;
}
memmove(currchar+1, currchar, strlen(currchar)+1);
ModTextPointers(wnd, wnd->CurrLine+1, 1);
if (DfIsMultiLine(wnd) && wnd->wlines > 1)
wnd->textwidth = max(wnd->textwidth,
(int) (DfTextLine(wnd, wnd->CurrLine+1)-
DfTextLine(wnd, wnd->CurrLine)));
else
wnd->textwidth = max((int)wnd->textwidth,
(int)strlen(wnd->text));
DfWriteTextLine(wnd, NULL,
wnd->wtop+wnd->WndRow, FALSE);
}
/* ----- put the char in the buffer ----- */
*currchar = c;
wnd->TextChanged = TRUE;
if (c == '\n') {
wnd->wleft = 0;
DfBuildTextPointers(wnd);
End(wnd);
Forward(wnd);
DfSendMessage(wnd, DFM_PAINT, 0, 0);
return;
}
/* ---------- test end of window --------- */
if (DfWndCol == DfClientWidth(wnd)-1) {
if (!DfIsMultiLine(wnd)) {
if (!(currchar == (char*)(wnd->text+wnd->MaxTextLength-2)))
DfSendMessage(wnd, DFM_HORIZSCROLL, TRUE, 0);
}
else {
char *cp = currchar;
while (*cp != ' ' && cp != (char*)DfTextLine(wnd, wnd->CurrLine))
--cp;
if (cp == (char*)DfTextLine(wnd, wnd->CurrLine) ||
!wnd->WordWrapMode)
DfSendMessage(wnd, DFM_HORIZSCROLL, TRUE, 0);
else {
int dif = 0;
if (c != ' ') {
dif = (int) (currchar - cp);
wnd->CurrCol -= dif;
DfSendMessage(wnd, DFM_KEYBOARD, DF_DEL, 0);
--dif;
}
DfSendMessage(wnd, DFM_KEYBOARD, '\n', 0);
currchar = DfCurrChar;
wnd->CurrCol = dif;
if (c == ' ')
return;
}
}
}
/* ------ display the character ------ */
DfSetStandardColor(wnd);
DfPutWindowChar(wnd, c, DfWndCol, wnd->WndRow);
/* ----- advance the pointers ------ */
wnd->CurrCol++;
}
/* ------------ screen changing key strokes ------------- */
static void DoKeyStroke(DFWINDOW wnd, int c, DF_PARAM p2)
{
switch (c) {
case DF_RUBOUT:
if (wnd->CurrCol == 0 && wnd->CurrLine == 0)
break;
Backward(wnd);
case DF_DEL:
DelKey(wnd);
break;
case DF_SHIFT_HT:
ShiftTabKey(wnd, p2);
break;
case '\t':
TabKey(wnd, p2);
break;
case '\r':
if (!DfIsMultiLine(wnd)) {
DfPostMessage(DfGetParent(wnd), DFM_KEYBOARD, c, p2);
break;
}
c = '\n';
default:
if (DfTextBlockMarked(wnd)) {
DfSendMessage(wnd, DFM_COMMAND, DF_ID_DELETETEXT, 0);
DfSendMessage(wnd, DFM_PAINT, 0, 0);
}
KeyTyped(wnd, c);
break;
}
}
/* ----------- DFM_KEYBOARD Message ---------- */
static int KeyboardMsg(DFWINDOW wnd, DF_PARAM p1, DF_PARAM p2)
{
int c = (int) p1;
if (DfWindowMoving || DfWindowSizing || ((int)p2 & DF_ALTKEY))
return FALSE;
switch (c)
{
/* these keys get processed by lower classes */
case DF_ESC:
case DF_F1:
case DF_F2:
case DF_F3:
case DF_F4:
case DF_F5:
case DF_F6:
case DF_F7:
case DF_F8:
case DF_F9:
case DF_F10:
case DF_INS:
case DF_SHIFT_INS:
case DF_SHIFT_DEL:
return FALSE;
/* these keys get processed here */
case DF_CTRL_FWD:
case DF_CTRL_BS:
case DF_CTRL_HOME:
case DF_CTRL_END:
case DF_CTRL_PGUP:
case DF_CTRL_PGDN:
break;
default:
/* other ctrl keys get processed by lower classes */
if ((int)p2 & DF_CTRLKEY)
return FALSE;
/* all other keys get processed here */
break;
}
DoMultiLines(wnd, c, p2);
if (DoScrolling(wnd, c, p2))
{
if (KeyBoardMarking)
ExtendBlock(wnd, DfWndCol, wnd->WndRow);
}
else if (!DfTestAttribute(wnd, DF_READONLY))
{
DoKeyStroke(wnd, c, p2);
DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
}
else
DfBeep();
return TRUE;
}
/* ----------- DFM_SHIFT_CHANGED Message ---------- */
static void ShiftChangedMsg(DFWINDOW wnd, DF_PARAM p1)
{
if (!((int)p1 & (DF_LEFTSHIFT | DF_RIGHTSHIFT)) &&
KeyBoardMarking) {
StopMarking(wnd);
KeyBoardMarking = FALSE;
}
}
/* ----------- DF_ID_DELETETEXT Command ---------- */
static void DeleteTextCmd(DFWINDOW wnd)
{
if (DfTextBlockMarked(wnd)) {
char *bbl=DfTextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
char *bel=DfTextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
int len = (int) (bel - bbl);
SaveDeletedText(wnd, bbl, len);
wnd->TextChanged = TRUE;
strcpy(bbl, bel);
wnd->CurrLine = DfTextLineNumber(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;
}
DfSendMessage(wnd, DFM_KEYBOARD_CURSOR, DfWndCol, wnd->WndRow);
DfClearTextBlock(wnd);
DfBuildTextPointers(wnd);
}
}
/* ----------- DF_ID_CLEAR Command ---------- */
static void ClearCmd(DFWINDOW wnd)
{
if (DfTextBlockMarked(wnd)) {
char *bbl=DfTextLine(wnd,wnd->BlkBegLine)+wnd->BlkBegCol;
char *bel=DfTextLine(wnd,wnd->BlkEndLine)+wnd->BlkEndCol;
int len = (int) (bel - bbl);
SaveDeletedText(wnd, bbl, len);
wnd->CurrLine = DfTextLineNumber(wnd, bbl);
wnd->CurrCol = wnd->BlkBegCol;
wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
if (wnd->WndRow < 0) {
wnd->WndRow = 0;
wnd->wtop = wnd->BlkBegLine;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -