public MultiLineTextManager(MultiLineTextBox owner, SpecialCharacterFlags flags)
        {
            Owner      = owner;
            Font       = Owner.Font;
            Flags      = flags;
            LineHeight = (int)Font.LineHeight;

            m_Paragraphs = new ParagraphList(LineHeight, BreakWidth);

            Paragraph para = new Paragraph(0, BreakWidth, String.Empty, Font, Flags);

            Paragraphs.AddLast(para);
        }
        public void LoadTextAsync(string value, float breakWidth)
        {
            BreakWidth = breakWidth;
            if (value == null)
            {
                value = String.Empty;
            }

            Task.Factory.StartNew(() => {
                Stopwatch sw = Stopwatch.StartNew();

                int index = 0;
                Paragraphs.Clear();
                ParagraphList paragraphs = new ParagraphList(LineHeight, BreakWidth);
                char splitChar           = AutoDetectLineBreakChar(value);

                if (!GroupParagraphs)
                {
                    Strings.Split(value, splitChar).ForEach(line =>
                                                            paragraphs.AddLast(new Paragraph(index++, BreakWidth, line, Font, Flags))
                                                            );
                }
                else
                {
                    const string splitStr = "\r\n\r\n";
                    Strings.Split(value, splitStr).ForEach(line => {
                        paragraphs.AddLast(new Paragraph(index++, BreakWidth, line.Replace("\n", " ") + "\n", Font, Flags));
                        paragraphs.AddLast(new Paragraph(index++, BreakWidth, "\n", Font, Flags));
                    });
                }

                paragraphs.OnUpdate();
                Concurrency.LockFreeUpdate(ref m_Paragraphs, paragraphs);

                this.LogVerbose("{0} characters of text in {1} paragraphs loaded into the editor in {2} ms.", value.Length.ToString("n0"), Paragraphs.Count.ToString("n0"), sw.ElapsedMilliseconds.ToString("n0"));
            }).ContinueWith((t) => {
                if (t.Status == TaskStatus.RanToCompletion)
                {
                    if (Paragraphs.BreakWidth != BreakWidth)
                    {
                        Paragraphs.OnUpdateBreakWidthAsync(BreakWidth);
                    }
                }
            }).ContinueWith((t) => {
                Owner.UndoRedoManager.Clear();
                if (LoadingCompleted != null)
                {
                    LoadingCompleted(this, EventArgs.Empty);
                }
            });
        }