Midlet Atlas

CLASE PRINCIPAL

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Atlas;
// Importo las librerías necesarias para trabajar
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;


/**
 * @author glop
 */
public class midletAtlas extends MIDlet implements CommandListener {
   
    private Display pantalla; // Display, pantalla del midlet.
    private Form contenedor; // Form, contenedor donde se cargan los diferentes elementos.
    private List continentes; // Lista implícita de continentes. Se genera un evento al elegir un continente.
    private Command siguiente; // Comando que solicita la siguiente pantalla. Se utiliza en la pantalla de presentacion.
    private Command probar; // Comando que comienza la aplicación después de las instrucciones.
    private Command terminar; // Comando salir
    private Command verPaises; // Comando que permite ver los países del continente elegido
    private Command volverContinentes; // Comando que permite volver al menú de continentes
    private Command volverContinente; // Comando que permite volver al continente con la descripción y la lista de países
    private Command adios;
    private ChoiceGroup paises; // Lista de selección de países.
    private continentes continente; // Objecto de la clase continentes.
    private Alert vacio;
   
   
    public midletAtlas() throws IOException {
        pantalla = Display.getDisplay(this); // Se indica a la pantalla que utilice la pantalla del midlet
        presentacion(); // Llama al método presentacion(). Éste presenta la aplicación y su autor.
    }
   
   
    // Método que implementa un formulario con el título de la aplicación, su autor y una imagen.
    private void presentacion() throws IOException {
        contenedor = new Form(""); // Formulario sin título
        contenedor.append("Tarea 3 -- Midlet Mensajero"); // Se añade texto
        Image imag = Image.createImage("imagenes/java.png"); // Se crea una imagen
        ImageItem elemento= new ImageItem ("",  imag, ImageItem.LAYOUT_CENTER, ""); // La imagen se pasa a un ImageItem para
                                                                                    // definir algunos detalles
        contenedor.append(elemento); // Se añade el ImageItem
        contenedor.append("Gabriel López Marcos"); // Se añade texto
        // Se añaden los comandos que tendrá la pantalla
        terminar = new Command("Terminar",Command.EXIT,0);
        siguiente = new Command("Siguiente",Command.OK,1);
        contenedor.addCommand(terminar);
        contenedor.addCommand(siguiente);
        contenedor.setCommandListener(this); // Se asigna el oyente
        pantalla.setCurrent(contenedor); // La pantalla activa es ésta.
       
    }
   
    // Método que implementa una formulario con las instrucciones de la aplicación
    private void instrucciones() {
        contenedor = new Form("Instrucciones"); // Se crea el formulario con título
        // Se añaden las instrucciones
        contenedor.append("La aplicación ofrece una lista de continentes, pulsa el botón central para elegir uno de ellos\n"
                + "En la pantalla aparecerá el nombre del continente elegido, una imagen del mismo y 5 países para elegir\n"
                + "los países se pueden elegir de forma múltiple, elige los que quieras ver y pulsa el botón 'ver países'\n"
                + "En la pantalla aparecerán los países elegidos junto a una imagen.\n"
                + "Puedes volver atrás en cualquier momento a través de los botones de navegación superiores.");
        // Se añaden los comandos que tendrá la pantalla
        terminar = new Command("Terminar", Command.EXIT,0);
        probar = new Command("Probar",Command.OK,1);
        contenedor.addCommand(terminar);
        contenedor.addCommand(probar);
        contenedor.setCommandListener(this); // Se asigna el oyente
        pantalla.setCurrent(contenedor); // La pantalla activa es ésta.
    }
   
     // Método que implementa una lista con los continente para elegir
     private void verContinentes() {
        continentes = new List("Continentes",List.IMPLICIT); // Se crea una lista implícita. Cuando se elija un continente,
                                                              // Desencadenará un evento
        // Se añaden los continentes
        continentes.insert(0, "Europa", null);
        continentes.insert(1, "África", null);
        continentes.insert(2, "Asia", null);
        continentes.insert(3, "América", null);
        continentes.insert(4, "Oceanía", null);
        // Se añade el comando que tendrá la pantalla
        terminar = new Command("Terminar", Command.EXIT,1);
        continentes.addCommand(terminar);
        continentes.setCommandListener(this); // Se asigna el oyente
        pantalla.setCurrent(continentes); // La pantalla activa es ésta.
    }

