package ingsw.proj.cluedo.gui;
import ingsw.proj.cluedo.componenti.CongetturaRidotta;
import ingsw.proj.cluedo.componenti.Soluzione;
import ingsw.proj.cluedo.componenti.Casella.CasellaRidotta;
import ingsw.proj.cluedo.eventi.AccusaFormulataEvent;
import ingsw.proj.cluedo.eventi.AccusaFormulataListener;
import ingsw.proj.cluedo.eventi.AzioneSceltaEvent;
import ingsw.proj.cluedo.eventi.AzioneSceltaListener;
import ingsw.proj.cluedo.eventi.DestinazioneSceltaEvent;
import ingsw.proj.cluedo.eventi.DestinazioneSceltaListener;
import ingsw.proj.cluedo.eventi.IpotesiFormulataEvent;
import ingsw.proj.cluedo.eventi.IpotesiFormulataListener;
import ingsw.proj.cluedo.eventi.Listener;
import ingsw.proj.cluedo.eventi.NomiSceltiEvent;
import ingsw.proj.cluedo.eventi.NomiSceltiListener;
import ingsw.proj.cluedo.logica.AzioniEnum;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
/*******************************************************************************
* Classe astratta per la GUI.
*
* @author C&C
*/
public abstract class InterfacciaUtente {
protected List<String> nomiGiocatori;
protected CasellaRidotta[][] tabellone;
protected List<Listener> listeners;
/***************************************************************************
* Costruttore
*/
public InterfacciaUtente() {
this.nomiGiocatori = new ArrayList<String>();
this.listeners = new ArrayList<Listener>();
}
/***************************************************************************
* Permette ai listeners di registrarsi agli eventi generati dalla classe
*
* @param l
* Listener che si vuole registrare
*
*/
public final synchronized void addListener(Listener l) {
listeners.add(l);
}
/***************************************************************************
* Permette ai listeners di de-registrarsi agli eventi generati dalla classe
*
* @param l
* Listener che si vuole de-registrare
*
*/
public final synchronized void removeListener(Listener l) {
listeners.remove(l);
}
/***************************************************************************
* Chiede all'utente una tra le possibili azioni
*
* @param nomeGiocatore
* il giocatore che deve compiere l'azione
* @param azione
* le possibili azioni da compiere
*
*/
public abstract void chiediAzione(String nomeGiocatore, AzioniEnum[] azione);
protected final synchronized void fireAzioneSceltaEvent(String giocatore, AzioniEnum azione) {
AzioneSceltaEvent evento = new AzioneSceltaEvent(this, giocatore, azione);
for (int i = 0; i < listeners.size(); i++)
if (listeners.get(i) instanceof AzioneSceltaListener)
((AzioneSceltaListener) listeners.get(i)).notificaAzioneScelta(evento);
}
/***************************************************************************
* Chiede i nomi dei giocatori all'utente
*/
public abstract void chiediNomiGiocatori();
protected final synchronized void fireNomiSceltiEvent(String[] nomi) {
NomiSceltiEvent evento = new NomiSceltiEvent(this, nomi);
for (int i = 0; i < listeners.size(); i++)
if (listeners.get(i) instanceof NomiSceltiListener)
((NomiSceltiListener) listeners.get(i)).notificaNomiScelti(evento);
}
/***************************************************************************
* Dice alla GUI di disegnare il tabellone
*
* @param tabellone
* il tabellone da disegnare
*/
public abstract void disegnaTabellone(CasellaRidotta[][] tabellone);
/***************************************************************************
* Chiede all'utente di formulare un'accusa
*
* @param nomeGiocatore
* il giocatore che deve accusare
*/
public abstract void formulaAccusa(String nomeGiocatore);
protected final synchronized void fireAccusaFormulataEvent(String accusante, CongetturaRidotta accusa) {
AccusaFormulataEvent evento = new AccusaFormulataEvent(this, accusante, accusa);
for (int i = 0; i < listeners.size(); i++)
if (listeners.get(i) instanceof AccusaFormulataListener)
((AccusaFormulataListener) listeners.get(i)).notificaAccusaFormulata(evento);
}
/***************************************************************************
* Chiede all'utente di forumlare un'ipotesi
*
* @param nomeGiocatore
* il giocatore che deve fare l'ipotesi
*/
public abstract void forumlaIpotesi(String nomeGiocatore);
protected final synchronized void fireIpotesiFormulataEvent(String accusante, CongetturaRidotta ipotesi) {
IpotesiFormulataEvent evento = new IpotesiFormulataEvent(this, accusante, ipotesi);
for (int i = 0; i < listeners.size(); i++)
if (listeners.get(i) instanceof IpotesiFormulataListener)
((IpotesiFormulataListener) listeners.get(i)).notificaIpotesiFormulata(evento);
}
/***************************************************************************
* Informa la GUI circa gli appunti di un giocatore.
*
* @param nomeGiocatore
* il giocatore a cui appartengono gli appunti
* @param note
* gli appunti del giocatore
*/
public abstract void mostraAppunti(String nomeGiocatore, String[] note);
/***************************************************************************
* Informa la GUI circa le carte di un giocatore
*
* @param nomeGiocatore
* il giocatore a cui appartengono le carte
* @param carte
* le carte del giocatore
*/
public abstract void mostraCarte(String nomeGiocatore, String[] carte);
/***************************************************************************
* Informa la GUI circa l'esito del lancio dei dadi
*
* @param result
* il risultato ottenuto dal giocatore
*/
public abstract void mostraLancioDadi(int result);
/***************************************************************************
* Informa la GUI circa il verificarsi di un errore
*
* @param errore
* il messaggio di errore
*/
public abstract void notificaErrore(String errore);
/***************************************************************************
* Informa la GUI circa la fine del turno di un giocatore
*
* @param nomeGiocatore
* il giocatore che ha finito il turno
*/
public abstract void notificaFineTurno(String nomeGiocatore);
/***************************************************************************
* Informa la GUI circa il Game Over di un giocatore
*
* @param nomeGiocatore
* il giocatore che ha perso
*/
public abstract void notificaGameOver(String nomeGiocatore);
/***************************************************************************
* Informa la GUI circa la vittoria di un giocatore
*
* @param nomeGiocatore
* il giocatore che ha vinto
*/
public abstract void notificaGiocoVinto(String nomeGiocatore);
/***************************************************************************
* Informa la GUI circa l'inizio del turno di un giocatore
*
* @param nomeGiocatore
* il giocatore che inizia il turno
*/
public abstract void notificaInizioTurno(String nomeGiocatore);
/***************************************************************************
* Informa la GUI circa la fine del gioco
*/
public abstract void notificaGiocoFinito(Soluzione sol);
/***************************************************************************
* Informa la GUI circa le destinazioni raggiungibili da un giocatore
*
* @param nomeGiocatore
* il giocatore che deve muoversi
* @param destinazioni
* le destinazioni che puo' raggiungere
*/
public abstract void chiediDestinazione(String nomeGiocatore, Point[] destinazioni);
/***************************************************************************
* Dice alla GUI di effettuare un refresh di solo alcune caselle
*
* @param tabellone
* il nuovo tabellone di gioco
*/
public abstract void refreshTabellone(CasellaRidotta[][] tabellone);
protected final synchronized void fireDestinazioneSceltaEvent(String giocatore, Point destinazione) {
DestinazioneSceltaEvent evento = new DestinazioneSceltaEvent(this, giocatore, destinazione);
for (int i = 0; i < listeners.size(); i++)
if (listeners.get(i) instanceof DestinazioneSceltaListener)
((DestinazioneSceltaListener) listeners.get(i)).notificaDestinazioneScelta(evento);
}
}