/// <summary> /// Calculates the space used by the legend entry. /// </summary> internal override void Format() { XGraphics gfx = this.rendererParms.Graphics; LegendEntryRendererInfo leri = (LegendEntryRendererInfo)this.rendererParms.RendererInfo; // Initialize leri.MarkerArea.Width = MaxLegendMarkerWidth; leri.MarkerArea.Height = MaxLegendMarkerHeight; leri.MarkerSize = new XSize(); leri.MarkerSize.Width = leri.MarkerArea.Width; leri.MarkerSize.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)this.rendererParms.RendererInfo; if (cri.chart.legend != null) { lri = new LegendRendererInfo(); lri.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(); leri.seriesRendererInfo = sri; leri.legendRendererInfo = lri; leri.EntryText = string.Empty; if (xseries != null) { if (xseries.Count > index) { leri.EntryText = xseries[index].Value; } } else { leri.EntryText = (index + 1).ToString(CultureInfo.InvariantCulture); // 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)this.rendererParms.RendererInfo; if (cri.chart.legend != null) { lri = new LegendRendererInfo(); lri.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(); leri.seriesRendererInfo = sri; leri.legendRendererInfo = lri; leri.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 revers ordered 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 = this.rendererParms.Graphics; LegendEntryRendererInfo leri = (LegendEntryRendererInfo)this.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(); format.LineAlignment = XLineAlignment.Near; gfx.DrawString(leri.EntryText, leri.legendRendererInfo.Font, leri.legendRendererInfo.FontColor, rect, format); } }