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

namespace UsingMenusStatusStripsToolStrips
{

    /// <summary>
    /// Esta aplicación de ejemplo simula un editor de texto RTF.
    /// Está conformada por un único formulario.
    /// </summary>
    public partial class MainForm : Form
	{
		public MainForm()
		{
			InitializeComponent();
		}

        /// <summary>
        /// Al cargarse en memoria el formulario, se genera texto con 
        /// formato que será visualizado utilizando el control RichTextBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void Form1_Load(object sender, EventArgs e)
		{
			// Algo de texto que se carga por defecto.
			EntryArea.Rtf = @"{\rtf1\ansi \b Este\b0  es un control \ul RichTextBox\ul0. \i Intente probar \i0  con algún \b formato\b0!  También pruebe con el botón alternativo del mouse para visualizar el menú contextual.}";
			// Por defecto, la propiedad Opacity del Form está establecida al 100%, por eso la opción del menú tiene una marca.
			this.onehundredPercent.Checked = true;
		}

		private void fileMenuItem_Click(object sender, EventArgs e)
		{
			manipulateFile(((ToolStripMenuItem)sender).Text);
		}

		private void fileToolStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
		{
			manipulateFile(((ToolStripItem)e.ClickedItem).Text);
		}

		private void formatMenuItem_Click(object sender, EventArgs e)
		{
			formatText(((ToolStripMenuItem)sender).Text);
 		}

		private void formatToolStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
		{
			formatText(((ToolStripItem)e.ClickedItem).Text);
		}


		private void changeOpacityToolStripMenuItem_Click(object sender, EventArgs e)
		{
			ToolStripMenuItem menuItem = (ToolStripMenuItem)sender;
			double opacity = Convert.ToDouble(menuItem.Tag.ToString());
			this.Opacity = opacity;

			// El valor de la propiedad Opacity es mutuamente excluyente.
			ToolStripMenuItem menuChangeOpacity = (ToolStripMenuItem)optionsToolStripMenuItem.DropDownItems[1];
			foreach (ToolStripMenuItem item in menuChangeOpacity.DropDownItems)
			{
				item.Checked = false;
			}
			menuItem.Checked = true;
		}

        /// <summary>
        /// Este método maneja las operaciones de formateo de texto 
        /// que se ejecutan desde el menú, desde la barra de herramientas
        /// y el menú contextual.
        /// </summary>
        /// <param name="menuItemText"></param>
		private void formatText(string menuItemText)
		{
			Font fontOfSelectedText = this.EntryArea.SelectionFont;
			FontStyle styleApplied;

			switch (menuItemText)
			{
				case "&Negrita":
					if (this.EntryArea.SelectionFont.Bold == true)
						styleApplied = FontStyle.Regular;
					else
						styleApplied = FontStyle.Bold;

					break;
				case "&Italica":
					if (this.EntryArea.SelectionFont.Italic == true)
						styleApplied = FontStyle.Regular;
					else
						styleApplied = FontStyle.Italic;

					break;

				default:
					if (this.EntryArea.SelectionFont.Underline == true)
						styleApplied = FontStyle.Regular;
					else
						styleApplied = FontStyle.Underline;

					break;
			}

			Font FontToApply = new Font(fontOfSelectedText, styleApplied);
			this.EntryArea.SelectionFont = FontToApply;
		}

        /// <summary>
        /// Este método controla las operaciones de manejo de archivos, tanto
        /// cuando es invocado desde el menú como de la barra de herramientas.
        /// </summary>
        /// <param name="menuItemText"></param>
		private void manipulateFile(string menuItemText)
		{
			switch (menuItemText)
			{
				case "&Nuevo":
                    // Simula estar creando un nuevo documento pero simplemente 
                    // elimina el texto existente.
					EntryArea.Text = "";
					EntryArea.Focus();

					break;
				case "&Abrir":
                    // Los cuadros de diálogo sólo se abren a modo demostrativo.
                    // No se lleva a cabo ninguna acción sobre el archivo seleccionado.
					if (this.openFileDialog.ShowDialog() == DialogResult.OK)
					{
						MessageBox.Show("El botón Abrir fue presionado a los efectos de demostrar el uso del diálogo común 'Abrir'. El " +
							"\n archivo " + this.openFileDialog.FileName + " No será abierto.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
					}

					break;
				case "&Grabar":
                    // Los cuadros de diálogo sólo se abren a modo demostrativo.
                    // No se lleva a cabo ninguna acción sobre el archivo seleccionado.
                    if (this.saveFileDialog.ShowDialog() == DialogResult.OK)
					{
						MessageBox.Show("El boton Grabar fue presionado a los efectos de demostrar el uso del diálogo común 'Grabar'." +
							"\nEl archivo " + this.saveFileDialog.FileName + " no será grabado.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
					}

					break;
				default:
					this.Close();
					this.Dispose();

					break;
			}
		}

		public void TestProgressBar()
		{
            // Ejecuta un bucle para simular una tarea que demora cierto tiempo
            // a efectos de mostrar el avance de la barra de progreso hasta 
            // su máximo valor.
			while (toolStripProgressBar.Value < toolStripProgressBar.Maximum)
			{
				System.Threading.Thread.Sleep(10);
				toolStripProgressBar.Value++;
			}

			// Reestablece la barra de progreso a su estado inicial.
			toolStripProgressBar.Value = toolStripProgressBar.Minimum;
		}

		private void testProgressBarToolStripMenuItem_Click(object sender, EventArgs e)
		{
			TestProgressBar();
		}

	}
}