1667 lines
59 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using ceTe.DynamicPDF;
using Consulenza.ReportWriter.Business.Entity;
namespace Consulenza.ReportWriter.Business.OBJ_PDF
{
/// <summary>
/// Rappresenta una tabella.
///
/// </summary>
public class TablePDF : ObjectPDF
{
#region Fields
private bool _whitespaceTableCell = false;
private float _widthseparationlines = 1;
private bool _hidelastseparationline = true;
private bool _hidefirstseparationline = false;
private bool _showseparationlines = false;
private bool _showfooterseparationlines = false;
private bool _alternaterow = true;
private float _margin = 5;
private bool _pagebreak = true;
private Style _style = Style.ConsulenzaBase;
private bool _whiteSpacesHorizontalSeparator = false;
private List<ColumnPDF> _columns = new List<ColumnPDF>();
private DataTable _datasource;
public List<int> RowsIndexesThatCantEndPage = new List<int>();
public int RowsIndexesThatCantEndPageYLimit = 0;
// TABLE TITLE
private string _tableTitle = "";
private bool _tableTitleFontBold = false;
private ColorPDF _tableTitleFontColor = null;
private float _tableTitleFontSize = 10;
private float _tableTitleDeltaX = 0;
// ROW TITLE
private string _titlerowtext = string.Empty;
private float _titlerowheight = 20;
private BorderTitleRowType _titlerowborder = BorderTitleRowType.Pieno;
private float _titlerowspace = 10;
// SUBTITLE
//CELL
private Cell[,] _cells;
//ROWS
private RowPDF[] _row;
private readonly int _rowscount;
private float _rowspadding = 5;
private float _rowheight = 18;
private float _minimumrowheight;
private List<float> specifiedRowHeights = new List<float>();
// HEADER
private bool _header = true;
private bool _showborderheader = true;
private string _headertext = string.Empty;
private float _headerheight = 20;
private float _headerfontsize = 9;
private float _headermargin = 1;
private float _yoffset = 0;
private HorizontalAlignmentType _headertexthorizontalalign = HorizontalAlignmentType.Nonimpostato;
private VerticalAlignmentType _headertextverticalalign = VerticalAlignmentType.Centrato;
private float _additionalSpaceBetweenHeadersAndTable = 0;
//FOOTER
private bool _footer = true;
private bool _showborderfooter = true;
private List<ColumnPDF> _footercolumns = new List<ColumnPDF>();
private Cell[,] _footercells;
private float _footerheight = 20;
private VerticalAlignmentType _footertextverticalalign = VerticalAlignmentType.Centrato;
private float _footerYOffset = 0;
//CONTENT
private bool _showborderlastlineinpagebreak;
// NOTE
private List<TableNotePDF> _notes = new List<TableNotePDF>();
// HEADER NOTES
public List<ObjectPDF> HeaderNoteObjects = new List<ObjectPDF>();
/// <summary>
/// Imposta o ottiene la coordianata X su cui disegnare la TablePDF.
/// </summary>
public float X { get; set; }
public bool DrawLineHeaderUP
{
get { return drawLineHeaderUP; }
set { drawLineHeaderUP = value; }
}
private bool drawLineHeaderUP = true;
public bool AddSpaceBeforeTableAfterEntireTableIsMovedToNextPage = false;
public bool HeaderTextDrawJustOnce
{
get { return headerTextDrawJustOnce; }
set { headerTextDrawJustOnce = value; }
}
public int HeaderTextCounter = 0;
public int HeaderNoteObjectsCounter = 0;
private bool headerTextDrawJustOnce = false;
public int TableCantReachThisYPosition = 0;
/// <summary>
/// Imposta o ottiene la coordinaat Y su cui disegnare la TablePDF.
/// </summary>
public float Y { get; set; }
public bool WhiteSpacesHorizontalSeparator
{
get
{
return _whiteSpacesHorizontalSeparator;
}
set
{
_whiteSpacesHorizontalSeparator = value;
}
}
public float AdditionalSpaceBetweenHeadersAndTable
{
get
{
return _additionalSpaceBetweenHeadersAndTable;
}
set
{
_additionalSpaceBetweenHeadersAndTable = value;
}
}
/// <summary>
/// Imposta o recupera lo stile di visualizzazione di una tabella di Default (senza ulteriori personalizzazioni).
/// Di default = Style.ConsulenzaBase (Report di proposta per ConsulenzaBase.)
/// </summary>
/// <remarks>NOTA DI SVILUPPO:
/// Essendo di default impostata = Style.ConsulenzaBase, ogni proprietà impostata per ConsulenzaBase
/// deve necessariamente essere riportata in tutti gli altri "case"</remarks>
public Style Style
{
get { return _style; }
set
{
switch (value)
{
case Style.ConsulenzaBase:
_minimumrowheight = 14;
_rowheight = 18;
_rowspadding = 5;
_headerfontsize = 8;
break;
case Style.Immobiliare:
_minimumrowheight = 0;
_rowheight = 0;
_rowspadding = 7;
_alternaterow = false;
_showborderfooter = false;
_showborderheader = false;
_headerfontsize = 8;
_headerheight = 25;
break;
case Style.ConsulenzaUnica:
_minimumrowheight = 18;
_rowheight = 0;
_rowspadding = 0;
_showseparationlines = true;
_showborderfooter = false;
_showborderheader = false;
_headerfontsize = 7;
break;
default:
break;
}
_style = value;
}
}
/// <summary>
/// Recupera l'altezza della tabella.
/// LIMITAZIONE: Utilizzabile solo se impostato MinimumRowHeight > 0.
/// In caso contrario ritorna 0.
/// </summary>
public float Height
{
get
{
var rowheight = _minimumrowheight > 0 ? _minimumrowheight : 0;
if (_rowheight > rowheight)
rowheight = _rowheight;
return rowheight == 0 ? 0 : _headerheight + (rowheight * _rowscount) + (_rowspadding * (_rowscount + 1)) + _footerheight;
}
}
/// <summary>
/// Imposta o ottiene l'altezza dell'header della tabella
/// Di default = 20.
/// </summary>
public float HeaderHeight
{
get { return _headerheight; }
set { _headerheight = value; }
}
/// <summary>
/// Imposta o ottiene il testo da stampare nell'header della tabella.
/// Di default il testo non viene stampato e vengono stampate nell'header le caption delle singole colonne
/// della tabella.
/// Se HeaderText è valorizzata, non verranno stampate le caption delle colonne ma il testo contenuto in HeaderText.
/// </summary>
public string HeaderText
{
get { return _headertext; }
set { _headertext = value; }
}
/// <summary>
/// Imposta o ottiene il titolo della tabella.
/// Di default il testo non viene stampato.
/// </summary>
public string TableTitle
{
get { return _tableTitle; }
set { _tableTitle = value; }
}
private float tableTitleHeight;
public float TableTitleHeight
{
get { return tableTitleHeight; }
set { tableTitleHeight = value; }
}
public float HeadersObjectsHeight { get; set; }
/// <summary>
/// Imposta o ottiene il colore del titolo della tabella.
/// Di default il testo è 'ColorPDF.Immobiliare_Grigio_TitoloPiccolo'.
/// </summary>
public ColorPDF TableTitleFontColor
{
get { return _tableTitleFontColor; }
set { _tableTitleFontColor = value; }
}
/// <summary>
/// Imposta o ottiene il titolo della tabella è in grassetto.
/// Di default il testo non è in grassetto.
/// </summary>
public bool TableTitleFontBold
{
get { return _tableTitleFontBold; }
set { _tableTitleFontBold = value; }
}
/// <summary>
/// Imposta o ottiene la dimensione del titolo della tabella.
/// Di default il testo non è 10.
/// </summary>
public float TableTitleFontSize
{
get { return _tableTitleFontSize; }
set { _tableTitleFontSize = value; }
}
/// <summary>
/// Imposta o ottiene il DeltaX del titolo della tabella.
/// Di default il deltaX del testo è 0.
/// </summary>
public float TableTitleDeltaX
{
get { return _tableTitleDeltaX; }
set { _tableTitleDeltaX = value; }
}
/// <summary>
/// Allineamento Orizzontale del testo dell'header della tabella.
/// Di default allineamento = NONIMPOSTATO.
/// Se il valore è su NONIMPOSTATO l'allineamento usato sarà quello definito a livello di ciascuna colonna.
/// Se il valore viene cambiato tutte le colonne dell'header verranno allineate secondo l'allineamento scelto indipendentemente da quello di ciascuna colonna.
/// </summary>
public HorizontalAlignmentType HeaderTextHorizontalAlign
{
get { return _headertexthorizontalalign; }
set { _headertexthorizontalalign = value; }
}
/// <summary>
/// Allineamento Verticale del testo dell'header della tabella
/// Di default è allineato CENTRATO.
/// </summary>
public VerticalAlignmentType HeaderTextVerticalAlign
{
get { return _headertextverticalalign; }
set { _headertextverticalalign = value; }
}
/// <summary>
/// Imposta o recupera il margine tra l'header e il corpo della tabella.
/// Di default = 1.
/// </summary>
public float HeaderMargin
{
get { return _headermargin; }
set { _headermargin = value; }
}
/// <summary>
/// Allineamento Verticale del testo del footer della tabella.
/// Di default è allineato CENTRATO.
/// </summary>
public VerticalAlignmentType FooterTextVerticalAlign
{
get { return _footertextverticalalign; }
set { _footertextverticalalign = value; }
}
/// <summary>
/// Booleano che indica se mostrare il bordo di chiusura sull'ultima riga.
/// Viene renderizzato solo se la tabella non ha footer.
/// Di default = false;
/// </summary>
public bool ShowBorderLastLine { get; set; }
/// <summary>
/// Ottiene o imposta l'insieme di celle che costruiscono ogni singola riga della tabella.
/// TO DO
/// </summary>
public RowPDF[] Row
{
get { return _row; }
set { _row = value; }
}
/// <summary>
/// Recupera il numero totale di righe della tabella.
/// </summary>
public int RowsCount
{
get { return _rowscount; }
}
/// <summary>
/// Imposta o recupera lo spazio tra le righe.
/// Di default = 5.
/// </summary>
public float RowsPadding
{
get { return _rowspadding; }
set { _rowspadding = value; }
}
public float RowsHeightOffset { get; set; }
/// <summary>
/// Ottiene o imposta le celle della tabella.
/// L'ordine dell'array è colonna,riga.
/// </summary>
public Cell[,] Cells
{
get { return _cells; }
set { _cells = value; }
}
/// <summary>
/// Restituisce la larghezza tabella. Data dalla somma della largheza di ciascuna colonna.
/// </summary>
public float Width
{
get { return GetWidth(); }
}
/// <summary>
/// Lista di colonne.
/// </summary>
public List<ColumnPDF> Columns
{
get { return _columns; }
set { _columns = value; }
}
/// <summary>
/// Lista delle colonne del Footer
/// </summary>
public List<ColumnPDF> FooterColumns
{
get { return _footercolumns; }
set { _footercolumns = value; }
}
public float FooterYOffset
{
get { return _footerYOffset; }
set { _footerYOffset = value; }
}
/// <summary>
/// Imposta o ottiene la cella del footer.
/// </summary>
public Cell[,] FooterCells
{
get { return _footercells; }
set { _footercells = value; }
}
/// <summary>
/// Recupera o imposta l'altezza del footer della tabella
/// Di default = 20.
/// </summary>
public float FooterHeight
{
get { return _footerheight; }
set { _footerheight = value; }
}
/// <summary>
/// DataSource. Contiene i dati che andranno stampati nella tabella
/// </summary>
public DataTable DataSource
{
get { return _datasource; }
set { _datasource = value; }
}
/// <summary>
/// DataSource del Footer. Contiene i dati che andranno stampati nel footer della tabella
/// </summary>
public DataTable FooterDatasource { get; set; }
/// <summary>
/// Mostra le linee di separazione tra una riga e l'altra.
/// Di default false.
/// </summary>
public bool ShowSeparationLines
{
get { return _showseparationlines; }
set { _showseparationlines = value; }
}
public bool ShowFooterSeparationLines
{
get { return _showfooterseparationlines; }
set { _showfooterseparationlines = value; }
}
/// <summary>
/// Di default true.
/// Nasconde l'ultima riga di separazione.
/// </summary>
public bool HideLastSeparationLine
{
get { return _hidelastseparationline; }
set { _hidelastseparationline = value; }
}
public bool HideFirstSeparationLine
{
get { return _hidefirstseparationline; }
set { _hidefirstseparationline = value; }
}
///// <summary>
///// Ottiene o imposta lo spessore delle linee di separazione.
///// Di default = 1
///// </summary>
//public bool WhiteSpaceCells
//{
// get { return _whitespaceTableCell; }
// set { _whitespaceTableCell = value; }
//}
/// <summary>
/// Ottiene o imposta lo spessore delle linee di separazione.
/// Di default = 1
/// </summary>
public float WidthSeparationLines
{
get { return _widthseparationlines; }
set { _widthseparationlines = value; }
}
/// <summary>
/// Indica se la tabella è provvista di header.
/// Di default true.
/// </summary>
public bool Header
{
get { return _header; }
set
{
_header = value;
if (_header == false)
_headerheight = 0;
}
}
/// <summary>
/// Indica se l' header della tabella ha un border oppure no.
/// Di default = true.
/// </summary>
public bool ShowBorderHeader
{
get { return _showborderheader; }
set { _showborderheader = value; }
}
/// <summary>
/// Indica se la tabella è provvista di Footer.
/// Di default = True.
/// </summary>
public bool Footer
{
get { return _footer; }
set
{
_footer = value;
if (_footer == false)
_footerheight = 0;
}
}
/// <summary>
/// Indica se il footer della tabella ha un border oppure no.
/// Di default = true.
/// </summary>
public bool ShowBorderFooter
{
get { return _showborderfooter; }
set { _showborderfooter = value; }
}
/// <summary>
/// Dimensione del carattere dell'header. E' il fontsize di base definito a seconda dello Style attributo alla tabella.
/// </summary>
public float HeaderFontSize
{
get { return _headerfontsize; }
set { _headerfontsize = value; }
}
///// <summary>
///// Colore del carattere dell'intestazione della tabella
///// </summary>
//public ceTe.DynamicPDF.CmykColor HeaderFontColor
//{
// get { return _headerfontcolor; }
// set { _headerfontcolor = value; }
//}
/// <summary>
/// Ottiene o imposta un booleano che indica se alternare le righe della tabella con uno sfondo bianco e uno grigio.
/// Di default = true.
/// </summary>
public bool AlternateRow
{
get { return _alternaterow; }
set { _alternaterow = value; }
}
/// <summary>
/// Ottiene o imposta un booleano che indica se la tabella conterrà una riga aggiuntiva
/// all'inizio della stessa in cui andrà scritta il titolo (TitleRowText).
/// La riga ha sfondo grigio ed è bordata, è posta sopra l'header della tabella.
/// Se impostata a true, la proprietà ShowBorderHeader viene automaticamente settata a false.
/// Di default = false.
/// </summary>
public bool TitleRow { get; set; }
/// <summary>
/// Ottiene o imposta il testo della riga del titolo della tabella.
/// </summary>
public string TitleRowText
{
get { return _titlerowtext; }
set { _titlerowtext = value; }
}
/// <summary>
/// Ottiene o imposta l'altezza del titolo della tabella.
/// Di default = 20.
/// </summary>
public float TitleRowHeight
{
get { return _titlerowheight; }
set { _titlerowheight = value; }
}
/// <summary>
/// Ottiene o imposta il tipo di bordo per il TitleRow della tabella.
/// Di default = BorderTypeTitleRow.PIENO
/// </summary>
public BorderTitleRowType TitleRowBorder
{
get { return _titlerowborder; }
set { _titlerowborder = value; }
}
/// <summary>
/// Ottiene o imposta il valore dello spazio che intercorre tra la fine del TitleRow e l'inizio dell' Header della tabella sottostante.
/// Se è impostato la SubTitleTable è il valore che intercorre tra la fine della SubTitleTable e l' Header della tabella sottostante.
/// Di default=10.
/// </summary>
public float TitleRowSpace
{
get { return _titlerowspace; }
set { _titlerowspace = value; }
}
/// <summary>
/// Imposta o recupera la TablePDF da disegnare sotto al TitleRow.
/// </summary>
public TablePDF SubTitleTable { get; set; }
/// <summary>
/// Imposta o recupera la lista di oggetti (ObjectPDF) da disegnare sotto al TitleRow.
/// </summary>
public List<ObjectPDF> SubTitleElements { get; set; }
/// <summary>
/// Imposta o recupera il valore del margine sinistro e destro, la distanza tra
/// il bordo sinistro e destro dal testo della prima e ultima colonna.
/// Di default = 5.
/// </summary>
public float Margin
{
get { return _margin; }
set { _margin = value; }
}
/// <summary>
/// Indica se il contenuto della tabella ha un border oppure no.
/// Di default = false.
/// </summary>
public bool ShowBorderContent { get; set; }
/// <summary>
/// Imposta o recupera un booleano che indica se la tabella può effettuare il salto pagina.
/// Se impostato a false la tabella sarà stampata in un'unica pagina.
/// Di default = true.
/// </summary>
public bool PageBreak
{
get { return _pagebreak; }
set { _pagebreak = value; }
}
/// <summary>
/// Imposta o recupera la lista di note da associare alla tabella.
/// </summary>
public List<TableNotePDF> Notes
{
get { return _notes; }
set { _notes = value; }
}
/// <summary>
/// Imposta o recupera lo spazio aggiuntivo sotto la tabella.
/// Di default = 0.
/// </summary>
public float AdditionalSpaceBelow { get; set; }
/// <summary>
/// Imposta o ottiene un booleano che indica se mostrare le note aggiunte alla tabella in fondo alla pagina per ogni pagina quando questa effettua dei salti pagina.
/// Di default=false.
/// </summary>
public bool ShowNotesFooterPageForAllPages { get; set; }
/// <summary>
/// Imposta o recupera l'altezza della riga.
/// </summary>
public float RowHeight
{
get { return _rowheight; }
set { _rowheight = value; }
}
public List<float> SpecifiedRowHeights
{
get { return specifiedRowHeights; }
set { specifiedRowHeights = value; }
}
///// <summary>
///// Recupera un bool che indica se l'altezza di ogni riga della tabella è fissa a RowHeight.
///// Di default: Style.ConsulenzaBase = TRUE, Style.Immobiliare e Style.ConsulenzaUnica = FALSE.
///// </summary>
//public bool FixedRowHeight
//{
// get { return _style == Style.ConsulenzaBase; }
//}
/// <summary>
/// Imposta o recupera l'altezza minima delle righe della tabella.
/// Se 0 non viene considerata.
/// Di default 0.
/// </summary>
public float MinimumRowHeight
{
get { return _minimumrowheight; }
set { _minimumrowheight = value; }
}
/// <summary>
/// Bool che indica se mostrare una linea orizzontale all'ultima riga della tabella prima del salto pagina.
/// Di default = false.
/// </summary>
public bool ShowBorderLastLineInPageBreak
{
get { return _style == Style.Immobiliare || _showborderlastlineinpagebreak; }
set { _showborderlastlineinpagebreak = value; }
}
public float YOffset
{
get
{
return _yoffset;
}
set
{
_yoffset = value;
}
}
public List<int> RowsIndexesThatIgnoreColumnBackgroundColor { get; set; }
public List<int> IndexesOfSeparatorsToIgnore { get; set; }
public List<int> IndexesOfRowLinesToIgnoreSeparators { get; set; }
#endregion
#region Costruttori
/// <summary>
/// Costruttore
/// </summary>
public TablePDF()
{
Style = OBJ_PDF.Style.ConsulenzaBase; // Di Default Style.ConsulenzaBase
ObjectType = ObjectTypePdf.TABLE;
TableTitle = null;
ShowNotesFooterPageForAllPages = false;
AdditionalSpaceBelow = 0;
ShowBorderContent = false;
SubTitleElements = null;
SubTitleTable = null;
TitleRow = false;
ShowSeparationLines = false;
ShowBorderLastLine = false;
IndexesOfSeparatorsToIgnore = new List<int>();
RowsIndexesThatIgnoreColumnBackgroundColor = new List<int>();
IndexesOfRowLinesToIgnoreSeparators = new List<int>();
}
/// <summary>
/// Costruttore
/// </summary>
public TablePDF(float x)
: this()
{
X = x;
}
///// <summary>
///// Costruttore.
///// Verrà disegnata una tabella a partire dal "datasource" passato in input.
///// La proprietà "cells" della tabella non deve essere impostata in quanto verranno stampate le colonne del "datasource" che coincidono con le colonne (proprietà "columns").
///// Devono essere definite le colonne tramite la proprietà "columns".
///// </summary>
///// <param name="x">x a partire dalla quale verrà disegnata la tabella.</param>
///// <param name="datasource">Fonte dati</param>
//public TablePDF(float x, DataTable datasource)
// : this(x)
//{
// _datasource = datasource;
// _rowscount = datasource.Rows.Count;
// X = x;
// _row = new RowPDF[datasource.Rows.Count];
// _cells = new Cell[datasource.Columns.Count, datasource.Rows.Count];
// _footercell = new Cell[datasource.Columns.Count];
// for (int col = 0; col < datasource.Columns.Count; col++)
// {
// for (int row = 0; row < datasource.Rows.Count; row++)
// {
// _cells[col, row] = new Cell(string.Empty);
// _row[row] = new RowPDF();
// }
// _footercell[col] = new Cell(string.Empty);
// }
//}
/// <summary>
/// Costruttore.
/// Viene impostato sull'intera riga il FontBold in funzione del booleano impostato nella colonna "FontBold" del datasource.
/// Viene rimpiazzato sull'intera riga i valori a 0 con il carattere impostato nella colonna "ReplaceIfZero" del datasource.
/// </summary>
/// <param name="x">x a partire dalla quale verrà disegnata la tabella.</param>
/// <param name="datasource">Fonte dati</param>
public TablePDF(float x, DataTable datasource)
: this(x)
{
_datasource = datasource;
_rowscount = datasource.Rows.Count;
X = x;
_row = new RowPDF[datasource.Rows.Count];
_cells = new Cell[datasource.Columns.Count, datasource.Rows.Count];
_footercells = new Cell[datasource.Columns.Count, 1];
for (int col = 0; col < datasource.Columns.Count; col++)
{
for (int row = 0; row < datasource.Rows.Count; row++)
{
var cell = new Cell(string.Empty);
if (_datasource.Columns.Contains("FontBold"))
cell.FontBold = Convert.ToBoolean(_datasource.Rows[row]["FontBold"]);
if (_datasource.Columns.Contains("ReplaceIfZero"))
cell.ReplaceIfZero = _datasource.Rows[row]["ReplaceIfZero"].ToString();
_cells[col, row] = cell;
_row[row] = new RowPDF();
}
_footercells[col, 0] = new Cell(string.Empty) { BackgroundColor = ColorPDF.ConsulenzaUnica_Grigio_SfondoColonnaHeaderFooterTabella };
}
}
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="datasource"></param>
/// <param name="footerdatasource"></param>
public TablePDF(float x, DataTable datasource, DataTable footerdatasource)
: this(x, datasource)
{
FooterDatasource = footerdatasource;
_footercells = new Cell[footerdatasource.Columns.Count, footerdatasource.Rows.Count];
for (int col = 0; col < footerdatasource.Columns.Count; col++)
{
for (int row = 0; row < footerdatasource.Rows.Count; row++)
{
var cell = new Cell(string.Empty);
if (footerdatasource.Columns.Contains("FontBold"))
cell.FontBold = Convert.ToBoolean(footerdatasource.Rows[row]["FontBold"]);
if (footerdatasource.Columns.Contains("ReplaceIfZero"))
cell.ReplaceIfZero = footerdatasource.Rows[row]["ReplaceIfZero"].ToString();
if (footerdatasource.Columns.Contains("BackgroundGray"))
{
var boolBackgroundGray = Convert.ToBoolean(footerdatasource.Rows[row]["BackgroundGray"]);
cell.BackgroundColor = boolBackgroundGray ? ColorPDF.Standard_Grigio_SfondoColonnaTabella : ColorPDF.Bianco;
}
_footercells[col, row] = cell;
}
}
}
/// <summary>
/// Costruttore.
/// La tabella sarà composta dal numero di colonne e di righe passate in input.
/// E' necessario valorizzare la proprietà "cells" della tabella per l'assegnazione dei valori
/// alle singole celle.
/// Devono essere definite le colonne tramite la proprietà "columns".
/// </summary>
/// <param name="x">x a partire dalla quale verrà disegnata la tabella.</param>
/// <param name="columns">Numero di colonne.</param>
/// <param name="rows">Numero di righe.</param>
public TablePDF(float x, int columns, int rows)
: this()
{
_cells = new Cell[columns, rows];
//_footercell = new Cell[columns];
_row = new RowPDF[rows];
X = x;
_rowscount = rows;
for (int col = 0; col < columns; col++)
{
for (int row = 0; row < rows; row++)
{
_cells[col, row] = new Cell(string.Empty);
_row[row] = new RowPDF();
}
//_footercell[col] = new Cell(string.Empty);
}
}
#endregion
#region Metodi
/// <summary>
/// Recupera la larghezza totale della tabella, data dalla somma delle colonne aggiunte ad essa.
/// </summary>
/// <returns></returns>
private float GetWidth()
{
return _columns.Aggregate<ColumnPDF, float>(0, (current, col) => current + col.Width);
}
/// <summary>
/// Ritorna l'oggetto che sarà stampato sulla pagina.
/// </summary>
/// <returns></returns>
public override PageElement ToElement()
{
return null;
}
///// <summary>
///// Converte in DataTable le righe e le colonne aggiunte alla tabella.
///// Ritorna un DataTable denominato "ToDataTable".
///// </summary>
///// <returns></returns>
//public DataTable ToDataTable()
//{
// DataTable dtReturn = new DataTable("ToDataTable");
// foreach (ColumnPDF colonna in _columns)
// dtReturn.Columns.Add(colonna.Id, typeof(string));
// DataRow drToAdd;
// for (int iRiga = 0; iRiga < _rowscount; iRiga++)
// {
// drToAdd = dtReturn.NewRow();
// for (int iColonna = 0; iColonna < _columns.Count; iColonna++)
// drToAdd[iColonna] = _cells[iColonna, iRiga].Value;
// dtReturn.Rows.Add(drToAdd);
// }
// return dtReturn;
//}
#endregion
}
/// <summary>
/// Rappresenta il tipo della colonna della tabella.
/// </summary>
public enum ColumnType
{
Testo,
Immagine,
Objectpdf,
Decimale,
Intero,
Percentuale
}
/// <summary>
/// Tipo di allineamento orizzontale della colonna.
/// </summary>
public enum HorizontalAlignmentType
{
Nonimpostato,
Centrato,
Destra,
Sinistra
}
/// <summary>
/// Tipo di allineamento verticale della colonna.
/// </summary>
public enum VerticalAlignmentType
{
Nonimpostato,
Alto,
Centrato,
Basso
}
/// <summary>
/// Tipo di bordo per il TitleRow dell'oggetto TablePDF
/// </summary>
public enum BorderTitleRowType
{
Nessuno,
Pieno
}
/// <summary>
/// Tipo di bordo per la Row dell'oggetto TablePDF
/// </summary>
public enum BorderRowType
{
Alto,
Basso,
Entrambi
}
/// <summary>
/// Rappresenta la singola colonna di una tabella
/// </summary>
public class ColumnPDF
{
private int _width;
private bool? _fontbold;
private float _fontsize = 7;
private HorizontalAlignmentType _horizontalalignment = HorizontalAlignmentType.Nonimpostato;
private VerticalAlignmentType _verticalalignment = VerticalAlignmentType.Centrato;
private string _headertext = string.Empty;
private VerticalAlignmentType _headerverticalalignment = VerticalAlignmentType.Centrato;
private bool _headerfontbold = true;
private List<string> _headergrouptext = new List<string>();
private bool _headergroupborderline = true;
private float _scalecolumntypeimage = 1;
private float _paddingtopimage = 0;
private bool _visibile = true;
private float _paddingleft;
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
public ColumnPDF(string id, int width)
{
ForceStyleFontColor = false;
ForceStyleFontBold = false;
HeaderFontColor = null;
HeaderBackgroundColor = null;
HeaderTextVerticalDirection = false;
HeaderFontSize = 0; // Viene impostata di default in base alla HeaderFontSize della relativa TablePDF.
FontColor = null;
BackgroundColor = null;
BackgroundGray = false;
DeltaYContent = 0;
HeaderGroupTextDeltaX = 0;
HeaderPaddingLeft = 0;
PaddingRight = 0;
HeaderGroupWidth = 0;
HeaderGroupTextDeltaY = 0;
HeaderGroupScaleImage = 1;
Id = id;
_width = width;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento Orizzontale della colonna</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment)
: this(id, width)
{
_horizontalalignment = horizontalalignment;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray)
: this(id, width, horizontalalignment)
{
BackgroundGray = backgroundgray;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
/// <param name="fontbold">Se true il testo dell'intera colonna viene scritto in grassetto</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray, bool fontbold)
: this(id, width, horizontalalignment, backgroundgray)
{
_fontbold = fontbold;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
/// <param name="fontbold">Se true il testo dell'intera colonna viene scritto in grassetto</param>
/// <param name="fontsize">Dimensione del carattere con cui viene scritto il testo sull'intera colonna</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray, bool fontbold, int fontsize)
: this(id, width, horizontalalignment, backgroundgray, fontbold)
{
_fontsize = fontsize;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
/// <param name="fontbold">Se true il testo dell'intera colonna viene scritto in grassetto</param>
/// <param name="fontsize">Dimensione del carattere con cui viene scritto il testo sull'intera colonna</param>
/// <param name="columntype">Tipo di colonna</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray, bool fontbold, int fontsize, ColumnType columntype)
: this(id, width, horizontalalignment, backgroundgray, fontbold, fontsize)
{
TipoColonna = columntype;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
/// <param name="fontbold">Se true il testo dell'intera colonna viene scritto in grassetto</param>
/// <param name="fontsize">Dimensione del carattere con cui viene scritto il testo sull'intera colonna</param>
/// <param name="columntype">Tipo di colonna</param>
/// <param name="columnnamedatasource">Nome della colonna del datasource a cui associare la colonna</param>
/// <param name="headertext">Testo dell'header della colonna. Se specificato il valore contenuto in "columnnamedatasource" viene rimpiazzato da questo valore.</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray, bool fontbold, int fontsize, ColumnType columntype, string columnnamedatasource, string headertext)
: this(id, width, horizontalalignment, backgroundgray, fontbold, fontsize, columntype)
{
Name = columnnamedatasource;
_headertext = headertext;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="id">Identificativo della colonna</param>
/// <param name="width">Larghezza della colonna</param>
/// <param name="horizontalalignment">Allineamento orizzontale della colonna</param>
/// <param name="backgroundgray">Se true disegna uno sfondo grigio sull'intera colonna</param>
/// <param name="fontbold">Se true il testo dell'intera colonna viene scritto in grassetto</param>
/// <param name="fontsize">Dimensione del carattere con cui viene scritto il testo sull'intera colonna</param>
/// <param name="columntype">Tipo di colonna</param>
/// <param name="columnnamedatasource">Nome della colonna del datasource a cui associare la colonna</param>
/// <param name="headertext">Testo dell'header della colonna. Se specificato il valore contenuto in "colonnadatasource" viene rimpiazzato da questo valore.</param>
/// <param name="headertextpaddingleft">Spostamento a destra o a sinistra (a seconda se positivo o negativo) del valore attribuito alla proprietà dell'intestazione.</param>
public ColumnPDF(string id, int width, HorizontalAlignmentType horizontalalignment, bool backgroundgray, bool fontbold, int fontsize, ColumnType columntype, string columnnamedatasource, string headertext, float headertextpaddingleft)
: this(id, width, horizontalalignment, backgroundgray, fontbold, fontsize, columntype, columnnamedatasource, headertext)
{
HeaderPaddingLeft = headertextpaddingleft;
}
/// <summary>
/// Ottiene o imposta l'identificativo della colonna.
/// </summary>
public string Id { get; set; }
/// <summary>
/// Ottiene o imposta la larghezza della colonna.
/// </summary>
public int Width
{
get { return _width; }
set { _width = value; }
}
/// <summary>
/// Dimensione in scala di ciascuna immagine che verrà stampata nella colonna di tipo immagine.
/// Di default = 1.
/// </summary>
public float ScaleColumnTypeImage
{
get { return _scalecolumntypeimage; }
set { _scalecolumntypeimage = value; }
}
public float PaddingTopImage
{
get { return _paddingtopimage; }
set { _paddingtopimage = value; }
}
/// <summary>
/// Indica se il testo contenuto nella colonna sarà in grassetto oppure no.
/// </summary>
public bool? FontBold
{
get { return _fontbold; }
set { _fontbold = value; }
}
/// <summary>
/// Ottiene o imposta la dimensione del font della colonna.
/// Se non impostato = 7.
/// </summary>
public float FontSize
{
get { return _fontsize; }
set { _fontsize = value; }
}
/// <summary>
/// Imposta o recupera il colore del carattere della colonna.
/// </summary>
public ColorPDF FontColor { get; set; }
/// <summary>
/// Indica se lo sfondo della colonna della tabella deve essere grigio.
/// Lo sfondo verrà applicato all'intera colonna della tabella.
/// </summary>
public bool BackgroundGray { get; set; }
/// <summary>
/// Recupera o imposta il colore di sfondo della colonna della tabella.
/// Di default = null (bianco)
/// </summary>
public ColorPDF BackgroundColor { get; set; }
/// <summary>
/// Ottiene o imposta il nome della colonna.
/// Corrisponde al campo del DataTable cui la colonna viene associata.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Tipo della colonna.
/// </summary>
public ColumnType TipoColonna { get; set; }
/// <summary>
/// Ottiene e imposta la visibilità della colonna.
/// </summary>
public bool Visibile
{
get { return _visibile; }
set { _visibile = value; }
}
/// <summary>
/// Allineamento orizzontale del testo della colonna.
/// Di default = NONIMPOSTATO
/// </summary>
public HorizontalAlignmentType HorizontalAlignment
{
get { return _horizontalalignment; }
set { _horizontalalignment = value; }
}
/// <summary>
/// Allineamento verticale del testo della colonna.
/// Di default = AllineamentoVerticale.CENTRATO.
/// </summary>
public VerticalAlignmentType VerticalAlignment
{
get { return _verticalalignment; }
set { _verticalalignment = value; }
}
/// <summary>
/// Imposta o recupera la distanza tra il bordo e il contenuto in una colonna allineata a sinistra.
/// Di default = 0.
/// </summary>
public float PaddingLeft
{
get { return _paddingleft; }
set
{
_paddingleft = value;
if (_paddingleft > _width)
throw new Exception("Il padding sinistro non può essere maggiore della larghezza della colonna");
}
}
/// <summary>
/// Imposta o recupera la distanza tra il bordo e il contenuto in una colonna allineata a destra.
/// Di default = 0.
/// </summary>
public float PaddingRight { get; set; }
/// <summary>
/// Imposta o recupera il Delta (incremento o decremento) sinistro per il titolo della colonna.
/// Rappresenta lo spostamento a destra o a sinistra (a seconda se positivo o negativo) del valore attribuito alla HeaderText.
/// Di default = 0.
/// </summary>
public float HeaderPaddingLeft { get; set; }
/// <summary>
/// Imposta o recupera il Delta (incremento o decremento) destro per il titolo della colonna.
/// Rappresenta lo spostamento a destra o a sinistra (a seconda se positivo o negativo) del valore attribuito alla HeaderText.
/// Di default = 0.
/// </summary>
public float HeaderPaddingRight { get; set; }
/// <summary>
/// Imposta o recupera il Delta (incremento o decremento) per il titolo della colonna.
/// Rappresenta lo spostamento a destra o a sinistra (a seconda se positivo o negativo) del valore attribuito allla HeaderGroupText.
/// Di default = 0.
/// </summary>
public float HeaderGroupTextDeltaX { get; set; }
/// <summary>
/// Imposta o recupera il Delta (incremento o decremento) per il titolo della colonna.
/// Rappresenta lo spostamento in alto o in basso (a seconda se positivo o negativo) del valore attribuito allla HeaderGroupText.
/// Di default = 0.
/// </summary>
public float HeaderGroupTextDeltaY { get; set; }
/// <summary>
/// Imposta o recupera il Delta (incremento o decremento) per il contenuto della colonna.
/// Rappresenta lo spostamento in alto o in basso (a seconda se negativo o positivo) del valore in cui sarebbe scritto l'elemento.
/// Di default = 0.
/// </summary>
public float DeltaYContent { get; set; }
/// <summary>
/// Ottiene o imposta il testo che verrà scritto sul titolo della colonna.
/// Il campo del DataTable cui la colonna viene associata verrà sovrascritto da questa proprietà.
/// </summary>
public string HeaderText
{
get { return _headertext; }
set { _headertext = value; }
}
/// <summary>
/// Allineamento verticale del testo dell'Header della colonna.
/// Di default = AllineamentoVerticale.CENTRATO.
/// </summary>
public VerticalAlignmentType HeaderVerticalAlignment
{
get { return _headerverticalalignment; }
set { _headerverticalalignment = value; }
}
/// <summary>
/// Imposta o recupera un bool che indica se il testo dell'Header della colonna sarà scritto in verticale.
/// Di default = false.
/// </summary>
public bool HeaderTextVerticalDirection { get; set; }
/// <summary>
/// Recupera o imposta il colore di sfondo dell'header della colonna della tabella.
/// Di default = null (bianco)
/// </summary>
public ColorPDF HeaderBackgroundColor { get; set; }
/// <summary>
/// Imposta o recupera il colore del carattere dell'header della colonna.
/// Di default = null (bianco).
/// </summary>
public ColorPDF HeaderFontColor { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se il testo dell'Header della colonna è bold.
/// Di default = true.
/// </summary>
public bool HeaderFontBold
{
get { return _headerfontbold; }
set { _headerfontbold = value; }
}
/// <summary>
/// Imposta o recupera la grandezza del testo dell'Header della colonna.
/// Di default = 9.
/// </summary>
public float HeaderFontSize { get; set; }
/// <summary>
/// Imposta o recupera una lista di stringhe rappresentanti i testi che saranno scritti nell' header della colonna per una larghezza complessiva definita in HeaderGroupWidth.
/// </summary>
public List<string> HeaderGroupText
{
get { return _headergrouptext; }
set { _headergrouptext = value; }
}
/// <summary>
/// Imposta o recupera il percorso dell'immagine da inserire nel HeaderGroup in sostituzione dell'HeaderGroupText.
/// </summary>
public string HeaderGroupPathImage { get; set; }
/// <summary>
/// Imposta o recupera la scala dell'immagine definita in HeaderGroupPathImage
/// </summary>
public float HeaderGroupScaleImage { get; set; }
/// <summary>
/// Imposta o recupera la larghezza su cui scrivere HeaderGroupText.
/// </summary>
public int HeaderGroupWidth { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se scrivere in modalità verticale il HeaderGroupText
/// </summary>
public bool HeaderGroupTextVerticalDirection { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se disegnare una linea di bordo basso quando HeaderGroupText è impostato.
/// Di default = true.
/// </summary>
public bool HeaderGroupBorderLine
{
get { return _headergroupborderline; }
set { _headergroupborderline = value; }
}
/// <summary>
/// Imposta o recupera un bool che indica se forzare l'utilizzo dello stile di FontBold definito a livello di Column.
/// Se False,lo stile definito viene sovrascritto, in ordine, da quello definito a livello di Cell.
/// Di default = False.
/// </summary>
public bool ForceStyleFontBold { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se forzare l'utilizzo dello stile di FontColor definito a livello di Column.
/// Se False,lo stile definito viene sovrascritto, in ordine, da quello definito a livello di Cell.
/// Di default = False.
/// </summary>
public bool ForceStyleFontColor { get; set; }
}
/// <summary>
/// Rappresenta la singola cella di una tabella.
/// </summary>
public class Cell
{
private string _value = string.Empty;
private bool? _fontbold;
private string _replaceifzero = string.Empty;
/// <summary>
/// Costruttore
/// </summary>
public Cell()
{
FontColor = null;
BackgroundColor = null;
ColSpan = 0;
ValueObject = null;
ValueObjectList = new List<ObjectPDF>();
HorizontalAlignment = HorizontalAlignmentType.Nonimpostato;
YContentOffset = 0;
XContentOffset = 0;
}
/// <summary>
/// Costruttore
/// </summary>
/// <param name="value">Valore da inserire nella cella.</param>
public Cell(string value)
: this()
{
_value = value;
}
/// <summary>
/// Imposta o recupera il valore della cella.
/// Se si imposta il tipo di colonna = IMMAGINE e si assegna a questa proprietà il nome dell'immagine
/// (ad esempio danger.png), sulla tabella verranno riportate le immagini,altimenti verrà stampato il testo impostato.
/// </summary>
public string Value
{
get { return _value; }
set { _value = value; }
}
/// <summary>
/// Imposta o recupera l'ObjectPDF da disegnare nella cella.
/// Attualmente è possibile renderizzare solamente FormattedTextAreaPDF, RectanglePDF e CirclePDF (altri oggetti non verranno renderizzati).
/// </summary>
public ObjectPDF ValueObject { get; set; }
/// <summary>
/// Imposta o recupera la lista di ObjectPDF da disegnare nella cella.
/// Attualmente è possibile renderizzare solamente FormattedTextAreaPDF, RectanglePDF e CirclePDF (altri oggetti non verranno renderizzati).
/// </summary>
public List<ObjectPDF> ValueObjectList { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se il testo della cella è bold.
/// </summary>
public bool? FontBold
{
get { return _fontbold; }
set { _fontbold = value; }
}
/// <summary>
/// Imposta o recupera il carattere di sostituzione nel caso il valore di una colonna INTERO o DECIMALE sia uguale a 0.
/// Valido solo per le colonne di tipo INTERO o DECIMALE.
/// Di default = string.empty (nessuna sostituzione).
/// </summary>
public string ReplaceIfZero
{
get { return _replaceifzero; }
set { _replaceifzero = value; }
}
/// <summary>
/// Imposta o recupera il numero di celle che saranno raggruppate all'interno delle colonne definite per l'oggetto TablePDF.
/// ColSpan = 2 raggruppa la cella corrente e la successiva.
/// Di default = 0 (nessun colspan);
/// </summary>
public int ColSpan { get; set; }
/// <summary>
/// Recupera o imposta il colore di sfondo della cella della tabella.
/// Di default = null (bianco)
/// </summary>
public ColorPDF BackgroundColor { get; set; }
public ColorPDF HorizontalSeparatorColor { get; set; }
/// <summary>
/// Imposta o recupera il colore del carattere della cella.
/// </summary>
public ColorPDF FontColor { get; set; }
/// <summary>
/// Allineamento orizzontale del testo della cella.
/// Di default = NonImpostato (viene condiserato l'allineamento definito a livello di ColumnPDF)
/// </summary>
public HorizontalAlignmentType HorizontalAlignment { get; set; }
public float YContentOffset { get; set; }
public float XContentOffset { get; set; }
}
/// <summary>
/// Rappresenta la singola riga di una tabella
/// </summary>
public class RowPDF
{
private bool? _fontbold;
private bool _visible = true;
private BorderRowType _bordertype = BorderRowType.Entrambi;
private bool _showborderincolumnimage = true;
public RowPDF()
{
BackgroundColor = null;
Border = false;
ForceStyleFontColor = false;
ForceStyleFontBold = false;
BackgroundGray = false;
}
/// <summary>
/// Indica se il testo dell'intera riga della tabella sarà grassetto.
/// </summary>
public bool? FontBold
{
get { return _fontbold; }
set { _fontbold = value; }
}
/// <summary>
/// Imposta o recupera un booleano che indica se la riga deve essere visualizzata.
/// Di default=true.
/// </summary>
public bool Visible
{
get { return _visible; }
set { _visible = value; }
}
/// <summary>
/// Indica se lo sfondo della riga della tabella deve essere grigio.
/// Di default=false.
/// </summary>
public bool BackgroundGray { get; set; }
/// <summary>
/// Recupera o imposta il colore di sfondo della riga della tabella.
/// Di default = null (bianco)
/// </summary>
public ColorPDF BackgroundColor { get; set; }
/// <summary>
/// Imposta o recupera il colore del carattere della riga.
/// Se non impostato viene definito di base in funzione dello Style della tabella.
/// </summary>
public ColorPDF FontColor { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se mostare il bordo (una linea in alto e una in basso alla riga).
/// </summary>
public bool Border { get; set; }
/// <summary>
/// Imposta o recupera il tipo di bordo della riga.
/// Di default = ENTRAMBI
/// </summary>
public BorderRowType BorderType
{
get { return _bordertype; }
set { _bordertype = value; }
}
/// <summary>
/// Imposta o recupera un bool che indica se mostrare il border della riga anche nelle colonne di tipo Immagine.
/// Di default= true.
/// </summary>
public bool ShowBorderInColumnImage
{
get { return _showborderincolumnimage; }
set { _showborderincolumnimage = value; }
}
/// <summary>
/// Imposta o recupera un bool che indica se forzare l'utilizzo dello stile di FontBold definito a livello di Row.
/// Se False,lo stile definito viene sovrascritto, in ordine, da quello definito a livello di Column e da quello a livello di Cell.
/// Di default = False.
/// </summary>
public bool ForceStyleFontBold { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se forzare l'utilizzo dello stile di FontColor definito a livello di Row.
/// Se False,lo stile definito viene sovrascritto, in ordine, da quello definito a livello di Column e da quello a livello di Cell.
/// Di default = False.
/// </summary>
public bool ForceStyleFontColor { get; set; }
}
/// <summary>
/// Tipologia di stile di visulizzazione della tabella.
/// </summary>
public enum Style
{
ConsulenzaBase,
Immobiliare,
ConsulenzaUnica
}
}