using System;
using System.Globalization;
using System.Drawing;
using FastReport.Utils;
using FastReport.Barcode;
using System.Drawing.Drawing2D;
using FastReport.Format;
using System.Xml;
#if MSCHART
using FastReport.DataVisualization.Charting;
#endif
using FastReport.Matrix;
namespace FastReport.Import.StimulSoft
{
///
/// The StimulSoft units converter.
///
public static class UnitsConverter
{
#region Public Methods
///
/// Converts value to Boolean.
///
/// Boolen value as string.
public static bool ConvertBool(string str)
{
return str.ToLower() == "true";
}
///
/// Converts value to PageUnits.
///
///
///
public static float GetPixelsInUnit(PageUnits unitType)
{
switch (unitType)
{
case PageUnits.Centimeters:
return Units.Centimeters;
case PageUnits.Inches:
return Units.Inches;
case PageUnits.HundrethsOfInch:
return Units.HundrethsOfInch;
default:
return Units.Millimeters;
}
}
///
/// Converts value to PageUnits.
///
///
///
public static PageUnits ConverPageUnits(string unitType)
{
switch (unitType)
{
case "Centimeters":
return PageUnits.Centimeters;
case "Inches":
return PageUnits.Inches;
case "HundredthsOfInch":
return PageUnits.HundrethsOfInch;
default:
return PageUnits.Millimeters;
}
}
///
/// Converts the PaperSize to width and height values of paper size in millimeters
///
/// The PaperSize value.
/// The ReportPage instance.
public static void ConvertPaperSize(string paperSize, ReportPage page)
{
if (page == null)
return;
float width = 210;
float height = 297;
switch (paperSize)
{
case "A4":
width = 210;
height = 297;
break;
case "A3":
width = 297;
height = 420;
break;
case "A5":
width = 148;
height = 210;
break;
case "B4":
width = 257;
height = 364;
break;
case "B5":
width = 182;
height = 257;
break;
case "Legal":
width = 216;
height = 356;
break;
case "Letter":
width = 216;
height = 279;
break;
case "Tabloid":
width = 432;
height = 279;
break;
case "Statement":
width = 140;
height = 216;
break;
case "Executive":
width = 184;
height = 267;
break;
default:
width = 210;
height = 297;
break;
}
page.PaperWidth = width;
page.PaperHeight = height;
}
///
/// Parse int value.
///
///
///
public static int ConvertInt(string strInt)
{
int result = 0;
int.TryParse(strInt, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out result);
return result;
}
///
/// Parse float value
///
///
///
public static float ConvertFloat(string strFloat)
{
float result = 0;
float.TryParse(strFloat, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out result);
return result;
}
///
/// Converts StimulSoft Color.
///
/// The DevExpress Color value as string.
/// The Color value.
public static Color ConvertColor(string str)
{
if (!String.IsNullOrEmpty(str))
{
if (str.Contains("["))
{
string[] rgb = str.Replace("[", "").Replace("]","").Split(':');
if(rgb.Length > 3)
return Color.FromArgb(ConvertInt(rgb[0]), ConvertInt(rgb[1]), ConvertInt(rgb[2]), ConvertInt(rgb[3]));
return Color.FromArgb(ConvertInt(rgb[0]), ConvertInt(rgb[1]), ConvertInt(rgb[2]));
}
else if (str.Contains(","))
{
string[] rgb = str.Replace(" ", "").Split(',');
if (rgb.Length > 3)
return Color.FromArgb(ConvertInt(rgb[0]), ConvertInt(rgb[1]), ConvertInt(rgb[2]), ConvertInt(rgb[3]));
return Color.FromArgb(ConvertInt(rgb[0]), ConvertInt(rgb[1]), ConvertInt(rgb[2]));
}
else
return Color.FromName(str);
}
return Color.Black;
}
///
/// Converts StimulSoft Border.
///
///
///
public static Border ConvertBorder(string border)
{
Border result = new Border();
string[] parametrs = border.Split(';');
int indexParam = 0;
if (border.StartsWith("Adv"))
{
parametrs = border.Remove(0, 3).Split(';');
result.SimpleBorder = false;
for (int i = 0; i < 4; i++)
{
BorderLine line = new BorderLine();
line.Color = ConvertColor(parametrs[indexParam]);
indexParam++;
line.Width = ConvertInt(parametrs[indexParam]);
indexParam++;
if (parametrs[indexParam] == "None")
{
indexParam++;
continue;
}
else
{
line.Style = ConvertBorderDashStyle(parametrs[indexParam]);
indexParam++;
}
switch (i)
{
case 0:
result.TopLine = line;
result.Lines |= BorderLines.Top;
break;
case 1:
result.BottomLine = line;
result.Lines |= BorderLines.Bottom;
break;
case 2:
result.LeftLine = line;
result.Lines |= BorderLines.Left;
break;
case 3:
result.RightLine = line;
result.Lines |= BorderLines.Right;
break;
}
}
}
else
{
result.Lines = ConvertBorderSides(parametrs[indexParam]);
indexParam++;
result.Color = ConvertColor(parametrs[indexParam]);
indexParam++;
result.Width = ConvertInt(parametrs[indexParam]);
indexParam++;
result.Style = ConvertBorderDashStyle(parametrs[indexParam]);
indexParam++;
}
result.Shadow = ConvertBool(parametrs[indexParam]);
indexParam++;
result.ShadowWidth = ConvertInt(parametrs[indexParam]);
indexParam++;
result.ShadowColor = ConvertColor(parametrs[indexParam]);
return result;
}
///
/// Converts the StimulSoft BorderDashStyle to LineStyle.
///
/// The DevExpress BorderDashStyle value.
/// The LineStyle value.
public static LineStyle ConvertBorderDashStyle(string borderDashStyle)
{
if (borderDashStyle.Equals("Dot"))
{
return LineStyle.Dot;
}
else if (borderDashStyle.Equals("Dash"))
{
return LineStyle.Dash;
}
else if (borderDashStyle.Equals("DashDot"))
{
return LineStyle.DashDot;
}
else if (borderDashStyle.Equals("DashDotDot"))
{
return LineStyle.DashDotDot;
}
else if (borderDashStyle.Equals("Double"))
{
return LineStyle.Double;
}
return LineStyle.Solid;
}
#if MSCHART
///
/// Converts the StimulSoft BorderDashStyle to LineStyle.
///
/// The DevExpress BorderDashStyle value.
/// The LineStyle value.
public static ChartDashStyle ConvertBorderChartDashStyle(string chartDashStyle)
{
if (chartDashStyle.Equals("Dot"))
{
return ChartDashStyle.Dot;
}
else if (chartDashStyle.Equals("Dash"))
{
return ChartDashStyle.Dash;
}
else if (chartDashStyle.Equals("DashDot"))
{
return ChartDashStyle.DashDot;
}
else if (chartDashStyle.Equals("DashDotDot"))
{
return ChartDashStyle.DashDotDot;
}
else if (chartDashStyle.Equals("Double"))
{
return ChartDashStyle.NotSet;
}
return ChartDashStyle.Solid;
}
#endif
///
/// Converts the StimulSoft LineStyle to LineStyle.
///
/// The StimulSoft LineStyle value.
/// The LineStyle value.
public static LineStyle ConvertLineStyle(string lineStyle)
{
if (lineStyle == "System.Drawing.Drawing2D.DashStyle.Dot")
{
return LineStyle.Dot;
}
else if (lineStyle == "System.Drawing.Drawing2D.DashStyle.Dash")
{
return LineStyle.Dash;
}
else if (lineStyle == "System.Drawing.Drawing2D.DashStyle.DashDot")
{
return LineStyle.DashDot;
}
else if (lineStyle == "System.Drawing.Drawing2D.DashStyle.DashDotDot")
{
return LineStyle.DashDotDot;
}
else if (lineStyle == "System.Drawing.Drawing2D.DashStyle.Double")
{
return LineStyle.Double;
}
return LineStyle.Solid;
}
///
/// Converts the StimulSoft TextAlignment to HorzAlignment.
///
/// The StimulSoft TextAlignment value.
/// The HorzAlign value.
public static HorzAlign ConvertTextAlignmentToHorzAlign(string textAlignment)
{
if (textAlignment.Contains("Center"))
{
return HorzAlign.Center;
}
if (textAlignment.Contains("Width"))
{
return HorzAlign.Justify;
}
if (textAlignment.Contains("Right"))
{
return HorzAlign.Right;
}
return HorzAlign.Left;
}
///
/// Converts the StimulSoft Brush to FillBase object.
///
///
///
public static FillBase ConvertBrush(string brush)
{
string[] parametrs = brush.Split(',');
if (brush.Contains("HatchBrush"))
{
HatchFill fill = new HatchFill();
fill.ForeColor = ConvertColor(parametrs[2]);
fill.BackColor = ConvertColor(parametrs[3]);
foreach (HatchStyle style in Enum.GetValues(typeof(HatchStyle)))
{
if (style.ToString() == parametrs[1])
{
fill.Style = style;
break;
}
}
return fill;
}
if (brush.Contains("GradientBrush"))
{
return new LinearGradientFill(ConvertColor(parametrs[2]), ConvertColor(parametrs[1]), ConvertInt(parametrs[3]));
}
if (brush.Contains("GlareBrush"))
{
return new LinearGradientFill(ConvertColor(parametrs[1]), ConvertColor(parametrs[2]), ConvertInt(parametrs[3]), ConvertFloat(parametrs[4]), 100);
}
if (brush.Contains("GlassBrush"))
{
return new GlassFill(ConvertColor(parametrs[1]), ConvertFloat(parametrs[3]), ConvertBool(parametrs[2]));
}
return new SolidFill(ConvertColor(brush));
}
///
/// Converts the StimulSoft Format to FormatBase object.
///
///
///
public static FormatBase ConvertFormat(XmlNode node)
{
switch (node.Attributes["type"].Value)
{
case "NumberFormat":
NumberFormat numberFormat = new NumberFormat();
if (node["GroupSeparator"] != null)
numberFormat.GroupSeparator = node["GroupSeparator"].InnerText;
if (node["NegativePattern"] != null)
numberFormat.NegativePattern = ConvertInt(node["NegativePattern"].InnerText);
if (node["DecimalDigits"] != null)
numberFormat.DecimalDigits = ConvertInt(node["DecimalDigits"].InnerText);
if (node["DecimalSeparator"] != null)
numberFormat.DecimalSeparator = node["DecimalSeparator"].InnerText;
return numberFormat;
case "CurrencyFormat":
CurrencyFormat currencyFormat = new CurrencyFormat();
if (node["GroupSeparator"] != null)
currencyFormat.GroupSeparator = node["GroupSeparator"].InnerText;
if (node["NegativePattern"] != null)
currencyFormat.NegativePattern = ConvertInt(node["NegativePattern"].InnerText);
if (node["DecimalDigits"] != null)
currencyFormat.DecimalDigits = ConvertInt(node["DecimalDigits"].InnerText);
if (node["DecimalSeparator"] != null)
currencyFormat.DecimalSeparator = node["DecimalSeparator"].InnerText;
if (node["PositivePattern"] != null)
currencyFormat.PositivePattern = ConvertInt(node["PositivePattern"].InnerText);
if (node["Symbol"] != null)
currencyFormat.CurrencySymbol = node["Symbol"].InnerText;
return currencyFormat;
case "PercentageFormat":
PercentFormat percentFormat = new PercentFormat();
if (node["GroupSeparator"] != null)
percentFormat.GroupSeparator = node["GroupSeparator"].InnerText;
if (node["NegativePattern"] != null)
percentFormat.NegativePattern = ConvertInt(node["NegativePattern"].InnerText);
if (node["DecimalDigits"] != null)
percentFormat.DecimalDigits = ConvertInt(node["DecimalDigits"].InnerText);
if (node["DecimalSeparator"] != null)
percentFormat.DecimalSeparator = node["DecimalSeparator"].InnerText;
if (node["PositivePattern"] != null)
percentFormat.PositivePattern = ConvertInt(node["PositivePattern"].InnerText);
return percentFormat;
case "DateFormat":
DateFormat dataFormats = new DateFormat();
if (node["StringFormat"] != null)
dataFormats.Format = node["StringFormat"].InnerText;
return dataFormats;
case "TimeFormat":
TimeFormat timeFormats = new TimeFormat();
if (node["StringFormat"] != null)
timeFormats.Format = node["StringFormat"].InnerText;
return timeFormats;
case "BooleanFormat":
BooleanFormat booleanFormat = new BooleanFormat();
if (node["FalseDisplay"] != null)
booleanFormat.FalseText = node["FalseDisplay"].InnerText;
if (node["TrueDisplay"] != null)
booleanFormat.TrueText = node["TrueDisplay"].InnerText;
return booleanFormat;
case "CustomFormat":
CustomFormat customFormat = new CustomFormat();
customFormat.Format = node["StringFormat"].InnerText;
return customFormat;
}
return new GeneralFormat();
}
///
/// Converts the StimulSoft RTF string to raw RTF.
///
///
///
public static string ConvertRTF(string rtfStimulsoft)
{
string result = rtfStimulsoft.Replace("__LP__", "{").Replace("__RP__", "}");
for(int i = 0; i < result.Length; i++)
{
if(result[i] == '_')
try
{
result = result.Replace(result.Substring(i, 7), ((char)Int16.Parse(result.Substring(i + 2, 4), NumberStyles.AllowHexSpecifier)).ToString());
}
catch { }
}
return result;
}
///
/// Converts the StimulSoft CapStyle to CapStyle.
///
///
///
public static CapStyle ConvertCapStyle(string style)
{
switch (style)
{
case "Diamond":
return CapStyle.Diamond;
case "Open":
return CapStyle.Arrow;
case "Square":
return CapStyle.Square;
case "Oval":
return CapStyle.Circle;
default:
return CapStyle.Arrow;
}
}
///
/// Converts the StimulSoft TextAlignment to VertAlignment.
///
/// The StimulSoft TextAlignment value.
/// The VertAlign value.
public static VertAlign ConvertTextAlignmentToVertAlign(string textAlignment)
{
if (textAlignment.Contains("Center"))
{
return VertAlign.Center;
}
if (textAlignment.Contains("Bottom"))
{
return VertAlign.Bottom;
}
return VertAlign.Top;
}
///
/// Converts the StimulSoft CheckedSymbol to CheckedSymbol.
///
///
///
public static CheckedSymbol ConvertCheckSymbol(string checksymbol)
{
switch (checksymbol)
{
case "Cross":
return CheckedSymbol.Cross;
case "DotRectangle":
return CheckedSymbol.Fill;
default:
return CheckedSymbol.Check;
}
}
///
/// Converts the StimulSoft Barcode.Symbology to Barcode.Barcode.
///
/// The StimulSoft Barcode.Symbology value as string.
/// The BarcodeObject instance.
public static void ConvertBarcodeSymbology(string symbology, BarcodeObject barcode)
{
switch (symbology)
{
case "Stimulsoft.Report.BarCodes.StiEAN128bBarCodeType":
case "Stimulsoft.Report.BarCodes.StiEAN128cBarCodeType":
case "Stimulsoft.Report.BarCodes.StiEAN128AutoBarCodeType":
case "Stimulsoft.Report.BarCodes.StiEAN128aBarCodeType":
case "Stimulsoft.Report.BarCodes.StiGS1_128BarCodeType":
barcode.Barcode = new BarcodeEAN128();
break;
case "Stimulsoft.Report.BarCodes.StiDataMatrixBarCodeType":
barcode.Barcode = new BarcodeDatamatrix();
break;
case "Stimulsoft.Report.BarCodes.StiQRCodeBarCodeType":
barcode.Barcode = new BarcodeQR();
break;
case "Stimulsoft.Report.BarCodes.StiMaxicodeBarCodeType":
barcode.Barcode = new BarcodeMaxiCode();
break;
case "Stimulsoft.Report.BarCodes.StiPdf417BarCodeType":
barcode.Barcode = new BarcodePDF417();
break;
case "Stimulsoft.Report.BarCodes.StiAztecBarCodeType":
barcode.Barcode = new BarcodeAztec();
break;
case "Stimulsoft.Report.BarCodes.StiEAN8BarCodeType":
barcode.Barcode = new BarcodeEAN8();
break;
case "Stimulsoft.Report.BarCodes.StiUpcABarCodeType":
barcode.Barcode = new BarcodeUPC_A();
break;
case "Stimulsoft.Report.BarCodes.StiITF14BarCodeType":
barcode.Barcode = new BarcodeITF14();
break;
case "Stimulsoft.Report.BarCodes.StiAustraliaPost4StateBarCodeType":
break;
case "Stimulsoft.Report.BarCodes.StiIntelligentMail4StateBarCodeType":
barcode.Barcode = new BarcodeIntelligentMail();
break;
case "Stimulsoft.Report.BarCodes.StiCode128aBarCodeType":
case "Stimulsoft.Report.BarCodes.StiCode128bBarCodeType":
case "Stimulsoft.Report.BarCodes.StiCode128cBarCodeType":
case "Stimulsoft.Report.BarCodes.StiCode128AutoBarCodeType":
barcode.Barcode = new Barcode128();
break;
case "Stimulsoft.Report.BarCodes.StiCode39BarCodeType":
barcode.Barcode = new Barcode39();
break;
case "Stimulsoft.Report.BarCodes.StiCode39ExtBarCodeType":
barcode.Barcode = new Barcode39Extended();
break;
case "Stimulsoft.Report.BarCodes.StiCode93BarCodeType":
barcode.Barcode = new Barcode93();
break;
case "Stimulsoft.Report.BarCodes.StiCode93ExtBarCodeType":
barcode.Barcode = new Barcode93Extended();
break;
case "Stimulsoft.Report.BarCodes.StiCodabarBarCodeType":
barcode.Barcode = new BarcodeCodabar();
break;
case "Stimulsoft.Report.BarCodes.StiMsiBarCodeType":
barcode.Barcode = new BarcodeMSI();
break;
case "Stimulsoft.Report.BarCodes.StiPlesseyBarCodeType":
barcode.Barcode = new BarcodePlessey();
break;
case "Stimulsoft.Report.BarCodes.StiInterleaved2of5BarCodeType":
barcode.Barcode = new Barcode2of5Interleaved();
break;
case "Stimulsoft.Report.BarCodes.StiPharmacodeBarCodeType":
barcode.Barcode = new BarcodePharmacode();
break;
case "Stimulsoft.Report.BarCodes.StiStandard2of5BarCodeType":
case "Stimulsoft.Report.BarCodes.StiDutchKIXBarCodeType":
case "Stimulsoft.Report.BarCodes.StiRoyalMail4StateBarCodeType":
case "Stimulsoft.Report.BarCodes.StiFIMBarCodeType":
case "Stimulsoft.Report.BarCodes.StiCode11BarCodeType":
case "Stimulsoft.Report.BarCodes.StiUpcEBarCodeType":
case "Stimulsoft.Report.BarCodes.StiUpcSup2BarCodeType":
case "Stimulsoft.Report.BarCodes.StiJan13BarCodeType":
case "Stimulsoft.Report.BarCodes.StiJan8BarCodeType":
case "Stimulsoft.Report.BarCodes.StiSSCC18BarCodeType":
case "Stimulsoft.Report.BarCodes.StiIsbn10BarCodeType":
case "Stimulsoft.Report.BarCodes.StiIsbn13BarCodeType":
default:
barcode.Barcode = new Barcode39();
break;
}
}
///
/// Converts the StimulSoft border sides to FastReport border sides
///
///
public static BorderLines ConvertBorderSides(string sides)
{
BorderLines borderLines = BorderLines.None;
if (!String.IsNullOrEmpty(sides))
{
if (sides.IndexOf("Left") > -1)
{
borderLines |= BorderLines.Left;
}
if (sides.IndexOf("Top") > -1)
{
borderLines |= BorderLines.Top;
}
if (sides.IndexOf("Right") > -1)
{
borderLines |= BorderLines.Right;
}
if (sides.IndexOf("Bottom") > -1)
{
borderLines |= BorderLines.Bottom;
}
if (sides.IndexOf("All") > -1)
{
borderLines = BorderLines.All;
}
}
return borderLines;
}
///
/// Converts the StimulSoft AggregateFunction sides to FastReport MatrixAggregateFunction
///
///
///
public static MatrixAggregateFunction GetMatrixAggregateFunction(XmlNode node)
{
if (node["Summary"] != null)
{
switch (node["Summary"].InnerText)
{
case "Image":
return MatrixAggregateFunction.None;
case "Average":
return MatrixAggregateFunction.Avg;
case "Min":
return MatrixAggregateFunction.Min;
case "Max":
return MatrixAggregateFunction.Max;
case "Count":
return MatrixAggregateFunction.Count;
case "CountDistinct":
return MatrixAggregateFunction.CountDistinct;
case "None":
return MatrixAggregateFunction.None;
}
}
return MatrixAggregateFunction.Sum;
}
///
/// Convert fill to color
///
///
///
public static Color ConvertBrushToColor(FillBase fill)
{
if (fill is HatchFill)
return (fill as HatchFill).ForeColor;
if (fill is LinearGradientFill)
return (fill as LinearGradientFill).StartColor;
if (fill is GlassFill)
return (fill as GlassFill).Color;
if (fill is SolidFill)
return (fill as SolidFill).Color;
return Color.Transparent;
}
#if MSCHART
///
/// Converts the StimulSoft SeriesChartType to SeriesChartType.
///
///
///
public static SeriesChartType ConvertChartType(string value)
{
switch (value)
{
case "Stimulsoft.Report.Chart.StiPieSeries":
return SeriesChartType.Pie;
case "Stimulsoft.Report.Chart.StiStackedColumnSeries":
return SeriesChartType.StackedColumn;
case "Stimulsoft.Report.Chart.StiStackedLineSeries":
return SeriesChartType.StackedColumn;
case "Stimulsoft.Report.Chart.StiClusteredBarSeries":
return SeriesChartType.Bar;
case "Stimulsoft.Report.Chart.StiLineSeries":
return SeriesChartType.Line;
case "Stimulsoft.Report.Chart.StiGanttSeries":
case "Stimulsoft.Report.Chart.StiClusteredColumnSeries":
return SeriesChartType.Column;
case "Stimulsoft.Report.Chart.StiRadarAreaSeries":
case "Stimulsoft.Report.Chart.StiSteppedAreaSeries":
return SeriesChartType.Area;
case "Stimulsoft.Report.Chart.StiDoughnutSeries":
return SeriesChartType.Doughnut;
case "Stimulsoft.Report.Chart.StiStackedSplineAreaSeries":
return SeriesChartType.SplineArea;
case "Stimulsoft.Report.Chart.StiFullStackedColumnSeries":
return SeriesChartType.StackedColumn100;
case "Stimulsoft.Report.Chart.StiFullStackedAreaSeries":
return SeriesChartType.StackedArea100;
case "Stimulsoft.Report.Chart.StiStackedBarSeries":
return SeriesChartType.StackedBar;
default:
return SeriesChartType.Column;
}
}
#endif
///
/// Parse string to struct f Point.
///
///
///
public static Point ConvertPoint(string value)
{
string[] points = value.Split(',');
return new Point(ConvertInt(points[0]), ConvertInt(points[1]));
}
///
/// Parse string to struct of Size.
///
///
///
public static Size ConvertSize(string value)
{
string[] points = value.Split(',');
return new Size(ConvertInt(points[0]), ConvertInt(points[1]));
}
///
/// Converts the StimulSoft SeriesChartType to SeriesChartType.
///
///
///
public static ContentAlignment ConvertContentAlignment(string value)
{
switch (value)
{
case "TopLeft":
return ContentAlignment.TopLeft;
case "TopCenter":
return ContentAlignment.TopCenter;
case "TopRight":
return ContentAlignment.TopRight;
case "MiddleLeft":
return ContentAlignment.MiddleLeft;
case "MiddleCenter":
return ContentAlignment.MiddleCenter;
case "MiddleRight":
return ContentAlignment.MiddleRight;
case "BottomLeft":
return ContentAlignment.BottomLeft;
case "BottomCenter":
return ContentAlignment.BottomCenter;
case "BottomRight":
return ContentAlignment.BottomRight;
}
return ContentAlignment.TopLeft;
}
#endregion // Public Methods
}
}