/// <summary> /// Appends the specified style parts to the current one. The parts can be instances of sub-classes like Border or CellXf or a Style instance. Only the altered properties of the specified style or style part that differs from a new / untouched style instance will be appended. This enables method chaining /// </summary> /// <param name="styleToAppend">The style to append or a sub-class of Style</param> /// <returns>Current style with appended style parts</returns> public Style Append(AbstractStyle styleToAppend) { if (styleToAppend.GetType() == typeof(Style.Border)) { this.CurrentBorder.CopyProperties <Border>((Border)styleToAppend, new Border()); } else if (styleToAppend.GetType() == typeof(Style.CellXf)) { this.CurrentCellXf.CopyProperties <CellXf>((CellXf)styleToAppend, new CellXf()); } else if (styleToAppend.GetType() == typeof(Style.Fill)) { this.CurrentFill.CopyProperties <Fill>((Fill)styleToAppend, new Fill()); } else if (styleToAppend.GetType() == typeof(Style.Font)) { this.CurrentFont.CopyProperties <Font>((Font)styleToAppend, new Font()); } else if (styleToAppend.GetType() == typeof(Style.NumberFormat)) { this.CurrentNumberFormat.CopyProperties <NumberFormat>((NumberFormat)styleToAppend, new NumberFormat()); } else if (styleToAppend.GetType() == typeof(Style)) { this.CurrentBorder.CopyProperties <Border>(((Style)styleToAppend).CurrentBorder, new Border()); this.CurrentCellXf.CopyProperties <CellXf>(((Style)styleToAppend).CurrentCellXf, new CellXf()); this.CurrentFill.CopyProperties <Fill>(((Style)styleToAppend).CurrentFill, new Fill()); this.CurrentFont.CopyProperties <Font>(((Style)styleToAppend).CurrentFont, new Font()); this.CurrentNumberFormat.CopyProperties <NumberFormat>(((Style)styleToAppend).CurrentNumberFormat, new NumberFormat()); } return(this); }
/// <summary> /// Gets a style by its hash /// </summary> /// <param name="hash">Hash of the style</param> /// <returns>Determined style</returns> /// <exception cref="StyleException">Throws a StyleException if the style was not found in the style manager</exception> public NanoXLSX.Style.Style GetStyleByHash(String hash) { AbstractStyle component = GetComponentByHash(ref styles, hash); if (component == null) { throw new StyleException("MissingReferenceException", "The style component with the hash '" + hash + "' was not found"); } return((NanoXLSX.Style.Style)component); }
/// <summary> /// Checks whether a style component in the style manager is used by a style /// </summary> /// <param name="component">Component to check</param> /// <returns>If true, the component is in use</returns> private bool IsUsedByStyle(AbstractStyle component) { NanoXLSX.Style.Style s; bool match = false; String hash = component.Hash; int len = styles.Count; for (int i = 0; i < len; i++) { s = (NanoXLSX.Style.Style)styles[i]; if (component.GetType() == typeof(NanoXLSX.Style.Style.Border)) { if (s.CurrentBorder.Hash == hash) { match = true; break; } } else if (component.GetType() == typeof(NanoXLSX.Style.Style.CellXf)) { if (s.CurrentCellXf.Hash == hash) { match = true; break; } } if (component.GetType() == typeof(NanoXLSX.Style.Style.Fill)) { if (s.CurrentFill.Hash == hash) { match = true; break; } } if (component.GetType() == typeof(NanoXLSX.Style.Style.Font)) { if (s.CurrentFont.Hash == hash) { match = true; break; } } if (component.GetType() == typeof(NanoXLSX.Style.Style.NumberFormat)) { if (s.CurrentNumberFormat.Hash == hash) { match = true; break; } } } return(match); }
/// <summary> /// Adds a style component to the manager /// </summary> /// <param name="style">Component to add</param> /// <returns>Hash of the added or determined component</returns> private string AddStyleComponent(AbstractStyle style) { string hash = style.Hash; if (style.GetType() == typeof(NanoXLSX.Style.Style.Border)) { if (GetComponentByHash(ref borders, hash) == null) { borders.Add(style); } Reorganize(ref borders); } else if (style.GetType() == typeof(NanoXLSX.Style.Style.CellXf)) { if (GetComponentByHash(ref cellXfs, hash) == null) { cellXfs.Add(style); } Reorganize(ref cellXfs); } else if (style.GetType() == typeof(NanoXLSX.Style.Style.Fill)) { if (GetComponentByHash(ref fills, hash) == null) { fills.Add(style); } Reorganize(ref fills); } else if (style.GetType() == typeof(NanoXLSX.Style.Style.Font)) { if (GetComponentByHash(ref fonts, hash) == null) { fonts.Add(style); } Reorganize(ref fonts); } else if (style.GetType() == typeof(NanoXLSX.Style.Style.NumberFormat)) { if (GetComponentByHash(ref numberFormats, hash) == null) { numberFormats.Add(style); } Reorganize(ref numberFormats); } else if (style.GetType() == typeof(NanoXLSX.Style.Style)) { NanoXLSX.Style.Style s = (NanoXLSX.Style.Style)style; if (styleNames.Contains(s.Name) == true) { throw new StyleException("StyleAlreadyExistsException", "The style with the name '" + s.Name + "' already exists"); } if (GetComponentByHash(ref styles, hash) == null) { int?id; if (s.InternalID.HasValue == false) { id = int.MaxValue; s.InternalID = id; } else { id = s.InternalID.Value; } string temp = AddStyleComponent(s.CurrentBorder, id); s.CurrentBorder = (NanoXLSX.Style.Style.Border)GetComponentByHash(ref borders, temp); temp = AddStyleComponent(s.CurrentCellXf, id); s.CurrentCellXf = (NanoXLSX.Style.Style.CellXf)GetComponentByHash(ref cellXfs, temp); temp = AddStyleComponent(s.CurrentFill, id); s.CurrentFill = (NanoXLSX.Style.Style.Fill)GetComponentByHash(ref fills, temp); temp = AddStyleComponent(s.CurrentFont, id); s.CurrentFont = (NanoXLSX.Style.Style.Font)GetComponentByHash(ref fonts, temp); temp = AddStyleComponent(s.CurrentNumberFormat, id); s.CurrentNumberFormat = (NanoXLSX.Style.Style.NumberFormat)GetComponentByHash(ref numberFormats, temp); styles.Add(s); } Reorganize(ref styles); hash = s.CalculateHash(); } return(hash); }
/// <summary> /// Adds a style component to the manager with an ID /// </summary> /// <param name="style">Component to add</param> /// <param name="id">Id of the component</param> /// <returns>Hash of the added or determined component</returns> private string AddStyleComponent(AbstractStyle style, int?id) { style.InternalID = id; return(AddStyleComponent(style)); }