     // Inicio de la aplicación
    public void startApp() {
        // La pantalla activa al inicio de la aplicación, y si vuelve del estado de pausa, es siempre el contenido del contenedor.
        // Recordemos que el contenedor es un form donde voy añadiendo lo que necesito en cada momento.
        pantalla.setCurrent(contenedor);
    }
   
    public void pauseApp() {
    }
   
    public void destroyApp(boolean unconditional) {
    }
  
   
    // Método que carga un continente concreto. En éste caso América.
    // Se carga la descripción y se añaden los países completos. De este modo, el objeto está instanciado para recuperar
    // los datos en cualquier momento.
   private void cargaAmerica() throws IOException {
      continente = new continentes(); // Instancia vacía del objeto continente.
        continente.setNombre("América"); // Asigno el nombre
        // Asigno una descripción
        continente.setDescripcion("América es el segundo continente más grande del planeta, después de Asia."
                + " Ocupa gran parte del hemisferio occidental de la Tierra. Se extiende desde el océano Glacial Ártico"
                + " por el norte hasta el Cabo de Hornos por el sur, en la confluencia de los océanos Atlántico y Pacífico,"
                + " los cuales a su vez delimitan al continente por el este y el oeste, respectivamente.");
       
        // Asigno una imagen. Llamo al método redimensionar que me devuelve la imagen con la proporción adecuada
        continente.setImagen(redimensionar(Image.createImage ("imagenes/america.png")));
       
        // Añado los países. Introduzco la posición que ocupan en el array, el nombre y la ruta de la imagen correspondiente.
        continente.addPais(0, "Bahamas", "imagenes/bahamas.png");
        continente.addPais(1, "Belice", "imagenes/belice.png");
        continente.addPais(2, "Costa Rica", "imagenes/costarica.png");

        // Ya tengo el objeto continente con los datos que necesito. Ahora creo un form donde se incluirán.
        contenedor = new Form(continente.getNombre()); // Creo el form con el nombre del continente.
        contenedor.append(continente.getImagen()); // Añado la imagen.
        contenedor.append(continente.getDescripcion()); // Añado la descripción.
        paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE); // Añado un ChoiceGroup de países del continente.
        for (int c=0;c<continente.paises.length;c++) { // Recorro todos el array de países y se los agrego al ChoiceGroup
            paises.append(continente.nombrePais(c), null);
        }
        contenedor.append(paises); // Añado el Choice al formulario
        // Añado los comandos que tendrá la aplicación
        volverContinentes = new Command("Volver", Command.BACK,0); // Este comando estará situado en la parte superior.
        verPaises = new Command("Ver países", Command.OK,1); // Comando que lanza la pantalla de países. Con los países elegidos.
        contenedor.addCommand(volverContinentes);
        contenedor.addCommand(verPaises);
        contenedor.setCommandListener(this); // Asigno el oyente
        pantalla.setCurrent(contenedor);  // La pantalla activa es ésta.
    }
  
    // Carga del continente Europa
    private void cargaEuropa() throws IOException {
      continente = new continentes();
        continente.setNombre("Europa");
        continente.setDescripcion("Europa es uno de los continentes que forman el supercontinente euroasiático,"
                + " situado entre los paralelos 36º y 70º de latitud norte. De forma convencional y por motivos históricos"
                + " es considerada un continente, tras la delimitación realizada por el geógrafo ruso Vassili Tatichtchev"
                + " quien deseaba señalar la pertenencia de Rusia a Europa y no a Asia.");
        continente.setImagen(redimensionar(Image.createImage ("imagenes/europa.png")));
       
        continente.addPais(0, "Chipre", "imagenes/chipre.png");
        continente.addPais(1, "Georgia", "imagenes/georgia.png");
        continente.addPais(2, "Letonia", "imagenes/letonia.png");

        contenedor = new Form(continente.getNombre());
        contenedor.append(continente.getImagen());
        contenedor.append(continente.getDescripcion());
        paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
        for (int c=0;c<continente.paises.length;c++) {
            paises.append(continente.nombrePais(c), null);
        }
        contenedor.append(paises);
        volverContinentes = new Command("Volver", Command.BACK,0);
        verPaises = new Command("Ver países", Command.OK,1);
        contenedor.addCommand(volverContinentes);
        contenedor.addCommand(verPaises);
        contenedor.setCommandListener(this);
        pantalla.setCurrent(contenedor); 
    }
   
    // Carga del continente África
    private void cargaAfrica() throws IOException {
        continente = new continentes();
        continente.setNombre("África");
        continente.setDescripcion("África es el tercer continente (después de Asia y América) del mundo por extensión"
                + " territorial. Limita al norte con el mar Mediterráneo, al oeste con el océano Atlántico, al sur con"
                + " la conjunción de los océanos Atlántico e Índico y al este con el mar Rojo y el océano Índico.");
        continente.setImagen(redimensionar(Image.createImage ("imagenes/africa.png")));
       
        continente.addPais(0, "Burundi", "imagenes/burundi.png");
        continente.addPais(1, "Chad", "imagenes/chad.png");
        continente.addPais(2, "Etiopía", "imagenes/etiopia.png");

        contenedor = new Form(continente.getNombre());
        contenedor.append(continente.getImagen());
        contenedor.append(continente.getDescripcion());
        paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
        for (int c=0;c<continente.paises.length;c++) {
            paises.append(continente.nombrePais(c), null);
        }
        contenedor.append(paises);
        volverContinentes = new Command("Volver", Command.BACK,0);
        verPaises = new Command("Ver países", Command.OK,1);
        contenedor.addCommand(volverContinentes);
        contenedor.addCommand(verPaises);
        contenedor.setCommandListener(this);
        pantalla.setCurrent(contenedor); 
    }
  
    // Carga del continente Asia
    public void cargaAsia() throws IOException {
        continente = new continentes();
        continente.setNombre("Asia");
        continente.setDescripcion("Asia o continente asiático es el continente más extenso y poblado de la Tierra"
                + " que, con cerca de 44 millones de km², supone el 8,70% del total de la superficie terrestre"
                + " y el 29,45% de las tierras emergidas y, con 4.200.000.000 de habitantes, el 60% de la población mundial.");
        continente.setImagen(redimensionar(Image.createImage ("imagenes/asia.png")));
       
        continente.addPais(0, "Birmania", "imagenes/birmania.png");
        continente.addPais(1, "Corea del Norte", "imagenes/coreanorte.png");
        continente.addPais(2, "Israel", "imagenes/samoa.png");

        contenedor = new Form(continente.getNombre());
        contenedor.append(continente.getImagen());
        contenedor.append(continente.getDescripcion());
        paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
        for (int c=0;c<continente.paises.length;c++) {
            paises.append(continente.nombrePais(c), null);
        }
        contenedor.append(paises);
        volverContinentes = new Command("Volver", Command.BACK,0);
        verPaises = new Command("Ver países", Command.OK,1);
        contenedor.addCommand(volverContinentes);
        contenedor.addCommand(verPaises);
        contenedor.setCommandListener(this);
        pantalla.setCurrent(contenedor);
    }
   
    // Carga del continente Oceanía
    public void cargaOceania() throws IOException {
        continente = new continentes();
        continente.setNombre("Oceanía");
        continente.setDescripcion("Oceanía es un continente insular de la Tierra constituido por la plataforma"
                + " continental de Australia, las islas de Nueva Guinea, Nueva Zelanda y los archipiélagos coralinos"
                + " y volcánicos de Melanesia, Micronesia y Polinesia.");
        continente.setImagen(redimensionar(Image.createImage ("imagenes/oceania.png")));
       
        continente.addPais(0, "Australia", "imagenes/australia.png");
        continente.addPais(1, "Nauru", "imagenes/nauru.png");
        continente.addPais(2, "Samoa", "imagenes/samoa.png");

        contenedor = new Form(continente.getNombre());
        contenedor.append(continente.getImagen());
        contenedor.append(continente.getDescripcion());
        paises= new ChoiceGroup ("Algunos países:", Choice.MULTIPLE);
        for (int c=0;c<continente.paises.length;c++) {
            paises.append(continente.nombrePais(c), null);
        }
        contenedor.append(paises);
        volverContinentes = new Command("Volver", Command.BACK,0);
        verPaises = new Command("Ver países", Command.OK,1);
        contenedor.addCommand(volverContinentes);
        contenedor.addCommand(verPaises);
        contenedor.setCommandListener(this);
        pantalla.setCurrent(contenedor);
    }
   

    // Control de los comandos utilizados
    public void commandAction(Command c, Displayable d) {
       
        if (c == siguiente) { // Control del comando siguiente. Se usa en la pantalla de presentación
            instrucciones();
        }
       
        if (c == probar) { // Control del comando probar. Se usa en la pantalla de instrucciones
            verContinentes();
        }
        if (c == terminar) { // Control del comando terminar. Se usa en varias pantallas.
            creditos();
            if (c == adios) {
            destroyApp (true);
            notifyDestroyed ();
            }
        }
        if (c==List.SELECT_COMMAND) { // Control de los eventos producidos por la lista implícita de los continentes.
            int indice = continentes.getSelectedIndex();
            try {
            switch(indice) { // Según el índice, carga el continente que se elija
                case 0:
                    cargaEuropa();
                    break;
                case 1:
                    cargaAfrica();
                    break;
                case 2:
                    cargaAsia();
                    break;
                case 3:
                    cargaAmerica();
                    break;
                case 4:
                    cargaOceania();
                    break;
            }
            } catch (IOException ex) {
            }
        }
       
        if (c == volverContinentes) { // Control del comando volverContinente. Se usa para volver a la lista de continentes.
            pantalla.setCurrent(continentes);
        }
       
        if (c == verPaises) { // Control del comando verpaises. Se usa para ver una pantalla con los países elegidos
            try {
            cargarPaises(continente); // Llama al método que carga los países solicitados
            } catch (IOException ex) {
               
            }
        }
       
        if (c==volverContinente) { // Control del comando volverContinente. Se usa para salir de la pantalla de países
                                   // y volver a la del continente padre.
            pantalla.setCurrent(contenedor);
        }
       
        if (c == adios) {
            pantalla.setCurrent(null);
        }
    }
   
    // Método que carga los países en función de continente elegido. En el momento en que se llame este método, el objeto
    // continente ya estará instanciado con los datos que corresponda.
    public void cargarPaises(continentes continente) throws IOException {
        int npaises=0; // Variable que almacena el total de paises que se eligieron mostrar
        Form contenedor_paises = new Form(continente.getNombre()); // Se crea el form con el nombre del continente.
        for (int co=0;co<paises.size();co++) { // Se recorre el array de países. Un array bidimensional que almacena
                                               // el nombre y la imagen.
                if (paises.isSelected(co)) { // Sólo nos interesan los países que se marcaron.
                  contenedor_paises.append(continente.paises[co][0]); // Añado el nombre
                  // Añado la imagen. Ésta estará ya proporcionada a la pantalla ya que llamo al método redimensionar.
                  contenedor_paises.append(redimensionar(Image.createImage(continente.paises[co][1])));
                  npaises ++; // Se suma un nuevo elemento
                }
            }
        if (npaises==0) { // Si no se seleccionó ningún país, aparece un alerta y la pantalla activa es dicha alerta.
                    vacio= new Alert ("No se eligieron países", "Pulse aceptar para"
                            + " volver al continente", null, AlertType.INFO);
                    vacio.setTimeout (Alert.FOREVER);
                    pantalla.setCurrent(vacio);
                   
                } else { // Si se seleccionaron países los añado al form.
           
                    // Añado los comandos que tendrá la pantalla.
                    volverContinente = new Command("Volver", Command.BACK,1); // El botón estará ubicado en la parte superior.
                    contenedor_paises.addCommand(volverContinente);
                    contenedor_paises.setCommandListener(this); // Asigno el oyente
                    pantalla.setCurrent(contenedor_paises); // La pantalla activa es ésta.
                }
       
    }
   
    public void creditos() {
        contenedor = new Form ("Créditos");
        contenedor.append("Tarea realizada por:\n"
                + "Gabriel López Marcos\n"
                + "para DAM\n"
                + "8/Agosto/2013");
        adios = new Command("Adiós",Command.OK,0);
        contenedor.addCommand(adios);
        contenedor.setCommandListener(this);
        pantalla.setCurrent(contenedor);
    }
   
    // Método que devuelve una imagen proporcionada a la pantalla desde una imagen tomada por parámetro
    private Image redimensionar(Image imagen) {
      int anchoImagenOriginal = imagen.getWidth(); // Se toma el ancho de la imagen original
      int altoImagenOriginal = imagen.getHeight(); // Se toma el alto de la imagen original
      int anchoPantalla = Display.getDisplay(this).getCurrent().getWidth(); // Se toma el ancho de la pantalla
      if (anchoImagenOriginal<anchoPantalla) { // Si la imagen es más estrecha, no hace falta redimensionar
          return imagen; // La retornamos tal cual
      }
      Image imagenTemporal = Image.createImage(anchoPantalla, altoImagenOriginal); // Se crea una imagen temporal con las
                                                                                   // medidas de nuestra imagen.
      Graphics g = imagenTemporal.getGraphics(); // Utilizo la clase graphics
      int ratio = (anchoImagenOriginal << 16) / anchoPantalla; // Se calcula el nuevo ratio
      int pos = ratio/2;

      //Bucle de redimensión horizontal       

      for (int x = 0; x < anchoPantalla; x++) {
          g.setClip(x, 0, 1, altoImagenOriginal);
          g.drawImage(imagen, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP);
          pos += ratio;
      }

      // La nueva imagen tiene un ancho ajustado a la pantalla
      Image imagenRedimensionada = Image.createImage(anchoPantalla, anchoPantalla);
      g = imagenRedimensionada.getGraphics();
      ratio = (altoImagenOriginal << 16) / anchoPantalla;
      pos = ratio/2;       

      // Bucle de redimensión vertical
      for (int y = 0; y < anchoPantalla; y++) {
          g.setClip(0, y, anchoPantalla, 1);
          g.drawImage(imagenTemporal, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP);
          pos += ratio;
      }
      return imagenRedimensionada; // Retorna la imagen redimensionada

  }
}

CLASE CONTINENTES

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Atlas;

// Importo las clases necesarias para trabajar
import java.io.IOException;
import javax.microedition.lcdui.Image;

/**
 * Objeto continente
 * @author glop
 */
public class continentes {

    private String nombre; // Variable que almacena el nombre del continente.
    private String descripcion; // Variable que almacena la descripción del continente.
    private Image imagen; // Variable que almacena la imagen con continente.
    // Array bidimensional que almacena los paises pertenecientes al continente. De los países se almacena el nombre y
    // la ruta de la imagen asociaciada. De ahí la necesidad de utilizar un array de este tipo.
    String[][] paises;
   
    // Instancia el objeto vacío
    public continentes() {
        nombre="";
        descripcion="";
        paises = new String[3][2]; // Se inicializa el objeto con 5 filas y dos columnas.
       
    }
   
   
    // Metodo que asigna el nombre.
    public void setNombre(String nomb) {
        this.nombre = nomb;
    }
   
    // Método que asigna la descripción.
    public void setDescripcion(String descrip) {
        this.descripcion = descrip;
    }
   
   
    // Método que asigna la imagen.
    public void setImagen(Image imag) {
        this.imagen = imag;
    }
   
    // Método que devuelve el nombre.
    public String getNombre() {
        return this.nombre;
    }
   
    // Método que devuelve la descripción.
    public String getDescripcion() {
        return this.descripcion;
    }
   
     // Método que devuelve la imagen
     public Image getImagen() {
        return this.imagen;
    }
    
     // Método que añade un nuevo país al array bidimensional de países.
     // Requiere la posición, el nombre del país y la ruta de la imagen asociada.
     public void addPais(int posicion,String nombpais, String rutaimg) throws IOException {
         paises[posicion][0] = nombpais;
         paises[posicion][1] = rutaimg;
     }
    
     // Devuelve el nombre del país, indicando la posición dentro del array.
     // Se utiliza en los bucles for cuando se recorre el array de países.
     public String nombrePais(int posicion) {
        return paises[posicion][0].toString();
     }
    
     // Devuelve la imagen del país, indicando la posición dentro del array.
     // Se utiliza en los bucles for cuando se recorre el array de países.
     public Image imagen(int posicion) throws IOException {
         Image imag=null;
         imag = Image.createImage(paises[posicion][1]); // Crea una imagen a partir de la ruta almacenada en el array
         return imag;
     }
    
    
    

}