using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using FastReport.DataVisualization.Charting;
using FastReport.MSChart;
using FastReport.Table;
using FastReport.Matrix;
namespace FastReport.Design.ExportPlugins.RDL
{
///
/// Represents the RDL export plugin.
///
internal class RDLExportPlugin : ExportPlugin
{
#region Fields
private StreamWriter writer;
private ReportPage page;
private Base parent;
private ReportComponentBase component;
#endregion // Fields
#region Constructors
///
/// Initializes a new instance of the class.
///
public RDLExportPlugin() : base()
{
}
///
/// Initializes a new instance of the class with a specified designer.
///
/// The report designer.
public RDLExportPlugin(Designer designer) : base(designer)
{
}
#endregion // Constructors
#region Private Methods
private string ReplaceControlChars(string str)
{
str = str.Replace(Environment.NewLine, "
");
str = str.Replace("&", "&");
str = str.Replace("'", "'");
str = str.Replace("\"", """);
str = str.Replace("<", "<");
str = str.Replace(">", ">");
return str;
}
private void WriteBorderStyle(string tab)
{
if (component.Border.Lines != BorderLines.None)
{
bool writeDefaultLine = true;
bool writeLeftLine = true;
bool writeRightLine = true;
bool writeTopLine = true;
bool writeBottomLine = true;
if (component.Border.Lines != BorderLines.All)
{
writeDefaultLine = false;
string borderLines = component.Border.Lines.ToString();
writeLeftLine = borderLines.Contains(BorderLines.Left.ToString());
writeRightLine = borderLines.Contains(BorderLines.Right.ToString());
writeTopLine = borderLines.Contains(BorderLines.Top.ToString());
writeBottomLine = borderLines.Contains(BorderLines.Bottom.ToString());
}
writer.WriteLine(tab + " ");
if (writeDefaultLine)
{
writer.WriteLine(tab + " " + UnitsConverter.ConvertLineStyle(component.Border.Style) + "");
}
if (writeLeftLine)
{
writer.WriteLine(tab + " " + UnitsConverter.ConvertLineStyle(component.Border.LeftLine.Style) + "");
}
if (writeRightLine)
{
writer.WriteLine(tab + " " + UnitsConverter.ConvertLineStyle(component.Border.RightLine.Style) + "");
}
if (writeTopLine)
{
writer.WriteLine(tab + " " + UnitsConverter.ConvertLineStyle(component.Border.TopLine.Style) + "");
}
if (writeBottomLine)
{
writer.WriteLine(tab + " " + UnitsConverter.ConvertLineStyle(component.Border.BottomLine.Style) + "");
}
writer.WriteLine(tab + " ");
}
}
private void WriteBorderColor(string tab)
{
writer.WriteLine(tab + " ");
writer.WriteLine(tab + " " + UnitsConverter.ConvertColor(component.Border.Color) + "");
writer.WriteLine(tab + " " + UnitsConverter.ConvertColor(component.Border.LeftLine.Color) + "");
writer.WriteLine(tab + " " + UnitsConverter.ConvertColor(component.Border.RightLine.Color) + "");
writer.WriteLine(tab + " " + UnitsConverter.ConvertColor(component.Border.TopLine.Color) + "");
writer.WriteLine(tab + " " + UnitsConverter.ConvertColor(component.Border.BottomLine.Color) + "");
writer.WriteLine(tab + " ");
}
private void WriteBorderWidth(string tab)
{
writer.WriteLine(tab + " ");
writer.WriteLine(tab + " " + UnitsConverter.PixelsToMillimeters(component.Border.Width) + "");
writer.WriteLine(tab + " " + UnitsConverter.PixelsToMillimeters(component.Border.LeftLine.Width) + "");
writer.WriteLine(tab + " " + UnitsConverter.PixelsToMillimeters(component.Border.RightLine.Width) + "");
writer.WriteLine(tab + " " + UnitsConverter.PixelsToMillimeters(component.Border.TopLine.Width) + "");
writer.WriteLine(tab + " " + UnitsConverter.PixelsToMillimeters(component.Border.BottomLine.Width) + "");
writer.WriteLine(tab + " ");
}
private void WriteStyle(string tab)
{
writer.WriteLine(tab + "");
}
private void WriteStyleT(Title title, string tab)
{
writer.WriteLine(tab + "");
}
private void WriteVisibility(bool visible, string tab)
{
if (!visible)
{
writer.WriteLine(tab + "");
writer.WriteLine(tab + " =true");
writer.WriteLine(tab + "");
}
}
private void WritePageSize()
{
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.PaperHeight) + "");
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.PaperWidth) + "");
}
private void WriteLegend()
{
Legend legend = (component as MSChartObject).Chart.Legends[0];
writer.WriteLine(" ");
}
private void WriteGrid(Grid grid)
{
writer.WriteLine(" " + UnitsConverter.ConvertBool(grid.Enabled) + "");
writer.WriteLine(" ");
}
private void WriteAxis(Axis axis)
{
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.ConvertAxisEnabled(axis.Enabled) + "");
writer.WriteLine(" ");
writer.WriteLine(" " + axis.Title + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.ConvertBool(axis.IsMarginVisible) + "");
writer.WriteLine(" " + UnitsConverter.ConvertTickMarkStyle(axis.MajorTickMark.TickMarkStyle) + "");
writer.WriteLine(" " + UnitsConverter.ConvertTickMarkStyle(axis.MinorTickMark.TickMarkStyle) + "");
writer.WriteLine(" ");
WriteGrid(axis.MajorGrid);
writer.WriteLine(" ");
writer.WriteLine(" ");
WriteGrid(axis.MinorGrid);
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.ConvertBool(axis.IsReversed) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(axis.IsInterlaced) + "");
writer.WriteLine(" ");
}
private void WriteCategoryAxis()
{
writer.WriteLine(" ");
WriteAxis((component as MSChartObject).Chart.ChartAreas[0].AxisX);
writer.WriteLine(" ");
}
private void WriteValueAxis()
{
writer.WriteLine(" ");
WriteAxis((component as MSChartObject).Chart.ChartAreas[0].AxisY);
writer.WriteLine(" ");
}
private void WriteTitle()
{
Title title = (component as MSChartObject).Chart.Titles[0];
writer.WriteLine("
");
writer.WriteLine(" " + ReplaceControlChars(title.Text) + "");
WriteStyleT(title, " ");
writer.WriteLine(" ");
}
private void WriteThreeDProperties()
{
MSChartObject chart = component as MSChartObject;
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.ConvertBool(chart.Chart.ChartAreas[0].Area3DStyle.Enable3D) + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.Rotation.ToString() + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.Inclination.ToString() + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.Perspective.ToString() + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.PointDepth.ToString() + "");
writer.WriteLine(" " + UnitsConverter.ConvertLightStyle(chart.Chart.ChartAreas[0].Area3DStyle.LightStyle) + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.PointGapDepth.ToString() + "");
writer.WriteLine(" " + chart.Chart.ChartAreas[0].Area3DStyle.WallWidth.ToString() + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(chart.Chart.ChartAreas[0].Area3DStyle.IsClustered) + "");
writer.WriteLine(" ");
}
private void WriteTableColumn(TableColumn column)
{
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(column.Width) + "");
WriteVisibility(column.Visible, " ");
writer.WriteLine(" ");
}
private void WriteTableColumns()
{
writer.WriteLine(" ");
foreach (TableColumn column in (component as TableObject).Columns)
{
WriteTableColumn(column);
}
writer.WriteLine(" ");
}
private void WriteTableCell(TableCell cell)
{
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
ReportComponentBase tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + ReplaceControlChars(cell.Text) + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + cell.ColSpan.ToString() + "");
writer.WriteLine(" ");
}
private void WriteTableRow(TableRow row, int rowNum)
{
writer.WriteLine(" ");
writer.WriteLine(" ");
for (int col = 0; col < (component as TableObject).ColumnCount; col++)
{
WriteTableCell((component as TableObject).GetCellData(col, rowNum).Cell);
}
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(row.Height) + "");
WriteVisibility(row.Visible, " ");
writer.WriteLine(" ");
}
private void WriteHeader()
{
writer.WriteLine(" ");
writer.WriteLine(" ");
WriteTableRow((component as TableObject).Rows[0], 0);
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteDetails()
{
TableObject table = component as TableObject;
if (table.Rows.Count > 1)
{
writer.WriteLine(" ");
writer.WriteLine(" ");
WriteTableRow(table.Rows[1], 1);
writer.WriteLine(" ");
WriteVisibility(table.Rows[1].Visible, " ");
writer.WriteLine(" ");
}
}
private void WriteFooter()
{
TableObject table = component as TableObject;
if (table.Rows.Count > 2)
{
writer.WriteLine(" ");
}
}
private void WriteColumnGroupings()
{
MatrixObject matrix = component as MatrixObject;
ReportComponentBase tempComponent = component;
TableCell cell = matrix.GetCellData(0, 0).Cell;
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(matrix.Rows[0].Height) + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + "" + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
cell = matrix.GetCellData(1, 0).Cell;
writer.WriteLine(" ");
tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + cell.Text + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
cell = matrix.GetCellData(matrix.ColumnCount - 1, 0).Cell;
writer.WriteLine(" ");
tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + cell.Text + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
WriteVisibility(cell.Visible, " ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteRowGroupings()
{
MatrixObject matrix = component as MatrixObject;
ReportComponentBase tempComponent = component;
TableCell cell = matrix.GetCellData(0, 0).Cell;
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(matrix.Columns[0].Width) + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + "" + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
cell = matrix.GetCellData(0, 1).Cell;
writer.WriteLine(" ");
tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + cell.Text + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
cell = matrix.GetCellData(0, matrix.RowCount - 1).Cell;
writer.WriteLine(" ");
tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + cell.Text + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
WriteVisibility(cell.Visible, " ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteMatrixColumns()
{
MatrixObject matrix = component as MatrixObject;
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(matrix.Columns[0].Width) + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteMatrixRows()
{
MatrixObject matrix = component as MatrixObject;
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(matrix.Rows[1].Height) + "");
writer.WriteLine(" ");
TableCell cell = matrix.GetCellData(1, 1).Cell;
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
ReportComponentBase tempComponent = component;
component = cell;
WriteStyle(" ");
component = tempComponent;
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(cell.CanShrink) + "");
writer.WriteLine(" " + cell.Text + "");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteReportItem()
{
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(component.Top) + "");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(component.Left) + "");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(component.Height) + "");
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(component.Width) + "");
WriteStyle(" ");
WriteVisibility(component.Visible, " ");
}
private void WriteLine(LineObject line)
{
writer.WriteLine(" ");
component = line;
WriteReportItem();
writer.WriteLine(" ");
}
private void WriteRectangle(ShapeObject rectangle)
{
writer.WriteLine(" ");
component = rectangle;
WriteReportItem();
writer.WriteLine(" ");
}
private void WriteTextbox(TextObject textbox)
{
writer.WriteLine(" ");
component = textbox;
WriteReportItem();
writer.WriteLine(" " + UnitsConverter.ConvertBool(textbox.CanGrow) + "");
writer.WriteLine(" " + UnitsConverter.ConvertBool(textbox.CanShrink) + "");
writer.WriteLine(" " + ReplaceControlChars(textbox.Text) + "");
writer.WriteLine(" ");
}
private void WriteImage(PictureObject image)
{
writer.WriteLine(" ");
component = image;
WriteReportItem();
writer.WriteLine(" External");
writer.WriteLine(" " + image.ImageLocation + "");
writer.WriteLine(" " + UnitsConverter.ConvertSizeMode(image.SizeMode) + "");
writer.WriteLine(" ");
}
private void WriteSubreport(SubreportObject subreport)
{
writer.WriteLine(" ");
component = subreport;
WriteReportItem();
writer.WriteLine(" " + subreport.Name + "");
writer.WriteLine(" ");
}
private void WriteChart(MSChartObject chart)
{
writer.WriteLine(" ");
component = chart;
WriteReportItem();
writer.WriteLine(" " + UnitsConverter.ConvertChartType(chart.Series[0].SeriesSettings.ChartType) + "");
WriteLegend();
WriteCategoryAxis();
WriteValueAxis();
WriteTitle();
writer.WriteLine(" " + UnitsConverter.ConvertChartPalette(chart.Chart.Palette) + "");
WriteThreeDProperties();
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
writer.WriteLine(" ");
}
private void WriteTable(TableObject table)
{
writer.WriteLine(" ");
component = table;
WriteReportItem();
WriteTableColumns();
WriteHeader();
WriteDetails();
WriteFooter();
writer.WriteLine("
");
}
private void WriteMatrix(MatrixObject matrix)
{
writer.WriteLine(" ");
component = matrix;
WriteReportItem();
WriteColumnGroupings();
WriteRowGroupings();
WriteMatrixColumns();
WriteMatrixRows();
writer.WriteLine(" ");
}
private void WriteReportItems()
{
if (parent.AllObjects.Count != 0)
{
writer.WriteLine(" ");
foreach (Object obj in parent.AllObjects)
{
if (obj is LineObject)
{
WriteLine(obj as LineObject);
}
else if (obj is ShapeObject)
{
WriteRectangle(obj as ShapeObject);
}
else if (obj is TextObject)
{
if (!(obj is TableCell))
{
WriteTextbox(obj as TextObject);
}
}
else if (obj is PictureObject)
{
WriteImage(obj as PictureObject);
}
else if (obj is SubreportObject)
{
WriteSubreport(obj as SubreportObject);
}
else if (obj is MSChartObject)
{
WriteChart(obj as MSChartObject);
}
else if (obj is TableObject)
{
WriteTable(obj as TableObject);
}
else if (obj is MatrixObject)
{
WriteMatrix(obj as MatrixObject);
}
else
{
TextObject text = new TextObject();
ReportComponentBase c = obj as ReportComponentBase;
text.Name = c.Name;
text.Text = c.Name;
text.Top = c.Top;
text.Left = c.Left;
text.Width = c.Width;
text.Height = c.Height;
text.Visible = c.Visible;
WriteTextbox(text);
}
}
writer.WriteLine(" ");
}
}
private void WritePageHeader()
{
writer.WriteLine(" ");
string height = "0.0pt";
string printOn = "";
if (page.ReportTitle != null)
{
ReportTitleBand reportTitle = page.ReportTitle;
height = UnitsConverter.PixelsToMillimeters(reportTitle.Height);
printOn = reportTitle.PrintOn.ToString();
parent = reportTitle;
WriteReportItems();
}
else if (page.PageHeader != null)
{
PageHeaderBand pageHeader = page.PageHeader;
height = UnitsConverter.PixelsToMillimeters(pageHeader.Height);
printOn = pageHeader.PrintOn.ToString();
parent = pageHeader;
WriteReportItems();
}
string printOnFPage = printOn.Contains(PrintOn.FirstPage.ToString()).ToString().ToLower();
string printOnLPage = printOn.Contains(PrintOn.LastPage.ToString()).ToString().ToLower();
writer.WriteLine(" " + height + "");
writer.WriteLine(" " + printOnFPage + "");
writer.WriteLine(" " + printOnLPage + "");
writer.WriteLine(" ");
}
private void WriteBody()
{
writer.WriteLine(" ");
if ((page.Bands.Count != 0) && (page.Bands[0] is DataBand))
{
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(page.Bands[0].Height) + "");
parent = page.Bands[0] as DataBand;
WriteReportItems();
}
else
{
writer.WriteLine(" " + "0.0pt" + "");
}
writer.WriteLine(" ");
}
private void WritePageFooter()
{
writer.WriteLine(" ");
PageFooterBand pageFooter = page.PageFooter;
if (pageFooter != null)
{
writer.WriteLine(" " + UnitsConverter.PixelsToMillimeters(pageFooter.Height) + "");
string printOn = pageFooter.PrintOn.ToString();
bool printOnFirstPage = printOn.Contains(PrintOn.FirstPage.ToString());
bool printOnLastPage = printOn.Contains(PrintOn.LastPage.ToString());
writer.WriteLine(" " + printOnFirstPage.ToString().ToLower() + "");
writer.WriteLine(" " + printOnLastPage.ToString().ToLower() + "");
parent = pageFooter;
WriteReportItems();
}
else
{
writer.WriteLine(" " + "0.0pt" + "");
writer.WriteLine(" " + "true" + "");
writer.WriteLine(" " + "true" + "");
}
writer.WriteLine(" ");
}
private void WritePageMargins()
{
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.BottomMargin) + "");
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.LeftMargin) + "");
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.RightMargin) + "");
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.TopMargin) + "");
}
private void WriteReport()
{
writer.WriteLine(" " + ReplaceControlChars(Report.ReportInfo.Description) + "");
writer.WriteLine(" " + Report.ReportInfo.Author + "");
WritePageSize();
WritePageHeader();
WriteBody();
WritePageFooter();
writer.WriteLine(" " + UnitsConverter.MillimetersToString(page.PaperWidth) + "");
WritePageMargins();
}
#endregion // Private Methods
#region Protected Methods
///
protected override string GetFilter()
{
return new FastReport.Utils.MyRes("FileFilters").Get("RdlFile");
}
#endregion // Protected Methods
#region Public Methods
///
public override void SaveReport(Report report, string filename)
{
DialogResult result = MessageBox.Show(new FastReport.Utils.MyRes("Messages").Get("WarningSaveRDL"),
new FastReport.Utils.MyRes("Messages").Get("Attention"), MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
Report = report;
page = Report.Pages[0] as ReportPage;
if (page != null)
{
using (writer = new StreamWriter(new FileStream(filename, FileMode.Create)))
{
writer.WriteLine("");
writer.WriteLine("");
WriteReport();
writer.WriteLine("");
}
}
}
}
#endregion // Public Methods
}
}