Example #1
0
        public override void OnRender(DrawingContext dc)
        {
            if ((this._lineCache != null) && (this._lineCache.Count != 0))
            {
                int num3;
                int num4;
                int count = this._lineCache.Count;
                int num2  = 0;
                base.GetRenderSize(out num3, out num4);
                for (int i = this._currentLine; i < count; i++)
                {
                    int      num6;
                    TextLine line = (TextLine)this._lineCache[i];
                    if ((num2 + line.Height) > num4)
                    {
                        break;
                    }
                    TextRun[] runs = line.Runs;
                    switch (this._alignment)
                    {
                    case GHIElectronics.TinyCLR.UI.Media.TextAlignment.Left:
                        num6 = 0;
                        break;

                    case GHIElectronics.TinyCLR.UI.Media.TextAlignment.Center:
                        num6 = (num3 - line.Width) >> 1;
                        break;

                    case GHIElectronics.TinyCLR.UI.Media.TextAlignment.Right:
                        num6 = num3 - line.Width;
                        break;

                    default:
                        throw new NotSupportedException();
                    }
                    for (int j = 0; j < runs.Length; j++)
                    {
                        int     num8;
                        int     num9;
                        TextRun run = runs[j];
                        run.GetSize(out num8, out num9);
                        int y = (num2 + line.Baseline) - run.Font.Ascent;
                        dc.DrawText(run.Text, run.Font, run.ForeColor, num6, y);
                        num6 += num8;
                    }
                    num2 += line.Height;
                }
            }
        }
Example #2
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);
        }