/*******************************************************************************
 * 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-27
 *******************************************************************************/

using System;

namespace OfficeOpenXml;

/// <summary>
/// A range of cells.
/// </summary>
public class ExcelRange : ExcelRangeBase {
  internal ExcelRange(ExcelWorksheet sheet)
      : base(sheet) {}

  internal ExcelRange(ExcelWorksheet sheet, string address)
      : base(sheet, address) {}

  internal ExcelRange(ExcelWorksheet sheet, int fromRow, int fromCol, int toRow, int toCol)
      : base(sheet) {
    _fromRow = fromRow;
    _fromCol = fromCol;
    _toRow = toRow;
    _toCol = toCol;
  }

  /// <summary>
  /// Access the range using an address
  /// </summary>
  /// <param name="address">The address</param>
  /// <returns>A range object</returns>
  public ExcelRange this[string address] {
    get {
      if (_worksheet.Names.ContainsKey(address)) {
        if (_worksheet.Names[address].IsName) {
          return null;
        }
        Address = _worksheet.Names[address].Address;
      } else {
        Address = address;
      }
      return this;
    }
  }

  /// <summary>
  /// Access a single cell
  /// </summary>
  /// <param name="row">The row</param>
  /// <param name="col">The column</param>
  /// <returns>A range object</returns>
  public ExcelRange this[int row, int col] {
    get {
      ValidateRowCol(row, col);

      _fromCol = col;
      _fromRow = row;
      _toCol = col;
      _toRow = row;
      Address = GetAddress(_fromRow, _fromCol);
      return this;
    }
  }

  /// <summary>
  /// Access a range of cells
  /// </summary>
  /// <param name="fromRow">Start row</param>
  /// <param name="fromCol">Start column</param>
  /// <param name="toRow">End Row</param>
  /// <param name="toCol">End Column</param>
  /// <returns></returns>
  public ExcelRange this[int fromRow, int fromCol, int toRow, int toCol] {
    get {
      ValidateRowCol(fromRow, fromCol);
      ValidateRowCol(toRow, toCol);

      _fromCol = fromCol;
      _fromRow = fromRow;
      _toCol = toCol;
      _toRow = toRow;
      Address = GetAddress(_fromRow, _fromCol, _toRow, _toCol);
      return this;
    }
  }

  private static void ValidateRowCol(int row, int col) {
    if (row < 1 || row > ExcelPackage.MaxRows) {
      throw (new ArgumentException("Row out of range"));
    }
    if (col < 1 || col > ExcelPackage.MaxColumns) {
      throw (new ArgumentException("Column out of range"));
    }
  }
}
