using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using FastReport.Barcode;
using FastReport.Table;
using FastReport.Utils;
using System.Linq;
namespace FastReport.Import.DevExpress
{
///
/// Represents the DevExpess import plugin.
///
public partial class DevExpressImport : ImportBase
{
#region Constants
private const string TOP_MARGIN_BAND_MASK = "DevExpress.XtraReports.UI.TopMarginBand";
private const string BOTTOM_MARGIN_BAND_MASK = "DevExpress.XtraReports.UI.BottomMarginBand";
private const string DETAIL_REPORT_BAND_MASK = "DevExpress.XtraReports.UI.DetailReportBand";
private const string REPORT_HEADER_BAND_MASK = "DevExpress.XtraReports.UI.ReportHeaderBand";
private const string REPORT_FOOTER_BAND_MASK = "DevExpress.XtraReports.UI.ReportFooterBand";
private const string DETAIL_BAND_MASK = "DevExpress.XtraReports.UI.DetailBand";
private const string GROUP_HEADER_BAND_MASK = "DevExpress.XtraReports.UI.GroupHeaderBand";
private const string GROUP_FOOTER_BAND_MASK = "DevExpress.XtraReports.UI.GroupFooterBand";
private const string BAND_CHILD_DEFINITION = "new DevExpress.XtraReports.UI.XRControl[]";
private const string BAND_CHILDBAND_DEFINITION = "new DevExpress.XtraReports.UI.Band[]";
private const string DEV_EXPRESS_LABEL = "DevExpress.XtraReports.UI.XRLabel";
private const string DEV_EXPRESS_LINE = "DevExpress.XtraReports.UI.XRLine";
private const string DEV_EXPRESS_TABLE = "DevExpress.XtraReports.UI.XRTable";
private const string DEV_EXPRESS_TABLE_ROW = "DevExpress.XtraReports.UI.XRTableRow";
private const string DEV_EXPRESS_TABLE_CELL = "DevExpress.XtraReports.UI.XRTableCell";
private const string DEV_EXPRESS_PICTURE = "DevExpress.XtraReports.UI.XRPictureBox";
private const string DEV_EXPRESS_PAGE_INFO = "DevExpress.XtraReports.UI.XRPageInfo";
private const string DEV_EXPRESS_SHAPE = "DevExpress.XtraReports.UI.XRShape";
private const string DEV_EXPRESS_ZIP_CODE = "DevExpress.XtraReports.UI.XRZipCode";
private const string DEV_EXPRESS_BAR_CODE = "DevExpress.XtraReports.UI.XRBarCode";
private const string DEV_EXPRESS_RICH_TEXT = "DevExpress.XtraReports.UI.XRRichText";
private const string DEV_EXPRESS_STYLE = "DevExpress.XtraReports.UI.XRControlStyle ";
#endregion // Constants
#region Fields
private ReportPage page;
private string devText;
private List outsideBands = new List();
#endregion // Fields
private class TableInfo
{
public List Column;
public List Row;
public TableInfo()
{
Column = new List();
Row = new List();
}
}
#region Constructors
///
/// Initializes a new instance of the class.
///
public DevExpressImport() : base()
{
devText = "";
}
#endregion // Constructors
#region Private Methods
private void LoadReportCode()
{
if (devText.IndexOf("namespace") >= 0)
{
devText = devText.Remove(0, devText.IndexOf("namespace")).Replace(@"http://", " ");
}
LoadReport();
page = null;
}
private string FindObjectName(string mask)
{
string name = "";
int start = devText.IndexOf(mask);
if (start > -1)
{
start += mask.Length;
int length = devText.IndexOf(";", start) - start;
name = devText.Substring(start, length).Trim();
}
return name;
}
private void LoadOutsideBandsNames()
{
string bandsRagneStart = "this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[]";
int start = devText.IndexOf(bandsRagneStart);
if (start > -1)
{
start += bandsRagneStart.Length;
int lenght = devText.IndexOf(";", start) - start;
string bandsEnumeration = devText.Substring(start, lenght).Replace("{", "").Replace("}", "").Replace(")", "").Replace("\n", "").Replace("\r", "").Trim();
string[] outBands = bandsEnumeration.Split(',');
outsideBands.Clear();
foreach (string bandString in outBands)
{
// Trim() is not working :(
string band = String.Concat(bandString.Where(c => !Char.IsWhiteSpace(c)));
if (band.StartsWith("this."))
outsideBands.Add(band.Substring(5));
else
outsideBands.Add(band);
}
}
}
private string FindReportOutsideBandName(string mask)
{
string name = "";
int start = devText.IndexOf(mask);
while (start != -1)
{
if (start == -1)
return string.Empty;
start += mask.Length;
int length = devText.IndexOf(";", start) - start;
name = devText.Substring(start, length).Trim();
if (outsideBands.Contains(name))
return name;
start = devText.IndexOf(mask, start + mask.Length);
}
return string.Empty;
}
private string GetObjectDescription(string name)
{
string description = "";
int start = 0;
while (start > -1)
{
start = devText.IndexOf(@"// " + name, start);
if (devText.Substring(start, name.Length + 2 + 3).EndsWith("\r\n"))
break;
start += 1;
}
if (start > -1)
{
start = devText.IndexOf(@"//", start + 2);
int length = devText.IndexOf(@"//", start + 2) - start + 2;
description = devText.Substring(start, length);
}
return description;
}
private string GetPropertyValue(string name, string description)
{
string value = "";
int start = description.IndexOf("." + name + " ");
if (start > -1)
{
start += name.Length + 3;
int length = description.IndexOf(";", start) - start;
value = description.Substring(start, length).Trim();
}
return value;
}
private bool ExistValue(string name, string description)
{
int start = description.IndexOf("." + name + " ");
return start > 0;
}
private int GetLevelPropValue(string description)
{
string level = "level = ";
if (description == null)
return -1;
int start = description.ToLower().IndexOf(level);
if (start > -1)
{
string value = description.Substring(start + level.Length, 1);
try
{
return int.Parse(value);
}
catch
{
return -1;
}
//bool parsed = int.TryParse(value, out int resultValue);
//if (parsed)
// return resultValue;
}
return -1;
}
private void LoadBand(BandBase band, string description)
{
if (ExistValue("HeightF", description))
band.Height = UnitsConverter.SizeFToPixels(GetPropertyValue("HeightF", description));
else
band.Height = UnitsConverter.SizeFToPixels("100F");
band.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description));
}
private List GetObjectNames(string description)
{
List names = new List();
int start = description.IndexOf(BAND_CHILD_DEFINITION);
if (start > -1)
{
start += BAND_CHILD_DEFINITION.Length;
int end = description.IndexOf("});", start);
string namesStr = description.Substring(start, end - start + 1).Replace("}", ",");
int pos = 0;
while (pos < end)
{
pos = namesStr.IndexOf("this.", pos);
if (pos < 0)
{
break;
}
names.Add(namesStr.Substring(pos + 5, namesStr.IndexOf(",", pos) - pos - 5));
pos += 5;
}
}
return names;
}
private List GetBandsNames(string description)
{
List names = new List();
int start = description.IndexOf(BAND_CHILDBAND_DEFINITION);
if (start > -1)
{
start += BAND_CHILDBAND_DEFINITION.Length;
int end = description.IndexOf("});", start);
string namesStr = description.Substring(start, end - start + 1).Replace("}", ",");
int pos = 0;
while (pos < end)
{
pos = namesStr.IndexOf("this.", pos);
if (pos < 0)
{
break;
}
names.Add(namesStr.Substring(pos + 5, namesStr.IndexOf(",", pos) - pos - 5));
pos += 5;
}
}
return names;
}
private bool IsTypeOfBand(string name, string bandType)
{
int index = devText.IndexOf(name + " = new " + bandType);
if (index > -1)
return true;
return false;
}
private string GetBandType(string name)
{
string type = string.Empty;
int start = devText.IndexOf(name + " = new ");
if (start > -1)
{
int end = devText.IndexOf(";", start);
start += name.Length + 7;
type = devText.Substring(start, end - start - 2);
}
return type;
}
private string GetObjectType(string name)
{
string str = "this." + name + " = new ";
int start = devText.IndexOf(str) + str.Length;
int end = devText.IndexOf("();", start);
return devText.Substring(start, end - start);
}
private void LoadComponent(string description, ComponentBase comp)
{
comp.Name = GetPropertyValue("Name", description).Replace("\"", "");
string location = GetPropertyValue("LocationFloat", description);
if (!String.IsNullOrEmpty(location))
{
int start = location.IndexOf("(");
int comma = location.IndexOf(",", start);
int end = location.IndexOf(")");
comp.Left = UnitsConverter.SizeFToPixels(location.Substring(start + 1, comma - start));
comp.Top = UnitsConverter.SizeFToPixels(location.Substring(comma + 2, end - comma - 1));
}
}
private void LoadBorder(string description, Border border)
{
string borders = GetPropertyValue("Borders", description);
if (!String.IsNullOrEmpty(borders))
{
if (borders.IndexOf("Left") > -1)
{
border.Lines |= BorderLines.Left;
}
if (borders.IndexOf("Top") > -1)
{
border.Lines |= BorderLines.Top;
}
if (borders.IndexOf("Right") > -1)
{
border.Lines |= BorderLines.Right;
}
if (borders.IndexOf("Bottom") > -1)
{
border.Lines |= BorderLines.Bottom;
}
}
string color = GetPropertyValue("BorderColor", description);
if (!String.IsNullOrEmpty(color))
{
border.Color = UnitsConverter.ConvertColor(color);
}
string style = GetPropertyValue("BorderDashStyle", description);
if (!String.IsNullOrEmpty(style))
{
border.Style = UnitsConverter.ConvertBorderDashStyle(style);
}
string width = GetPropertyValue("BorderWidth", description);
if (!String.IsNullOrEmpty(width))
{
border.Width = UnitsConverter.SizeFToPixels(width);
}
}
private void LoadSize(string description, ComponentBase comp)
{
string size = GetPropertyValue("SizeF", description);
if (!String.IsNullOrEmpty(size))
{
int start = size.IndexOf("(");
int comma = size.IndexOf(",", start);
int end = size.IndexOf(")");
comp.Width = UnitsConverter.SizeFToPixels(size.Substring(start + 1, comma - start));
comp.Height = UnitsConverter.SizeFToPixels(size.Substring(comma + 2, end - comma - 1));
}
}
private Font LoadFont(string description)
{
string font = GetPropertyValue("Font", description);
if (!String.IsNullOrEmpty(font))
{
int start = font.IndexOf("(");
int comma = font.IndexOf(",", start);
int secondComma = font.IndexOf(",", comma + 1);
string fontFamily = font.Substring(start + 2, comma - start - 3);
float fontSize = 10.0f;
if (secondComma > -1)
{
string str = font.Substring(comma + 2, secondComma - comma - 2);
fontSize = UnitsConverter.SizeFToPixelsFont(font.Substring(comma + 2, secondComma - comma - 2));
FontStyle fontStyle = FontStyle.Regular;
if (font.Contains("Bold"))
{
fontStyle |= FontStyle.Bold;
}
if (font.Contains("Italic"))
{
fontStyle |= FontStyle.Italic;
}
if (font.Contains("Underline"))
{
fontStyle |= FontStyle.Underline;
}
if (font.Contains("Strikeout"))
{
fontStyle |= FontStyle.Strikeout;
}
return new Font(fontFamily, fontSize, fontStyle);
}
else
{
string str = font.Substring(comma + 2, font.IndexOf(")") - comma - 2);
fontSize = UnitsConverter.SizeFToPixelsFont(font.Substring(comma + 2, font.IndexOf(")") - comma - 2));
}
}
return new Font("Arial", 10.0f, FontStyle.Regular);
}
private void LoadLabel(string name, Base parent)
{
string description = GetObjectDescription(name);
TextObject text = ComponentsFactory.CreateTextObject(name, parent);
LoadComponent(description, text);
LoadSize(description, text);
LoadBorder(description, text.Border);
text.Name = name;
text.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description));
text.TextColor = UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description));
text.Text = GetPropertyValue("Text", description).Replace("\"", "");
text.HorzAlign = UnitsConverter.ConvertTextAlignmentToHorzAlign(GetPropertyValue("TextAlignment", description));
text.VertAlign = UnitsConverter.ConvertTextAlignmentToVertAlign(GetPropertyValue("TextAlignment", description));
text.Font = LoadFont(description);
ApplyStyleByName(text, GetPropertyValue("StyleName", description).Replace("\"", ""));
}
private void LoadTableCell(string name, TableCell cell)
{
string description = GetObjectDescription(name);
cell.Name = name;
cell.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description));
cell.TextColor = UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description));
cell.Text = GetPropertyValue("Text", description).Replace("\"", "");
cell.HorzAlign = UnitsConverter.ConvertTextAlignmentToHorzAlign(GetPropertyValue("TextAlignment", description));
cell.VertAlign = UnitsConverter.ConvertTextAlignmentToVertAlign(GetPropertyValue("TextAlignment", description));
cell.Font = LoadFont(description);
ApplyStyleByName(cell, GetPropertyValue("StyleName", description).Replace("\"", ""));
}
private void LoadLine(string name, Base parent)
{
string description = GetObjectDescription(name);
LineObject line = ComponentsFactory.CreateLineObject(name, parent);
LoadComponent(description, line);
LoadSize(description, line);
line.Border.Color = UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description));
line.Border.Style = UnitsConverter.ConvertLineStyle(GetPropertyValue("LineStyle", description));
string width = GetPropertyValue("LineWidth", description);
if (!String.IsNullOrEmpty(width))
{
line.Border.Width = Convert.ToSingle(width);
}
line.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
}
private void LoadPicture(string name, Base parent)
{
string description = GetObjectDescription(name);
PictureObject picture = ComponentsFactory.CreatePictureObject(name, parent);
LoadComponent(description, picture);
LoadSize(description, picture);
picture.SizeMode = UnitsConverter.ConvertImageSizeMode(GetPropertyValue("Sizing", description));
picture.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
}
private void LoadShape(string name, Base parent)
{
string description = GetObjectDescription(name);
ShapeObject shape = ComponentsFactory.CreateShapeObject(name, parent);
LoadComponent(description, shape);
LoadSize(description, shape);
shape.Border.Color = UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description));
shape.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("FillColor", description));
shape.Shape = UnitsConverter.ConvertShape(GetPropertyValue("Shape", description));
string width = GetPropertyValue("LineWidth", description);
if (!String.IsNullOrEmpty(width))
{
shape.Border.Width = Convert.ToSingle(width);
}
shape.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
}
private void LoadZipCode(string name, Base parent)
{
string description = GetObjectDescription(name);
ZipCodeObject zipCode = ComponentsFactory.CreateZipCodeObject(name, parent);
LoadComponent(description, zipCode);
LoadSize(description, zipCode);
zipCode.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description));
zipCode.Border.Color = UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description));
zipCode.Text = GetPropertyValue("Text", description).Replace("\"", "");
zipCode.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
}
private void LoadBarCode(string name, Base parent)
{
string description = GetObjectDescription(name);
BarcodeObject barcode = ComponentsFactory.CreateBarcodeObject(name, parent);
LoadComponent(description, barcode);
LoadSize(description, barcode);
LoadBorder(description, barcode.Border);
barcode.FillColor = UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description));
UnitsConverter.ConvertBarcodeSymbology(GetPropertyValue("Symbology", description), barcode);
barcode.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
}
partial void LoadRichText(string name, Base parent);
private List GetChildNames(string childType, string description)
{
List names = new List();
int start = description.IndexOf(childType + "[]");
if (start > -1)
{
start += childType.Length + 2;
int end = description.IndexOf("});", start);
string namesStr = description.Substring(start, end - start + 1).Replace("}", ",");
int pos = 0;
while (pos < end)
{
pos = namesStr.IndexOf("this.", pos);
if (pos < 0)
{
break;
}
names.Add(namesStr.Substring(pos + 5, namesStr.IndexOf(",", pos) - pos - 5));
pos += 5;
}
}
return names;
}
private void LoadTable(string name, Base parent)
{
string description = GetObjectDescription(name);
TableObject table = ComponentsFactory.CreateTableObject(name, parent);
LoadComponent(description, table);
LoadSize(description, table);
LoadBorder(description, table.Border);
table.Style = GetPropertyValue("StyleName", description).Replace("\"", "");
List rowNames = GetChildNames(DEV_EXPRESS_TABLE_ROW, description);
TableInfo tableInfo = new TableInfo();
// Create table columns.
int columnsCount = 0;
foreach (string rowName in rowNames)
{
string rowDescription = GetObjectDescription(rowName);
List cellNames = GetChildNames(DEV_EXPRESS_TABLE_CELL, rowDescription);
if (columnsCount < cellNames.Count)
{
columnsCount = cellNames.Count;
tableInfo.Column.Clear();
foreach (string cellName in cellNames)
{
tableInfo.Column.Add(GetWeight(cellName));
}
}
}
for (int i = 0; i < rowNames.Count; i++)
{
tableInfo.Row.Add(GetWeight(rowNames[i]));
}
for (int i = 0; i < columnsCount; i++)
{
TableColumn column = new TableColumn();
column.Width = GetRowColumnSize(tableInfo.Column, i, table.Width);
table.Columns.Add(column);
column.CreateUniqueName();
}
// Create table rows.
for (int i = 0; i < rowNames.Count; i++)
{
TableRow row = new TableRow();
row.Name = rowNames[i];
string rowDescription = GetObjectDescription(row.Name);
row.Height = GetRowColumnSize(tableInfo.Row, i, table.Height);
List cellNames = GetChildNames(DEV_EXPRESS_TABLE_CELL, rowDescription);
// Create table cell.
foreach (string cellName in cellNames)
{
TableCell cell = new TableCell();
cell.Name = cellName;
LoadTableCell(cellName, cell);
row.AddChild(cell);
}
table.Rows.Add(row);
}
}
private float GetWeight(string componentName)
{
string weight = GetPropertyValue("Weight", GetObjectDescription(componentName));
weight = weight.Substring(0, weight.Length - 1);
return float.Parse(weight.Replace(".", ","));
}
private float GetRowColumnSize(List allSizes, int index, float totalSize)
{
float size = totalSize / allSizes.Sum() * allSizes[index];
if (allSizes.Count == 1)
return totalSize;
return size;
}
private void LoadObjects(string description, Base parent)
{
List names = GetObjectNames(description);
foreach (string name in names)
{
string type = GetObjectType(name);
if (!String.IsNullOrEmpty(type))
{
switch (type)
{
case DEV_EXPRESS_LABEL:
LoadLabel(name, parent);
break;
case DEV_EXPRESS_PAGE_INFO:
LoadLabel(name, parent);
break;
case DEV_EXPRESS_LINE:
LoadLine(name, parent);
break;
case DEV_EXPRESS_PICTURE:
LoadPicture(name, parent);
break;
case DEV_EXPRESS_SHAPE:
LoadShape(name, parent);
break;
case DEV_EXPRESS_ZIP_CODE:
LoadZipCode(name, parent);
break;
case DEV_EXPRESS_BAR_CODE:
LoadBarCode(name, parent);
break;
case DEV_EXPRESS_RICH_TEXT:
LoadRichText(name, parent);
break;
case DEV_EXPRESS_TABLE:
LoadTable(name, parent);
break;
default:
break;
}
}
}
}
private void LoadPageSize()
{
string height = GetPropertyValue("PageHeight", devText);
string width = GetPropertyValue("PageWidth", devText);
if (!String.IsNullOrEmpty(height))
page.PaperHeight = UnitsConverter.SizeFToPixels(height) / Units.Millimeters;
if (!String.IsNullOrEmpty(width))
page.PaperWidth = UnitsConverter.SizeFToPixels(width) / Units.Millimeters;
}
private void CheckDpiZoom()
{
string dpi = GetPropertyValue("Dpi", devText);
if (!String.IsNullOrEmpty(dpi))
{
UnitsConverter.Ratio = float.Parse(dpi.Substring(0, dpi.Length - 1)) / 96;
}
}
private List GetStyleNames()
{
List names = new List();
int start = devText.IndexOf(DEV_EXPRESS_STYLE);
while (start > -1)
{
start += DEV_EXPRESS_STYLE.Length;
int end = devText.IndexOf(";", start);
names.Add(devText.Substring(start, end - start));
start = end;
start = devText.IndexOf(DEV_EXPRESS_STYLE, start);
}
return names;
}
private void LoadStyles()
{
List names = GetStyleNames();
foreach (string name in names)
{
Style style = ComponentsFactory.CreateStyle(name, Report);
string description = GetObjectDescription(name);
LoadBorder(description, style.Border);
style.TextFill = new SolidFill(UnitsConverter.ConvertColor(GetPropertyValue("ForeColor", description)));
style.Fill = new SolidFill(UnitsConverter.ConvertBackColor(GetPropertyValue("BackColor", description)));
style.Font = LoadFont(description);
}
}
private void ApplyStyleByName(ReportComponentBase component, string styleName)
{
foreach (Style subStyle in Report.Styles)
{
if (subStyle.Name == styleName)
{
Font f = new Font("Arial", 10, FontStyle.Regular);
if (component is TextObject)
{
f = (component as TextObject).Font;
}
component.Style = styleName;
component.ApplyStyle(subStyle);
string descr = GetObjectDescription(component.Name);
string useFont = GetPropertyValue("UseFont", descr);
if (useFont != string.Empty)
if (!UnitsConverter.ConvertBool(useFont))
{
(component as TextObject).Font = f;
}
return;
}
}
}
private void LoadTopMarginBand() // Page Header
{
string name = FindObjectName(TOP_MARGIN_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
PageHeaderBand header = ComponentsFactory.CreatePageHeaderBand(page);
string description = GetObjectDescription(name);
LoadBand(header, description);
LoadObjects(description, header);
}
}
private void LoadBottomMarginBand() // Page Footer
{
string name = FindObjectName(BOTTOM_MARGIN_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
PageFooterBand footer = ComponentsFactory.CreatePageFooterBand(page);
string description = GetObjectDescription(name);
LoadBand(footer, description);
LoadObjects(description, footer);
}
}
private void LoadReportHeaderBand() // Report Title
{
string name = FindReportOutsideBandName(REPORT_HEADER_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
ReportTitleBand title = ComponentsFactory.CreateReportTitleBand(page);
string description = GetObjectDescription(name);
LoadBand(title, description);
LoadObjects(description, title);
}
}
private void LoadReportFooterBand() // Report Summary
{
string name = FindObjectName(REPORT_FOOTER_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
ReportSummaryBand summary = ComponentsFactory.CreateReportSummaryBand(page);
string description = GetObjectDescription(name);
LoadBand(summary, description);
LoadObjects(description, summary);
}
}
#region DetailReportBand
private void LoadDetailReportBand() // One More Data Band
{
//string name = FindObjectName(DETAIL_REPORT_BAND_MASK);
List detailReports = NamesOfDetailReportBand();
for (int i = 0; i < detailReports.Count; i++)
{
string name = detailReports.Where(x => GetLevelPropValue(GetObjectDescription(x)) == i).FirstOrDefault();
if (!String.IsNullOrEmpty(name))
{
DataBand data = ComponentsFactory.CreateDataBand(page);
string description = GetObjectDescription(name);
List bandsInDetailReport = GetBandsNames(description);
LoadDetailBandInDetailReport(bandsInDetailReport, data);
LoadReportHeaderFooter(bandsInDetailReport, data);
LoadDetailReportGroupBands(bandsInDetailReport, data);
}
}
}
private List NamesOfDetailReportBand()
{
List names = new List();
int start = 0;
while (start != -1)
{
start = devText.IndexOf(DETAIL_REPORT_BAND_MASK, start);
if (start == -1)
return names;
start += DETAIL_REPORT_BAND_MASK.Length + 1;
int end = devText.IndexOf(";", start);
string stringName = devText.Substring(start, end - start).Replace("}", ",");
if (!stringName.EndsWith(")"))
names.Add(devText.Substring(start, end - start).Replace("}", ","));
}
return names;
}
private void LoadDetailBandInDetailReport(List bands, BandBase data)
{
string detailName = bands.Where(x => IsTypeOfBand(x, DETAIL_BAND_MASK)).FirstOrDefault();
if (String.IsNullOrEmpty(detailName))
return;
string detailDescription = GetObjectDescription(detailName);
LoadBand(data, detailDescription);
LoadObjects(detailDescription, data);
bands.Remove(detailName);
}
private void LoadReportHeaderFooter(List bands, DataBand data)
{
GroupHeaderBand header = LoadReportHeaderInDetailReport(bands, data);
LoadReportFooterInDetailReport(bands, header);
}
private GroupHeaderBand LoadReportHeaderInDetailReport(List bands, DataBand data)
{
string detailName = bands.Where(x => IsTypeOfBand(x, REPORT_HEADER_BAND_MASK)).FirstOrDefault();
if (detailName == null)
return null;
// Load one more report header as GroupHeader, 'cause FR don't support more than one ReportTitle band
GroupHeaderBand groupHeader = new GroupHeaderBand();
groupHeader.Data = data;
page.Bands.Add(groupHeader);
string detailDescription = GetObjectDescription(detailName);
LoadBand(groupHeader, detailDescription);
LoadObjects(detailDescription, groupHeader);
bands.Remove(detailName);
return groupHeader;
}
private void LoadReportFooterInDetailReport(List bands, GroupHeaderBand header)
{
if (header == null)
return;
string detailName = bands.Where(x => IsTypeOfBand(x, REPORT_FOOTER_BAND_MASK)).FirstOrDefault();
if (String.IsNullOrEmpty(detailName))
return;
// Load one more report header as GroupHeader, 'cause FR don't support more than one ReportTitle band
GroupFooterBand groupFooter = new GroupFooterBand();
header.GroupFooter = groupFooter;
string detailDescription = GetObjectDescription(detailName);
LoadBand(groupFooter, detailDescription);
LoadObjects(detailDescription, groupFooter);
bands.Remove(detailName);
}
private void LoadDetailReportGroupBands(List subBands, DataBand data)
{
int curLevel = 0;
for (int i = 0; i < subBands.Count; i++)
{
// Search header
string headerName = "";
if (i == 0)
// First header level may or may not contain a property "level", but the second level must contain a property with a value of 1
headerName = subBands.Where(x => (GetLevelPropValue(GetObjectDescription(x)) == curLevel || GetLevelPropValue(GetObjectDescription(x)) == -1) && GetBandType(x).Equals(GROUP_HEADER_BAND_MASK)).FirstOrDefault();
else
headerName = subBands.Where(x => GetLevelPropValue(GetObjectDescription(x)) == curLevel && GetBandType(x).Equals(GROUP_HEADER_BAND_MASK)).FirstOrDefault();
// Try to create header
GroupHeaderBand groupHeader = LoadDetailReportGroupHeaderBand(data, headerName);
if (groupHeader == null)
{
curLevel++;
continue;
}
int headerLevel = GetLevelPropValue(GetObjectDescription(headerName));
// The same situation with levels
if (headerLevel == -1 && i != 0)
headerLevel = -2;
string footerName = subBands.Where(x => GetLevelPropValue(GetObjectDescription(x)) == headerLevel && GetBandType(x).Equals(GROUP_FOOTER_BAND_MASK)).FirstOrDefault();
LoadDetailReportGroupFooterBand(groupHeader, footerName);
curLevel++;
}
}
private GroupHeaderBand LoadDetailReportGroupHeaderBand(DataBand data, string bandName)
{
if (bandName == null)
return null;
GroupHeaderBand groupHeader = new GroupHeaderBand();
if (data.Parent is GroupHeaderBand)
{
GroupHeaderBand parent = data.Parent as GroupHeaderBand;
groupHeader.Data = data;
parent.NestedGroup = groupHeader;
}
else
{
groupHeader.Data = data;
page.Bands.Add(groupHeader);
}
string detailDescription = GetObjectDescription(bandName);
LoadBand(groupHeader, detailDescription);
LoadObjects(detailDescription, groupHeader);
return groupHeader;
}
private void LoadDetailReportGroupFooterBand(GroupHeaderBand groupHeader, string bandName)
{
if (groupHeader == null || String.IsNullOrEmpty(bandName))
return;
GroupFooterBand groupFooter = new GroupFooterBand();
groupHeader.GroupFooter = groupFooter;
string detailDescription = GetObjectDescription(bandName);
LoadBand(groupFooter, detailDescription);
LoadObjects(detailDescription, groupFooter);
}
#endregion
private void LoadDetailBand() // Data
{
string name = FindObjectName(DETAIL_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
DataBand data = ComponentsFactory.CreateDataBand(page);
string description = GetObjectDescription(name);
LoadBand(data, description);
LoadObjects(description, data);
LoadGroupHeaderFooterBand(data);
}
}
private void LoadGroupHeaderFooterBand(DataBand data)
{
GroupHeaderBand groupHeader = LoadGroupHeaderBand(data);
LoadGroupFooterBand(groupHeader);
}
private GroupHeaderBand LoadGroupHeaderBand(DataBand data)
{
string name = FindReportOutsideBandName(GROUP_HEADER_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
GroupHeaderBand groupHeader = new GroupHeaderBand();
groupHeader.Data = data;
page.Bands.Add(groupHeader);
string description = GetObjectDescription(name);
LoadBand(groupHeader, description);
LoadObjects(description, groupHeader);
return groupHeader;
}
return null;
}
private void LoadGroupFooterBand(GroupHeaderBand header)
{
if (header == null)
return;
string name = FindReportOutsideBandName(GROUP_FOOTER_BAND_MASK);
if (!String.IsNullOrEmpty(name))
{
GroupFooterBand groupFooter = new GroupFooterBand();
header.GroupFooter = groupFooter;
string Description = GetObjectDescription(name);
LoadBand(groupFooter, Description);
LoadObjects(Description, groupFooter);
}
}
private void LoadReport()
{
CheckDpiZoom();
LoadPageSize();
LoadStyles();
LoadOutsideBandsNames();
LoadTopMarginBand();
LoadBottomMarginBand();
LoadReportHeaderBand();
LoadReportFooterBand();
LoadDetailBand();
LoadDetailReportBand();
UnitsConverter.Ratio = 1;
}
#endregion // Private Methods
#region Public Methods
///
public override void LoadReport(Report report, string filename)
{
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
LoadReport(report, fs);
}
}
///
public override void LoadReport(Report report, Stream content)
{
Report = report;
Report.Clear();
using (var sr = new StreamReader(content))
{
devText = sr.ReadToEnd();
}
try
{
devDoc = new System.Xml.XmlDocument();
devDoc.LoadXml(devText);
}
catch { }
page = ComponentsFactory.CreateReportPage(Report);
if (devDoc.LastChild != null)
{
LoadReportXml();
}
else
{
LoadReportCode();
}
}
#endregion // Public Methods
}
}