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(" "); writer.WriteLine(" " + UnitsConverter.ConvertBool(legend.Enabled) + ""); //WriteStyle(" "); writer.WriteLine(" " + UnitsConverter.ConvertLegendDockingAndAlignment(legend.Docking, legend.Alignment) + ""); writer.WriteLine(" " + UnitsConverter.ConvertLegendStyle(legend.LegendStyle) + ""); writer.WriteLine(" " + UnitsConverter.ConvertBool(legend.IsDockedInsideChartArea) + ""); 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(" <Caption>" + axis.Title + "</Caption>"); writer.WriteLine(" <Style>"); writer.WriteLine(" <FontStyle>" + UnitsConverter.ConvertFontStyle(axis.TitleFont.Style) + "</FontStyle>"); writer.WriteLine(" <FontFamily>" + UnitsConverter.ConvertFontFamily(axis.TitleFont.FontFamily) + "</FontFamily>"); writer.WriteLine(" <FontSize>" + UnitsConverter.ConvertFontSize(axis.TitleFont.Size) + "</FontSize>"); writer.WriteLine(" <TextAlign>" + UnitsConverter.ConvertStringAlignment(axis.TitleAlignment) + "</TextAlign>"); writer.WriteLine(" <Color>" + UnitsConverter.ConvertColor(axis.TitleForeColor) + "</Color>"); writer.WriteLine(" </Style>"); 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(" <Caption>" + ReplaceControlChars(title.Text) + "</Caption>"); 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 } }