using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;

namespace WinStampaCS
{
    public partial class Form1 : Form
    {
        //costante per il titolo delle messagebox
        const string titolo = "Esempio Stampa";
        //creo una variabile per gestire i dcumenti di stampa
        private PrintDocument pdocStampa = new PrintDocument();


        public Form1()
        {
            InitializeComponent();
        }

        private void BtnChiudi_Click(object sender, EventArgs e)
        {
            this.Close();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //gestore di evento dell'oggetto printdocument, per gestire lìevento printpage
            pdocStampa.PrintPage += new PrintPageEventHandler(pdocStampa_PrintPage);
            if (System.IO.File.Exists(Environment.CurrentDirectory + "\\testo.rtf"))
                rtbTesto.LoadFile(Environment.CurrentDirectory + "\\testo.rtf");
        }

        private void pdocStampa_PrintPage(object sender, PrintPageEventArgs e)
        {

            Image ImgStampa = pbxLogo.Image;

            //imposto il carattere per la stampa ed anteprima
            Font fntSTampa = new Font(this.Font.FontFamily, 10, FontStyle.Regular);

            //imposto altezza
            int IntAltezza = e.MarginBounds.Top + 50;

            //imposto le dimensione dell'immagine
            Rectangle RctImmagine = new Rectangle(e.MarginBounds.Left + 20, e.MarginBounds.Top - 30, 48, 48);


            //ottengo il carattere corrente
            int IntCarattere = 0;

            int intCaratteriInseriti = 0;
            int intLineeInserite = 0;
            StringFormat Fmt = new StringFormat(StringFormatFlags.LineLimit);
            try
            {
                //disegno l'immagine 
                e.Graphics.DrawImage(ImgStampa, RctImmagine);

                int intPrintAreaHeight, intPrintAreaWidth, intmarginLeft, intmarginTop;

                //imposto le misure per la stampa
                //imposto l'area di stampa
                intPrintAreaHeight = pdocStampa.DefaultPageSettings.PaperSize.Height - pdocStampa.DefaultPageSettings.Margins.Top - pdocStampa.DefaultPageSettings.Margins.Bottom;
                intPrintAreaWidth = pdocStampa.DefaultPageSettings.PaperSize.Width - pdocStampa.DefaultPageSettings.Margins.Left - pdocStampa.DefaultPageSettings.Margins.Right;

                //imposto i margini
                intmarginLeft = pdocStampa.DefaultPageSettings.Margins.Left; // X coordinate
                intmarginTop = pdocStampa.DefaultPageSettings.Margins.Top + 30; // Y coordinate
                //area di stampa
                RectangleF RctAreaDiStampa = new RectangleF(intmarginLeft, intmarginTop, intPrintAreaWidth, intPrintAreaHeight);
                //verifico che le stringa entri  nell'area di stampa
                e.Graphics.MeasureString(rtbTesto.Text, fntSTampa, new SizeF(intPrintAreaWidth, intPrintAreaHeight), Fmt, out intCaratteriInseriti, out intLineeInserite);
                e.Graphics.DrawString(rtbTesto.Text, fntSTampa, Brushes.Black, RctAreaDiStampa, Fmt);
                //conto il carattere che sto inserendo
                IntCarattere += intCaratteriInseriti;
                //verifico se devo inerire una pagina aggiuntiva
                if (IntCarattere < rtbTesto.Text.Length)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                    //riporto a zero il contatore
                    IntCarattere = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BtnAnteprima_Click(object sender, EventArgs e)
        {
            PrintPreviewDialog ppdStampa = new PrintPreviewDialog();
            try
            {
                ppdStampa.Document = pdocStampa;
                ppdStampa.StartPosition = FormStartPosition.CenterScreen;
                ppdStampa.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BtnOpzioni_Click(object sender, EventArgs e)
        {
            //creo un oggetto di tipo finestra di opzioni di stampa
            PageSetupDialog psdOpzioni = new PageSetupDialog();
            try
            {
                psdOpzioni.Document = this.pdocStampa;
                psdOpzioni.PageSettings = this.pdocStampa.DefaultPageSettings;
                if (psdOpzioni.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.pdocStampa.DefaultPageSettings = psdOpzioni.PageSettings;
                }

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void btnFinestra_Click(object sender, EventArgs e)
        {
            //creo un oggetto di tipo finestra di dialogo di stampa
            PrintDialog pdlgStampa = new PrintDialog();
            try
            {
                //toglie la finestra pop up
                this.pdocStampa.PrintController = new StandardPrintController();
                pdlgStampa.Document = pdocStampa;
                if (pdlgStampa.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    this.pdocStampa.Print();

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

    }
}
