/// <summary> /// Calculates the data label positions specific for column charts. /// </summary> internal override void CalcPositions() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; XGraphics gfx = _rendererParms.Graphics; foreach (SeriesRendererInfo sri in cri.seriesRendererInfos) { if (sri._dataLabelRendererInfo == null) { continue; } int columnIndex = 0; foreach (ColumnRendererInfo bar in sri._pointRendererInfos) { DataLabelEntryRendererInfo dleri = sri._dataLabelRendererInfo.Entries[columnIndex++]; dleri.Y = bar.Rect.Y + (bar.Rect.Height - dleri.Height) / 2; // Always the same... switch (sri._dataLabelRendererInfo.Position) { case DataLabelPosition.InsideEnd: // Inner border of the column. dleri.X = bar.Rect.X; if (bar.Point._value > 0) { dleri.X += bar.Rect.Width - dleri.Width; } break; case DataLabelPosition.Center: // Centered inside the column. dleri.X = bar.Rect.X + (bar.Rect.Width - dleri.Width) / 2; break; case DataLabelPosition.InsideBase: // Aligned at the base of the column. dleri.X = bar.Rect.X; if (bar.Point._value < 0) { dleri.X += bar.Rect.Width - dleri.Width; } break; case DataLabelPosition.OutsideEnd: // Outer border of the column. dleri.X = bar.Rect.X; if (bar.Point._value > 0) { dleri.X += bar.Rect.Width; } else { dleri.X -= dleri.Width; } break; } } } }
/// <summary> /// Calculates the space used by the data labels. /// </summary> internal override void Format() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; if (cri.seriesRendererInfos.Length == 0) { return; } SeriesRendererInfo sri = cri.seriesRendererInfos[0]; if (sri._dataLabelRendererInfo == null) { return; } double sumValues = sri.SumOfPoints; XGraphics gfx = _rendererParms.Graphics; sri._dataLabelRendererInfo.Entries = new DataLabelEntryRendererInfo[sri._pointRendererInfos.Length]; int index = 0; foreach (SectorRendererInfo sector in sri._pointRendererInfos) { DataLabelEntryRendererInfo dleri = new DataLabelEntryRendererInfo(); if (sri._dataLabelRendererInfo.Type != DataLabelType.None) { if (sri._dataLabelRendererInfo.Type == DataLabelType.Percent) { double percent = 100 / (sumValues / Math.Abs(sector.Point._value)); dleri.Text = percent.ToString(sri._dataLabelRendererInfo.Format) + "%"; } else if (sri._dataLabelRendererInfo.Type == DataLabelType.Value) { dleri.Text = sector.Point._value.ToString(sri._dataLabelRendererInfo.Format); } if (dleri.Text.Length > 0) { dleri.Size = gfx.MeasureString(dleri.Text, sri._dataLabelRendererInfo.Font); } } sri._dataLabelRendererInfo.Entries[index++] = dleri; } }
/// <summary> /// Calculates the space used by the data labels. /// </summary> internal override void Format() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; foreach (SeriesRendererInfo sri in cri.seriesRendererInfos) { if (sri._dataLabelRendererInfo == null) { continue; } XGraphics gfx = _rendererParms.Graphics; sri._dataLabelRendererInfo.Entries = new DataLabelEntryRendererInfo[sri._pointRendererInfos.Length]; int index = 0; foreach (ColumnRendererInfo column in sri._pointRendererInfos) { DataLabelEntryRendererInfo dleri = new DataLabelEntryRendererInfo(); if (sri._dataLabelRendererInfo.Type != DataLabelType.None) { if (sri._dataLabelRendererInfo.Type == DataLabelType.Value) { dleri.Text = column.Point._value.ToString(sri._dataLabelRendererInfo.Format); } else if (sri._dataLabelRendererInfo.Type == DataLabelType.Percent) { throw new InvalidOperationException(PSCSR.PercentNotSupportedByColumnDataLabel); } if (dleri.Text.Length > 0) { dleri.Size = gfx.MeasureString(dleri.Text, sri._dataLabelRendererInfo.Font); } } sri._dataLabelRendererInfo.Entries[index++] = dleri; } } CalcPositions(); }
/// <summary> /// Calculates the data label positions specific for pie charts. /// </summary> internal override void CalcPositions() { ChartRendererInfo cri = (ChartRendererInfo)_rendererParms.RendererInfo; XGraphics gfx = _rendererParms.Graphics; if (cri.seriesRendererInfos.Length > 0) { SeriesRendererInfo sri = cri.seriesRendererInfos[0]; if (sri != null && sri._dataLabelRendererInfo != null) { int sectorIndex = 0; foreach (SectorRendererInfo sector in sri._pointRendererInfos) { // Determine output rectangle double midAngle = sector.StartAngle + sector.SweepAngle / 2; double radMidAngle = midAngle / 180 * Math.PI; XPoint origin = new XPoint(sector.Rect.X + sector.Rect.Width / 2, sector.Rect.Y + sector.Rect.Height / 2); double radius = sector.Rect.Width / 2; double halfradius = radius / 2; DataLabelEntryRendererInfo dleri = sri._dataLabelRendererInfo.Entries[sectorIndex++]; switch (sri._dataLabelRendererInfo.Position) { case DataLabelPosition.OutsideEnd: // Outer border of the circle. dleri.X = origin.X + radius * Math.Cos(radMidAngle); dleri.Y = origin.Y + radius * Math.Sin(radMidAngle); if (dleri.X < origin.X) { dleri.X -= dleri.Width; } if (dleri.Y < origin.Y) { dleri.Y -= dleri.Height; } break; case DataLabelPosition.InsideEnd: // Inner border of the circle. dleri.X = origin.X + radius * Math.Cos(radMidAngle); dleri.Y = origin.Y + radius * Math.Sin(radMidAngle); if (dleri.X > origin.X) { dleri.X -= dleri.Width; } if (dleri.Y > origin.Y) { dleri.Y -= dleri.Height; } break; case DataLabelPosition.Center: // Centered dleri.X = origin.X + halfradius * Math.Cos(radMidAngle); dleri.Y = origin.Y + halfradius * Math.Sin(radMidAngle); dleri.X -= dleri.Width / 2; dleri.Y -= dleri.Height / 2; break; case DataLabelPosition.InsideBase: // Aligned at the base/center of the circle dleri.X = origin.X; dleri.Y = origin.Y; if (dleri.X < origin.X) { dleri.X -= dleri.Width; } if (dleri.Y < origin.Y) { dleri.Y -= dleri.Height; } break; } } } } }