public void Render(Cairo.Context c, Control control)
        {
            TextBlock textBlock = control as TextBlock;
            Rectangle borderRect;

            c.Save();
            borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height);
            if (!textBlock.CanGrow || DesignMode)
            {
                c.ClipRectangle(borderRect);
            }

            var rect = c.DrawTextBlock(textBlock, false);

            if (!DesignMode && (textBlock.CanGrow && rect.Height > textBlock.Height || textBlock.CanShrink && rect.Height < textBlock.Height))
            {
                borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, rect.Height);
            }
            else
            {
                borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height);
            }

            c.FillRectangle(borderRect, textBlock.BackgroundColor.ToCairoColor());
            c.DrawTextBlock(textBlock, true);
            c.DrawInsideBorder(borderRect, textBlock.Border, true);
            c.Restore();
        }
        /// <summary>
        /// Breaks off contol at most at height.
        /// </summary>
        /// <returns>
        /// Array of two controls: broken control with height equal to height param or lower and second control representing rest part of oryginal control
        /// </returns>
        /// <param name='control'>
        /// Control to broke off
        /// </param>
        /// <param name='height'>
        /// Height.
        /// </param>
        public Control[] BreakOffControlAtMostAtHeight(Cairo.Context c, Control control, double height)
        {
            Control[] controls = new Control[2];

            TextBlock textBlock = control.CreateControl() as TextBlock;

            controls[1] = textBlock;
            var newTextBlock = control.CreateControl() as TextBlock;

            textBlock.Top = 0;
            int charNumber = c.GetBreakLineCharacterIndexbyMaxHeight(textBlock, height);

            if (charNumber > 0)
            {
                newTextBlock.Text    = textBlock.Text.Substring(0, charNumber - 1);
                newTextBlock.Padding = new Thickness(textBlock.Padding.Left, 0, textBlock.Padding.Right, textBlock.Padding.Bottom);
                var newSize = c.DrawTextBlock(newTextBlock, false);
                newTextBlock.Height = newSize.Height;
                textBlock.Height    = textBlock.Height - newSize.Height;
                textBlock.Text      = textBlock.Text.Substring(charNumber - 1);
            }
            else if (charNumber == 0)
            {
                newTextBlock.Height = textBlock.Padding.Top;
                newTextBlock.Text   = String.Empty;
                textBlock.Height    = textBlock.Height - newTextBlock.Height;
            }
            else if (charNumber == -1)
            {
                newTextBlock.Height = height;
                newTextBlock.Text   = String.Empty;
                textBlock.Height    = textBlock.Height - height;
                textBlock.Padding   = new Thickness(textBlock.Padding.Left, textBlock.Padding.Top - height, textBlock.Padding.Right, textBlock.Padding.Bottom);
            }
            else if (charNumber == -2)
            {
                newTextBlock.Height = height;
                textBlock.Text      = String.Empty;
                textBlock.FieldName = String.Empty;
                textBlock.Height    = textBlock.Height - height;
                textBlock.Padding   = new Thickness(textBlock.Padding.Left, textBlock.Padding.Top - height, textBlock.Padding.Right, textBlock.Padding.Bottom);
            }
            controls[0] = newTextBlock;

            return(controls);
        }
        public Size Measure(Cairo.Context c, Control control)
        {
            TextBlock textBlock = control as TextBlock;
            Rectangle borderRect;
            var       rect = c.DrawTextBlock(textBlock, false);

            if (textBlock.CanGrow && rect.Height > textBlock.Height || textBlock.CanShrink && rect.Height < textBlock.Height)
            {
                borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, rect.Height);
            }
            else
            {
                borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height);
            }

            return(new Size(borderRect.Width, borderRect.Height));
        }