TextTrimming.cs
//
// This code is part of GrapeCity Documents for Imaging samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Imaging;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace GcImagingWeb.Samples
{
    // This sample demonstrates how to display ellipsis
    // if a string does not fit in the allocated space.
    public class TextTrimming
    {
        public GcBitmap GenerateImage(int pixelWidth = 1024, int pixelHeight = 1024, bool opaque = true, float dpiX = 96, float dpiY = 96)
        {
            var bmp = new GcBitmap(pixelWidth, pixelHeight, true, dpiX, dpiY);
            var Inch = dpiX;
            const float fontSize = 12;
            using (var g = bmp.CreateGraphics(Color.White))
            {
                var str = "This is a long line of text which does not fit in the allocated space.";
                var wid = Inch * 4;
                var dy = 0.3f;

                var rc = Common.Util.AddNote(
                    "TextLayout allows to display ellipsis (or other character) " +
                    "at the end of a text line that did not fit in the allocated space.\n" +
                    "To use trimming, set TrimmingGranularity to Character or Word " +
                    "(the default is None). Trimming will kick in if WrapMode is NoWrap, " +
                    "and the text is too long. Wrapped text may may also display trimming if " +
                    "the layout width is too narrow to fit a single word.\n" +
                    "Below are examples of text untrimmed, trimmed to character and to word. " +
                    "The next line demonstrates a different trimming character (tilde in this case). " +
                    "Finally, the last line shows how to trim text (respecting TrimmingGranularity) " +
                    "without adding any trimming character.",
                    g);
                var top = rc.Bottom + 36;

                var ip = new PointF(rc.Left, top);

                var tl = g.CreateTextLayout();
                tl.DefaultFormat.Font = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf"));
                tl.DefaultFormat.FontSize = fontSize;
                tl.MaxWidth = wid;
                tl.WrapMode = WrapMode.NoWrap;

                // TrimmingGranularity is None by default:
                tl.Append(str);
                tl.PerformLayout(true);
                g.DrawTextLayout(tl, ip);
                ip.Y += tl.ContentHeight + dy;

                // Character trimming:
                tl.TrimmingGranularity = TrimmingGranularity.Character;
                // NOTE that the recalculateGlyphsBeforeLayout parameter to PerformLayout
                // may be false after the first call, as the text/font has not changed:
                tl.PerformLayout(false);
                g.DrawTextLayout(tl, ip);
                ip.Y += tl.ContentHeight + dy;

                // Word trimming:
                tl.TrimmingGranularity = TrimmingGranularity.Word;
                tl.PerformLayout(false);
                g.DrawTextLayout(tl, ip);
                ip.Y += tl.ContentHeight + dy;

                // tl.EllipsisCharCode is HorizontalEllipsis (0x2026) by default.
                // Change it to a tilde:
                tl.EllipsisCharCode = 0x007E;
                tl.PerformLayout(false);
                g.DrawTextLayout(tl, ip);
                ip.Y += tl.ContentHeight + dy;

                // Finally, we may set tl.EllipsisCharCode to 0 to trim text
                // without rendering any trimming character:
                tl.EllipsisCharCode = 0;
                tl.PerformLayout(false);
                g.DrawTextLayout(tl, ip);
                ip.Y += tl.ContentHeight + dy;

                g.DrawRectangle(new RectangleF(rc.Left, top, wid, ip.Y - top), Color.OrangeRed);

                // Draw border around the whole image:
                g.DrawRectangle(new RectangleF(0, 0, bmp.Width, bmp.Height), Color.DarkSlateBlue, 4);
            }
            // Done:
            return bmp;
        }
    }
}