using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Text;
using PDFGenerator;
using PDFGenerator.BusinessLayer;
using PDFGenerator.BusinessLayer.DataSection;
using PDFGenerator.Presentation.Section.Charts;
using PDFGenerator.Presentation.Section;
using Dundas.Charting.WebControl;
using System.Collections.Generic;
public class S85 : ISezione
{
string Titolo = " ";
int Resolution = 300;
private bool _IncludiScenarioMedio;
private string _testointroduttivo = "";
public string TestoIntroduttivo
{
get
{
return _testointroduttivo;
}
set
{
_testointroduttivo = value;
}
}
public S85()
{
//
// TODO: Add constructor logic here
//
}
#region ISezione Members
///
/// Recupera il massimo valore dell'arraylist
///
///
///
public static object GetMaxValue(ArrayList arrList)
{
ArrayList sortArrayList = arrList;
sortArrayList.Sort();
sortArrayList.Reverse();
return sortArrayList[0];
}
///
/// Recupera il minimo valore dell'arraylist
///
///
///
public static object GetMinValue(ArrayList arrList)
{
ArrayList sortArrayList = arrList;
sortArrayList.Sort();
return sortArrayList[0];
}
private static int MonthDifference(DateTime lValue, DateTime rValue)
{
return Math.Abs((lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year));
}
private List GetEqualAxisXLabels(DateTime minValue, DateTime maxValue, int labelsCount, int margin, double labelMarginLeft, double labelMarginRight, out double newMinValue, out double newMaxValue)
{
double difference = (maxValue.ToOADate() - minValue.ToOADate());
double newDifference = difference * margin / 100;
double intervalLength = newDifference / labelsCount;
double differenceToAdd = (newDifference - difference) / 2;
newMinValue = minValue.ToOADate() - differenceToAdd;
newMaxValue = maxValue.ToOADate() + differenceToAdd;
// with labels margins now
double lblNewDifference = newDifference * ((((double)labelMarginLeft + (double)labelMarginRight) + 100d) / 100d);
double lblIntervalLength = lblNewDifference / labelsCount;
double lblNewMinValue = newMinValue - (newDifference * ((double)labelMarginLeft) / 100d);
List labels = new List();
//for (int i = 0; i< labelsCount; i++)
//{
// labels.Add(newMinValue + i * intervalLength + intervalLength / 2);
//}
for (int i = 0; i < labelsCount; i++)
{
labels.Add(lblNewMinValue + i * lblIntervalLength + lblIntervalLength / 2);
}
return labels;
}
public void writeSezione(DataThread dataThread)
{
DocumentPDF document = dataThread.DocumentPDF;
DataSetS85 set = (DataSetS85)dataThread.Data.DatiSezione;
int ChartHeigth = 215;
//eventuali operazioni sul dataset
//calcola se entra nella pagina altrimenti aggiunge una nuova pagina. In questa sezione il # di righe è fissato
//if (document.checkMargin(ChartHeigth + 50))
// //if (document.checkMargin(ChartHeigth + 100))
// document.addPage();
document.setLastPos((document.getLastPos() * -1) + 410);
ceTe.DynamicPDF.Merger.ImportedPage page = document.getCurrentPage();
//page.Elements.Add(new ceTe.DynamicPDF.PageElements.Label("Possibile evoluzione del rendimento", document.getMargineLeft(), document.getLastPos() - 30, 500, 12, Globals.OpenTypeFontVerdanaB, 12, ceTe.DynamicPDF.CmykColor.Black));
document.setTitolo(Titolo);
document.setHeaderSpace(5);
//document.setChapterHeader(_testointroduttivo);
document.setChapterHeader(_testointroduttivo, 0, 520, 8);
#region Valori Asse Y
//Impostare l’asse delle ordinate in funzione del valore massimo e minimo
// rappresentati nel grafico (tra i valori del cono e il valore del rendimento)
DataTable dtDati = new DataTable();
DataTable dtGrafico = new DataTable();
DataTable dtRendimento = new DataTable();
dtGrafico = set.Tables["DatiGrafico"].Copy();
dtRendimento = set.Tables["Rendimento"];
dtGrafico.Merge(dtRendimento, true);
DataView dwValoriY = new DataView(dtGrafico);
dtDati = dwValoriY.ToTable(false, "Ottimistico", "Pessimistico", "Valore");
// in un arraylist che poi andrò ad ordinare per recuperare massimo e minimo inserisco tutti valore delle 3 colonne
// "Ottimistico", "Pessimistico", "Valore"
ArrayList al = new ArrayList();
// MODIFICA TORRESI
/*
foreach (DataRow r in dtDati.Rows)
foreach (DataColumn c in dtDati.Columns)
{
if (r[c].ToString() != string.Empty)
al.Add(Convert.ToDouble(r[c].ToString()));
}
*/
foreach (DataColumn c in dtDati.Columns)
{
foreach (DataRow r in dtDati.Rows)
if ((r[c].ToString() != string.Empty) && (r[c].ToString() != ""))
al.Add(Convert.ToDouble(r[c].ToString()));
}
//FINE MODIFICA TORRESI
#endregion
DatiGrafico dati = new DatiGrafico();
dati.dataTab = set.Tables["DatiGrafico"];
dati.setHeight(ChartHeigth);
dati.setWidth(440);
LineeRendimentoCumulato grafico = new LineeRendimentoCumulato();
grafico.MaximumY = Convert.ToDouble(GetMaxValue(al));
grafico.MinimumY = Convert.ToDouble(GetMinValue(al));
if (set.Tables["Rendimento"].Rows.Count > 0)
{
if (set.Tables["Rendimento"].Rows[0]["Data"] != DBNull.Value)
grafico.DataRendimento = (DateTime)set.Tables["Rendimento"].Rows[0]["Data"];
if (set.Tables["Rendimento"].Rows[0]["Valore"] != DBNull.Value)
grafico.Rendimento = Convert.ToDouble(set.Tables["Rendimento"].Rows[0]["Valore"]);
}
grafico.IncludiScenarioMedio = false;
grafico.getGrafico(dati);
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Rectangle(100, document.getLastPos() + ChartHeigth - 17.5f, 405, 25, 0, new RgbColor(232, 236, 237)));
var chartGrafico = grafico.getGrafico(dati);
// add 6 months to maximum axis X
//chartGrafico.ChartAreas[0].ReCalc();
//chartGrafico.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(chartGrafico.ChartAreas[0].AxisX.Maximum).AddMonths(6).ToOADate();
// ---------------------
FormatNum format = new FormatNum();
DataTable datiAsse = set.Tables["DatiAsse"];
if (datiAsse.Rows.Count > 0)
{
var maxAxisX = grafico.maxAxisX;
var minAxisX = grafico.minAxisX;
//ArrayList labels = format.CreaCustomDataTime(Convert.ToDateTime(datiAsse.Rows[0]["DataInizio"]), Convert.ToInt32(datiAsse.Rows[0]["IntervalloMesi"]));
//float startX = getX(Convert.ToInt32(datiAsse.Rows[0]["IntervalloMesi"])) - 15;
//float endX = 489; // punto fisso 489.
//float intervallo = (endX - startX) / (labels.Count - 1);
//var labelWidth = (maxAxisX - minAxisX) / 10;
//foreach (string label in labels)
//{
// int month = int.Parse(label.ToString().Split('/')[0]);
// int year = int.Parse(label.ToString().Split('/')[1]) + 2000;
// double labelValue = new DateTime(year, month, 1).ToOADate();
// var leftLabel = labelValue - labelWidth / 2;
// var rightLabel = labelValue + labelWidth / 2;
// CustomLabel axisXLabel = new CustomLabel(leftLabel, rightLabel, new DateTime(year, month, 15).ToString("MM/yy"), 0, LabelMark.None);
// chartGrafico.ChartAreas[0].AxisX.CustomLabels.Add(axisXLabel);
//}
// ----------- new
double newMinAxisX;
double newMaxAxisX;
var labels = GetEqualAxisXLabels(DateTime.FromOADate(minAxisX), DateTime.FromOADate(maxAxisX).AddMonths(6), 10, 108, 1.35d, 3, out newMinAxisX, out newMaxAxisX);
chartGrafico.ChartAreas[0].AxisX.Maximum = newMaxAxisX;
chartGrafico.ChartAreas[0].AxisX.Minimum = newMinAxisX;
chartGrafico.ChartAreas[0].AxisX.MajorTickMark.Enabled = true;
chartGrafico.ChartAreas[0].AxisX.MajorTickMark.LineColor = System.Drawing.Color.Transparent;
chartGrafico.ChartAreas[0].AxisX.MajorTickMark.Size = 1.5f;
//chartGrafico.ChartAreas[0].AxisX.LineWidth = 2;
var labelWidth = (maxAxisX - minAxisX) / 10;
foreach (double label in labels)
{
var leftLabel = label - labelWidth / 2;
var rightLabel = label + labelWidth / 2;
CustomLabel axisXLabel = new CustomLabel(leftLabel, rightLabel, DateTime.FromOADate(label).ToString("MM/yy"), 0, LabelMark.None);
chartGrafico.ChartAreas[0].AxisX.CustomLabels.Add(axisXLabel);
}
// ----------
}
var pos = document.getLastPos();
chartGrafico.BackColor = System.Drawing.Color.FromArgb(232, 236, 237);
var currentResolution = chartGrafico.ImageResolution;
document.InsertGrafico(chartGrafico, 70, pos, Resolution);
chartGrafico.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
chartGrafico.ImageResolution = currentResolution;
document.InsertGrafico(chartGrafico, 70, pos, Resolution, 6.35f);
var linesYPosition = document.getLastPos() + ChartHeigth - 18;
// white rectangles
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Rectangle(69, linesYPosition, 31, 26, 0, new RgbColor(255, 255, 255)));
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Rectangle(73 + 425, linesYPosition, 31, 26, 0, new RgbColor(255, 255, 255)));
//page.Elements.Add(new ceTe.DynamicPDF.PageElements.Rectangle(130 + (float)chartGrafico.Width.Value, linesYPosition, 170, 60, 0, new RgbColor(255, 0, 0)));
// end of white rectangles
float yLegendOffset = -3.5f;
float xLegendOffset = -3;
ceTe.DynamicPDF.PageElements.Rectangle rect = new ceTe.DynamicPDF.PageElements.Rectangle(document.getMargineLeft() + xLegendOffset + 95, document.getLastPos() + yLegendOffset + ChartHeigth + 5, 10, 2, 0, new RgbColor(0, 0, 255));
page.Elements.Add(rect);
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Label("Scenario ottimistico", document.getMargineLeft() + xLegendOffset + 110, document.getLastPos() + yLegendOffset + ChartHeigth, 120, 10, Globals.OpenTypeFontVerdana, 9));
rect = new ceTe.DynamicPDF.PageElements.Rectangle(document.getMargineLeft() + xLegendOffset + 225, document.getLastPos() + yLegendOffset + ChartHeigth + 2, 5, 5, 0, new RgbColor(0, 0, 0));
rect.CornerRadius = 2.5F;
page.Elements.Add(rect);
//to tutaj
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Label("Rendimento cumulato", document.getMargineLeft() + xLegendOffset + 235, document.getLastPos() + yLegendOffset + ChartHeigth, 120, 10, Globals.OpenTypeFontVerdana, 9));
rect = new ceTe.DynamicPDF.PageElements.Rectangle(document.getMargineLeft() + xLegendOffset + 345, document.getLastPos() + yLegendOffset + ChartHeigth + 5, 10, 2, 0, new RgbColor(239, 65, 53));
page.Elements.Add(rect);
page.Elements.Add(new ceTe.DynamicPDF.PageElements.Label("Scenario pessimistico", document.getMargineLeft() + xLegendOffset + 360, document.getLastPos() + yLegendOffset + ChartHeigth, 120, 10, Globals.OpenTypeFontVerdana, 9));
document.setLastPos(ChartHeigth + 40);
dataThread.UltimaSezioneStampata = "S85";
}
///
/// Ritorna la x su cui scrivere la prima etichetta dell'asse x. ///
///
///
///
private float getX(int intervallomesi)
{
decimal massimo = 360;
decimal xPartenza = 133;
decimal xFine = xPartenza + 23;
decimal intervallo = xFine - xPartenza;
decimal rapporto = intervallo / massimo;
return Convert.ToSingle(xFine - (rapporto * intervallomesi));
}
public void setTitolo(string label)
{
Titolo = label;
}
public bool IncludiScenarioMedio
{
get
{
return _IncludiScenarioMedio;
}
set
{
_IncludiScenarioMedio = value;
}
}
#endregion
}