📄 editbox.c
字号:
BuildTextPointers(wnd);
}
}
/* ----------- ID_CLEAR Command ---------- */
static void ClearCmd(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->CurrLine = TextLineNumber(wnd, bbl);
wnd->CurrCol = wnd->BlkBegCol;
wnd->WndRow = wnd->BlkBegLine - wnd->wtop;
if (wnd->WndRow < 0) {
wnd->WndRow = 0;
wnd->wtop = wnd->BlkBegLine;
}
/* ------ change all text lines in block to \n ----- */
while (bbl < bel) {
char *cp = strchr(bbl, '\n');
if (cp > bel)
cp = bel;
strcpy(bbl, cp);
bel -= (int) (cp - bbl);
bbl++;
}
ClearTextBlock(wnd);
BuildTextPointers(wnd);
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
wnd->TextChanged = TRUE;
}
}
/* ----------- ID_UNDO Command ---------- */
static void UndoCmd(WINDOW wnd)
{
if (wnd->DeletedText != NULL) {
PasteText(wnd, wnd->DeletedText, wnd->DeletedLength);
free(wnd->DeletedText);
wnd->DeletedText = NULL;
wnd->DeletedLength = 0;
SendMessage(wnd, PAINT, 0, 0);
}
}
/* ----------- ID_PARAGRAPH Command ---------- */
static void ParagraphCmd(WINDOW wnd)
{
int bc, fl;
char *bl, *bbl, *bel, *bb;
ClearTextBlock(wnd);
/* ---- forming paragraph from cursor position --- */
fl = wnd->wtop + wnd->WndRow;
bbl = bel = bl = TextLine(wnd, wnd->CurrLine);
if ((bc = wnd->CurrCol) >= ClientWidth(wnd))
bc = 0;
Home(wnd);
/* ---- locate the end of the paragraph ---- */
while (*bel) {
int blank = TRUE;
char *bll = bel;
/* --- blank line marks end of paragraph --- */
while (*bel && *bel != '\n') {
if (*bel != ' ')
blank = FALSE;
bel++;
}
if (blank) {
bel = bll;
break;
}
if (*bel)
bel++;
}
if (bel == bbl) {
SendMessage(wnd, KEYBOARD, DN, 0);
return;
}
if (*bel == '\0')
--bel;
if (*bel == '\n')
--bel;
/* --- change all newlines in block to spaces --- */
while (CurrChar < bel) {
if (*CurrChar == '\n') {
*CurrChar = ' ';
wnd->CurrLine++;
wnd->CurrCol = 0;
}
else
wnd->CurrCol++;
}
/* ---- insert newlines at new margin boundaries ---- */
bb = bbl;
while (bbl < bel) {
bbl++;
if ((int)(bbl - bb) == ClientWidth(wnd)-1) {
while (*bbl != ' ' && bbl > bb)
--bbl;
if (*bbl != ' ') {
bbl = strchr(bbl, ' ');
if (bbl == NULL || bbl >= bel)
break;
}
*bbl = '\n';
bb = bbl+1;
}
}
BuildTextPointers(wnd);
/* --- put cursor back at beginning --- */
wnd->CurrLine = TextLineNumber(wnd, bl);
wnd->CurrCol = bc;
if (fl < wnd->wtop)
wnd->wtop = fl;
wnd->WndRow = fl - wnd->wtop;
SendMessage(wnd, PAINT, 0, 0);
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
wnd->TextChanged = TRUE;
BuildTextPointers(wnd);
}
/* ----------- COMMAND Message ---------- */
static int CommandMsg(WINDOW wnd, PARAM p1)
{
switch ((int)p1) {
case ID_SEARCH:
SearchText(wnd);
return TRUE;
case ID_REPLACE:
ReplaceText(wnd);
return TRUE;
case ID_SEARCHNEXT:
SearchNext(wnd);
return TRUE;
case ID_CUT:
CopyToClipboard(wnd);
SendMessage(wnd, COMMAND, ID_DELETETEXT, 0);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_COPY:
CopyToClipboard(wnd);
ClearTextBlock(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_PASTE:
PasteFromClipboard(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_DELETETEXT:
DeleteTextCmd(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_CLEAR:
ClearCmd(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_UNDO:
UndoCmd(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
case ID_PARAGRAPH:
ParagraphCmd(wnd);
SendMessage(wnd, PAINT, 0, 0);
return TRUE;
default:
break;
}
return FALSE;
}
/* ---------- CLOSE_WINDOW Message ----------- */
static int CloseWindowMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
int rtn;
SendMessage(NULL, HIDE_CURSOR, 0, 0);
if (wnd->DeletedText != NULL)
free(wnd->DeletedText);
rtn = BaseWndProc(EDITBOX, wnd, CLOSE_WINDOW, p1, p2);
if (wnd->text != NULL) {
free(wnd->text);
wnd->text = NULL;
}
return rtn;
}
/* ------- Window processing module for EDITBOX class ------ */
int EditBoxProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
{
int rtn;
switch (msg) {
case CREATE_WINDOW:
return CreateWindowMsg(wnd);
case ADDTEXT:
return AddTextMsg(wnd, p1, p2);
case SETTEXT:
return SetTextMsg(wnd, p1);
case CLEARTEXT:
return ClearTextMsg(wnd);
case GETTEXT:
return GetTextMsg(wnd, p1, p2);
case SETTEXTLENGTH:
return SetTextLengthMsg(wnd, (unsigned) p1);
case KEYBOARD_CURSOR:
KeyboardCursorMsg(wnd, p1, p2);
return TRUE;
case SETFOCUS:
if (!(int)p1)
SendMessage(NULL, HIDE_CURSOR, 0, 0);
case PAINT:
case MOVE:
rtn = BaseWndProc(EDITBOX, wnd, msg, p1, p2);
SendMessage(wnd,KEYBOARD_CURSOR,WndCol,wnd->WndRow);
return rtn;
case SIZE:
return SizeMsg(wnd, p1, p2);
case SCROLL:
return ScrollMsg(wnd, p1);
case HORIZSCROLL:
return HorizScrollMsg(wnd, p1);
case SCROLLPAGE:
return ScrollPageMsg(wnd, p1);
case HORIZPAGE:
return HorizPageMsg(wnd, p1);
case LEFT_BUTTON:
if (LeftButtonMsg(wnd, p1, p2))
return TRUE;
break;
case MOUSE_MOVED:
if (MouseMovedMsg(wnd, p1, p2))
return TRUE;
break;
case BUTTON_RELEASED:
if (ButtonReleasedMsg(wnd))
return TRUE;
break;
case KEYBOARD:
if (KeyboardMsg(wnd, p1, p2))
return TRUE;
break;
case SHIFT_CHANGED:
ShiftChangedMsg(wnd, p1);
break;
case COMMAND:
if (CommandMsg(wnd, p1))
return TRUE;
break;
case CLOSE_WINDOW:
return CloseWindowMsg(wnd, p1, p2);
default:
break;
}
return BaseWndProc(EDITBOX, wnd, msg, p1, p2);
}
/* ------ save deleted text for the Undo command ------ */
static void SaveDeletedText(WINDOW wnd, char *bbl, int len)
{
wnd->DeletedLength = len;
wnd->DeletedText=DFrealloc(wnd->DeletedText,len);
memmove(wnd->DeletedText, bbl, len);
}
/* ---- cursor right key: right one character position ---- */
static void Forward(WINDOW wnd)
{
char *cc = CurrChar+1;
if (*cc == '\0')
return;
if (*CurrChar == '\n') {
Home(wnd);
Downward(wnd);
}
else {
wnd->CurrCol++;
if (WndCol == ClientWidth(wnd))
SendMessage(wnd, HORIZSCROLL, TRUE, 0);
}
}
/* ----- stick the moving cursor to the end of the line ---- */
static void StickEnd(WINDOW wnd)
{
char *cp = TextLine(wnd, wnd->CurrLine);
char *cp1 = strchr(cp, '\n');
int len = cp1 ? (int) (cp1 - cp) : 0;
wnd->CurrCol = min(len, wnd->CurrCol);
if (wnd->wleft > wnd->CurrCol) {
wnd->wleft = max(0, wnd->CurrCol - 4);
SendMessage(wnd, PAINT, 0, 0);
}
else if (wnd->CurrCol-wnd->wleft >= ClientWidth(wnd)) {
wnd->wleft = wnd->CurrCol - (ClientWidth(wnd)-1);
SendMessage(wnd, PAINT, 0, 0);
}
}
/* --------- cursor down key: down one line --------- */
static void Downward(WINDOW wnd)
{
if (isMultiLine(wnd) &&
wnd->WndRow+wnd->wtop+1 < wnd->wlines) {
wnd->CurrLine++;
if (wnd->WndRow == ClientHeight(wnd)-1)
SendMessage(wnd, SCROLL, TRUE, 0);
wnd->WndRow++;
StickEnd(wnd);
}
}
/* -------- cursor up key: up one line ------------ */
static void Upward(WINDOW wnd)
{
if (isMultiLine(wnd) && wnd->CurrLine != 0) {
--wnd->CurrLine;
if (wnd->WndRow == 0)
SendMessage(wnd, SCROLL, FALSE, 0);
--wnd->WndRow;
StickEnd(wnd);
}
}
/* ---- cursor left key: left one character position ---- */
static void Backward(WINDOW wnd)
{
if (wnd->CurrCol) {
--wnd->CurrCol;
if (wnd->CurrCol < wnd->wleft)
SendMessage(wnd, HORIZSCROLL, FALSE, 0);
}
else if (isMultiLine(wnd) && wnd->CurrLine != 0) {
Upward(wnd);
End(wnd);
}
}
/* -------- End key: to end of line ------- */
static void End(WINDOW wnd)
{
while (*CurrChar && *CurrChar != '\n')
++wnd->CurrCol;
if (WndCol >= ClientWidth(wnd)) {
wnd->wleft = wnd->CurrCol - (ClientWidth(wnd)-1);
SendMessage(wnd, PAINT, 0, 0);
}
}
/* -------- Home key: to beginning of line ------- */
static void Home(WINDOW wnd)
{
wnd->CurrCol = 0;
if (wnd->wleft != 0) {
wnd->wleft = 0;
SendMessage(wnd, PAINT, 0, 0);
}
}
/* -- Ctrl+cursor right key: to beginning of next word -- */
static void NextWord(WINDOW wnd)
{
int savetop = wnd->wtop;
int saveleft = wnd->wleft;
ClearVisible(wnd);
while (!isWhite(*CurrChar)) {
char *cc = CurrChar+1;
if (*cc == '\0')
break;
Forward(wnd);
}
while (isWhite(*CurrChar)) {
char *cc = CurrChar+1;
if (*cc == '\0')
break;
Forward(wnd);
}
SetVisible(wnd);
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
if (wnd->wtop != savetop || wnd->wleft != saveleft)
SendMessage(wnd, PAINT, 0, 0);
}
/* -- Ctrl+cursor left key: to beginning of previous word -- */
static void PrevWord(WINDOW wnd)
{
int savetop = wnd->wtop;
int saveleft = wnd->wleft;
ClearVisible(wnd);
Backward(wnd);
while (isWhite(*CurrChar)) {
if (wnd->CurrLine == 0 && wnd->CurrCol == 0)
break;
Backward(wnd);
}
while (wnd->CurrCol != 0 && !isWhite(*CurrChar))
Backward(wnd);
if (isWhite(*CurrChar))
Forward(wnd);
SetVisible(wnd);
if (wnd->wleft != saveleft)
if (wnd->CurrCol >= saveleft)
if (wnd->CurrCol - saveleft < ClientWidth(wnd))
wnd->wleft = saveleft;
SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
if (wnd->wtop != savetop || wnd->wleft != saveleft)
SendMessage(wnd, PAINT, 0, 0);
}
/* ----- modify text pointers from a specified position
by a specified plus or minus amount ----- */
static void ModTextPointers(WINDOW wnd, int lineno, int var)
{
while (lineno < wnd->wlines)
*((wnd->TextPointers) + lineno++) += var;
}
/* ----- set anchor point for marking text block ----- */
static void SetAnchor(WINDOW wnd, int mx, int my)
{
ClearTextBlock(wnd);
/* ------ set the anchor ------ */
wnd->BlkBegLine = wnd->BlkEndLine = my;
wnd->BlkBegCol = wnd->BlkEndCol = mx;
SendMessage(wnd, PAINT, 0, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -