/*******************************************************************************
* 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.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Xml;
namespace OfficeOpenXml.Style.XmlAccess
{
///
/// Xml access class for fonts
///
public sealed class ExcelFontXml : StyleXmlHelper
{
internal ExcelFontXml(XmlNamespaceManager nameSpaceManager)
: base(nameSpaceManager)
{
_name = "";
_size = 0;
_family = int.MinValue;
_scheme = "";
_color = _color = new ExcelColorXml(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 ExcelColorXml(nsm, topNode.SelectSingleNode(_colorPath, nsm));
_bold = (topNode.SelectSingleNode(boldPath, NameSpaceManager) != null);
_italic = (topNode.SelectSingleNode(italicPath, NameSpaceManager) != null);
_strike = (topNode.SelectSingleNode(strikePath, NameSpaceManager) != null);
_verticalAlign = GetXmlNodeString(verticalAlignPath);
if (topNode.SelectSingleNode(underLinedPath, NameSpaceManager) != null)
{
string ut = GetXmlNodeString(underLinedPath + "/@val");
if (ut == "")
{
_underlineType = ExcelUnderLineType.Single;
}
else
{
_underlineType = (ExcelUnderLineType)Enum.Parse(typeof(ExcelUnderLineType), ut, true);
}
}
else
{
_underlineType = ExcelUnderLineType.None;
}
}
internal override string Id
{
get
{
return Name + "|" + Size + "|" + Family + "|" + Color.Id + "|" + Scheme + "|" + Bold.ToString() + "|" + Italic.ToString() + "|" + Strike.ToString() + "|" + VerticalAlign + "|" + UnderLineType.ToString();
}
}
const string namePath = "d:name/@val";
string _name;
///
/// The name of the font
///
public string Name
{
get
{
return _name;
}
set
{
Scheme = ""; //Reset schema to avoid corrupt file if unsupported font is selected.
_name = value;
}
}
const string sizePath = "d:sz/@val";
float _size;
///
/// Font size
///
public float Size
{
get
{
return _size;
}
set
{
_size = value;
}
}
const string familyPath = "d:family/@val";
int _family;
///
/// Font family
///
public int Family
{
get
{
return (_family == int.MinValue ? 0 : _family); ;
}
set
{
_family=value;
}
}
ExcelColorXml _color = null;
const string _colorPath = "d:color";
///
/// Text color
///
public ExcelColorXml Color
{
get
{
return _color;
}
internal set
{
_color=value;
}
}
const string schemePath = "d:scheme/@val";
string _scheme="";
///
/// Font Scheme
///
public string Scheme
{
get
{
return _scheme;
}
private set
{
_scheme=value;
}
}
const string boldPath = "d:b";
bool _bold;
///
/// If the font is bold
///
public bool Bold
{
get
{
return _bold;
}
set
{
_bold=value;
}
}
const string italicPath = "d:i";
bool _italic;
///
/// If the font is italic
///
public bool Italic
{
get
{
return _italic;
}
set
{
_italic=value;
}
}
const string strikePath = "d:strike";
bool _strike;
///
/// If the font is striked out
///
public bool Strike
{
get
{
return _strike;
}
set
{
_strike=value;
}
}
const string underLinedPath = "d:u";
///
/// If the font is underlined.
/// When set to true a the text is underlined with a single line
///
public bool UnderLine
{
get
{
return UnderLineType!=ExcelUnderLineType.None;
}
set
{
_underlineType=value ? ExcelUnderLineType.Single : ExcelUnderLineType.None;
}
}
ExcelUnderLineType _underlineType;
///
/// If the font is underlined
///
public ExcelUnderLineType UnderLineType
{
get
{
return _underlineType;
}
set
{
_underlineType = value;
}
}
const string verticalAlignPath = "d:vertAlign/@val";
string _verticalAlign;
///
/// Vertical aligned
///
public string VerticalAlign
{
get
{
return _verticalAlign;
}
set
{
_verticalAlign=value;
}
}
public void SetFromFont(System.Drawing.Font Font)
{
Name=Font.Name;
//Family=fnt.FontFamily.;
Size=(int)Font.Size;
Strike=Font.Strikeout;
Bold = Font.Bold;
UnderLine=Font.Underline;
Italic=Font.Italic;
}
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.ToString());
if(_size>0) SetXmlNodeString(sizePath, _size.ToString(System.Globalization.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.ToString());
return TopNode;
}
}
}