Ejemplo n.º 1
0
 public static int GetLinesCount(this ITextAreaDataSource src)
 {
     lock (src.LockObject)
     {
         return(src.Lines.Count == 0 ? 0 : src.Lines.Keys.Last());
     }
 }
Ejemplo n.º 2
0
 private static void RemoveLine(this ITextAreaDataSource src, int lineNo)
 {
     lock (src.LockObject)
     {
         if (src.Lines.ContainsKey(lineNo))
         {
             src.Lines.Remove(lineNo);
         }
     }
 }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 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);
         }
     }
 }
Ejemplo n.º 8
0
        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);
                }
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 11
0
        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);
                }
            }
        }
Ejemplo n.º 12
0
        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++;
            }
        }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
        private void HandleLeftArrow(ITextAreaDataSource textAreaDataSource)
        {
            if (CursorX == 0 && XOffset == 0)
            {
                GetPreviousLinePosition(textAreaDataSource);
                return;
            }

            if (CursorX > 0)
            {
                CursorX--;
                return;
            }

            if (XOffset > 0)
            {
                XOffset--;
            }
        }
Ejemplo n.º 15
0
        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;
            }
        }
Ejemplo n.º 16
0
 public void SetDataSource(ITextAreaDataSource dataSource)
 {
     _textAreaDataSource = dataSource;
 }