DataGridViewUtilities.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / WinForms / Managed / System / WinForms / DataGridViewUtilities.cs / 1 / DataGridViewUtilities.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Windows.Forms 
{ 
    using System;
    using System.Diagnostics; 
    using System.Drawing;
    using System.Windows.Forms.Internal;
    using System.Drawing.Imaging;
    using System.Windows.Forms.VisualStyles; 

    ///  
    ///  
    ///    
    ///  
    internal class DataGridViewUtilities
    {
        private const byte DATAGRIDVIEWROWHEADERCELL_iconMarginWidth = 3;      // 3 pixels of margin on the left and right of icons
        private const byte DATAGRIDVIEWROWHEADERCELL_iconMarginHeight = 2;     // 2 pixels of margin on the top and bottom of icons 
        private const byte DATAGRIDVIEWROWHEADERCELL_contentMarginWidth = 3;   // 3 pixels of margin on the left and right of content
        private const byte DATAGRIDVIEWROWHEADERCELL_contentMarginHeight = 3;  // 3 pixels of margin on the top and bottom of content 
        private const byte DATAGRIDVIEWROWHEADERCELL_iconsWidth = 12;          // all icons are 12 pixels wide - make sure that is stays that way 
        private const byte DATAGRIDVIEWROWHEADERCELL_iconsHeight = 11;         // all icons are 11 pixels tall - make sure that is stays that way
 
        private const byte DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft = 1;
        private const byte DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight = 2;
        private const byte DATAGRIDVIEWROWHEADERCELL_verticalTextMargin = 1;
 
        /// 
        internal static System.Drawing.ContentAlignment ComputeDrawingContentAlignmentForCellStyleAlignment(DataGridViewContentAlignment alignment) 
        { 
            // Why isn't the DataGridView using System.Drawing.ContentAlignment?
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft:
                    return System.Drawing.ContentAlignment.TopLeft;
                case DataGridViewContentAlignment.TopCenter: 
                    return System.Drawing.ContentAlignment.TopCenter;
                case DataGridViewContentAlignment.TopRight: 
                    return System.Drawing.ContentAlignment.TopRight; 
                case DataGridViewContentAlignment.MiddleLeft:
                    return System.Drawing.ContentAlignment.MiddleLeft; 
                case DataGridViewContentAlignment.MiddleCenter:
                    return System.Drawing.ContentAlignment.MiddleCenter;
                case DataGridViewContentAlignment.MiddleRight:
                    return System.Drawing.ContentAlignment.MiddleRight; 
                case DataGridViewContentAlignment.BottomLeft:
                    return System.Drawing.ContentAlignment.BottomLeft; 
                case DataGridViewContentAlignment.BottomCenter: 
                    return System.Drawing.ContentAlignment.BottomCenter;
                case DataGridViewContentAlignment.BottomRight: 
                    return System.Drawing.ContentAlignment.BottomRight;
                default:
                    return System.Drawing.ContentAlignment.MiddleCenter;
            } 
        }
 
        ///  
        internal static TextFormatFlags ComputeTextFormatFlagsForCellStyleAlignment(bool rightToLeft,
                                                                                    DataGridViewContentAlignment alignment, 
                                                                                    DataGridViewTriState wrapMode)
        {
            TextFormatFlags tff;
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft: 
                    tff = TextFormatFlags.Top; 
                    if (rightToLeft)
                    { 
                        tff |= TextFormatFlags.Right;
                    }
                    else
                    { 
                        tff |= TextFormatFlags.Left;
                    } 
                    break; 
                case DataGridViewContentAlignment.TopCenter:
                    tff = TextFormatFlags.Top | TextFormatFlags.HorizontalCenter; 
                    break;
                case DataGridViewContentAlignment.TopRight:
                    tff = TextFormatFlags.Top;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Left; 
                    } 
                    else
                    { 
                        tff |= TextFormatFlags.Right;
                    }
                    break;
                case DataGridViewContentAlignment.MiddleLeft: 
                    tff = TextFormatFlags.VerticalCenter;
                    if (rightToLeft) 
                    { 
                        tff |= TextFormatFlags.Right;
                    } 
                    else
                    {
                        tff |= TextFormatFlags.Left;
                    } 
                    break;
                case DataGridViewContentAlignment.MiddleCenter: 
                    tff = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter; 
                    break;
                case DataGridViewContentAlignment.MiddleRight: 
                    tff = TextFormatFlags.VerticalCenter;
                    if (rightToLeft)
                    {
                        tff |= TextFormatFlags.Left; 
                    }
                    else 
                    { 
                        tff |= TextFormatFlags.Right;
                    } 
                    break;
                case DataGridViewContentAlignment.BottomLeft:
                    tff = TextFormatFlags.Bottom;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Right; 
                    } 
                    else
                    { 
                        tff |= TextFormatFlags.Left;
                    }
                    break;
                case DataGridViewContentAlignment.BottomCenter: 
                    tff = TextFormatFlags.Bottom | TextFormatFlags.HorizontalCenter;
                    break; 
                case DataGridViewContentAlignment.BottomRight: 
                    tff = TextFormatFlags.Bottom;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Left;
                    }
                    else 
                    {
                        tff |= TextFormatFlags.Right; 
                    } 
                    break;
                default: 
                    tff = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter;
                    break;
            }
            if (wrapMode == DataGridViewTriState.False) 
            {
                tff |= TextFormatFlags.SingleLine; 
            } 
            else
            { 
                //tff |= TextFormatFlags.NoFullWidthCharacterBreak;  VSWhidbey 518422
                tff |= TextFormatFlags.WordBreak;
            }
            tff |= TextFormatFlags.NoPrefix; 
            tff |= TextFormatFlags.PreserveGraphicsClipping;
            if (rightToLeft) 
            { 
                tff |= TextFormatFlags.RightToLeft;
            } 
            return tff;
        }

 
        /// 
        internal static Size GetPreferredRowHeaderSize(Graphics graphics, 
                                                       string val, 
                                                       DataGridViewCellStyle cellStyle,
                                                       int borderAndPaddingWidths, 
                                                       int borderAndPaddingHeights,
                                                       bool showRowErrors,
                                                       bool showGlyph,
                                                       Size constraintSize, 
                                                       TextFormatFlags flags)
        { 
            Size preferredSize; 
            DataGridViewFreeDimension freeDimension = DataGridViewCell.GetFreeDimensionFromConstraint(constraintSize);
 
            switch (freeDimension)
            {
                case DataGridViewFreeDimension.Width:
                { 
                    int preferredWidth = 0, allowedHeight = constraintSize.Height - borderAndPaddingHeights;
                    if (!String.IsNullOrEmpty(val)) 
                    { 
                        int maxHeight = allowedHeight - 2 * DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                        if (maxHeight > 0) 
                        {
                            if (cellStyle.WrapMode == DataGridViewTriState.True)
                            {
                                preferredWidth = DataGridViewCell.MeasureTextWidth(graphics, val, cellStyle.Font, maxHeight, flags); 
                            }
                            else 
                            { 
                                preferredWidth = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags).Width;
                            } 
                            preferredWidth += 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth + DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight;
                        }
                    }
                    if (allowedHeight >= DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight) 
                    {
                        if (showGlyph) 
                        { 
                            preferredWidth += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth;
                        } 
                        if (showRowErrors)
                        {
                            preferredWidth += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth;
                        } 
                    }
                    preferredWidth = Math.Max(preferredWidth, 1); 
                    preferredWidth += borderAndPaddingWidths; 
                    return new Size(preferredWidth, 0);
                } 
                case DataGridViewFreeDimension.Height:
                {
                    int minHeightIcon = 1, minHeightContent = 1;
                    int allowedWidth = constraintSize.Width - borderAndPaddingWidths; 
                    if (!String.IsNullOrEmpty(val))
                    { 
                        if (showGlyph && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth) 
                        {
                            // There is enough room for the status icon 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                            // Status icon takes priority
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth;
                        } 
                        if (showRowErrors && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth)
                        { 
                            // There is enough room for the error icon 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                            // There is enough room for both the status and error icons 
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth;
                        }
                        if (allowedWidth > 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth +
                                           DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + 
                                           DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight)
                        { 
                            // There is enough room for text 
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth +
                                            DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + 
                                            DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight;
                            if (cellStyle.WrapMode == DataGridViewTriState.True)
                            {
                                minHeightContent = DataGridViewCell.MeasureTextHeight(graphics, val, cellStyle.Font, allowedWidth, flags); 
                            }
                            else 
                            { 
                                minHeightContent = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags).Height;
                            } 
                            minHeightContent += 2 * DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                        }
                    }
                    else 
                    {
                        if ((showGlyph || showRowErrors) && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth) 
                        { 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                        } 
                    }
                    return new Size(0, Math.Max(minHeightIcon, minHeightContent) + borderAndPaddingHeights);
                }
                default: 
                {
                    if (!String.IsNullOrEmpty(val)) 
                    { 
                        if (cellStyle.WrapMode == DataGridViewTriState.True)
                        { 
                            preferredSize = DataGridViewCell.MeasureTextPreferredSize(graphics, val, cellStyle.Font, 5.0F, flags);
                        }
                        else
                        { 
                            preferredSize = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags);
                        } 
                        preferredSize.Width += 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth + 
                                               DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft +
                                               DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight; 
                        preferredSize.Height += 2*DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                    }
                    else
                    { 
                        preferredSize = new Size(0, 1);
                    } 
                    if (showGlyph) 
                    {
                        preferredSize.Width += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth; 
                    }
                    if (showRowErrors)
                    {
                        preferredSize.Width += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth; 
                    }
                    if (showGlyph || showRowErrors) 
                    { 
                        preferredSize.Height = Math.Max(preferredSize.Height,
                                                        DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight); 
                    }
                    preferredSize.Width += borderAndPaddingWidths;
                    preferredSize.Height += borderAndPaddingHeights;
                    return preferredSize; 
                }
            } 
        } 

        internal static Rectangle GetTextBounds(Rectangle cellBounds, 
                                                string text,
                                                TextFormatFlags flags,
                                                DataGridViewCellStyle cellStyle)
        { 
            return GetTextBounds(cellBounds, text, flags, cellStyle, cellStyle.Font);
        } 
 
        internal static Rectangle GetTextBounds(Rectangle cellBounds,
                                                string text, 
                                                TextFormatFlags flags,
                                                DataGridViewCellStyle cellStyle,
                                                Font font)
        { 
            if ((flags & TextFormatFlags.SingleLine) != 0)
            { 
                Size sizeRequired = TextRenderer.MeasureText(text, font, new Size(System.Int32.MaxValue, System.Int32.MaxValue), flags); 
                if (sizeRequired.Width > cellBounds.Width)
                { 
                    flags |= TextFormatFlags.EndEllipsis;
                }
            }
 
            Size sizeCell = new Size(cellBounds.Width, cellBounds.Height);
            Size sizeConstraint = TextRenderer.MeasureText(text, font, sizeCell, flags); 
            if (sizeConstraint.Width > sizeCell.Width) 
            {
                sizeConstraint.Width = sizeCell.Width; 
            }
            if (sizeConstraint.Height > sizeCell.Height)
            {
                sizeConstraint.Height = sizeCell.Height; 
            }
            if (sizeConstraint == sizeCell) 
            { 
                return cellBounds;
            } 
            return new Rectangle(GetTextLocation(cellBounds, sizeConstraint, flags, cellStyle), sizeConstraint);
        }

        internal static Point GetTextLocation(Rectangle cellBounds, 
                                              Size sizeText,
                                              TextFormatFlags flags, 
                                              DataGridViewCellStyle cellStyle) 
        {
            Point ptTextLocation = new Point(0, 0); 

            // now use the alignment on the cellStyle to determine the final text location
            DataGridViewContentAlignment alignment = cellStyle.Alignment;
            if ((flags & TextFormatFlags.RightToLeft) != 0) 
            {
                switch (alignment) 
                { 
                    case DataGridViewContentAlignment.TopLeft:
                        alignment = DataGridViewContentAlignment.TopRight; 
                        break;

                    case DataGridViewContentAlignment.TopRight:
                        alignment = DataGridViewContentAlignment.TopLeft; 
                        break;
 
                    case DataGridViewContentAlignment.MiddleLeft: 
                        alignment = DataGridViewContentAlignment.MiddleRight;
                        break; 

                    case DataGridViewContentAlignment.MiddleRight:
                        alignment = DataGridViewContentAlignment.MiddleLeft;
                        break; 

                    case DataGridViewContentAlignment.BottomLeft: 
                        alignment = DataGridViewContentAlignment.BottomRight; 
                        break;
 
                    case DataGridViewContentAlignment.BottomRight:
                        alignment = DataGridViewContentAlignment.BottomLeft;
                        break;
                } 
            }
 
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft: 
                    ptTextLocation.X = cellBounds.X;
                    ptTextLocation.Y = cellBounds.Y;
                    break;
 
                case DataGridViewContentAlignment.TopCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2; 
                    ptTextLocation.Y = cellBounds.Y; 
                    break;
 
                case DataGridViewContentAlignment.TopRight:
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Y;
                    break; 

                case DataGridViewContentAlignment.MiddleLeft: 
                    ptTextLocation.X = cellBounds.X; 
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2;
                    break; 

                case DataGridViewContentAlignment.MiddleCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2;
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2; 
                    break;
 
                case DataGridViewContentAlignment.MiddleRight: 
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2; 
                    break;

                case DataGridViewContentAlignment.BottomLeft:
                    ptTextLocation.X = cellBounds.X; 
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height;
                    break; 
 
                case DataGridViewContentAlignment.BottomCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2; 
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height;
                    break;

                case DataGridViewContentAlignment.BottomRight: 
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height; 
                    break; 

                default: 
                    Debug.Assert(cellStyle.Alignment == DataGridViewContentAlignment.NotSet, "this is the only alignment left");
                    break;
            }
            return ptTextLocation; 
        }
 
        internal static bool ValidTextFormatFlags(TextFormatFlags flags) 
        {
            return (flags & ~(TextFormatFlags.Bottom | 
                              TextFormatFlags.Default |
                              TextFormatFlags.EndEllipsis |
                              TextFormatFlags.ExpandTabs |
                              TextFormatFlags.ExternalLeading | 
                              TextFormatFlags.HidePrefix |
                              TextFormatFlags.HorizontalCenter | 
                              TextFormatFlags.Internal | 
                              TextFormatFlags.Left |
                              TextFormatFlags.ModifyString | 
                              TextFormatFlags.NoClipping |
                              TextFormatFlags.NoFullWidthCharacterBreak |
                              TextFormatFlags.NoPrefix |
                              TextFormatFlags.PathEllipsis | 
                              TextFormatFlags.PrefixOnly |
                              TextFormatFlags.PreserveGraphicsClipping | 
                              TextFormatFlags.PreserveGraphicsTranslateTransform | 
                              TextFormatFlags.Right |
                              TextFormatFlags.RightToLeft | 
                              TextFormatFlags.SingleLine |
                              TextFormatFlags.TextBoxControl |
                              TextFormatFlags.Top |
                              TextFormatFlags.VerticalCenter | 
                              TextFormatFlags.WordBreak |
                              TextFormatFlags.WordEllipsis)) == 0; 
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Windows.Forms 
{ 
    using System;
    using System.Diagnostics; 
    using System.Drawing;
    using System.Windows.Forms.Internal;
    using System.Drawing.Imaging;
    using System.Windows.Forms.VisualStyles; 

    ///  
    ///  
    ///    
    ///  
    internal class DataGridViewUtilities
    {
        private const byte DATAGRIDVIEWROWHEADERCELL_iconMarginWidth = 3;      // 3 pixels of margin on the left and right of icons
        private const byte DATAGRIDVIEWROWHEADERCELL_iconMarginHeight = 2;     // 2 pixels of margin on the top and bottom of icons 
        private const byte DATAGRIDVIEWROWHEADERCELL_contentMarginWidth = 3;   // 3 pixels of margin on the left and right of content
        private const byte DATAGRIDVIEWROWHEADERCELL_contentMarginHeight = 3;  // 3 pixels of margin on the top and bottom of content 
        private const byte DATAGRIDVIEWROWHEADERCELL_iconsWidth = 12;          // all icons are 12 pixels wide - make sure that is stays that way 
        private const byte DATAGRIDVIEWROWHEADERCELL_iconsHeight = 11;         // all icons are 11 pixels tall - make sure that is stays that way
 
        private const byte DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft = 1;
        private const byte DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight = 2;
        private const byte DATAGRIDVIEWROWHEADERCELL_verticalTextMargin = 1;
 
        /// 
        internal static System.Drawing.ContentAlignment ComputeDrawingContentAlignmentForCellStyleAlignment(DataGridViewContentAlignment alignment) 
        { 
            // Why isn't the DataGridView using System.Drawing.ContentAlignment?
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft:
                    return System.Drawing.ContentAlignment.TopLeft;
                case DataGridViewContentAlignment.TopCenter: 
                    return System.Drawing.ContentAlignment.TopCenter;
                case DataGridViewContentAlignment.TopRight: 
                    return System.Drawing.ContentAlignment.TopRight; 
                case DataGridViewContentAlignment.MiddleLeft:
                    return System.Drawing.ContentAlignment.MiddleLeft; 
                case DataGridViewContentAlignment.MiddleCenter:
                    return System.Drawing.ContentAlignment.MiddleCenter;
                case DataGridViewContentAlignment.MiddleRight:
                    return System.Drawing.ContentAlignment.MiddleRight; 
                case DataGridViewContentAlignment.BottomLeft:
                    return System.Drawing.ContentAlignment.BottomLeft; 
                case DataGridViewContentAlignment.BottomCenter: 
                    return System.Drawing.ContentAlignment.BottomCenter;
                case DataGridViewContentAlignment.BottomRight: 
                    return System.Drawing.ContentAlignment.BottomRight;
                default:
                    return System.Drawing.ContentAlignment.MiddleCenter;
            } 
        }
 
        ///  
        internal static TextFormatFlags ComputeTextFormatFlagsForCellStyleAlignment(bool rightToLeft,
                                                                                    DataGridViewContentAlignment alignment, 
                                                                                    DataGridViewTriState wrapMode)
        {
            TextFormatFlags tff;
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft: 
                    tff = TextFormatFlags.Top; 
                    if (rightToLeft)
                    { 
                        tff |= TextFormatFlags.Right;
                    }
                    else
                    { 
                        tff |= TextFormatFlags.Left;
                    } 
                    break; 
                case DataGridViewContentAlignment.TopCenter:
                    tff = TextFormatFlags.Top | TextFormatFlags.HorizontalCenter; 
                    break;
                case DataGridViewContentAlignment.TopRight:
                    tff = TextFormatFlags.Top;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Left; 
                    } 
                    else
                    { 
                        tff |= TextFormatFlags.Right;
                    }
                    break;
                case DataGridViewContentAlignment.MiddleLeft: 
                    tff = TextFormatFlags.VerticalCenter;
                    if (rightToLeft) 
                    { 
                        tff |= TextFormatFlags.Right;
                    } 
                    else
                    {
                        tff |= TextFormatFlags.Left;
                    } 
                    break;
                case DataGridViewContentAlignment.MiddleCenter: 
                    tff = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter; 
                    break;
                case DataGridViewContentAlignment.MiddleRight: 
                    tff = TextFormatFlags.VerticalCenter;
                    if (rightToLeft)
                    {
                        tff |= TextFormatFlags.Left; 
                    }
                    else 
                    { 
                        tff |= TextFormatFlags.Right;
                    } 
                    break;
                case DataGridViewContentAlignment.BottomLeft:
                    tff = TextFormatFlags.Bottom;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Right; 
                    } 
                    else
                    { 
                        tff |= TextFormatFlags.Left;
                    }
                    break;
                case DataGridViewContentAlignment.BottomCenter: 
                    tff = TextFormatFlags.Bottom | TextFormatFlags.HorizontalCenter;
                    break; 
                case DataGridViewContentAlignment.BottomRight: 
                    tff = TextFormatFlags.Bottom;
                    if (rightToLeft) 
                    {
                        tff |= TextFormatFlags.Left;
                    }
                    else 
                    {
                        tff |= TextFormatFlags.Right; 
                    } 
                    break;
                default: 
                    tff = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter;
                    break;
            }
            if (wrapMode == DataGridViewTriState.False) 
            {
                tff |= TextFormatFlags.SingleLine; 
            } 
            else
            { 
                //tff |= TextFormatFlags.NoFullWidthCharacterBreak;  VSWhidbey 518422
                tff |= TextFormatFlags.WordBreak;
            }
            tff |= TextFormatFlags.NoPrefix; 
            tff |= TextFormatFlags.PreserveGraphicsClipping;
            if (rightToLeft) 
            { 
                tff |= TextFormatFlags.RightToLeft;
            } 
            return tff;
        }

 
        /// 
        internal static Size GetPreferredRowHeaderSize(Graphics graphics, 
                                                       string val, 
                                                       DataGridViewCellStyle cellStyle,
                                                       int borderAndPaddingWidths, 
                                                       int borderAndPaddingHeights,
                                                       bool showRowErrors,
                                                       bool showGlyph,
                                                       Size constraintSize, 
                                                       TextFormatFlags flags)
        { 
            Size preferredSize; 
            DataGridViewFreeDimension freeDimension = DataGridViewCell.GetFreeDimensionFromConstraint(constraintSize);
 
            switch (freeDimension)
            {
                case DataGridViewFreeDimension.Width:
                { 
                    int preferredWidth = 0, allowedHeight = constraintSize.Height - borderAndPaddingHeights;
                    if (!String.IsNullOrEmpty(val)) 
                    { 
                        int maxHeight = allowedHeight - 2 * DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                        if (maxHeight > 0) 
                        {
                            if (cellStyle.WrapMode == DataGridViewTriState.True)
                            {
                                preferredWidth = DataGridViewCell.MeasureTextWidth(graphics, val, cellStyle.Font, maxHeight, flags); 
                            }
                            else 
                            { 
                                preferredWidth = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags).Width;
                            } 
                            preferredWidth += 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth + DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight;
                        }
                    }
                    if (allowedHeight >= DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight) 
                    {
                        if (showGlyph) 
                        { 
                            preferredWidth += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth;
                        } 
                        if (showRowErrors)
                        {
                            preferredWidth += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth;
                        } 
                    }
                    preferredWidth = Math.Max(preferredWidth, 1); 
                    preferredWidth += borderAndPaddingWidths; 
                    return new Size(preferredWidth, 0);
                } 
                case DataGridViewFreeDimension.Height:
                {
                    int minHeightIcon = 1, minHeightContent = 1;
                    int allowedWidth = constraintSize.Width - borderAndPaddingWidths; 
                    if (!String.IsNullOrEmpty(val))
                    { 
                        if (showGlyph && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth) 
                        {
                            // There is enough room for the status icon 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                            // Status icon takes priority
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth;
                        } 
                        if (showRowErrors && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth)
                        { 
                            // There is enough room for the error icon 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                            // There is enough room for both the status and error icons 
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth;
                        }
                        if (allowedWidth > 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth +
                                           DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + 
                                           DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight)
                        { 
                            // There is enough room for text 
                            allowedWidth -= 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth +
                                            DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft + 
                                            DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight;
                            if (cellStyle.WrapMode == DataGridViewTriState.True)
                            {
                                minHeightContent = DataGridViewCell.MeasureTextHeight(graphics, val, cellStyle.Font, allowedWidth, flags); 
                            }
                            else 
                            { 
                                minHeightContent = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags).Height;
                            } 
                            minHeightContent += 2 * DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                        }
                    }
                    else 
                    {
                        if ((showGlyph || showRowErrors) && allowedWidth >= 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth + DATAGRIDVIEWROWHEADERCELL_iconsWidth) 
                        { 
                            minHeightIcon = DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight;
                        } 
                    }
                    return new Size(0, Math.Max(minHeightIcon, minHeightContent) + borderAndPaddingHeights);
                }
                default: 
                {
                    if (!String.IsNullOrEmpty(val)) 
                    { 
                        if (cellStyle.WrapMode == DataGridViewTriState.True)
                        { 
                            preferredSize = DataGridViewCell.MeasureTextPreferredSize(graphics, val, cellStyle.Font, 5.0F, flags);
                        }
                        else
                        { 
                            preferredSize = DataGridViewCell.MeasureTextSize(graphics, val, cellStyle.Font, flags);
                        } 
                        preferredSize.Width += 2 * DATAGRIDVIEWROWHEADERCELL_contentMarginWidth + 
                                               DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginLeft +
                                               DATAGRIDVIEWROWHEADERCELL_horizontalTextMarginRight; 
                        preferredSize.Height += 2*DATAGRIDVIEWROWHEADERCELL_verticalTextMargin;
                    }
                    else
                    { 
                        preferredSize = new Size(0, 1);
                    } 
                    if (showGlyph) 
                    {
                        preferredSize.Width += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth; 
                    }
                    if (showRowErrors)
                    {
                        preferredSize.Width += DATAGRIDVIEWROWHEADERCELL_iconsWidth + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginWidth; 
                    }
                    if (showGlyph || showRowErrors) 
                    { 
                        preferredSize.Height = Math.Max(preferredSize.Height,
                                                        DATAGRIDVIEWROWHEADERCELL_iconsHeight + 2 * DATAGRIDVIEWROWHEADERCELL_iconMarginHeight); 
                    }
                    preferredSize.Width += borderAndPaddingWidths;
                    preferredSize.Height += borderAndPaddingHeights;
                    return preferredSize; 
                }
            } 
        } 

        internal static Rectangle GetTextBounds(Rectangle cellBounds, 
                                                string text,
                                                TextFormatFlags flags,
                                                DataGridViewCellStyle cellStyle)
        { 
            return GetTextBounds(cellBounds, text, flags, cellStyle, cellStyle.Font);
        } 
 
        internal static Rectangle GetTextBounds(Rectangle cellBounds,
                                                string text, 
                                                TextFormatFlags flags,
                                                DataGridViewCellStyle cellStyle,
                                                Font font)
        { 
            if ((flags & TextFormatFlags.SingleLine) != 0)
            { 
                Size sizeRequired = TextRenderer.MeasureText(text, font, new Size(System.Int32.MaxValue, System.Int32.MaxValue), flags); 
                if (sizeRequired.Width > cellBounds.Width)
                { 
                    flags |= TextFormatFlags.EndEllipsis;
                }
            }
 
            Size sizeCell = new Size(cellBounds.Width, cellBounds.Height);
            Size sizeConstraint = TextRenderer.MeasureText(text, font, sizeCell, flags); 
            if (sizeConstraint.Width > sizeCell.Width) 
            {
                sizeConstraint.Width = sizeCell.Width; 
            }
            if (sizeConstraint.Height > sizeCell.Height)
            {
                sizeConstraint.Height = sizeCell.Height; 
            }
            if (sizeConstraint == sizeCell) 
            { 
                return cellBounds;
            } 
            return new Rectangle(GetTextLocation(cellBounds, sizeConstraint, flags, cellStyle), sizeConstraint);
        }

        internal static Point GetTextLocation(Rectangle cellBounds, 
                                              Size sizeText,
                                              TextFormatFlags flags, 
                                              DataGridViewCellStyle cellStyle) 
        {
            Point ptTextLocation = new Point(0, 0); 

            // now use the alignment on the cellStyle to determine the final text location
            DataGridViewContentAlignment alignment = cellStyle.Alignment;
            if ((flags & TextFormatFlags.RightToLeft) != 0) 
            {
                switch (alignment) 
                { 
                    case DataGridViewContentAlignment.TopLeft:
                        alignment = DataGridViewContentAlignment.TopRight; 
                        break;

                    case DataGridViewContentAlignment.TopRight:
                        alignment = DataGridViewContentAlignment.TopLeft; 
                        break;
 
                    case DataGridViewContentAlignment.MiddleLeft: 
                        alignment = DataGridViewContentAlignment.MiddleRight;
                        break; 

                    case DataGridViewContentAlignment.MiddleRight:
                        alignment = DataGridViewContentAlignment.MiddleLeft;
                        break; 

                    case DataGridViewContentAlignment.BottomLeft: 
                        alignment = DataGridViewContentAlignment.BottomRight; 
                        break;
 
                    case DataGridViewContentAlignment.BottomRight:
                        alignment = DataGridViewContentAlignment.BottomLeft;
                        break;
                } 
            }
 
            switch (alignment) 
            {
                case DataGridViewContentAlignment.TopLeft: 
                    ptTextLocation.X = cellBounds.X;
                    ptTextLocation.Y = cellBounds.Y;
                    break;
 
                case DataGridViewContentAlignment.TopCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2; 
                    ptTextLocation.Y = cellBounds.Y; 
                    break;
 
                case DataGridViewContentAlignment.TopRight:
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Y;
                    break; 

                case DataGridViewContentAlignment.MiddleLeft: 
                    ptTextLocation.X = cellBounds.X; 
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2;
                    break; 

                case DataGridViewContentAlignment.MiddleCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2;
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2; 
                    break;
 
                case DataGridViewContentAlignment.MiddleRight: 
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Y + (cellBounds.Height - sizeText.Height) / 2; 
                    break;

                case DataGridViewContentAlignment.BottomLeft:
                    ptTextLocation.X = cellBounds.X; 
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height;
                    break; 
 
                case DataGridViewContentAlignment.BottomCenter:
                    ptTextLocation.X = cellBounds.X + (cellBounds.Width - sizeText.Width) / 2; 
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height;
                    break;

                case DataGridViewContentAlignment.BottomRight: 
                    ptTextLocation.X = cellBounds.Right - sizeText.Width;
                    ptTextLocation.Y = cellBounds.Bottom - sizeText.Height; 
                    break; 

                default: 
                    Debug.Assert(cellStyle.Alignment == DataGridViewContentAlignment.NotSet, "this is the only alignment left");
                    break;
            }
            return ptTextLocation; 
        }
 
        internal static bool ValidTextFormatFlags(TextFormatFlags flags) 
        {
            return (flags & ~(TextFormatFlags.Bottom | 
                              TextFormatFlags.Default |
                              TextFormatFlags.EndEllipsis |
                              TextFormatFlags.ExpandTabs |
                              TextFormatFlags.ExternalLeading | 
                              TextFormatFlags.HidePrefix |
                              TextFormatFlags.HorizontalCenter | 
                              TextFormatFlags.Internal | 
                              TextFormatFlags.Left |
                              TextFormatFlags.ModifyString | 
                              TextFormatFlags.NoClipping |
                              TextFormatFlags.NoFullWidthCharacterBreak |
                              TextFormatFlags.NoPrefix |
                              TextFormatFlags.PathEllipsis | 
                              TextFormatFlags.PrefixOnly |
                              TextFormatFlags.PreserveGraphicsClipping | 
                              TextFormatFlags.PreserveGraphicsTranslateTransform | 
                              TextFormatFlags.Right |
                              TextFormatFlags.RightToLeft | 
                              TextFormatFlags.SingleLine |
                              TextFormatFlags.TextBoxControl |
                              TextFormatFlags.Top |
                              TextFormatFlags.VerticalCenter | 
                              TextFormatFlags.WordBreak |
                              TextFormatFlags.WordEllipsis)) == 0; 
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK