Ejemplo n.º 1
0
  /**
   * Realiza la función de cortar, si hay algo seleccionado Guarda el valor del portapapeles
   * anterior. Copia todos los tramos seleccionados y los nodos. Calcula una posicion que será la
   * referencia a la hora de pegar. Ésta posición será el nodo situado más a la izquierda. Después
   * elimina del mapa los elementos que se han cortado. Sin embargo, deja en el mapa nodos que, aún
   * habiendo sido cortados, tienen otros tramos no cortados en el mapa.
   */
  public int hacer(IModelo modelo) {
    if (modelo.getMapa().getSeleccion() != null) {
      portapapelesAntiguo = modelo.getMapa().getPortapapeles();
      antiguoNodoReferencia = modelo.getMapa().getNodoReferenciaPortapapeles();
      modelo.getMapa().setPortapapeles(new Seleccion());
      for (int j = 0; j < modelo.getMapa().getSeleccion().getTramosSeleccionados().size(); j++) {
        Tramo tramoMapa = modelo.getMapa().getSeleccion().getTramosSeleccionados().get(j);

        Nodo nodoInicialEnPortapapeles =
            modelo.getMapa().getPortapapeles().existeNodo(tramoMapa.getNodoInicial());
        if (nodoInicialEnPortapapeles == null) {
          nodoInicialEnPortapapeles = tramoMapa.getNodoInicial().pseudoClone();
          modelo.getMapa().getPortapapeles().añadirNodo(nodoInicialEnPortapapeles);
        }

        Nodo nodoFinalEnPortapapeles =
            modelo.getMapa().getPortapapeles().existeNodo(tramoMapa.getNodoFinal());
        if (nodoFinalEnPortapapeles == null) {
          nodoFinalEnPortapapeles = tramoMapa.getNodoFinal().pseudoClone();
          modelo.getMapa().getPortapapeles().añadirNodo(nodoFinalEnPortapapeles);
        }

        Tramo tramoPortapapeles =
            tramoMapa.pseudoClone(nodoInicialEnPortapapeles, nodoFinalEnPortapapeles);
        modelo.getMapa().getPortapapeles().añadirTramo(tramoPortapapeles);
        nodoInicialEnPortapapeles.añadirTramo(tramoPortapapeles);
        nodoFinalEnPortapapeles.añadirTramo(tramoPortapapeles);
      }
      for (int i = 0; i < modelo.getMapa().getSeleccion().getNodosSeleccionados().size(); i++) {
        Nodo nodoTemp = modelo.getMapa().getSeleccion().getNodosSeleccionados().get(i);
        Nodo nodoPortapapeles = modelo.getMapa().getPortapapeles().existeNodo(nodoTemp);
        if (nodoPortapapeles == null) {
          nodoPortapapeles = nodoTemp.pseudoClone();
          modelo.getMapa().getPortapapeles().añadirNodo(nodoPortapapeles);
        }
      }
      Posicion posMinima = new Posicion(Double.MAX_VALUE, Double.MAX_VALUE);
      for (int i = 0; i < modelo.getMapa().getPortapapeles().getNodosSeleccionados().size(); i++) {
        Nodo nodoTemp = modelo.getMapa().getPortapapeles().getNodosSeleccionados().get(i);
        if (nodoTemp.getPos().getLon() <= posMinima.getLon()) {
          // if (nodoTemp.getPos().getLat()<=posMinima.getLat()) {
          posMinima = nodoTemp.getPos();
          modelo.getMapa().setNodoReferenciaPortapapeles(nodoTemp);
        }
      }

      Iterator<Tramo> it = modelo.getMapa().getSeleccion().getTramosSeleccionados().iterator();
      Tramo temp;
      while (it.hasNext()) {
        temp = it.next();
        modelo.getMapa().getTramos().remove(temp);
        temp.getNodoInicial().getTramos().remove(temp);
        temp.getNodoFinal().getTramos().remove(temp);
      }

      for (int i = 0; i < modelo.getMapa().getSeleccion().getNodosSeleccionados().size(); i++) {
        Nodo nodoTemp = modelo.getMapa().getSeleccion().getNodosSeleccionados().get(i);
        boolean existeTramoEnMapa = false;
        for (int j = 0; j < modelo.getMapa().getTramos().size() && !existeTramoEnMapa; j++) {
          if (modelo.getMapa().getTramos().get(j).getNodoInicial().equals(nodoTemp)
              || modelo.getMapa().getTramos().get(j).getNodoFinal().equals(nodoTemp))
            existeTramoEnMapa = true;
        }
        if (!existeTramoEnMapa) {
          boolean nodoEliminado = false;
          modelo.getMapa().getNodos().remove(nodoTemp);
        }
      }
    }
    return 0;
  }