/*******************************************************************************
|
* 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-12-22
|
* Jan Källman License changed GPL-->LGPL 2011-12-16
|
*******************************************************************************/
|
using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using System.Xml;
|
using System.Drawing;
|
|
namespace HH.WMS.Utils.EPPlus.Drawing
|
{
|
/// <summary>
|
/// Fill properties for drawing objects
|
/// </summary>
|
public sealed class ExcelDrawingFill : XmlHelper
|
{
|
//ExcelShape _shp;
|
string _fillPath;
|
XmlNode _fillNode;
|
internal ExcelDrawingFill(XmlNamespaceManager nameSpaceManager, XmlNode topNode, string fillPath) :
|
base(nameSpaceManager, topNode)
|
{
|
// _shp=shp;
|
_fillPath = fillPath;
|
_fillNode = topNode.SelectSingleNode(_fillPath, NameSpaceManager);
|
SchemaNodeOrder = new string[] { "tickLblPos", "spPr", "txPr","dLblPos", "crossAx", "printSettings", "showVal", "prstGeom", "noFill", "solidFill", "blipFill", "gradFill", "noFill", "pattFill", "ln", "prstDash" };
|
//Setfill node
|
if (_fillNode != null)
|
{
|
_fillTypeNode = topNode.SelectSingleNode("solidFill");
|
if (_fillTypeNode == null) _fillTypeNode = topNode.SelectSingleNode("noFill");
|
if (_fillTypeNode == null) _fillTypeNode = topNode.SelectSingleNode("blipFill");
|
if (_fillTypeNode == null) _fillTypeNode = topNode.SelectSingleNode("gradFill");
|
if (_fillTypeNode == null) _fillTypeNode = topNode.SelectSingleNode("pattFill");
|
}
|
}
|
eFillStyle _style;
|
XmlNode _fillTypeNode = null;
|
/// <summary>
|
/// Fill style
|
/// </summary>
|
public eFillStyle Style
|
{
|
get
|
{
|
if (_fillTypeNode == null)
|
{
|
return eFillStyle.SolidFill;
|
}
|
else
|
{
|
_style=GetStyleEnum(_fillTypeNode.Name);
|
}
|
return _style;
|
}
|
set
|
{
|
if (value == eFillStyle.NoFill || value == eFillStyle.SolidFill)
|
{
|
_style = value;
|
CreateFillTopNode(value);
|
}
|
else
|
{
|
throw new NotImplementedException("Fillstyle not implemented");
|
}
|
}
|
}
|
|
private void CreateFillTopNode(eFillStyle value)
|
{
|
if (_fillTypeNode != null)
|
{
|
TopNode.RemoveChild(_fillTypeNode);
|
}
|
CreateNode(_fillPath + "/a:" + GetStyleText(value), false);
|
_fillNode=TopNode.SelectSingleNode(_fillPath + "/a:" + GetStyleText(value), NameSpaceManager);
|
}
|
|
private eFillStyle GetStyleEnum(string name)
|
{
|
switch(name)
|
{
|
case "noFill":
|
return eFillStyle.NoFill;
|
case "blipFill":
|
return eFillStyle.BlipFill;
|
case "gradFill":
|
return eFillStyle.GradientFill;
|
case "grpFill":
|
return eFillStyle.GroupFill;
|
case "pattFill":
|
return eFillStyle.PatternFill;
|
default:
|
return eFillStyle.SolidFill;
|
}
|
}
|
|
private string GetStyleText(eFillStyle style)
|
{
|
switch (style)
|
{
|
case eFillStyle.BlipFill:
|
return "blipFill";
|
case eFillStyle.GradientFill:
|
return "gradFill";
|
case eFillStyle.GroupFill:
|
return "grpFill";
|
case eFillStyle.NoFill:
|
return "noFill";
|
case eFillStyle.PatternFill:
|
return "pattFill";
|
default:
|
return "solidFill";
|
}
|
}
|
|
const string ColorPath = "/a:solidFill/a:srgbClr/@val";
|
/// <summary>
|
/// Fill color for solid fills
|
/// </summary>
|
public Color Color
|
{
|
get
|
{
|
string col = GetXmlNodeString(_fillPath + ColorPath);
|
if (col == "")
|
{
|
return Color.FromArgb(79, 129, 189);
|
}
|
else
|
{
|
return Color.FromArgb(int.Parse(col,System.Globalization.NumberStyles.AllowHexSpecifier));
|
}
|
}
|
set
|
{
|
if (_fillTypeNode == null)
|
{
|
_style = eFillStyle.SolidFill;
|
}
|
else if (_style != eFillStyle.SolidFill)
|
{
|
throw new Exception("FillStyle must be set to SolidFill");
|
}
|
CreateNode(_fillPath, false);
|
SetXmlNodeString(_fillPath + ColorPath, value.ToArgb().ToString("X").Substring(2, 6));
|
}
|
}
|
const string alphaPath = "/a:solidFill/a:srgbClr/a:alpha/@val";
|
/// <summary>
|
/// Transparancy in percent
|
/// </summary>
|
public int Transparancy
|
{
|
get
|
{
|
return 100 - (GetXmlNodeInt(_fillPath + alphaPath) / 1000);
|
}
|
set
|
{
|
if (_fillTypeNode == null)
|
{
|
_style = eFillStyle.SolidFill;
|
Color = Color.FromArgb(79, 129, 189); //Set a Default color
|
}
|
else if (_style != eFillStyle.SolidFill)
|
{
|
throw new Exception("FillStyle must be set to SolidFill");
|
}
|
//CreateNode(_fillPath, false);
|
SetXmlNodeString(_fillPath + alphaPath, ((100 - value) * 1000).ToString());
|
}
|
}
|
}
|
}
|