blob: c2143e852b38781cca07ca93dae2191c8e333757 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Xml;
using System.Drawing;
namespace OfficeOpenXml.Style.Dxf
{
public class ExcelDxfStyleConditionalFormatting : DxfStyleBase<ExcelDxfStyleConditionalFormatting>
{
XmlHelperInstance _helper;
internal ExcelDxfStyleConditionalFormatting(XmlNamespaceManager nameSpaceManager, XmlNode topNode, ExcelStyles styles) : base(styles)
{
NumberFormat = new ExcelDxfNumberFormat(_styles);
Font = new ExcelDxfFontBase(_styles);
Border = new ExcelDxfBorderBase(_styles);
Fill = new ExcelDxfFill(_styles);
if (topNode != null)
{
_helper = new XmlHelperInstance(nameSpaceManager, topNode);
NumberFormat.NumFmtID = _helper.GetXmlNodeInt("d:numFmt/@numFmtId");
NumberFormat.Format = _helper.GetXmlNodeString("d:numFmt/@formatCode");
if (NumberFormat.NumFmtID < 164 && string.IsNullOrEmpty(NumberFormat.Format))
{
NumberFormat.Format = ExcelNumberFormat.GetFromBuildInFromID(NumberFormat.NumFmtID);
}
Font.Bold = _helper.GetXmlNodeBoolNullable("d:font/d:b/@val");
Font.Italic = _helper.GetXmlNodeBoolNullable("d:font/d:i/@val");
Font.Strike = _helper.GetXmlNodeBoolNullable("d:font/d:strike");
Font.Underline = GetUnderLineEnum(_helper.GetXmlNodeString("d:font/d:u/@val"));
Font.Color = GetColor(_helper, "d:font/d:color");
Border.Left = GetBorderItem(_helper, "d:border/d:left");
Border.Right = GetBorderItem(_helper, "d:border/d:right");
Border.Bottom = GetBorderItem(_helper, "d:border/d:bottom");
Border.Top = GetBorderItem(_helper, "d:border/d:top");
Fill.PatternType = GetPatternTypeEnum(_helper.GetXmlNodeString("d:fill/d:patternFill/@patternType"));
Fill.BackgroundColor = GetColor(_helper, "d:fill/d:patternFill/d:bgColor/");
Fill.PatternColor = GetColor(_helper, "d:fill/d:patternFill/d:fgColor/");
}
else
{
_helper = new XmlHelperInstance(nameSpaceManager);
}
_helper.SchemaNodeOrder = new string[] { "font", "numFmt", "fill", "border" };
}
private ExcelDxfBorderItem GetBorderItem(XmlHelperInstance helper, string path)
{
ExcelDxfBorderItem bi = new ExcelDxfBorderItem(_styles);
bi.Style = GetBorderStyleEnum(helper.GetXmlNodeString(path+"/@style"));
bi.Color = GetColor(helper, path+"/d:color");
return bi;
}
private ExcelBorderStyle GetBorderStyleEnum(string style)
{
if (style == "") return ExcelBorderStyle.None;
string sInStyle = style.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + style.Substring(1, style.Length - 1);
try
{
return (ExcelBorderStyle)Enum.Parse(typeof(ExcelBorderStyle), sInStyle);
}
catch
{
return ExcelBorderStyle.None;
}
}
private ExcelFillStyle GetPatternTypeEnum(string patternType)
{
if (patternType == "") return ExcelFillStyle.None;
patternType = patternType.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture) + patternType.Substring(1, patternType.Length - 1);
try
{
return (ExcelFillStyle)Enum.Parse(typeof(ExcelFillStyle), patternType);
}
catch
{
return ExcelFillStyle.None;
}
}
private ExcelDxfColor GetColor(XmlHelperInstance helper, string path)
{
ExcelDxfColor ret = new ExcelDxfColor(_styles);
ret.Theme = helper.GetXmlNodeIntNull(path + "/@theme");
ret.Index = helper.GetXmlNodeIntNull(path + "/@indexed");
string rgb=helper.GetXmlNodeString(path + "/@rgb");
if(rgb!="")
{
ret.Color = Color.FromArgb( int.Parse(rgb.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier),
int.Parse(rgb.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier),
int.Parse(rgb.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier),
int.Parse(rgb.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier));
}
ret.Auto = helper.GetXmlNodeBoolNullable(path + "/@auto");
ret.Tint = helper.GetXmlNodeDoubleNull(path + "/@tint");
return ret;
}
private ExcelUnderLineType? GetUnderLineEnum(string value)
{
switch(value.ToLower(CultureInfo.InvariantCulture))
{
case "single":
return ExcelUnderLineType.Single;
case "double":
return ExcelUnderLineType.Double;
case "singleaccounting":
return ExcelUnderLineType.SingleAccounting;
case "doubleaccounting":
return ExcelUnderLineType.DoubleAccounting;
default:
return null;
}
}
internal int DxfId { get; set; }
public ExcelDxfFontBase Font { get; set; }
public ExcelDxfNumberFormat NumberFormat { get; set; }
public ExcelDxfFill Fill { get; set; }
public ExcelDxfBorderBase Border { get; set; }
protected internal override string Id
{
get
{
return NumberFormat.Id + Font.Id + Border.Id + Fill.Id +
(AllowChange ? "" : DxfId.ToString());//If allowchange is false we add the dxfID to ensure it's not used when conditional formatting is updated);
}
}
protected internal override ExcelDxfStyleConditionalFormatting Clone()
{
var s=new ExcelDxfStyleConditionalFormatting(_helper.NameSpaceManager, null, _styles);
s.Font = Font.Clone();
s.NumberFormat = NumberFormat.Clone();
s.Fill = Fill.Clone();
s.Border = Border.Clone();
return s;
}
protected internal override void CreateNodes(XmlHelper helper, string path)
{
if(Font.HasValue) Font.CreateNodes(helper, "d:font");
if (NumberFormat.HasValue) NumberFormat.CreateNodes(helper, "d:numFmt");
if (Fill.HasValue) Fill.CreateNodes(helper, "d:fill");
if (Border.HasValue) Border.CreateNodes(helper, "d:border");
}
protected internal override bool HasValue
{
get { return Font.HasValue || NumberFormat.HasValue || Fill.HasValue || Border.HasValue; }
}
}
}