/* ----------- 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; } }
/* ----------- SETTEXTLENGTH Message ---------- */ static int SetTextLengthMsg(WINDOW wnd, unsigned int len) { if (++len < MAXTEXTLEN) { wnd->MaxTextLength = len; if (len < wnd->textlen) { wnd->text=DFrealloc(wnd->text, len+2); wnd->textlen = len; *((wnd->text)+len) = '\0'; *((wnd->text)+len+1) = '\0'; BuildTextPointers(wnd); } return TRUE; } return FALSE; }
BOOL PasteText(WINDOW wnd, char *SaveTo, unsigned len) { if (SaveTo != NULL && len > 0) { unsigned plen = strlen(wnd->text) + len; if (plen <= wnd->MaxTextLength) { if (plen+1 > wnd->textlen) { wnd->text = DFrealloc(wnd->text, plen+3); wnd->textlen = plen+1; } memmove(CurrChar+len, CurrChar, strlen(CurrChar)+1); memmove(CurrChar, SaveTo, len); BuildTextPointers(wnd); wnd->TextChanged = TRUE; return TRUE; } } return 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); BuildTextPointers(wnd); } }
/* -------------- 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; }
/* ----------- 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); }
/* --------- All displayable typed keys ------------- */ static void KeyTyped(WINDOW wnd, int c) { char *currchar = CurrChar; if ((c != '\n' && c < ' ') || (c & 0x1000)) /* ---- not recognized by editor --- */ 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); PutWindowChar(wnd, c, WndCol, wnd->WndRow); /* ----- advance the pointers ------ */ wnd->CurrCol++; }