﻿/*******************************************************************************
 * 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       Conditional Formatting    2012-04-03
 *******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml.Utils;
using OfficeOpenXml.ConditionalFormatting.Contracts;

namespace OfficeOpenXml.ConditionalFormatting
{
  internal class RangeConditionalFormatting
    : IRangeConditionalFormatting
  {
    #region Public Properties
    public ExcelWorksheet _worksheet;
    public ExcelAddress _address;
    #endregion Public Properties

    #region Constructors
    public RangeConditionalFormatting(
      ExcelWorksheet worksheet,
      ExcelAddress address)
    {
      Require.Argument(worksheet).IsNotNull("worksheet");
      Require.Argument(address).IsNotNull("address");

      _worksheet = worksheet;
      _address = address;
    }
    #endregion Constructors

    #region Conditional Formatting Rule Types
    /// <summary>
    /// Add AboveOrEqualAverage Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingAverageGroup AddAboveAverage()
    {
      return _worksheet.ConditionalFormatting.AddAboveAverage(
        _address);
    }

    /// <summary>
    /// Add AboveOrEqualAverage Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingAverageGroup AddAboveOrEqualAverage()
    {
      return _worksheet.ConditionalFormatting.AddAboveOrEqualAverage(
        _address);
    }

    /// <summary>
    /// Add BelowOrEqualAverage Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingAverageGroup AddBelowAverage()
    {
      return _worksheet.ConditionalFormatting.AddBelowAverage(
        _address);
    }

    /// <summary>
    /// Add BelowOrEqualAverage Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingAverageGroup AddBelowOrEqualAverage()
    {
      return _worksheet.ConditionalFormatting.AddBelowOrEqualAverage(
        _address);
    }

    /// <summary>
    /// Add AboveStdDev Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingStdDevGroup AddAboveStdDev()
    {
      return _worksheet.ConditionalFormatting.AddAboveStdDev(
        _address);
    }

    /// <summary>
    /// Add BelowStdDev Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingStdDevGroup AddBelowStdDev()
    {
      return _worksheet.ConditionalFormatting.AddBelowStdDev(
        _address);
    }

    /// <summary>
    /// Add Bottom Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTopBottomGroup AddBottom()
    {
      return _worksheet.ConditionalFormatting.AddBottom(
        _address);
    }

    /// <summary>
    /// Add BottomPercent Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTopBottomGroup AddBottomPercent()
    {
      return _worksheet.ConditionalFormatting.AddBottomPercent(
        _address);
    }

    /// <summary>
    /// Add Top Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTopBottomGroup AddTop()
    {
      return _worksheet.ConditionalFormatting.AddTop(
        _address);
    }

    /// <summary>
    /// Add TopPercent Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTopBottomGroup AddTopPercent()
    {
      return _worksheet.ConditionalFormatting.AddTopPercent(
        _address);
    }

    /// <summary>
    /// Add Last7Days Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddLast7Days()
    {
      return _worksheet.ConditionalFormatting.AddLast7Days(
        _address);
    }

    /// <summary>
    /// Add LastMonth Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddLastMonth()
    {
      return _worksheet.ConditionalFormatting.AddLastMonth(
        _address);
    }

    /// <summary>
    /// Add LastWeek Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddLastWeek()
    {
      return _worksheet.ConditionalFormatting.AddLastWeek(
        _address);
    }

    /// <summary>
    /// Add NextMonth Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddNextMonth()
    {
      return _worksheet.ConditionalFormatting.AddNextMonth(
        _address);
    }

    /// <summary>
    /// Add NextWeek Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddNextWeek()
    {
      return _worksheet.ConditionalFormatting.AddNextWeek(
        _address);
    }

    /// <summary>
    /// Add ThisMonth Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddThisMonth()
    {
      return _worksheet.ConditionalFormatting.AddThisMonth(
        _address);
    }

    /// <summary>
    /// Add ThisWeek Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddThisWeek()
    {
      return _worksheet.ConditionalFormatting.AddThisWeek(
        _address);
    }

    /// <summary>
    /// Add Today Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddToday()
    {
      return _worksheet.ConditionalFormatting.AddToday(
        _address);
    }

    /// <summary>
    /// Add Tomorrow Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddTomorrow()
    {
      return _worksheet.ConditionalFormatting.AddTomorrow(
        _address);
    }

    /// <summary>
    /// Add Yesterday Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTimePeriodGroup AddYesterday()
    {
      return _worksheet.ConditionalFormatting.AddYesterday(
        _address);
    }

    /// <summary>
    /// Add BeginsWith Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingBeginsWith AddBeginsWith()
    {
      return _worksheet.ConditionalFormatting.AddBeginsWith(
        _address);
    }

    /// <summary>
    /// Add Between Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingBetween AddBetween()
    {
      return _worksheet.ConditionalFormatting.AddBetween(
        _address);
    }

    /// <summary>
    /// Add ContainsBlanks Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingContainsBlanks AddContainsBlanks()
    {
      return _worksheet.ConditionalFormatting.AddContainsBlanks(
        _address);
    }

    /// <summary>
    /// Add ContainsErrors Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingContainsErrors AddContainsErrors()
    {
      return _worksheet.ConditionalFormatting.AddContainsErrors(
        _address);
    }

    /// <summary>
    /// Add ContainsText Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingContainsText AddContainsText()
    {
      return _worksheet.ConditionalFormatting.AddContainsText(
        _address);
    }

    /// <summary>
    /// Add DuplicateValues Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingDuplicateValues AddDuplicateValues()
    {
      return _worksheet.ConditionalFormatting.AddDuplicateValues(
        _address);
    }

    /// <summary>
    /// Add EndsWith Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingEndsWith AddEndsWith()
    {
      return _worksheet.ConditionalFormatting.AddEndsWith(
        _address);
    }

    /// <summary>
    /// Add Equal Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingEqual AddEqual()
    {
      return _worksheet.ConditionalFormatting.AddEqual(
        _address);
    }

    /// <summary>
    /// Add Expression Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingExpression AddExpression()
    {
      return _worksheet.ConditionalFormatting.AddExpression(
        _address);
    }

    /// <summary>
    /// Add GreaterThan Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingGreaterThan AddGreaterThan()
    {
      return _worksheet.ConditionalFormatting.AddGreaterThan(
        _address);
    }

    /// <summary>
    /// Add GreaterThanOrEqual Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingGreaterThanOrEqual AddGreaterThanOrEqual()
    {
      return _worksheet.ConditionalFormatting.AddGreaterThanOrEqual(
        _address);
    }

    /// <summary>
    /// Add LessThan Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingLessThan AddLessThan()
    {
      return _worksheet.ConditionalFormatting.AddLessThan(
        _address);
    }

    /// <summary>
    /// Add LessThanOrEqual Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingLessThanOrEqual AddLessThanOrEqual()
    {
      return _worksheet.ConditionalFormatting.AddLessThanOrEqual(
        _address);
    }

    /// <summary>
    /// Add NotBetween Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingNotBetween AddNotBetween()
    {
      return _worksheet.ConditionalFormatting.AddNotBetween(
        _address);
    }

    /// <summary>
    /// Add NotContainsBlanks Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingNotContainsBlanks AddNotContainsBlanks()
    {
      return _worksheet.ConditionalFormatting.AddNotContainsBlanks(
        _address);
    }

    /// <summary>
    /// Add NotContainsErrors Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingNotContainsErrors AddNotContainsErrors()
    {
      return _worksheet.ConditionalFormatting.AddNotContainsErrors(
        _address);
    }

    /// <summary>
    /// Add NotContainsText Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingNotContainsText AddNotContainsText()
    {
      return _worksheet.ConditionalFormatting.AddNotContainsText(
        _address);
    }

    /// <summary>
    /// Add NotEqual Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingNotEqual AddNotEqual()
    {
      return _worksheet.ConditionalFormatting.AddNotEqual(
        _address);
    }

    /// <summary>
    /// Add UniqueValues Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingUniqueValues AddUniqueValues()
    {
      return _worksheet.ConditionalFormatting.AddUniqueValues(
        _address);
    }

    /// <summary>
    /// Add ThreeColorScale Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingThreeColorScale AddThreeColorScale()
    {
      return (IExcelConditionalFormattingThreeColorScale)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.ThreeColorScale,
        _address));
    }

    /// <summary>
    /// Add TwoColorScale Conditional Formatting
    /// </summary>
    ///  <returns></returns>
    public IExcelConditionalFormattingTwoColorScale AddTwoColorScale()
    {
      return (IExcelConditionalFormattingTwoColorScale)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.TwoColorScale,
        _address));
    }

    /// <summary>
    /// Adds a ThreeIconSet rule 
    /// </summary>
    /// <param name="IconSet"></param>
    /// <returns></returns>
    public IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType> AddThreeIconSet(eExcelconditionalFormatting3IconsSetType IconSet)
    {
        var rule = (IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType>)(_worksheet.ConditionalFormatting.AddRule(
          eExcelConditionalFormattingRuleType.ThreeIconSet,
          _address));
        rule.IconSet = IconSet;
        return rule;
    }

    /// <summary>
    /// Adds a FourIconSet rule 
    /// </summary>
    /// <param name="IconSet"></param>
    /// <returns></returns>
    public IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType> AddFourIconSet(eExcelconditionalFormatting4IconsSetType IconSet)
    {
        var rule = (IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType>)(_worksheet.ConditionalFormatting.AddRule(
          eExcelConditionalFormattingRuleType.FourIconSet,
          _address));
        rule.IconSet = IconSet;
        return rule;
    }

    /// <summary>
    /// Adds a FiveIconSet rule 
    /// </summary>
    /// <param name="IconSet"></param>
    /// <returns></returns>
    public IExcelConditionalFormattingFiveIconSet AddFiveIconSet(eExcelconditionalFormatting5IconsSetType IconSet)
    {
        var rule = (IExcelConditionalFormattingFiveIconSet)(_worksheet.ConditionalFormatting.AddRule(
          eExcelConditionalFormattingRuleType.FiveIconSet,
          _address));
        rule.IconSet = IconSet;
        return rule;
    }

    /// <summary>
    /// Adds a Databar rule 
    /// </summary>
    /// <param name="Color">The color of the databar</param>
    /// <returns></returns>
    public IExcelConditionalFormattingDataBarGroup AddDatabar(System.Drawing.Color Color)
    {
        var rule = (IExcelConditionalFormattingDataBarGroup)(_worksheet.ConditionalFormatting.AddRule(
          eExcelConditionalFormattingRuleType.DataBar,
          _address));
        rule.Color = Color;
        return rule;
    }
    #endregion Conditional Formatting Rule Types
  }
}