/// <summary> /// Reconstructs an icon formatting rule from the specified XML image. /// </summary> /// <param name="node">The node containing the icon formatting rule XML.</param> /// <returns>The icon formatting rule.</returns> private static IconFormattingRule ReadIconFormattingRuleXml(XmlNode node) { IconFormattingRule formattingRule = new IconFormattingRule(); XmlNodeList ruleNodes = XmlHelper.SelectNodes(node, "iconFormattingRule/rules/rule"); foreach (XmlNode ruleNode in ruleNodes) { IconRule rule = new IconRule(); rule.Color = ColorInfoHelper.ReadColorInfoXml(ruleNode, "color"); rule.Condition = ConditionHelper.ReadConditionXml(ruleNode, "condition"); rule.Icon = (IconType)XmlHelper.ReadElementEnum(ruleNode, "icon", typeof(IconType), IconType.None); XmlNode iconIdNode = ruleNode.SelectSingleNode("iconId"); if (iconIdNode != null) { long iconId; if (long.TryParse(iconIdNode.InnerText, out iconId)) { rule.IconId = iconId; } } rule.Scale = 1; formattingRule.Rules.Add(rule); } return(formattingRule); }
/// <summary> /// Writes the icon formatting rule to the specified XML writer. /// </summary> /// <param name="iconFormattingRule">The icon formatting rule to serialize.</param> /// <param name="xmlWriter">The XML writer used to write the image to.</param> private static void WriteIconFormattingRuleXml(IconFormattingRule iconFormattingRule, XmlWriter xmlWriter) { xmlWriter.WriteStartElement("iconFormattingRule"); xmlWriter.WriteStartElement("rules"); foreach (IconRule rule in iconFormattingRule.Rules) { xmlWriter.WriteStartElement("rule"); ColorInfoHelper.WriteColorInfoXml("color", rule.Color, xmlWriter); xmlWriter.WriteElementString("icon", rule.Icon.ToString()); ConditionHelper.WriteConditionXml("condition", rule.Condition, xmlWriter); // Write out the Icon ID if (rule.IconId.HasValue) { xmlWriter.WriteStartElement("iconId"); xmlWriter.WriteAttributeString("entityRef", "true"); xmlWriter.WriteString(rule.IconId.Value.ToString(CultureInfo.InvariantCulture)); xmlWriter.WriteEndElement(); } xmlWriter.WriteEndElement(); // rule } xmlWriter.WriteEndElement(); // rules xmlWriter.WriteEndElement(); // iconFormattingRule }
/// <summary> /// Writes the column formats to the specified xml writer. /// </summary> /// <param name="columnFormats">The column formats to serialize.</param> /// <param name="xmlWriter">The writer used to write the xml.</param> public static void WriteColumnFormatsXml(IList <ColumnFormatting> columnFormats, XmlWriter xmlWriter) { if (columnFormats == null) { throw new ArgumentNullException("columnFormats"); } if (xmlWriter == null) { throw new ArgumentNullException("xmlWriter"); } if (columnFormats.Count > 0) { xmlWriter.WriteStartElement("columnFormats"); foreach (ColumnFormatting columnFormat in columnFormats) { xmlWriter.WriteStartElement("columnFormat"); xmlWriter.WriteElementString("queryColumnId", columnFormat.QueryColumnId.ToString()); xmlWriter.WriteElementString("columnName", columnFormat.ColumnName); columnFormat.ColumnType.ToXml(xmlWriter); xmlWriter.WriteElementString("showText", columnFormat.ShowText.ToString()); xmlWriter.WriteElementString("formatString", columnFormat.FormatString); xmlWriter.WriteElementString("decimalPlaces", columnFormat.DecimalPlaces.ToString()); xmlWriter.WriteElementString("prefix", columnFormat.Prefix); xmlWriter.WriteElementString("suffix", columnFormat.Suffix); xmlWriter.WriteElementString("lines", columnFormat.Lines.ToString()); if (columnFormat.FormattingRule is ColorFormattingRule) { ColorFormattingRule colorRule = columnFormat.FormattingRule as ColorFormattingRule; WriteColorFormattingRuleXml(colorRule, xmlWriter); } else if (columnFormat.FormattingRule is IconFormattingRule) { IconFormattingRule iconRule = columnFormat.FormattingRule as IconFormattingRule; WriteIconFormattingRuleXml(iconRule, xmlWriter); } else if (columnFormat.FormattingRule is BarFormattingRule) { BarFormattingRule barRule = columnFormat.FormattingRule as BarFormattingRule; WriteBarFormattingRuleXml(barRule, xmlWriter); } else if (columnFormat.FormattingRule is ImageFormattingRule) { var imageRule = columnFormat.FormattingRule as ImageFormattingRule; WriteImageFormattingRuleXml(imageRule, xmlWriter); } xmlWriter.WriteEndElement(); //columnFormat } xmlWriter.WriteEndElement(); //columnFormats } }
/// <summary> /// </summary> /// <param name="index"></param> /// <param name="ifr1"></param> /// <param name="ifr2"></param> private static void CompareIconFormattingRules(int index, IconFormattingRule ifr1, IconFormattingRule ifr2) { Assert.IsNotNull(ifr1, "Format Index:{0} IconFormattingRule 1 should not be null.", index.ToString(CultureInfo.InvariantCulture)); Assert.IsNotNull(ifr2, "Format Index:{0} IconFormattingRule 2 should not be null.", index.ToString(CultureInfo.InvariantCulture)); Assert.IsNotNull(ifr1.Rules, "Format Index:{0} IconFormattingRule.Rules 1 should not be null.", index.ToString(CultureInfo.InvariantCulture)); Assert.IsNotNull(ifr2.Rules, "Format Index:{0} IconFormattingRule.Rules 2 should not be null.", index.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ifr1.Rules.Count, ifr2.Rules.Count, "Format Index:{0} IconFormattingRule.Rules.Count is invalid.", index.ToString(CultureInfo.InvariantCulture)); for (int ri = 0; ri < ifr1.Rules.Count; ri++) { IconRule ir1 = ifr1.Rules[ri]; IconRule ir2 = ifr2.Rules[ri]; Assert.AreEqual(ir1.Color.A, ir2.Color.A, "Format Index:{0} Rule Index:{1} Color.A is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Color.R, ir2.Color.R, "Format Index:{0} Rule Index:{1} Color.R is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Color.G, ir2.Color.G, "Format Index:{0} Rule Index:{1} Color.G is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Color.B, ir2.Color.B, "Format Index:{0} Rule Index:{1} Color.B is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Icon, ir2.Icon, "Format Index:{0} Rule Index:{1} Icon is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Condition.ColumnName, ir2.Condition.ColumnName, "Format Index:{0} Rule Index:{1} Condition.ColumnName is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Condition.ColumnType.GetType( ), ir2.Condition.ColumnType.GetType( ), "Format Index:{0} Rule Index:{1} Condition.ColumnType is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Condition.Operator, ir2.Condition.Operator, "Format Index:{0} Rule Index:{1} Condition.Operator is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(ir1.Condition.Arguments.Count, ir2.Condition.Arguments.Count, "Format Index:{0} Rule Index:{1} Condition.Arguments.Count is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture)); for (int ti = 0; ti < ir1.Condition.Arguments.Count; ti++) { TypedValue tv1 = ir1.Condition.Arguments[ti]; TypedValue tv2 = ir1.Condition.Arguments[ti]; Assert.AreEqual(tv1.Type, tv2.Type, "Format Index:{0} Rule Index:{1} Arg Index:{2} Argument.Type is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture), ti.ToString(CultureInfo.InvariantCulture)); Assert.AreEqual(tv1.Value, tv2.Value, "Format Index:{0} Rule Index:{1} Arg Index:{2} Argument.Value is invalid", index.ToString(CultureInfo.InvariantCulture), ri.ToString(CultureInfo.InvariantCulture), ti.ToString(CultureInfo.InvariantCulture)); } } }
/// <summary> /// Initializes a new instance of the <see cref="ConditionalFormatter" /> class. /// </summary> /// <param name="columnFormats">The column formats.</param> /// <param name="additionalColumnInfo">The additional column info.</param> /// <param name="reportResult">The report result.</param> public ConditionalFormatter(IList <ColumnFormatting> columnFormats, IEnumerable <ResultColumn> additionalColumnInfo, ReportResult reportResult) { _reportResult = reportResult; if (columnFormats != null) { _formatRules = new Dictionary <string, List <ConditionInfo> >(columnFormats.Count); // Cache the formatting rules into a dictionary for fast lookup. Dictionary <string, ColumnFormatting> formatters = columnFormats.ToDictionary(cf => cf.EntityId.ToString(CultureInfo.InvariantCulture)); foreach (KeyValuePair <string, ColumnFormatting> keyValuePair in formatters.Where(f => f.Value != null)) { BarFormattingRule barFormattingRule = keyValuePair.Value.FormattingRule as BarFormattingRule; if (barFormattingRule != null) { ConditionInfo condition = new ConditionInfo { ColorRule = new ColorRule { BackgroundColor = barFormattingRule.Color }, Style = ConditionalFormatStyleEnum.ProgressBar, ShowText = keyValuePair.Value.ShowText }; DatabaseType columnForFormatType = additionalColumnInfo.FirstOrDefault(ac => ac.RequestColumn.EntityId.ToString(CultureInfo.InvariantCulture) == keyValuePair.Key).ColumnType; if (columnForFormatType != null) { barFormattingRule.Minimum.Type = columnForFormatType; barFormattingRule.Maximum.Type = columnForFormatType; } DateTime minumumDateTime; if (barFormattingRule.Minimum.Value != null && (columnForFormatType is DateType || columnForFormatType is TimeType || columnForFormatType is DateTimeType) && DateTime.TryParse(barFormattingRule.Minimum.Value.ToString(), out minumumDateTime)) { condition.LowerBounds = minumumDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); } else { float minimum; condition.LowerBounds = float.TryParse(barFormattingRule.Minimum.ValueString, out minimum) ? minimum : 0.0f; } DateTime maximumDateTime; if (barFormattingRule.Maximum.Value != null && (columnForFormatType is DateType || columnForFormatType is TimeType || columnForFormatType is DateTimeType) && DateTime.TryParse(barFormattingRule.Maximum.Value.ToString(), out maximumDateTime)) { condition.Upperbounds = maximumDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); } else { float maximum; if (float.TryParse(barFormattingRule.Maximum.ValueString, out maximum)) { condition.Upperbounds = maximum; } } _formatRules.Add(keyValuePair.Key, new List <ConditionInfo>(new[] { condition })); } ColorFormattingRule colorFormattingRule = keyValuePair.Value.FormattingRule as ColorFormattingRule; if (colorFormattingRule != null) { IList <ColorRule> colorRules = colorFormattingRule.Rules; List <ConditionInfo> predicates = new List <ConditionInfo>(colorRules.Count); foreach (ColorRule colorRule in colorRules) { ResultColumn gridResultColumn = additionalColumnInfo.FirstOrDefault(gu => gu.RequestColumn.EntityId.ToString(CultureInfo.InvariantCulture) == keyValuePair.Key); if (gridResultColumn == null) { continue; } colorRule.Condition.Arguments = TypedValuesForOperatorColumnType(colorRule.Condition.Arguments, colorRule.Condition.Operator, gridResultColumn.ColumnType); } predicates.AddRange(from colorRule in colorRules let gridResultColumn = additionalColumnInfo.FirstOrDefault(gu => gu.RequestColumn.EntityId.ToString(CultureInfo.InvariantCulture) == keyValuePair.Key) let predicate = PredicateForRule(colorRule.Condition, IsResourceCondition(gridResultColumn), gridResultColumn, this) where (predicate != null) select new ConditionInfo { Predicate = predicate, ColorRule = colorRule, Operator = colorRule.Condition.Operator, Values = colorRule.Condition.Arguments, Style = ConditionalFormatStyleEnum.Highlight, ShowText = keyValuePair.Value.ShowText }); _formatRules.Add(keyValuePair.Key, predicates); } IconFormattingRule iconFormattingRule = keyValuePair.Value.FormattingRule as IconFormattingRule; if (iconFormattingRule != null) { IList <IconRule> iconRulesRules = iconFormattingRule.Rules; foreach (IconRule iconRule in iconRulesRules) { ResultColumn gridResultColumn = additionalColumnInfo.FirstOrDefault(gu => gu.RequestColumn.EntityId.ToString(CultureInfo.InvariantCulture) == keyValuePair.Key); if (gridResultColumn == null) { continue; } iconRule.Condition.Arguments = TypedValuesForOperatorColumnType(iconRule.Condition.Arguments, iconRule.Condition.Operator, gridResultColumn.ColumnType); } List <ConditionInfo> predicates = new List <ConditionInfo>(iconRulesRules.Count); predicates.AddRange(from iconRule in iconRulesRules let gridResultColumn = additionalColumnInfo.FirstOrDefault(gu => gu.RequestColumn.EntityId.ToString(CultureInfo.InvariantCulture) == keyValuePair.Key) let predicate = PredicateForRule(iconRule.Condition, IsResourceCondition(gridResultColumn), gridResultColumn, this) where (predicate != null) select new ConditionInfo { Predicate = predicate, IconRule = iconRule, Operator = iconRule.Condition.Operator, Values = iconRule.Condition.Arguments, Style = ConditionalFormatStyleEnum.Icon, ShowText = keyValuePair.Value.ShowText }); _formatRules.Add(keyValuePair.Key, predicates); } } } }