| /******************************************************************************* |
| * 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 |
| * ****************************************************************************** |
| * Mats Alm Added 2011-01-08 |
| * Jan Källman License changed GPL-->LGPL 2011-12-27 |
| *******************************************************************************/ |
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Text; |
| using System.Xml; |
| using OfficeOpenXml.Utils; |
| using OfficeOpenXml.DataValidation.Formulas.Contracts; |
| using System.Text.RegularExpressions; |
| using System.Collections; |
| |
| namespace OfficeOpenXml.DataValidation.Formulas |
| { |
| internal class ExcelDataValidationFormulaList : ExcelDataValidationFormula, IExcelDataValidationFormulaList |
| { |
| #region class DataValidationList |
| private class DataValidationList : IList<string>, ICollection |
| { |
| private IList<string> _items = new List<string>(); |
| private EventHandler<EventArgs> _listChanged; |
| |
| public event EventHandler<EventArgs> ListChanged |
| { |
| add { _listChanged += value; } |
| remove { _listChanged -= value; } |
| } |
| |
| private void OnListChanged() |
| { |
| if (_listChanged != null) |
| { |
| _listChanged(this, EventArgs.Empty); |
| } |
| } |
| |
| #region IList members |
| int IList<string>.IndexOf(string item) |
| { |
| return _items.IndexOf(item); |
| } |
| |
| void IList<string>.Insert(int index, string item) |
| { |
| _items.Insert(index, item); |
| OnListChanged(); |
| } |
| |
| void IList<string>.RemoveAt(int index) |
| { |
| _items.RemoveAt(index); |
| OnListChanged(); |
| } |
| |
| string IList<string>.this[int index] |
| { |
| get |
| { |
| return _items[index]; |
| } |
| set |
| { |
| _items[index] = value; |
| OnListChanged(); |
| } |
| } |
| |
| void ICollection<string>.Add(string item) |
| { |
| _items.Add(item); |
| OnListChanged(); |
| } |
| |
| void ICollection<string>.Clear() |
| { |
| _items.Clear(); |
| OnListChanged(); |
| } |
| |
| bool ICollection<string>.Contains(string item) |
| { |
| return _items.Contains(item); |
| } |
| |
| void ICollection<string>.CopyTo(string[] array, int arrayIndex) |
| { |
| _items.CopyTo(array, arrayIndex); |
| } |
| |
| int ICollection<string>.Count |
| { |
| get { return _items.Count; } |
| } |
| |
| bool ICollection<string>.IsReadOnly |
| { |
| get { return false; } |
| } |
| |
| bool ICollection<string>.Remove(string item) |
| { |
| var retVal = _items.Remove(item); |
| OnListChanged(); |
| return retVal; |
| } |
| |
| IEnumerator<string> IEnumerable<string>.GetEnumerator() |
| { |
| return _items.GetEnumerator(); |
| } |
| |
| System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() |
| { |
| return _items.GetEnumerator(); |
| } |
| #endregion |
| |
| public void CopyTo(Array array, int index) |
| { |
| _items.CopyTo((string[])array, index); |
| } |
| |
| int ICollection.Count |
| { |
| get { return _items.Count; } |
| } |
| |
| public bool IsSynchronized |
| { |
| get { return ((ICollection)_items).IsSynchronized; } |
| } |
| |
| public object SyncRoot |
| { |
| get { return ((ICollection)_items).SyncRoot; } |
| } |
| } |
| #endregion |
| |
| public ExcelDataValidationFormulaList(XmlNamespaceManager namespaceManager, XmlNode itemNode, string formulaPath) |
| : base(namespaceManager, itemNode, formulaPath) |
| { |
| Require.Argument(formulaPath).IsNotNullOrEmpty("formulaPath"); |
| _formulaPath = formulaPath; |
| var values = new DataValidationList(); |
| values.ListChanged += new EventHandler<EventArgs>(values_ListChanged); |
| Values = values; |
| SetInitialValues(); |
| } |
| |
| private string _formulaPath; |
| |
| private void SetInitialValues() |
| { |
| var @value = GetXmlNodeString(_formulaPath); |
| if (!string.IsNullOrEmpty(@value)) |
| { |
| if (@value.StartsWith("\"") && @value.EndsWith("\"")) |
| { |
| @value = @value.TrimStart('"').TrimEnd('"'); |
| var items = @value.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries); |
| foreach (var item in items) |
| { |
| Values.Add(item); |
| } |
| } |
| else |
| { |
| ExcelFormula = @value; |
| } |
| } |
| } |
| |
| void values_ListChanged(object sender, EventArgs e) |
| { |
| if (Values.Count > 0) |
| { |
| State = FormulaState.Value; |
| } |
| var valuesAsString = GetValueAsString(); |
| // Excel supports max 255 characters in this field. |
| if (valuesAsString.Length > 255) |
| { |
| throw new InvalidOperationException("The total length of a DataValidation list cannot exceed 255 characters"); |
| } |
| SetXmlNodeString(_formulaPath, valuesAsString); |
| } |
| public IList<string> Values |
| { |
| get; |
| private set; |
| } |
| |
| protected override string GetValueAsString() |
| { |
| var sb = new StringBuilder(); |
| foreach (var val in Values) |
| { |
| if (sb.Length == 0) |
| { |
| sb.Append("\""); |
| sb.Append(val); |
| } |
| else |
| { |
| sb.AppendFormat(",{0}", val); |
| } |
| } |
| sb.Append("\""); |
| return sb.ToString(); |
| } |
| |
| internal override void ResetValue() |
| { |
| Values.Clear(); |
| } |
| } |
| } |