using System;
using System.Diagnostics;
using System.Windows.Forms;
using prog_tesztelo.Properties;

namespace prog_tesztelo
{
	/// <summary>
	/// A szerkesztés folyamatát kezelő form
	/// </summary>
	/// <remarks>
	/// Az aktuálisan beállított szerkesztő bezárását figyeli, ha az alkalmazást
	///	bezárjuk (és ezzel befejezzük a szerkesztést), akkor meghívja a főprogram
	///	callback függvényét, ami feltölti a szerverre a frissített fájlt. 
	///	Amennyiben bezárjuk a formot, a feltöltési lehetőség elvész.
	/// </remarks>
    public partial class EditForm : Form
    {
		/// <summary>
		/// Callback delegátus a formok közötti kommunikációhoz
		/// </summary>
        public UploadDelegate Callback;

		/// <summary>
		/// Az aktuális fájlinformációk és beállítások
		/// </summary>
		public ViewerSettings settings;

		/// <summary>
		/// A szerkesztőt futtató processz
		/// </summary>
		public Process editor;

		/// <summary>
		/// A konstruktor paraméterül az aktuális állomány információit tartalmazó objektumot kapja,
		/// és megnyitja a paraméterben szereplő fájlt a beállított szerkesztőben, amelynek bezárását figyeli.
		/// Amennyiben bezárjuk a szerkesztőt, a program felkínálja feltöltésre a megváltozott fájlt.
		/// </summary>
		/// <param name="vs">A szerkesztett fájlra vonatkozó információkat tartalmazó objektum</param>
        public EditForm(ViewerSettings vs)
        {
            InitializeComponent();

            try
            {
                // Feliratok beállítása
                this.Text = "Szerkesztés";
                label1.Text = vs.Selectedfile;

                settings = vs;

                // Szerkesztő megnyitása az aktuális beállításoknak megfelelően
                editor = new Process();
                editor.StartInfo.FileName = Settings.Default.editor;
                editor.StartInfo.Arguments = this.settings.Tempfilename;
                editor.EnableRaisingEvents = true;
                editor.Exited += new EventHandler(editor_Exited);
                editor.Start();
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba a szerkesztés során.");
                if (this.InvokeRequired)
                {
                    this.BeginInvoke((MethodInvoker)delegate()
                    {
                        this.Close();
                    });
                }
                else
                {
                    this.Close();
                }
            }
        }

		/// <summary>
		/// A szerkesztő bezárását figyelő eseménykezelő
		/// </summary>
		/// <remarks>
		/// Amikor bezárjuk a szerkesztőt, az aktuális adatokat átadjuk a főprogramnak,
		/// és feltöltjük a frissített fájlt
		/// </remarks>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        void editor_Exited(object sender, EventArgs e)
        {
            try
            {
                // Feltöltés jelzésével továbbítjuk az állományinformációkat
                ViewerSettings s = new ViewerSettings(this.settings.Selectedfile, this.settings.Tempfilename, false, true, settings.Host, settings.User, settings.Pass);

                // Átadjuk az adatokat a fő formnak
                if (Callback != null)
                {
                    Callback(s);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hiba a szerkesztés során.");
            }

			// Bezárjuk az ablakot
			if ( this.InvokeRequired )
			{
				this.BeginInvoke( (MethodInvoker)delegate()
				{
					this.Close();
				} );
			}
			else
			{
				this.Close();
			}
        }

		/// <summary>
		/// A 'Bezárás' gombra kattintva visszatérünk a főprogramhoz, 
		/// és a jelenleg szerkesztés alatt álló fájl figyelését megszüntetjük
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            editor.EnableRaisingEvents = false;
            editor.Exited -= new EventHandler(editor_Exited);
            this.Close();
        }
    }
}