﻿/*******************************************************************************
 * 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		Added this class		        2010-01-28
 * Jan Källman		License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

namespace OfficeOpenXml;

/// <summary>
/// A named range.
/// </summary>
public sealed class ExcelNamedRange : ExcelRangeBase {
  private readonly ExcelWorksheet _sheet;

  /// <summary>
  /// A named range
  /// </summary>
  /// <param name="name">The name</param>
  /// <param name="nameSheet">The sheet containing the name. null if its a global name</param>
  /// <param name="sheet">Sheet where the address points</param>
  /// <param name="address">The address</param>
  /// <param name="index">The index in the collection</param>
  public ExcelNamedRange(
      string name,
      ExcelWorksheet nameSheet,
      ExcelWorksheet sheet,
      string address,
      int index)
      : base(sheet, address) {
    Name = name;
    _sheet = nameSheet;
    Index = index;
  }

  internal ExcelNamedRange(string name, ExcelWorkbook wb, ExcelWorksheet nameSheet, int index)
      : base(wb, nameSheet, name, true) {
    Name = name;
    _sheet = nameSheet;
    Index = index;
  }

  /// <summary>
  /// Name of the range
  /// </summary>
  public string Name { get; internal set; }

  /// <summary>
  /// Is the named range local for the sheet
  /// </summary>
  public int LocalSheetId {
    get {
      if (_sheet == null) {
        return -1;
      }
      return _sheet.PositionID - 1;
    }
  }

  internal int Index { get; set; }

  /// <summary>
  /// Is the name hidden
  /// </summary>
  public bool IsNameHidden { get; set; }

  /// <summary>
  /// A comment for the Name
  /// </summary>
  public string NameComment { get; set; }

  internal object NameValue { get; set; }

  internal string NameFormula { get; set; }

  public override string ToString() {
    return Name;
  }
}
