| using System; | 
 | using System.Globalization; | 
 |  | 
 | namespace AppsheetEpplus; | 
 |  | 
 | public abstract class DxfStyleBase<T> { | 
 |   protected ExcelStyles _styles; | 
 |  | 
 |   internal DxfStyleBase(ExcelStyles styles) { | 
 |     _styles = styles; | 
 |   } | 
 |  | 
 |   protected internal abstract string Id { get; } | 
 |  | 
 |   protected internal abstract bool HasValue { get; } | 
 |  | 
 |   protected internal abstract void CreateNodes(XmlHelper helper, string path); | 
 |  | 
 |   protected internal abstract T Clone(); | 
 |  | 
 |   protected void SetValueColor(XmlHelper helper, string path, ExcelDxfColor color) { | 
 |     if (color != null && color.HasValue) { | 
 |       if (color.Rgb != null) { | 
 |         SetValue(helper, path + "/@rgb", color.Rgb); | 
 |       } else if (color.Auto != null) { | 
 |         SetValueBool(helper, path + "/@auto", color.Auto); | 
 |       } else if (color.Theme != null) { | 
 |         SetValue(helper, path + "/@theme", color.Theme); | 
 |       } else if (color.Index != null) { | 
 |         SetValue(helper, path + "/@indexed", color.Index); | 
 |       } | 
 |       if (color.Tint != null) { | 
 |         SetValue(helper, path + "/@tint", color.Tint); | 
 |       } | 
 |     } | 
 |   } | 
 |  | 
 |   /// <summary> | 
 |   /// Same as SetValue but will set first char to lower case. | 
 |   /// </summary> | 
 |   /// <param name="helper"></param> | 
 |   /// <param name="path"></param> | 
 |   /// <param name="v"></param> | 
 |   protected void SetValueEnum(XmlHelper helper, string path, Enum v) { | 
 |     if (v == null) { | 
 |       helper.DeleteNode(path); | 
 |     } else { | 
 |       var s = v.ToString(); | 
 |       s = s.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + s.Substring(1); | 
 |       helper.SetXmlNodeString(path, s); | 
 |     } | 
 |   } | 
 |  | 
 |   protected void SetValue(XmlHelper helper, string path, object v) { | 
 |     if (v == null) { | 
 |       helper.DeleteNode(path); | 
 |     } else { | 
 |       helper.SetXmlNodeString(path, v.ToString()); | 
 |     } | 
 |   } | 
 |  | 
 |   protected void SetValueBool(XmlHelper helper, string path, bool? v) { | 
 |     if (v == null) { | 
 |       helper.DeleteNode(path); | 
 |     } else { | 
 |       helper.SetXmlNodeBool(path, (bool)v); | 
 |     } | 
 |   } | 
 |  | 
 |   protected string GetAsString(object v) { | 
 |     return (v ?? "").ToString(); | 
 |   } | 
 |  | 
 |   /// <summary> | 
 |   /// Is this value allowed to be changed? | 
 |   /// </summary> | 
 |   protected internal bool AllowChange { get; set; } = false; | 
 | } |