/*
* This file is part of MazeSolver.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (c) 2014 MazeSolver
* Sergio M. Afonso Fumero <theSkatrak@gmail.com>
* Kevin I. Robayna Hernández <kevinirobaynahdez@gmail.com>
*/
/**
* @file EnvironmentSet.java
* @date 25/10/2014
*/
package es.ull.mazesolver.gui.environment;
import java.util.ArrayList;
import com.tomtessier.scrollabledesktop.JScrollableDesktopPane;
import es.ull.mazesolver.agent.Agent;
import es.ull.mazesolver.gui.MainWindow;
import es.ull.mazesolver.util.InteractionMode;
/**
* Panel principal en el que se encuentran todos los laberintos cargados.
* Proporciona la gestión de los laberintos.
*/
public class EnvironmentSet extends JScrollableDesktopPane {
private static final long serialVersionUID = 1L;
private ArrayList <Environment> m_envs;
private InteractionMode m_mode;
/**
* Constructor. Inicializa la instancia.
*/
public EnvironmentSet () {
setVisible(true);
setOpaque(true);
m_envs = new ArrayList <Environment>();
m_mode = InteractionMode.SIMULATION;
}
/**
* Obtiene el entorno seleccionado actualmente.
*
* @return Entorno seleccionado actualmente o null si no hay ninguno.
*/
public Environment getSelectedEnvironment () {
return (Environment) getSelectedFrame();
}
/**
* No se deben eliminar los entornos de la lista, o tendrá un comportamiento
* erróneo posteriormente.
*
* @return Lista de entornos cargados actualmente.
*/
public final ArrayList <Environment> getEnvironmentList () {
return m_envs;
}
/**
* Obtiene el número de entornos que contiene el conjunto de entornos.
*
* @return Número de entornos en el conjunto.
*/
public int getEnvironmentCount () {
return m_envs.size();
}
/**
* Añade un nuevo entorno.
*
* @param env
* Añade un entorno a la lista.
*/
public void addEnvironment (Environment env) {
if (env != null) {
env.setInteractionMode(m_mode);
m_envs.add(env);
add(env);
repaint();
}
}
/**
* Elimina el entorno seleccionado actualmente si hay alguno seleccionado.
*/
public void removeSelectedEnvironment () {
Environment env = getSelectedEnvironment();
if (env != null) {
m_envs.remove(env);
remove(env);
repaint();
}
}
/**
* Añade un agente al entorno seleccionado y actualiza la referencia al
* entorno por si se trataba de un entorno simple y tras la adición de un
* agente pasa a ser un entorno múltiple.
*
* @param ag
* Agente que se quiere añadir al entorno actual.
*/
public void addAgentToSelectedEnvironment (Agent ag) {
Environment env = getSelectedEnvironment();
if (env != null)
env.addAgent(ag);
else
throw new IllegalStateException(
MainWindow.getTranslations().message().noEnvironmentSelected());
}
/**
* Elimina un agente de un entorno y actualiza la referencia al entorno, por
* si era un entorno múltiple y tras la eliminación tan sólo queda un agente.
*
* @param ag
* Referencia al agente que se quiere eliminar del entorno.
* @param env
* Entorno del cual se quiere eliminar el agente.
*/
public void removeAgentFromEnvironment (Agent ag, Environment env) {
if (m_envs.contains(env))
env.removeAgent(ag);
else
throw new IllegalArgumentException(
MainWindow.getTranslations().exception().envNotInEnvSet());
}
/**
* Actualiza el zoom de los entornos y sus tamaños.
*
* @param zoom
* Nivel de escala a aplicar a la visualización de los entornos.
*/
public void setZoom (double zoom) {
EnvironmentPanel.setZoom(zoom);
for (Environment i: m_envs)
i.updateSize();
}
/**
* Intercambia un entorno dentro del conjunto de entornos por otro que no está
* en dicho conjunto.
*
* @param e1
* Entorno que se quiere eliminar del conjunto.
* @param e2
* Entorno que se quiere introducir en su lugar.
*/
public void exchangeEnvironments (Environment e1, Environment e2) {
// Evitamos intercambiar un entorno por sí mismo
if (e1 != e2) {
if (!m_envs.contains(e1) || m_envs.contains(e2))
throw new IllegalArgumentException(
MainWindow.getTranslations().exception().environmentsNotExchangeable());
// Quitamos el primer entorno
m_envs.remove(e1);
remove(e1);
// Ponemos el segundo entorno
m_envs.add(e2);
add(e2);
// Lo seleccionamos como entorno activo
e2.setLocation(e1.getLocation());
setSelectedFrame(e2);
// Le asignamos una clase de renderizado acorde con el modo de interacción
// actual
e2.setInteractionMode(m_mode);
}
repaint();
}
/**
* Modifica todos los entornos para que funcionen en el modo indicado.
*
* @param mode
* Nuevo modo de interacción.
*/
public void setInteractionMode (InteractionMode mode) {
if (mode != m_mode) {
m_mode = mode;
for (Environment env: m_envs)
env.setInteractionMode(mode);
}
}
/**
* @return El modo de interacción actual de los entornos.
*/
public InteractionMode getInteractionMode () {
return m_mode;
}
}