/*******************************************************************************
* 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
* ******************************************************************************
* Eyal Seagull Added 2012-04-03
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Xml;
using OfficeOpenXml.Utils;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Security;
namespace OfficeOpenXml.ConditionalFormatting
{
///
/// 18.3.1.11 cfvo (Conditional Format Value Object)
/// Describes the values of the interpolation points in a gradient scale.
///
public class ExcelConditionalFormattingIconDataBarValue
: XmlHelper
{
/****************************************************************************************/
#region Private Properties
private eExcelConditionalFormattingRuleType _ruleType;
private ExcelWorksheet _worksheet;
#endregion Private Properties
/****************************************************************************************/
#region Constructors
///
/// Initialize the cfvo (§18.3.1.11) node
///
///
///
///
///
///
///
///
/// The cfvo (§18.3.1.11) node parent. Can be any of the following:
/// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)
///
internal ExcelConditionalFormattingIconDataBarValue(
eExcelConditionalFormattingValueObjectType type,
double value,
string formula,
eExcelConditionalFormattingRuleType ruleType,
ExcelAddress address,
int priority,
ExcelWorksheet worksheet,
XmlNode itemElementNode,
XmlNamespaceManager namespaceManager)
: this(
ruleType,
address,
worksheet,
itemElementNode,
namespaceManager)
{
Require.Argument(priority).IsInRange(1, int.MaxValue, "priority");
// Check if the parent does not exists
if (itemElementNode == null)
{
// Get the parent node path by the rule type
string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType(
ruleType);
// Check for en error (rule type does not have )
if (parentNodePath == string.Empty)
{
throw new Exception(
ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode);
}
// Point to the parent node
itemElementNode = _worksheet.WorksheetXml.SelectSingleNode(
string.Format(
"//{0}[{1}='{2}']/{3}[{4}='{5}']/{6}",
// {0}
ExcelConditionalFormattingConstants.Paths.ConditionalFormatting,
// {1}
ExcelConditionalFormattingConstants.Paths.SqrefAttribute,
// {2}
address.Address,
// {3}
ExcelConditionalFormattingConstants.Paths.CfRule,
// {4}
ExcelConditionalFormattingConstants.Paths.PriorityAttribute,
// {5}
priority,
// {6}
parentNodePath),
_worksheet.NameSpaceManager);
// Check for en error (rule type does not have )
if (itemElementNode == null)
{
throw new Exception(
ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode);
}
}
TopNode = itemElementNode;
// Save the attributes
RuleType = ruleType;
Type = type;
Value = value;
Formula = formula;
}
///
/// Initialize the cfvo (§18.3.1.11) node
///
///
///
///
/// The cfvo (§18.3.1.11) node parent. Can be any of the following:
/// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)
///
internal ExcelConditionalFormattingIconDataBarValue(
eExcelConditionalFormattingRuleType ruleType,
ExcelAddress address,
ExcelWorksheet worksheet,
XmlNode itemElementNode,
XmlNamespaceManager namespaceManager)
: base(
namespaceManager,
itemElementNode)
{
Require.Argument(address).IsNotNull("address");
Require.Argument(worksheet).IsNotNull("worksheet");
// Save the worksheet for private methods to use
_worksheet = worksheet;
// Schema order list
SchemaNodeOrder = new string[]
{
ExcelConditionalFormattingConstants.Nodes.Cfvo,
};
//Check if the parent does not exists
if (itemElementNode == null)
{
// Get the parent node path by the rule type
string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType(
ruleType);
// Check for en error (rule type does not have )
if (parentNodePath == string.Empty)
{
throw new Exception(
ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode);
}
}
RuleType = ruleType;
}
///
/// Initialize the
///
///
///
///
///
///
///
///
///
internal ExcelConditionalFormattingIconDataBarValue(
eExcelConditionalFormattingValueObjectType type,
double value,
string formula,
eExcelConditionalFormattingRuleType ruleType,
ExcelAddress address,
int priority,
ExcelWorksheet worksheet,
XmlNamespaceManager namespaceManager)
: this(
type,
value,
formula,
ruleType,
address,
priority,
worksheet,
null,
namespaceManager)
{
}
///
/// Initialize the
///
///
///
///
///
///
///
///
internal ExcelConditionalFormattingIconDataBarValue(
eExcelConditionalFormattingValueObjectType type,
Color color,
eExcelConditionalFormattingRuleType ruleType,
ExcelAddress address,
int priority,
ExcelWorksheet worksheet,
XmlNamespaceManager namespaceManager)
: this(
type,
0,
null,
ruleType,
address,
priority,
worksheet,
null,
namespaceManager)
{
}
#endregion Constructors
/****************************************************************************************/
#region Methods
#endregion
/****************************************************************************************/
#region Exposed Properties
///
///
///
internal eExcelConditionalFormattingRuleType RuleType
{
get { return _ruleType; }
set { _ruleType = value; }
}
///
///
///
public eExcelConditionalFormattingValueObjectType Type
{
get
{
var typeAttribute = GetXmlNodeString(ExcelConditionalFormattingConstants.Paths.TypeAttribute);
return ExcelConditionalFormattingValueObjectType.GetTypeByAttrbiute(typeAttribute);
}
set
{
if ((_ruleType==eExcelConditionalFormattingRuleType.ThreeIconSet || _ruleType==eExcelConditionalFormattingRuleType.FourIconSet || _ruleType==eExcelConditionalFormattingRuleType.FiveIconSet) &&
(value == eExcelConditionalFormattingValueObjectType.Min || value == eExcelConditionalFormattingValueObjectType.Max))
{
throw(new ArgumentException("Value type can't be Min or Max for icon sets"));
}
SetXmlNodeString(ExcelConditionalFormattingConstants.Paths.TypeAttribute, value.ToString().ToLower(CultureInfo.InvariantCulture));
}
}
///
/// Get/Set the 'cfvo' node @val attribute
///
public Double Value
{
get
{
if ((Type == eExcelConditionalFormattingValueObjectType.Num)
|| (Type == eExcelConditionalFormattingValueObjectType.Percent)
|| (Type == eExcelConditionalFormattingValueObjectType.Percentile))
{
return GetXmlNodeDouble(ExcelConditionalFormattingConstants.Paths.ValAttribute);
}
else
{
return 0;
}
}
set
{
string valueToStore = string.Empty;
// Only some types use the @val attribute
if ((Type == eExcelConditionalFormattingValueObjectType.Num)
|| (Type == eExcelConditionalFormattingValueObjectType.Percent)
|| (Type == eExcelConditionalFormattingValueObjectType.Percentile))
{
valueToStore = value.ToString(CultureInfo.InvariantCulture);
}
SetXmlNodeString(ExcelConditionalFormattingConstants.Paths.ValAttribute, valueToStore);
}
}
///
/// Get/Set the Formula of the Object Value (uses the same attribute as the Value)
///
public string Formula
{
get
{
// Return empty if the Object Value type is not Formula
if (Type != eExcelConditionalFormattingValueObjectType.Formula)
{
return string.Empty;
}
// Excel stores the formula in the @val attribute
return GetXmlNodeString(ExcelConditionalFormattingConstants.Paths.ValAttribute);
}
set
{
// Only store the formula if the Object Value type is Formula
if (Type == eExcelConditionalFormattingValueObjectType.Formula)
{
SetXmlNodeString(ExcelConditionalFormattingConstants.Paths.ValAttribute, value);
}
}
}
#endregion Exposed Properties
/****************************************************************************************/
}
}