/******************************************************************************* * 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.Text; using System.Xml; using System.Globalization; namespace OfficeOpenXml.Style.XmlAccess { /// /// Xml access class for color /// public sealed class ExcelColorXml : StyleXmlHelper { internal ExcelColorXml(XmlNamespaceManager nameSpaceManager) : base(nameSpaceManager) { _auto = false; _theme = ""; _tint = 0; _rgb = ""; _indexed = int.MinValue; } internal ExcelColorXml(XmlNamespaceManager nsm, XmlNode topNode) : base(nsm, topNode) { if(topNode==null) { _exists=false; } else { _exists = true; _auto = GetXmlNodeBool("@auto"); _theme = GetXmlNodeString("@theme"); _tint = GetXmlNodeDecimalNull("@tint")??decimal.MinValue; _rgb = GetXmlNodeString("@rgb"); _indexed = GetXmlNodeIntNull("@indexed") ?? int.MinValue; } } internal override string Id { get { return _auto.ToString() + "|" + _theme + "|" + _tint + "|" + _rgb + "|" + _indexed; } } bool _auto; public bool Auto { get { return _auto; } set { if (value) { } _auto = value; _exists = true; Clear(); } } string _theme; /// /// Theme color value /// public string Theme { get { return _theme; } } decimal _tint; /// /// Tint /// public decimal Tint { get { if (_tint == decimal.MinValue) { return 0; } else { return _tint; } } set { _tint = value; _exists = true; } } string _rgb; /// /// RGB value /// public string Rgb { get { return _rgb; } set { _rgb = value; _exists=true; _indexed = int.MinValue; _auto = false; } } int _indexed; /// /// Indexed color value /// public int Indexed { get { return (_indexed == int.MinValue ? 0 : _indexed); } set { if (value < 0 || value > 65) { throw (new ArgumentOutOfRangeException("Index out of range")); } Clear(); _indexed = value; _exists = true; } } internal void Clear() { _theme = ""; _tint = decimal.MinValue; _indexed = int.MinValue; _rgb = ""; _auto = false; } public void SetColor(System.Drawing.Color color) { Clear(); _rgb = color.ToArgb().ToString("X"); } internal ExcelColorXml Copy() { return new ExcelColorXml(NameSpaceManager) {_indexed=_indexed, _tint=_tint, _rgb=_rgb, _theme=_theme, _auto=_auto, _exists=_exists }; } internal override XmlNode CreateXmlNode(XmlNode topNode) { TopNode = topNode; if(_rgb!="") { SetXmlNodeString("@rgb", _rgb); } else if (_indexed >= 0) { SetXmlNodeString("@indexed", _indexed.ToString()); } else if (_auto) { SetXmlNodeBool("@auto", _auto); } else { SetXmlNodeString("@theme", _theme.ToString()); } if (_tint != decimal.MinValue) { SetXmlNodeString("@tint", _tint.ToString(CultureInfo.InvariantCulture)); } return TopNode; } bool _exists; internal bool Exists { get { return _exists; } } } }