Example #1
0
        internal ArrayList SplitLines(int availableWidth)
        {
            int       num  = 0;
            ArrayList list = new ArrayList();

            for (int i = 0; i < this.TextRuns.Count; i++)
            {
                list.Add(this.TextRuns[i]);
            }
            ArrayList list2 = new ArrayList();
            ArrayList runs  = new ArrayList();

            while (list.Count > 0)
            {
                bool    flag = false;
                TextRun run  = (TextRun)list[0];
                list.RemoveAt(0);
                if (run.IsEndOfLine)
                {
                    flag = true;
                }
                else
                {
                    int num3;
                    int num4;
                    run.GetSize(out num3, out num4);
                    num += num3;
                    runs.Add(run);
                    if (num > availableWidth)
                    {
                        bool emergencyBreak = runs.Count == 1;
                        if (run.Text.Length > 1)
                        {
                            TextRun run2;
                            TextRun run3;
                            runs.Remove(run);
                            if (run.Break(num3 - (num - availableWidth), out run2, out run3, emergencyBreak))
                            {
                                if (run2 != null)
                                {
                                    runs.Add(run2);
                                }
                                if (run3 != null)
                                {
                                    list.Insert(0, run3);
                                }
                            }
                            else if (!emergencyBreak)
                            {
                                list.Insert(0, run);
                            }
                        }
                        else if (!emergencyBreak)
                        {
                            runs.Remove(run);
                            list.Insert(0, run);
                        }
                        flag = true;
                    }
                    if ((num >= availableWidth) || (list.Count == 0))
                    {
                        flag = true;
                    }
                }
                if (flag)
                {
                    int height   = 0;
                    int baseline = 0;
                    int count    = runs.Count;
                    if (count > 0)
                    {
                        for (int j = 0; j < count; j++)
                        {
                            Font font = ((TextRun)runs[j]).Font;
                            int  num9 = font.Height + font.ExternalLeading;
                            if (num9 > height)
                            {
                                height   = num9;
                                baseline = font.Ascent;
                            }
                        }
                        list2.Add(new TextLine(runs, height, baseline));
                    }
                    else
                    {
                        height = (list2.Count > 0) ? ((TextLine)list2[list2.Count - 1]).Height : 10;
                        list2.Add(new TextLine(height));
                    }
                    runs.Clear();
                    num = 0;
                }
            }
            return(list2);
        }