Smrf.NodeXL.ExcelTemplate.AutoFillResultsLegendControl.DrawColorCategoryResults C# (CSharp) Method

DrawColorCategoryResults() protected method

protected DrawColorCategoryResults ( DrawingObjects oDrawingObjects, ICollection oCategoryNames, GetShapeAndColorForCategory oShapeAndColorGetter, Rectangle oColumnRectangle, Int32 &iTop ) : void
oDrawingObjects DrawingObjects
oCategoryNames ICollection
oShapeAndColorGetter GetShapeAndColorForCategory
oColumnRectangle System.Drawing.Rectangle
iTop System.Int32
return void
    DrawColorCategoryResults
    (
        DrawingObjects oDrawingObjects,
        ICollection<String> oCategoryNames,
        GetShapeAndColorForCategory oShapeAndColorGetter,
        Rectangle oColumnRectangle,
        ref Int32 iTop
    )
    {
        Debug.Assert(oDrawingObjects != null);
        Debug.Assert(oCategoryNames != null);
        AssertValid();

        Graphics oGraphics = oDrawingObjects.Graphics;
        iTop += oDrawingObjects.GetFontHeightMultiple(0.2F);

        // The categories are drawn from left to right.  Each category is drawn
        // as a shape followed by the category name.

        // Calculate the width of one category column.

        Single fShapeWidth = CategoryShapeFactor * oDrawingObjects.FontHeight;
        Single fShapeHalfWidth = fShapeWidth / 2F;

        Single fColumnWidth = (Single)Math.Ceiling( fShapeWidth +
            (MaximumCategoryNameLength * oDrawingObjects.FontHeight) );

        // How many columns will fit?  There must be at least one, even if
        // there isn't enough room for one column.

        Debug.Assert(fColumnWidth > 0);

        Int32 iColumns = Math.Max( 1,
            (Int32)(oColumnRectangle.Width / fColumnWidth) );

        fColumnWidth = (Single)oColumnRectangle.Width / (Single)iColumns;

        Int32 iCategories = oCategoryNames.Count;
        Int32 iColumn = 0;
        Single fLeft = oColumnRectangle.Left;

        Pen oPen = new Pen(Color.Black, 1.0F);
        oPen.Alignment = PenAlignment.Inset;

        SolidBrush oBrush = new SolidBrush(Color.Black);

        SmoothingMode eOldSmoothingMode = oGraphics.SmoothingMode;
        oGraphics.SmoothingMode = SmoothingMode.HighQuality;
        Int32 i = 0;

        foreach (String sCategoryName in oCategoryNames)
        {
            // Get the shape and color for this category.

            VertexShape eVertexShape;
            Color oVertexColor;

            oShapeAndColorGetter(i, out eVertexShape, out oVertexColor);

            DrawVertexCategoryShape(oDrawingObjects, eVertexShape, oPen,
                oBrush, oVertexColor,
                fLeft + fShapeHalfWidth + 2,
                iTop + fShapeHalfWidth + 1,
                fShapeHalfWidth);

            // Don't let the category name spill over into the next column.

            Single fTopOffset = fShapeWidth * 0.15F;

            Rectangle oNameRectangle = Rectangle.FromLTRB(
                (Int32)(fLeft + fShapeWidth * 1.4F),
                (Int32)(iTop + fTopOffset),
                (Int32)(fLeft + fColumnWidth),
                (Int32)(iTop + oDrawingObjects.FontHeight + fTopOffset)
                );

            oGraphics.DrawString(sCategoryName, oDrawingObjects.Font,
                SystemBrushes.WindowText, oNameRectangle,
                oDrawingObjects.TrimmingStringFormat);

            if (iCategories > MaximumCategoriesToDraw &&
                i == MaximumCategoriesToDraw - 1)
            {
                oGraphics.DrawString(
                    "There are additional categories that are not shown here.",
                    oDrawingObjects.Font, SystemBrushes.WindowText,
                    oColumnRectangle.Left,
                    iTop + 1.5F * oDrawingObjects.FontHeight);

                iTop += oDrawingObjects.GetFontHeightMultiple(3F);
                break;
            }

            oGraphics.DrawLine( SystemPens.ControlLight,
                oNameRectangle.Right - 1,
                iTop,
                oNameRectangle.Right - 1,
                iTop + oDrawingObjects.GetFontHeightMultiple(1.4F)
                );

            iColumn++;
            fLeft += fColumnWidth;
            Boolean bIncrementTop = false;

            if (iColumn == iColumns)
            {
                iColumn = 0;
                fLeft = oColumnRectangle.Left;
                bIncrementTop = true;
            }
            else if (i == iCategories - 1)
            {
                bIncrementTop = true;
            }

            if (bIncrementTop)
            {
                iTop += oDrawingObjects.GetFontHeightMultiple(1.4F);

                // Draw a line separating these results from the next.

                DrawHorizontalSeparator(oDrawingObjects, oColumnRectangle,
                    ref iTop);

                iTop += oDrawingObjects.GetFontHeightMultiple(0.2F);
            }

            i++;
        }

        oPen.Dispose();
        oBrush.Dispose();
        oGraphics.SmoothingMode = eOldSmoothingMode;
    }