|  | /******************************************************************************* | 
|  | * 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 OfficeOpenXml.Style.XmlAccess; | 
|  | using System.Drawing; | 
|  |  | 
|  | namespace OfficeOpenXml.Style | 
|  | { | 
|  | /// <summary> | 
|  | /// Color for cellstyling | 
|  | /// </summary> | 
|  | public sealed class ExcelColor :  StyleBase | 
|  | { | 
|  | eStyleClass _cls; | 
|  | StyleBase _parent; | 
|  | internal ExcelColor(ExcelStyles styles, OfficeOpenXml.XmlHelper.ChangedEventHandler ChangedEvent, int worksheetID, string address, eStyleClass cls, StyleBase parent) : | 
|  | base(styles, ChangedEvent, worksheetID, address) | 
|  |  | 
|  | { | 
|  | _parent = parent; | 
|  | _cls = cls; | 
|  | } | 
|  | /// <summary> | 
|  | /// The theme color | 
|  | /// </summary> | 
|  | public string Theme | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetSource().Theme; | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// The tint value | 
|  | /// </summary> | 
|  | public decimal Tint | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetSource().Tint; | 
|  | } | 
|  | set | 
|  | { | 
|  | if (value > 1 || value < -1) | 
|  | { | 
|  | throw (new ArgumentOutOfRangeException("Value must be between -1 and 1")); | 
|  | } | 
|  | _ChangedEvent(this, new StyleChangeEventArgs(_cls, eStyleProperty.Tint, value, _positionID, _address)); | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// The RGB value | 
|  | /// </summary> | 
|  | public string Rgb | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetSource().Rgb; | 
|  | } | 
|  | internal set | 
|  | { | 
|  | _ChangedEvent(this, new StyleChangeEventArgs(_cls, eStyleProperty.Color, value, _positionID, _address)); | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// The indexed color number. | 
|  | /// </summary> | 
|  | public int Indexed | 
|  | { | 
|  | get | 
|  | { | 
|  | return GetSource().Indexed; | 
|  | } | 
|  | set | 
|  | { | 
|  | _ChangedEvent(this, new StyleChangeEventArgs(_cls, eStyleProperty.IndexedColor, value, _positionID, _address)); | 
|  | } | 
|  | } | 
|  | /// <summary> | 
|  | /// Set the color of the object | 
|  | /// </summary> | 
|  | /// <param name="color">The color</param> | 
|  | public void SetColor(Color color) | 
|  | { | 
|  | Rgb = color.ToArgb().ToString("X"); | 
|  | } | 
|  |  | 
|  |  | 
|  | internal override string Id | 
|  | { | 
|  | get | 
|  | { | 
|  | return Theme + Tint + Rgb + Indexed; | 
|  | } | 
|  | } | 
|  | private ExcelColorXml GetSource() | 
|  | { | 
|  | Index = _parent.Index < 0 ? 0 : _parent.Index; | 
|  | switch(_cls) | 
|  | { | 
|  | case eStyleClass.FillBackgroundColor: | 
|  | return _styles.Fills[Index].BackgroundColor; | 
|  | case eStyleClass.FillPatternColor: | 
|  | return _styles.Fills[Index].PatternColor; | 
|  | case eStyleClass.Font: | 
|  | return _styles.Fonts[Index].Color; | 
|  | case eStyleClass.BorderLeft: | 
|  | return _styles.Borders[Index].Left.Color; | 
|  | case eStyleClass.BorderTop: | 
|  | return _styles.Borders[Index].Top.Color; | 
|  | case eStyleClass.BorderRight: | 
|  | return _styles.Borders[Index].Right.Color; | 
|  | case eStyleClass.BorderBottom: | 
|  | return _styles.Borders[Index].Bottom.Color; | 
|  | case eStyleClass.BorderDiagonal: | 
|  | return _styles.Borders[Index].Diagonal.Color; | 
|  | default: | 
|  | throw(new Exception("Invalid style-class for Color")); | 
|  | } | 
|  | } | 
|  | internal override void SetIndex(int index) | 
|  | { | 
|  | _parent.Index = index; | 
|  | } | 
|  | /// <summary> | 
|  | /// Return the RGB value for the color object that uses the Indexed or Tint property | 
|  | /// </summary> | 
|  | /// <param name="theColor">The color object</param> | 
|  | /// <returns>The RGB color starting with a #</returns> | 
|  | public string LookupColor(ExcelColor theColor) | 
|  | { | 
|  | //Thanks to neaves for contributing this method. | 
|  | int iTint = 0; | 
|  | string translatedRGB = ""; | 
|  |  | 
|  | // reference extracted from ECMA-376, Part 4, Section 3.8.26 | 
|  | string[] rgbLookup = | 
|  | { | 
|  | "#FF000000", // 0 | 
|  | "#FFFFFFFF", | 
|  | "#FFFF0000", | 
|  | "#FF00FF00", | 
|  | "#FF0000FF", | 
|  | "#FFFFFF00", | 
|  | "#FFFF00FF", | 
|  | "#FF00FFFF", | 
|  | "#FF000000", // 8 | 
|  | "#FFFFFFFF", | 
|  | "#FFFF0000", | 
|  | "#FF00FF00", | 
|  | "#FF0000FF", | 
|  | "#FFFFFF00", | 
|  | "#FFFF00FF", | 
|  | "#FF00FFFF", | 
|  | "#FF800000", | 
|  | "#FF008000", | 
|  | "#FF000080", | 
|  | "#FF808000", | 
|  | "#FF800080", | 
|  | "#FF008080", | 
|  | "#FFC0C0C0", | 
|  | "#FF808080", | 
|  | "#FF9999FF", | 
|  | "#FF993366", | 
|  | "#FFFFFFCC", | 
|  | "#FFCCFFFF", | 
|  | "#FF660066", | 
|  | "#FFFF8080", | 
|  | "#FF0066CC", | 
|  | "#FFCCCCFF", | 
|  | "#FF000080", | 
|  | "#FFFF00FF", | 
|  | "#FFFFFF00", | 
|  | "#FF00FFFF", | 
|  | "#FF800080", | 
|  | "#FF800000", | 
|  | "#FF008080", | 
|  | "#FF0000FF", | 
|  | "#FF00CCFF", | 
|  | "#FFCCFFFF", | 
|  | "#FFCCFFCC", | 
|  | "#FFFFFF99", | 
|  | "#FF99CCFF", | 
|  | "#FFFF99CC", | 
|  | "#FFCC99FF", | 
|  | "#FFFFCC99", | 
|  | "#FF3366FF", | 
|  | "#FF33CCCC", | 
|  | "#FF99CC00", | 
|  | "#FFFFCC00", | 
|  | "#FFFF9900", | 
|  | "#FFFF6600", | 
|  | "#FF666699", | 
|  | "#FF969696", | 
|  | "#FF003366", | 
|  | "#FF339966", | 
|  | "#FF003300", | 
|  | "#FF333300", | 
|  | "#FF993300", | 
|  | "#FF993366", | 
|  | "#FF333399", | 
|  | "#FF333333", // 63 | 
|  | }; | 
|  |  | 
|  | if ((0 <= theColor.Indexed) && (rgbLookup.Length > theColor.Indexed)) | 
|  | { | 
|  | // coloring by pre-set color codes | 
|  | translatedRGB = rgbLookup[theColor.Indexed]; | 
|  | } | 
|  | else if (null != theColor.Rgb && 0 < theColor.Rgb.Length) | 
|  | { | 
|  | // coloring by RGB value ("FFRRGGBB") | 
|  | translatedRGB = "#" + theColor.Rgb; | 
|  | } | 
|  | else | 
|  | { | 
|  | // coloring by shades of grey (-1 -> 0) | 
|  | iTint = ((int)(theColor.Tint * 160) + 0x80); | 
|  | translatedRGB = ((int)(decimal.Round(theColor.Tint * -512))).ToString("X"); | 
|  | translatedRGB = "#FF" + translatedRGB + translatedRGB + translatedRGB; | 
|  | } | 
|  |  | 
|  | return translatedRGB; | 
|  | } | 
|  | } | 
|  | } |