/// <summary> /// Calculates the space used by the legend entry. /// </summary> internal override void Format() { XGraphics gfx = _rendererParms.Graphics; LegendEntryRendererInfo leri = (LegendEntryRendererInfo)_rendererParms.RendererInfo; // Initialize leri.MarkerArea.Width = MaxLegendMarkerWidth; leri.MarkerArea.Height = MaxLegendMarkerHeight; leri.MarkerSize = new XSize { Width = leri.MarkerArea.Width, Height = leri.MarkerArea.Height }; if (leri._seriesRendererInfo._series._chartType == ChartType.Line) { leri.MarkerArea.Width *= 3; } leri.Width = leri.MarkerArea.Width; leri.Height = leri.MarkerArea.Height; if (leri.EntryText != "") { leri.TextSize = gfx.MeasureString(leri.EntryText, leri._legendRendererInfo.Font); if (leri._seriesRendererInfo._series._chartType == ChartType.Line) { leri.MarkerSize.Width = leri._seriesRendererInfo._markerRendererInfo.MarkerSize.Value; leri.MarkerArea.Width = Math.Max(3 * leri.MarkerSize.Width, leri.MarkerArea.Width); } leri.MarkerArea.Height = Math.Min(leri.MarkerArea.Height, leri.TextSize.Height); leri.MarkerSize.Height = Math.Min(leri.MarkerSize.Height, leri.TextSize.Height); leri.Width = leri.TextSize.Width + leri.MarkerArea.Width + SpacingBetweenMarkerAndText; leri.Height = leri.TextSize.Height; } }
/// <summary> /// Initializes the legend's renderer info. Each data point will be represented through /// a legend entry renderer info. /// </summary> internal override RendererInfo Init() { LegendRendererInfo lri = null; ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; if (cri._chart._legend != null) { lri = new LegendRendererInfo { _legend = cri._chart._legend }; lri.Font = Converter.ToXFont(lri._legend._font, cri.DefaultFont); lri.FontColor = new XSolidBrush(XColors.Black); if (lri._legend._lineFormat != null) { lri.BorderPen = Converter.ToXPen(lri._legend._lineFormat, XColors.Black, DefaultLineWidth, XDashStyle.Solid); } XSeries xseries = null; if (cri._chart._xValues != null) { xseries = cri._chart._xValues[0]; } int index = 0; SeriesRendererInfo sri = cri.seriesRendererInfos[0]; lri.Entries = new LegendEntryRendererInfo[sri._pointRendererInfos.Length]; foreach (PointRendererInfo pri in sri._pointRendererInfos) { LegendEntryRendererInfo leri = new LegendEntryRendererInfo { _seriesRendererInfo = sri, _legendRendererInfo = lri, EntryText = System.String.Empty }; if (xseries != null) { if (xseries.Count > index) { leri.EntryText = xseries[index]._value; } } else { leri.EntryText = (index + 1).ToString(); // create default/dummy entry } leri.MarkerPen = pri.LineFormat; leri.MarkerBrush = pri.FillFormat; lri.Entries[index++] = leri; } } return(lri); }
/// <summary> /// Initializes the legend's renderer info. Each data series will be represented through /// a legend entry renderer info. /// </summary> internal override RendererInfo Init() { LegendRendererInfo lri = null; ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; if (cri._chart._legend != null) { lri = new LegendRendererInfo { _legend = cri._chart._legend }; lri.Font = Converter.ToXFont(lri._legend._font, cri.DefaultFont); lri.FontColor = new XSolidBrush(XColors.Black); if (lri._legend._lineFormat != null) { lri.BorderPen = Converter.ToXPen(lri._legend._lineFormat, XColors.Black, DefaultLineWidth, XDashStyle.Solid); } lri.Entries = new LegendEntryRendererInfo[cri.seriesRendererInfos.Length]; int index = 0; foreach (SeriesRendererInfo sri in cri.seriesRendererInfos) { LegendEntryRendererInfo leri = new LegendEntryRendererInfo { _seriesRendererInfo = sri, _legendRendererInfo = lri, EntryText = sri._series.Name }; if (sri._markerRendererInfo != null) { leri.MarkerSize.Width = leri.MarkerSize.Height = sri._markerRendererInfo.MarkerSize.Point; leri.MarkerPen = new XPen(sri._markerRendererInfo.MarkerForegroundColor); leri.MarkerBrush = new XSolidBrush(sri._markerRendererInfo.MarkerBackgroundColor); } else { leri.MarkerPen = sri.LineFormat; leri.MarkerBrush = sri.FillFormat; } if (cri._chart._type == ChartType.ColumnStacked2D) { // Stacked columns are in reverse order. lri.Entries[cri.seriesRendererInfos.Length - index++ - 1] = leri; } else { lri.Entries[index++] = leri; } } } return(lri); }
/// <summary> /// Draws one legend entry. /// </summary> internal override void Draw() { XGraphics gfx = _rendererParms.Graphics; LegendEntryRendererInfo leri = (LegendEntryRendererInfo)_rendererParms.RendererInfo; XRect rect; if (leri._seriesRendererInfo._series._chartType == ChartType.Line) { // Draw line. XPoint posLineStart = new XPoint(leri.X, leri.Y + leri.Height / 2); XPoint posLineEnd = new XPoint(leri.X + leri.MarkerArea.Width, leri.Y + leri.Height / 2); gfx.DrawLine(new XPen(((XSolidBrush)leri.MarkerBrush).Color), posLineStart, posLineEnd); // Draw marker. double x = leri.X + leri.MarkerArea.Width / 2; XPoint posMarker = new XPoint(x, leri.Y + leri.Height / 2); MarkerRenderer.Draw(gfx, posMarker, leri._seriesRendererInfo._markerRendererInfo); } else { // Draw series rectangle for column, bar or pie charts. rect = new XRect(leri.X, leri.Y, leri.MarkerArea.Width, leri.MarkerArea.Height); rect.Y += (leri.Height - leri.MarkerArea.Height) / 2; gfx.DrawRectangle(leri.MarkerPen, leri.MarkerBrush, rect); } // Draw text if (leri.EntryText.Length > 0) { rect = leri.Rect; rect.X += leri.MarkerArea.Width + LegendEntryRenderer.SpacingBetweenMarkerAndText; XStringFormat format = new XStringFormat { LineAlignment = XLineAlignment.Near }; gfx.DrawString(leri.EntryText, leri._legendRendererInfo.Font, leri._legendRendererInfo.FontColor, rect, format); } }