/// <summary>
        /// Clears the selected.
        /// </summary>
        /// <param name="ts">The ts.</param>
        internal static void ClearSelected(TextSource ts)
        {
            var tb = ts.CurrentTB;

            Place start    = tb.Selection.Start;
            Place end      = tb.Selection.End;
            int   fromLine = Math.Min(end.iLine, start.iLine);
            int   toLine   = Math.Max(end.iLine, start.iLine);
            int   fromChar = tb.Selection.FromX;
            int   toChar   = tb.Selection.ToX;

            if (fromLine < 0)
            {
                return;
            }
            //
            if (fromLine == toLine)
            {
                ts[fromLine].RemoveRange(fromChar, toChar - fromChar);
            }
            else
            {
                ts[fromLine].RemoveRange(fromChar, ts[fromLine].Count - fromChar);
                ts[toLine].RemoveRange(0, toChar);
                ts.RemoveLine(fromLine + 1, toLine - fromLine - 1);
                InsertCharCommand.MergeLines(fromLine, ts);
            }
            //
            tb.Selection.Start = new Place(fromChar, fromLine);
            //
            ts.NeedRecalc(new TextSource.TextChangedEventArgs(fromLine, toLine));
        }
        /// <summary>
        /// Merge lines i and i+1
        /// </summary>
        /// <param name="i">The i.</param>
        /// <param name="ts">The ts.</param>
        internal static void MergeLines(int i, TextSource ts)
        {
            var tb = ts.CurrentTB;

            if (i + 1 >= ts.Count)
            {
                return;
            }
            tb.ExpandBlock(i);
            tb.ExpandBlock(i + 1);
            int pos = ts[i].Count;

            //

            /*
             * if(ts[i].Count == 0)
             *  ts.RemoveLine(i);
             * else*/
            if (ts[i + 1].Count == 0)
            {
                ts.RemoveLine(i + 1);
            }
            else
            {
                ts[i].AddRange(ts[i + 1]);
                ts.RemoveLine(i + 1);
            }
            tb.Selection.Start = new Place(pos, i);
            ts.NeedRecalc(new TextSource.TextChangedEventArgs(0, 1));
        }
        /// <summary>
        /// Inserts the text.
        /// </summary>
        /// <param name="insertedText">The inserted text.</param>
        /// <param name="ts">The ts.</param>
        internal static void InsertText(string insertedText, TextSource ts)
        {
            var tb = ts.CurrentTB;

            try
            {
                tb.Selection.BeginUpdate();
                char cc = '\x0';

                if (ts.Count == 0)
                {
                    InsertCharCommand.InsertLine(ts);
                    tb.Selection.Start = Place.Empty;
                }
                tb.ExpandBlock(tb.Selection.Start.iLine);
                var len = insertedText.Length;
                for (int i = 0; i < len; i++)
                {
                    var c = insertedText[i];
                    if (c == '\r' && (i >= len - 1 || insertedText[i + 1] != '\n'))
                    {
                        InsertCharCommand.InsertChar('\n', ref cc, ts);
                    }
                    else
                    {
                        InsertCharCommand.InsertChar(c, ref cc, ts);
                    }
                }
                ts.NeedRecalc(new TextSource.TextChangedEventArgs(0, 1));
            }
            finally {
                tb.Selection.EndUpdate();
            }
        }
        /// <summary>
        /// Inserts the line.
        /// </summary>
        /// <param name="ts">The ts.</param>
        internal static void InsertLine(TextSource ts)
        {
            var tb = ts.CurrentTB;

            if (!tb.Multiline && tb.LinesCount > 0)
            {
                return;
            }

            if (ts.Count == 0)
            {
                ts.InsertLine(0, ts.CreateLine());
            }
            else
            {
                BreakLines(tb.Selection.Start.iLine, tb.Selection.Start.iChar, ts);
            }

            tb.Selection.Start = new Place(0, tb.Selection.Start.iLine + 1);
            ts.NeedRecalc(new TextSource.TextChangedEventArgs(0, 1));
        }