blob: 2d90c95d7a5931b3eeac68a2b8764242cf17d0d4 [file] [log] [blame]
/*******************************************************************************
* You may amend and distribute as you like, but don't remove this header!
*
* EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
* See http://www.codeplex.com/EPPlus for details.
*
* Copyright (C) 2011 Jan Källman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
* If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
*
* All code and executables are provided "as is" with no warranty either express or implied.
* The author accepts no liability for any damage or loss of business that this product may cause.
*
* Code change notes:
*
* Author Change Date
* ******************************************************************************
* Jan Källman Initial Release 2009-10-01
* Jan Källman License changed GPL-->LGPL 2011-12-16
*******************************************************************************/
using System;
using System.Globalization;
using System.Xml;
namespace OfficeOpenXml.Style.XmlAccess;
/// <summary>
/// Xml access class for fonts
/// </summary>
public sealed class ExcelFontXml : StyleXmlHelper {
internal ExcelFontXml(XmlNamespaceManager nameSpaceManager)
: base(nameSpaceManager) {
_name = "";
_size = 0;
_family = int.MinValue;
_scheme = "";
_color = _color = new(NameSpaceManager);
_bold = false;
_italic = false;
_strike = false;
_underlineType = ExcelUnderLineType.None;
_verticalAlign = "";
}
internal ExcelFontXml(XmlNamespaceManager nsm, XmlNode topNode)
: base(nsm, topNode) {
_name = GetXmlNodeString(_namePath);
_size = (float)GetXmlNodeDecimal(_sizePath);
_family = GetXmlNodeIntNull(_familyPath) ?? int.MinValue;
_scheme = GetXmlNodeString(_schemePath);
_color = new(nsm, topNode.SelectSingleNode(_colorPath, nsm));
_bold = GetBoolValue(topNode, _boldPath);
_italic = GetBoolValue(topNode, _italicPath);
_strike = GetBoolValue(topNode, _strikePath);
_verticalAlign = GetXmlNodeString(_verticalAlignPath);
if (topNode.SelectSingleNode(_underLinedPath, NameSpaceManager) != null) {
string ut = GetXmlNodeString(_underLinedPath + "/@val");
if (ut == "") {
_underlineType = ExcelUnderLineType.Single;
} else {
if (!Enum.TryParse(ut, true, out _underlineType)) {
_underlineType = ExcelUnderLineType.Single;
}
}
} else {
_underlineType = ExcelUnderLineType.None;
}
}
internal override string Id =>
Name
+ "|"
+ Size
+ "|"
+ Family
+ "|"
+ Color.Id
+ "|"
+ Scheme
+ "|"
+ Bold
+ "|"
+ Italic
+ "|"
+ Strike
+ "|"
+ VerticalAlign
+ "|"
+ UnderLineType;
private const string _namePath = "d:name/@val";
private string _name;
/// <summary>
/// The name of the font
/// </summary>
public string Name {
get => _name;
set {
Scheme = ""; //Reset schema to avoid corrupt file if unsupported font is selected.
_name = value;
}
}
private const string _sizePath = "d:sz/@val";
private float _size;
/// <summary>
/// Font size
/// </summary>
public float Size {
get => _size;
set => _size = value;
}
private const string _familyPath = "d:family/@val";
private int _family;
/// <summary>
/// Font family
/// </summary>
public int Family {
get => (_family == int.MinValue ? 0 : _family);
set => _family = value;
}
private ExcelColorXml _color;
private const string _colorPath = "d:color";
/// <summary>
/// Text color
/// </summary>
public ExcelColorXml Color {
get => _color;
internal set => _color = value;
}
private const string _schemePath = "d:scheme/@val";
private string _scheme = "";
/// <summary>
/// Font Scheme
/// </summary>
public string Scheme {
get => _scheme;
private set => _scheme = value;
}
private const string _boldPath = "d:b";
private bool _bold;
/// <summary>
/// If the font is bold
/// </summary>
public bool Bold {
get => _bold;
set => _bold = value;
}
private const string _italicPath = "d:i";
private bool _italic;
/// <summary>
/// If the font is italic
/// </summary>
public bool Italic {
get => _italic;
set => _italic = value;
}
private const string _strikePath = "d:strike";
private bool _strike;
/// <summary>
/// If the font is striked out
/// </summary>
public bool Strike {
get => _strike;
set => _strike = value;
}
private const string _underLinedPath = "d:u";
/// <summary>
/// If the font is underlined.
/// When set to true a the text is underlined with a single line
/// </summary>
public bool UnderLine {
get => UnderLineType != ExcelUnderLineType.None;
set => _underlineType = value ? ExcelUnderLineType.Single : ExcelUnderLineType.None;
}
private ExcelUnderLineType _underlineType;
/// <summary>
/// If the font is underlined
/// </summary>
public ExcelUnderLineType UnderLineType {
get => _underlineType;
set => _underlineType = value;
}
private const string _verticalAlignPath = "d:vertAlign/@val";
private string _verticalAlign;
/// <summary>
/// Vertical aligned
/// </summary>
public string VerticalAlign {
get => _verticalAlign;
set => _verticalAlign = value;
}
internal ExcelFontXml Copy() {
ExcelFontXml newFont = new ExcelFontXml(NameSpaceManager);
newFont.Name = _name;
newFont.Size = _size;
newFont.Family = _family;
newFont.Scheme = _scheme;
newFont.Bold = _bold;
newFont.Italic = _italic;
newFont.UnderLineType = _underlineType;
newFont.Strike = _strike;
newFont.VerticalAlign = _verticalAlign;
newFont.Color = Color.Copy();
return newFont;
}
internal override XmlNode CreateXmlNode(XmlNode topElement) {
TopNode = topElement;
if (_bold) {
CreateNode(_boldPath);
} else {
DeleteAllNode(_boldPath);
}
if (_italic) {
CreateNode(_italicPath);
} else {
DeleteAllNode(_italicPath);
}
if (_strike) {
CreateNode(_strikePath);
} else {
DeleteAllNode(_strikePath);
}
if (_underlineType == ExcelUnderLineType.None) {
DeleteAllNode(_underLinedPath);
} else if (_underlineType == ExcelUnderLineType.Single) {
CreateNode(_underLinedPath);
} else {
var v = _underlineType.ToString();
SetXmlNodeString(
_underLinedPath + "/@val",
v.Substring(0, 1).ToLower(CultureInfo.InvariantCulture) + v.Substring(1));
}
if (_verticalAlign != "") {
SetXmlNodeString(_verticalAlignPath, _verticalAlign);
}
if (_size > 0) {
SetXmlNodeString(_sizePath, _size.ToString(CultureInfo.InvariantCulture));
}
if (_color.Exists) {
CreateNode(_colorPath);
TopNode.AppendChild(
_color.CreateXmlNode(TopNode.SelectSingleNode(_colorPath, NameSpaceManager)));
}
if (!string.IsNullOrEmpty(_name)) {
SetXmlNodeString(_namePath, _name);
}
if (_family > int.MinValue) {
SetXmlNodeString(_familyPath, _family.ToString());
}
if (_scheme != "") {
SetXmlNodeString(_schemePath, _scheme);
}
return TopNode;
}
}