/*******************************************************************************
* 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;
using System.Xml;
using OfficeOpenXml.Style;
namespace OfficeOpenXml
{
internal class RowInternal
{
internal double Height=-1;
internal bool Hidden;
internal bool Collapsed;
internal short OutlineLevel;
internal bool PageBreak;
internal bool Phonetic;
internal bool CustomHeight;
internal int MergeID;
internal RowInternal Clone()
{
return new RowInternal()
{
Height=Height,
Hidden=Hidden,
Collapsed=Collapsed,
OutlineLevel=OutlineLevel,
PageBreak=PageBreak,
Phonetic=Phonetic,
CustomHeight=CustomHeight,
MergeID=MergeID
};
}
}
///
/// Represents an individual row in the spreadsheet.
///
public class ExcelRow : IRangeID
{
private ExcelWorksheet _worksheet;
private XmlElement _rowElement = null;
///
/// Internal RowID.
///
[Obsolete]
public ulong RowID
{
get
{
return GetRowID(_worksheet.SheetID, Row);
}
}
#region ExcelRow Constructor
///
/// Creates a new instance of the ExcelRow class.
/// For internal use only!
///
/// The parent worksheet
/// The row number
internal ExcelRow(ExcelWorksheet Worksheet, int row)
{
_worksheet = Worksheet;
Row = row;
}
#endregion
///
/// Provides access to the node representing the row.
///
internal XmlNode Node { get { return (_rowElement); } }
#region ExcelRow Hidden
///
/// Allows the row to be hidden in the worksheet
///
public bool Hidden
{
get
{
var r=(RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return false;
}
else
{
return r.Hidden;
}
}
set
{
var r = GetRowInternal();
r.Hidden=value;
}
}
#endregion
#region ExcelRow Height
///
/// Sets the height of the row
///
public double Height
{
get
{
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null || r.Height<0)
{
return _worksheet.DefaultRowHeight;
}
else
{
return r.Height;
}
}
set
{
var r = GetRowInternal();
if (_worksheet._package.DoAdjustDrawings)
{
var pos = _worksheet.Drawings.GetDrawingWidths();
r.Height = value;
_worksheet.Drawings.AdjustHeight(pos);
}
else
{
r.Height = value;
}
if (r.Hidden && value != 0)
{
Hidden = false;
}
r.CustomHeight = (value != _worksheet.DefaultRowHeight);
}
}
///
/// Set to true if You don't want the row to Autosize
///
public bool CustomHeight
{
get
{
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return false;
}
else
{
return r.CustomHeight;
}
}
set
{
var r = GetRowInternal();
r.CustomHeight = value;
}
}
#endregion
internal string _styleName = "";
///
/// Sets the style for the entire column using a style name.
///
public string StyleName
{
get
{
return _styleName;
}
set
{
StyleID = _worksheet.Workbook.Styles.GetStyleIdFromName(value);
_styleName = value;
}
}
///
/// Sets the style for the entire row using the style ID.
///
public int StyleID
{
get
{
return _worksheet._styles.GetValue(Row, 0);
}
set
{
_worksheet._styles.SetValue(Row, 0, value);
}
}
///
/// Rownumber
///
public int Row
{
get;
set;
}
///
/// If outline level is set this tells that the row is collapsed
///
public bool Collapsed
{
get
{
var r=(RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return false;
}
else
{
return r.Collapsed;
}
}
set
{
var r = GetRowInternal();
r.Collapsed = value;
}
}
///
/// Outline level.
///
public int OutlineLevel
{
get
{
var r=(RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return 0;
}
else
{
return r.OutlineLevel;
}
}
set
{
var r = GetRowInternal();
r.OutlineLevel=(short)value;
}
}
private RowInternal GetRowInternal()
{
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
r = new RowInternal();
_worksheet._values.SetValue(Row, 0, r);
}
return r;
}
///
/// Show phonetic Information
///
public bool Phonetic
{
get
{
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return false;
}
else
{
return r.Phonetic;
}
}
set
{
var r = GetRowInternal();
r.Phonetic = value;
}
}
///
/// The Style applied to the whole row. Only effekt cells with no individual style set.
/// Use ExcelRange object if you want to set specific styles.
///
public ExcelStyle Style
{
get
{
return _worksheet.Workbook.Styles.GetStyleObject(StyleID,_worksheet.PositionID ,Row.ToString()+":"+Row.ToString());
}
}
///
/// Adds a manual page break after the row.
///
public bool PageBreak
{
get
{
var r = (RowInternal)_worksheet._values.GetValue(Row, 0);
if (r == null)
{
return false;
}
else
{
return r.PageBreak;
}
}
set
{
var r = GetRowInternal();
r.PageBreak = value;
}
}
public bool Merged
{
get
{
return _worksheet.MergedCells[Row, 0] != null;
}
set
{
_worksheet.MergedCells.Add(new ExcelAddressBase(Row, 1, Row, ExcelPackage.MaxColumns), true);
}
}
internal static ulong GetRowID(int sheetID, int row)
{
return ((ulong)sheetID) + (((ulong)row) << 29);
}
#region IRangeID Members
[Obsolete]
ulong IRangeID.RangeID
{
get
{
return RowID;
}
set
{
Row = ((int)(value >> 29));
}
}
#endregion
///
/// Copies the current row to a new worksheet
///
/// The worksheet where the copy will be created
internal void Clone(ExcelWorksheet added)
{
ExcelRow newRow = added.Row(Row);
newRow.Collapsed = Collapsed;
newRow.Height = Height;
newRow.Hidden = Hidden;
newRow.OutlineLevel = OutlineLevel;
newRow.PageBreak = PageBreak;
newRow.Phonetic = Phonetic;
newRow._styleName = _styleName;
newRow.StyleID = StyleID;
}
}
}