public static int GetLinesCount(this ITextAreaDataSource src) { lock (src.LockObject) { return(src.Lines.Count == 0 ? 0 : src.Lines.Keys.Last()); } }
private static void RemoveLine(this ITextAreaDataSource src, int lineNo) { lock (src.LockObject) { if (src.Lines.ContainsKey(lineNo)) { src.Lines.Remove(lineNo); } } }
private static void PutGapIntoLine(this ITextAreaDataSource src, int lineNo) { var linesToMoveDown = src.Lines.Where(itm => itm.Key > lineNo).OrderByDescending(itm => itm.Key).ToArray(); foreach (var lineToMoveDown in linesToMoveDown) { src.Lines.Remove(lineToMoveDown.Key); src.Lines.Add(lineToMoveDown.Key + 1, lineToMoveDown.Value); } }
private void HandleLineInsert(ITextAreaDataSource textAreaDataSource) { var lineNo = GetTextLineByScreenLine(CursorY); var positionNo = GetTextPositionByScreenLine(CursorX); var line = textAreaDataSource.GetLine(lineNo) ?? string.Empty; var positionOffset = line.GetPositionOffset(); textAreaDataSource.InsertLine(positionNo, lineNo, positionOffset); CursorX = positionOffset; HandleDownArrow(); }
public static string GetLine(this ITextAreaDataSource src, int lineNo) { lock (src.LockObject) { if (lineNo < 0) { return(null); } return(src.Lines.ContainsKey(lineNo) ? src.Lines[lineNo] : null); } }
public static void Update(this ITextAreaDataSource src, int lineNo, string value) { value = value?.TrimEnd(); if (string.IsNullOrEmpty(value)) { src.RemoveLine(lineNo); } else { src.UpdateLine(lineNo, value); } }
private static void UpdateLine(this ITextAreaDataSource src, int lineNo, string value) { lock (src.LockObject) { if (src.Lines.ContainsKey(lineNo)) { src.Lines[lineNo] = value; } else { src.Lines.Add(lineNo, value); } } }
public static void InsertLine(this ITextAreaDataSource src, int positionNo, int lineNo, int positionOffset) { lock (src.LockObject) { var line = src.Lines.ContainsKey(lineNo) ? src.Lines[lineNo] : null; src.PutGapIntoLine(lineNo); if (line != null) { var(line1, line2) = SplitEnterLine(line, positionNo); src.Update(lineNo, line1); src.Update(lineNo + 1, new string(' ', positionOffset) + line2); } } }
private void HandleBackspace(ITextAreaDataSource textAreaDataSource) { var cursorPosition = GetTextPositionByScreenLine(CursorX); if (cursorPosition <= 0) { HandleLinesMerge(textAreaDataSource); return; } var textLineNo = GetTextLineByScreenLine(CursorY); var str = textAreaDataSource.GetLine(textLineNo); str = str.BackspaceTextArea(cursorPosition); CursorX--; textAreaDataSource.Update(textLineNo, str); }
public static void MergeLines(this ITextAreaDataSource src, int lineNo) { lock (src.LockObject) { var line1 = src.GetLine(lineNo - 1) ?? string.Empty; var line2 = src.GetLine(lineNo) ?? string.Empty; if (!string.IsNullOrEmpty(line1)) { line1 += " "; } src.Update(lineNo - 1, line1 + line2); src.DeleteLine(lineNo); } }
public static void DeleteLine(this ITextAreaDataSource src, int lineNo) { lock (src.LockObject) { if (src.Lines.ContainsKey(lineNo)) { src.Lines.Remove(lineNo); } var linesToMoveUp = src.Lines.Where(itm => itm.Key > lineNo).ToArray(); foreach (var(lineId, value) in linesToMoveUp) { src.Lines.Remove(lineId); src.Lines.Add(lineId - 1, value); } } }
private void HandleLinesMerge(ITextAreaDataSource textAreaDataSource) { var linePos = GetTextLineByScreenLine(CursorY); if (linePos == 0) { return; } var line = textAreaDataSource.GetLine(linePos - 1) ?? string.Empty; textAreaDataSource.MergeLines(linePos); HandleUpArrow(); CursorX = line.Length; if (line.Length > 0) { CursorX++; } }
private void FindPreviousWord(ITextAreaDataSource textAreaDataSource) { var line = GetCurrentLine(); if (line == null) { return; } var xPosition = GetTextXPosition(); var newXPosition = line.GetPrevWordPosition(xPosition); for (var i = xPosition; i > newXPosition; i--) { HandleLeftArrow(textAreaDataSource); } }
private void HandleLeftArrow(ITextAreaDataSource textAreaDataSource) { if (CursorX == 0 && XOffset == 0) { GetPreviousLinePosition(textAreaDataSource); return; } if (CursorX > 0) { CursorX--; return; } if (XOffset > 0) { XOffset--; } }
private void GetPreviousLinePosition(ITextAreaDataSource textAreaDataSource) { var lineNo = GetTextLineByScreenLine(CursorY); if (lineNo == 0) { return; } var line = textAreaDataSource.GetLine(lineNo - 1) ?? string.Empty; HandleUpArrow(); CursorX = line.Length; if (CursorX > Width) { XOffset = CursorX - Width; CursorX = Width; } }
public void SetDataSource(ITextAreaDataSource dataSource) { _textAreaDataSource = dataSource; }