private void EnMenúCambiarTipo(object elObjecto, EventArgs losArgumentos)
        {
            // Retornamos si no hay PDIs.
            if (Lista.SelectedIndices.Count == 0)
            {
                return;
            }

            List <Pdi> pdis = new List <Pdi>();

            foreach (int indice in Lista.SelectedIndices)
            {
                ListViewItem item = Lista.Items[indice];

                // El Tag del item de la lista tiene que ser un ElementoConEtiqueta con un PDI.
                ElementoConEtiqueta elemento = item.Tag as ElementoConEtiqueta;
                if (elemento == null)
                {
                    throw new InvalidOperationException(string.Format("El Tag del item de la lista tiene que ser un ElementoConEtiqueta, pero es: {0}", item.Tag.GetType()));
                }
                Pdi pdi = elemento.ElementoDelMapa as Pdi;
                if (pdi == null)
                {
                    throw new InvalidOperationException(string.Format("El elemento del item de la lista tiene que ser un Pdi, pero es: {0}", elemento.ElementoDelMapa.GetType()));
                }

                // Añade el PDI a la lista.
                pdis.Add(pdi);
            }

            // Muestra la ventana para cambiar el Tipo.
            VentanaCambiarTipoDePdi ventanaCambiarTipo = new VentanaCambiarTipoDePdi {
                Pdis = pdis
            };
            DialogResult resultado = ventanaCambiarTipo.ShowDialog();

            if (resultado == DialogResult.OK)
            {
                // Cambia los tipos evitando que se generen eventos con
                // cada cambio.
                ManejadorDePdis.SuspendeEventos();
                foreach (Pdi pdi in pdis)
                {
                    pdi.ActualizaTipo(ventanaCambiarTipo.TipoNuevo, "Cambio Manual");
                }

                // Restablece los eventos en el manejador de mapa.
                ManejadorDePdis.RestableceEventos();

                // Envía el evento indicando que se editaron PDIs.
                EnvíaEventoEditó();
            }
        }
        public void PruebaShowDialog()
        {
            #region Preparación general.
              // Crea un PDI para las pruebas.
              IEscuchadorDeEstatus escuchadorDeEstatus = new EscuchadorDeEstatusPorOmisión();
              ManejadorDeMapa manejadorDeMapa = new ManejadorDeMapa(escuchadorDeEstatus);
              string nombre = "Nombre";
              Tipo tipo = new Tipo("0xaaaa");
              const string clase = "POI";
              Coordenadas coordenadas = new Coordenadas(20, 30);
              List<Campo> campos = new List<Campo> {
              new CampoNombre (nombre),
              new CampoTipo (tipo),
              new CampoCoordenadas (CampoCoordenadas.IdentificadorDeCoordenadas, 0, coordenadas)
            };
              List<Pdi> pdis = new List<Pdi>{new Pdi(manejadorDeMapa, 1, clase, campos)};
              #endregion

              #region Caso 1: Apenas aparece la ventana el usuario apreta "Cambiar"
              {
            // En este caso el método Show() debería retornar None,
            // Y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Apreta el botón de "Cambiar".
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.None, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 2: Apenas aparece la ventana el usuario apreta "Cancelar"
              {
            // En este caso el método Show() debería retornar Cancel,
            // Y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCancelar = new ButtonTester("miBotónCancelar", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Apreta el botón de "Cancelar".
            botónCancelar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.Cancel, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 3: El usuario cambia el tipo inicial por uno válido.
              {
            // En este caso el método Show() debería retornar OK,
            // y la propiedad TipoNuevo debería ser el tipo nuevo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea un tipo válido.
            string númeroTipoNuevoVálido = "100";
            Tipo tipoNuevoVálido = new Tipo("0x" + númeroTipoNuevoVálido);
            Assert.IsTrue(CaracterísticasDePdis.Descripciones.ContainsKey(tipoNuevoVálido), "El tipo nuevo debe ser conocido.");

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario poniendo un tipo válido.
            textoTipoNuevo.Properties.Focus();
            textoTipoNuevo.Enter(númeroTipoNuevoVálido);

            // Apreta el botón de "Cambiar".
            botónCambiar.Properties.Focus();
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.OK, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(tipoNuevoVálido, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 4: El usuario cambia el tipo inicial por uno desconocido.
              {
            // En este caso el método Show() debería retornar None,
            // y la propiedad TipoNuevo debería ser el tipo desconocido.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea un tipo desconocido.
            string númeroTipoNuevoDesconocido = "bbbb";
            Tipo tipoNuevoDesconocido = new Tipo("0x" + númeroTipoNuevoDesconocido);
            Assert.IsFalse(CaracterísticasDePdis.Descripciones.ContainsKey(tipoNuevoDesconocido), "El tipo nuevo debe ser desconocido.");

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario poniendo un tipo desconocido.
            textoTipoNuevo.Properties.Focus();
            textoTipoNuevo.Enter(númeroTipoNuevoDesconocido);

            // Apreta el botón de "Cambiar".
            botónCambiar.Properties.Focus();
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.None, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(tipoNuevoDesconocido, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 5: El usuario cambia el tipo inicial por uno inválido.
              {
            // En este caso el método Show() debería retornar None,
            // y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea un tipo inválido.
            // Un tipo inválido es aquel que genera una excepción cuando
            // se trata de construir una clase Tipo con el.
            string númeroTipoNuevoInválido = "ww";
            bool tipoEsInválido = false;
            try
            {
              new Tipo("0x" + númeroTipoNuevoInválido);
            }
            catch
            {
              tipoEsInválido = true;
            }
            Assert.IsTrue(tipoEsInválido, "El tipo nuevo debe ser inválido.");

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario poniendo un tipo inválido.
            textoTipoNuevo.Properties.Focus();
            textoTipoNuevo.Enter(númeroTipoNuevoInválido);

            // Apreta el botón de "Cambiar".
            botónCambiar.Properties.Focus();
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.None, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 6: El usuario empiezar a cambiar el tipo, pero al final lo borra y lo deja en blanco.
              {
            // En este caso el método Show() debería retornar None,
            // y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario empezando a cambiar el tipo y despues dejandolo en blanco.
            textoTipoNuevo.Properties.Focus();
            textoTipoNuevo.Enter("123");
            textoTipoNuevo.Properties.Text = string.Empty;

            // Apreta el botón de "Cambiar".
            botónCambiar.Properties.Focus();
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.None, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");
            Assert.AreEqual(pdis, objectoDePrueba.Pdis, "PDIs");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 7: El usuario empiezar a cambiar el tipo, pero al final cancela.
              {
            // En este caso el método Show() debería retornar Cancel,
            // y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = pdis;

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCancelar = new ButtonTester("miBotónCancelar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario empezando a cambiar el tipo y despues dejandolo en blanco.
            textoTipoNuevo.Enter("123");
            textoTipoNuevo.Properties.Text = string.Empty;

            // Apreta el botón de "Cancelar".
            botónCancelar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.Cancel, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion

              #region Caso 8: Se usa con un PDI nulo.
              {
            // En este caso el método Show() debería retornar None,
            // y la propiedad TipoNuevo debería ser el tipo nulo.

            #region Preparación.
            // Inicializa objecto de prueba.
            VentanaCambiarTipoDePdi objectoDePrueba = new VentanaCambiarTipoDePdi();
            objectoDePrueba.Pdis = null;

            // Crea los probadores de los elementos de la interfase.
            ButtonTester botónCambiar = new ButtonTester("miBotónCambiar", objectoDePrueba);
            TextBoxTester textoTipoNuevo = new TextBoxTester("miTextoTipoNuevo", objectoDePrueba);
            #endregion

            // Llama al método a probar.
            objectoDePrueba.Show();

            // Simula el usuario empezando a cambiar el tipo y despues dejandolo en blanco.
            textoTipoNuevo.Properties.Focus();
            textoTipoNuevo.Enter("100");
            textoTipoNuevo.Properties.Text = string.Empty;

            // Apreta el botón de "Cambiar".
            botónCambiar.Properties.Focus();
            botónCambiar.Click();

            // Probar propiedades.
            Assert.AreEqual(DialogResult.None, objectoDePrueba.DialogResult, "DialogResult");
            Assert.AreEqual(Tipo.TipoNulo, objectoDePrueba.TipoNuevo, "TipoNuevo");

            // Cierra la ventana.
            objectoDePrueba.Close();
              }
              #endregion
        }
        private void EnMenúCambiarTipo(object elObjecto, EventArgs losArgumentos)
        {
            // Retornamos si no hay PDIs.
              if (Lista.SelectedIndices.Count == 0)
              {
            return;
              }

              List<Pdi> pdis = new List<Pdi>();
              foreach (int indice in Lista.SelectedIndices)
              {
            ListViewItem item = Lista.Items[indice];

            // El Tag del item de la lista tiene que ser un ElementoConEtiqueta con un PDI.
            ElementoConEtiqueta elemento = item.Tag as ElementoConEtiqueta;
            if (elemento == null)
            {
              throw new InvalidOperationException(string.Format("El Tag del item de la lista tiene que ser un ElementoConEtiqueta, pero es: {0}", item.Tag.GetType()));
            }
            Pdi pdi = elemento.ElementoDelMapa as Pdi;
            if (pdi == null)
            {
              throw new InvalidOperationException(string.Format("El elemento del item de la lista tiene que ser un Pdi, pero es: {0}", elemento.ElementoDelMapa.GetType()));
            }

            // Añade el PDI a la lista.
            pdis.Add(pdi);
              }

              // Muestra la ventana para cambiar el Tipo.
              VentanaCambiarTipoDePdi ventanaCambiarTipo = new VentanaCambiarTipoDePdi {
            Pdis = pdis };
              DialogResult resultado = ventanaCambiarTipo.ShowDialog();
              if (resultado == DialogResult.OK)
              {
            // Cambia los tipos evitando que se generen eventos con
            // cada cambio.
            ManejadorDePdis.SuspendeEventos();
            foreach (Pdi pdi in pdis)
            {
              pdi.ActualizaTipo(ventanaCambiarTipo.TipoNuevo, "Cambio Manual");
            }

            // Restablece los eventos en el manejador de mapa.
            ManejadorDePdis.RestableceEventos();

            // Envía el evento indicando que se editaron PDIs.
            EnvíaEventoEditó();
              }
        }