/*******************************************************************************
 * 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;
namespace OfficeOpenXml.Style.XmlAccess
{
    /// <summary>
    /// Xml access class for border top level
    /// </summary>
    public sealed class ExcelBorderXml : StyleXmlHelper
    {
        internal ExcelBorderXml(XmlNamespaceManager nameSpaceManager)
            : base(nameSpaceManager)
        {

        }
        internal ExcelBorderXml(XmlNamespaceManager nsm, XmlNode topNode) :
            base(nsm, topNode)
        {
            _left = new ExcelBorderItemXml(nsm, topNode.SelectSingleNode(leftPath, nsm));
            _right = new ExcelBorderItemXml(nsm, topNode.SelectSingleNode(rightPath, nsm));
            _top = new ExcelBorderItemXml(nsm, topNode.SelectSingleNode(topPath, nsm));
            _bottom = new ExcelBorderItemXml(nsm, topNode.SelectSingleNode(bottomPath, nsm));
            _diagonal = new ExcelBorderItemXml(nsm, topNode.SelectSingleNode(diagonalPath, nsm));
            _diagonalUp = GetBoolValue(topNode, diagonalUpPath);
            _diagonalDown = GetBoolValue(topNode, diagonalDownPath);
        }
        internal override string Id
        {
            get
            {
                return Left.Id + Right.Id + Top.Id + Bottom.Id + Diagonal.Id + DiagonalUp.ToString() + DiagonalDown.ToString();
            }
        }
        const string leftPath = "d:left";
        ExcelBorderItemXml _left = null;
        /// <summary>
        /// Left border style properties
        /// </summary>
        public ExcelBorderItemXml Left
        {
            get
            {
                return _left;
            }
            internal set
            {
                _left = value;
            }
        }
        const string rightPath = "d:right";
        ExcelBorderItemXml _right = null;
        /// <summary>
        /// Right border style properties
        /// </summary>
        public ExcelBorderItemXml Right
        {
            get
            {
                return _right;
            }
            internal set
            {
                _right = value;
            }
        }
        const string topPath = "d:top";
        ExcelBorderItemXml _top = null;
        /// <summary>
        /// Top border style properties
        /// </summary>
        public ExcelBorderItemXml Top
        {
            get
            {
                return _top;
            }
            internal set
            {
                _top = value;
            }
        }
        const string bottomPath = "d:bottom";
        ExcelBorderItemXml _bottom = null;
        /// <summary>
        /// Bottom border style properties
        /// </summary>
        public ExcelBorderItemXml Bottom
        {
            get
            {
                return _bottom;
            }
            internal set
            {
                _bottom = value;
            }
        }
        const string diagonalPath = "d:diagonal";
        ExcelBorderItemXml _diagonal = null;
        /// <summary>
        /// Diagonal border style properties
        /// </summary>
        public ExcelBorderItemXml Diagonal
        {
            get
            {
                return _diagonal;
            }
            internal set
            {
                _diagonal = value;
            }
        }
        const string diagonalUpPath = "@diagonalUp";
        bool _diagonalUp = false;
        /// <summary>
        /// Diagonal up border
        /// </summary>
        public bool DiagonalUp
        {
            get
            {
                return _diagonalUp;
            }
            internal set
            {
                _diagonalUp = value;
            }
        }
        const string diagonalDownPath = "@diagonalDown";
        bool _diagonalDown = false;
        /// <summary>
        /// Diagonal down border
        /// </summary>
        public bool DiagonalDown
        {
            get
            {
                return _diagonalDown;
            }
            internal set
            {
                _diagonalDown = value;
            }
        }

        internal ExcelBorderXml Copy()
        {
            ExcelBorderXml newBorder = new ExcelBorderXml(NameSpaceManager);
            newBorder.Bottom = _bottom.Copy();
            newBorder.Diagonal = _diagonal.Copy();
            newBorder.Left = _left.Copy();
            newBorder.Right = _right.Copy();
            newBorder.Top = _top.Copy();
            newBorder.DiagonalUp = _diagonalUp;
            newBorder.DiagonalDown = _diagonalDown;

            return newBorder;

        }

        internal override XmlNode CreateXmlNode(XmlNode topNode)
        {
            TopNode = topNode;
            CreateNode(leftPath);
            topNode.AppendChild(_left.CreateXmlNode(TopNode.SelectSingleNode(leftPath, NameSpaceManager)));
            CreateNode(rightPath);
            topNode.AppendChild(_right.CreateXmlNode(TopNode.SelectSingleNode(rightPath, NameSpaceManager)));
            CreateNode(topPath);
            topNode.AppendChild(_top.CreateXmlNode(TopNode.SelectSingleNode(topPath, NameSpaceManager)));
            CreateNode(bottomPath);
            topNode.AppendChild(_bottom.CreateXmlNode(TopNode.SelectSingleNode(bottomPath, NameSpaceManager)));
            CreateNode(diagonalPath);
            topNode.AppendChild(_diagonal.CreateXmlNode(TopNode.SelectSingleNode(diagonalPath, NameSpaceManager)));
            if (_diagonalUp)
            {
                SetXmlNodeString(diagonalUpPath, "1");
            }
            if (_diagonalDown)
            {
                SetXmlNodeString(diagonalDownPath, "1");
            }
            return topNode;
        }
    }
}
