/// <summary> /// Draws the legend. /// </summary> internal override void Draw() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; LegendRendererInfo lri = cri.legendRendererInfo; if (lri == null) { return; } XGraphics gfx = _rendererParms.Graphics; RendererParameters parms = new RendererParameters { Graphics = gfx }; LegendEntryRenderer ler = new LegendEntryRenderer(parms); bool verticalLegend = lri._legend._docking == DockingType.Left || lri._legend._docking == DockingType.Right; int paddingFactor = 1; if (lri.BorderPen != null) { paddingFactor = 2; } XRect legendRect = lri.Rect; legendRect.X += LegendRenderer.LeftPadding * paddingFactor; legendRect.Y += LegendRenderer.TopPadding * paddingFactor; foreach (LegendEntryRendererInfo leri in cri.legendRendererInfo.Entries) { XRect entryRect = legendRect; entryRect.Width = leri.Width; entryRect.Height = leri.Height; leri.Rect = entryRect; parms.RendererInfo = leri; ler.Draw(); if (verticalLegend) { legendRect.Y += entryRect.Height + LegendRenderer.EntrySpacing; } else { legendRect.X += entryRect.Width + LegendRenderer.EntrySpacing; } } // Draw border around legend if (lri.BorderPen != null) { XRect borderRect = lri.Rect; borderRect.X += LegendRenderer.LeftPadding; borderRect.Y += LegendRenderer.TopPadding; borderRect.Width -= LegendRenderer.LeftPadding + LegendRenderer.RightPadding; borderRect.Height -= LegendRenderer.TopPadding + LegendRenderer.BottomPadding; gfx.DrawRectangle(lri.BorderPen, borderRect); } }
/// <summary> /// Layouts and calculates the space used by the legend. /// </summary> internal override void Format() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; LegendRendererInfo lri = cri.legendRendererInfo; if (lri == null) { return; } RendererParameters parms = new RendererParameters { Graphics = _rendererParms.Graphics }; bool verticalLegend = lri._legend._docking == DockingType.Left || lri._legend._docking == DockingType.Right; XSize maxMarkerArea = new XSize(); LegendEntryRenderer ler = new LegendEntryRenderer(parms); foreach (LegendEntryRendererInfo leri in lri.Entries) { parms.RendererInfo = leri; ler.Format(); maxMarkerArea.Width = Math.Max(leri.MarkerArea.Width, maxMarkerArea.Width); maxMarkerArea.Height = Math.Max(leri.MarkerArea.Height, maxMarkerArea.Height); if (verticalLegend) { lri.Width = Math.Max(lri.Width, leri.Width); lri.Height += leri.Height; } else { lri.Width += leri.Width; lri.Height = Math.Max(lri.Height, leri.Height); } } // Add padding to left, right, top and bottom int paddingFactor = 1; if (lri.BorderPen != null) { paddingFactor = 2; } lri.Width += (LegendRenderer.LeftPadding + LegendRenderer.RightPadding) * paddingFactor; lri.Height += (LegendRenderer.TopPadding + LegendRenderer.BottomPadding) * paddingFactor; if (verticalLegend) { lri.Height += LegendRenderer.EntrySpacing * (lri.Entries.Length - 1); } else { lri.Width += LegendRenderer.EntrySpacing * (lri.Entries.Length - 1); } foreach (LegendEntryRendererInfo leri in lri.Entries) { leri.MarkerArea = maxMarkerArea; } }