/* ------------ screen changing key strokes ------------- */ static void DoKeyStroke(WINDOW wnd, int c, PARAM p2) { switch (c) { case RUBOUT: if (wnd->CurrCol == 0 && wnd->CurrLine == 0) break; Backward(wnd); 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: if (TextBlockMarked(wnd)) { SendMessage(wnd, COMMAND, ID_DELETETEXT, 0); SendMessage(wnd, PAINT, 0, 0); } KeyTyped(wnd, c); break; } }
void StatsForMarked(WINDOW wnd, unsigned *bytes, unsigned *words, unsigned *lines) { bytes[0] = words[0] = lines[0] = 0; if (TextBlockMarked(wnd)) { int inWord = 0; char *bb = TextBlockBegin(wnd); /* near pointers */ char *be = TextBlockEnd(wnd); /* near pointers */ if (bb >= be) { bb = TextBlockEnd(wnd); /* sic! */ be = TextBlockBegin(wnd); /* sic! */ } while (bb < be) { char c = bb[0]; if (c == '\n') lines[0]++; if (isspace(c)) { if (inWord) words[0]++; inWord = 0; } else { inWord = 1; } bytes[0]++; bb++; } if (inWord) words[0]++; } }
/* ----------- 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; } }
/* --------- KEYBOARD Message ---------- */ static int KeyboardMsg(WINDOW wnd, PARAM p1, PARAM p2) { int c = (int) p1; BOOL delnl; PARAM pn = p1; if (WindowMoving || WindowSizing || ((int)p2 & ALTKEY)) return FALSE; switch (c) { case PGUP: case PGDN: case UP: case DN: pn = (PARAM) BS; case FWD: case BS: BaseWndProc(EDITOR, wnd, KEYBOARD, p1, p2); TurnOffDisplay(wnd); while (*CurrChar == pTab) BaseWndProc(EDITOR, wnd, KEYBOARD, pn, p2); TurnOnDisplay(wnd); return TRUE; case DEL: TurnOffDisplay(wnd); delnl = *CurrChar == '\n' || TextBlockMarked(wnd); BaseWndProc(EDITOR, wnd, KEYBOARD, p1, p2); while (*CurrChar == pTab) BaseWndProc(EDITOR, wnd, KEYBOARD, p1, p2); AdjustTab(wnd); TurnOnDisplay(wnd); RepaintLine(wnd); if (delnl) SendMessage(wnd, PAINT, 0, 0); return TRUE; case '\t': TurnOffDisplay(wnd); BaseWndProc(EDITOR, wnd, KEYBOARD, (PARAM) sTab, p2); while ((wnd->CurrCol % cfg.Tabs) != 0) BaseWndProc(EDITOR, wnd, KEYBOARD, pTab, p2); TurnOnDisplay(wnd); RepaintLine(wnd); return TRUE; default: if ((c & OFFSET == 0) && (isprint(c) || c == '\r')) { TurnOffDisplay(wnd); BaseWndProc(EDITOR, wnd, KEYBOARD, p1, p2); AdjustTab(wnd); TurnOnDisplay(wnd); RepaintLine(wnd); if (c == '\r') SendMessage(wnd, PAINT, 0, 0); return TRUE; } break; } return FALSE; }
void CopyToClipboard(WINDOW wnd) { if (TextBlockMarked(wnd)) { char *bb = TextBlockBegin(wnd); /* near pointers */ char *be = TextBlockEnd(wnd); /* near pointers */ if (bb >= be) { /* *** 0.6e extra check *** */ bb = TextBlockEnd(wnd); /* sic! */ be = TextBlockBegin(wnd); /* sic! */ } ClipboardLength = (unsigned) (be - bb); /* *** unsigned *** */ Clipboard = DFrealloc(Clipboard, ClipboardLength); memmove(Clipboard, bb, ClipboardLength); } }
void DownCaseMarked(WINDOW wnd) { if (TextBlockMarked(wnd)) { char *bb = TextBlockBegin(wnd); /* near pointers */ char *be = TextBlockEnd(wnd); /* near pointers */ if (bb >= be) { bb = TextBlockEnd(wnd); /* sic! */ be = TextBlockBegin(wnd); /* sic! */ } while (bb < be) { bb[0] = tolower(bb[0]); bb++; } } }
/* ----------- 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; }
/* --------- 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++; }
/* ---------- page/scroll keys ----------- */ static int DoScrolling(WINDOW wnd, int c, PARAM p2) { switch (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_FWD: NextWord(wnd); break; 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 BS: 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; }
/* ----------- LEFT_BUTTON Message ---------- */ static int LeftButtonMsg(WINDOW wnd, PARAM p1, PARAM p2) { int MouseX = (int) p1 - GetClientLeft(wnd); int MouseY = (int) p2 - GetClientTop(wnd); RECT rc = ClientRect(wnd); char *lp; int len; if (KeyBoardMarking) return TRUE; if (WindowMoving || WindowSizing) return FALSE; if (isMultiLine(wnd)) { if (TextMarking) { if (!InsideRect(p1, p2, rc)) { int x = MouseX, y = MouseY; int dir; MESSAGE msg = 0; if ((int)p2 == GetTop(wnd)) y++, dir = FALSE, msg = SCROLL; else if ((int)p2 == GetBottom(wnd)) --y, dir = TRUE, msg = SCROLL; else if ((int)p1 == GetLeft(wnd)) --x, dir = FALSE, msg = HORIZSCROLL; else if ((int)p1 == GetRight(wnd)) x++, dir = TRUE, msg = HORIZSCROLL; if (msg != 0) { if (SendMessage(wnd, msg, dir, 0)) ExtendBlock(wnd, x, y); SendMessage(wnd, PAINT, 0, 0); } } return TRUE; } if (!InsideRect(p1, p2, rc)) return FALSE; if (TextBlockMarked(wnd)) { ClearTextBlock(wnd); SendMessage(wnd, PAINT, 0, 0); } if (wnd->wlines) { if (MouseY > wnd->wlines-1) return TRUE; lp = TextLine(wnd, MouseY+wnd->wtop); len = (int) (strchr(lp, '\n') - lp); MouseX = min(MouseX, len); if (MouseX < wnd->wleft) { MouseX = 0; SendMessage(wnd, KEYBOARD, HOME, 0); } ButtonDown = TRUE; ButtonX = MouseX; ButtonY = MouseY; } else MouseX = MouseY = 0; wnd->WndRow = MouseY; SetLinePointer(wnd, MouseY+wnd->wtop); } if (isMultiLine(wnd) || (!TextBlockMarked(wnd) && MouseX+wnd->wleft < strlen(wnd->text))) wnd->CurrCol = MouseX+wnd->wleft; SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow); return TRUE; }