Rev 597 | Blame | Last modification | View Log | RSS feed
package org.tela_botanica.client;
import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Utilisateur;
import org.tela_botanica.client.modeles.UtilisateurAsynchroneDAO;
import org.tela_botanica.client.observation.ObservationMediateur;
import org.tela_botanica.client.vues.EtatConnexionVue;
import org.tela_botanica.client.vues.FenetreLicenceVue;
import org.tela_botanica.client.vues.FormulaireDeConnexionVue;
import org.tela_botanica.client.vues.ListeUtilisateurAdminVue;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Image;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.ExtElement;
import com.gwtext.client.core.Function;
import com.gwtext.client.widgets.BoxComponent;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Container;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.TabPanel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.ToolTip;
import com.gwtext.client.widgets.event.ContainerListener;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.event.TabPanelListener;
import com.gwtext.client.widgets.event.TabPanelListenerAdapter;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.layout.RowLayout;
import com.gwtext.client.widgets.layout.RowLayoutData;
/**
* Mediateur gérant les interactions entre vues et les echanges de données
* C'est un singleton.
* @author david delon
*
*/
public class CarnetEnLigneMediateur implements Rafraichissable {
/**
* booleen qui verifie l'unicite de l'instance
*/
private static boolean estInstancie = false ;
/**
* pointeur vers le médiateur lui même (pour le pattern singleton)
*/
private static CarnetEnLigneMediateur thisMediateur = null ;
/**
* modele de données
*/
private CarnetEnLigneModele carnetEnLigneModele=null;
/**
* panneau principal de l'application "Carnet en ligne"
*/
private Panel panneauPrincipalCarnetEnLigne= null ;
/**
* panneau a onglet pour les observation et les images
*/
private com.gwtext.client.widgets.TabPanel ongletsObservationsImages=null;
/**
* Indicateur d'etat de la connexion utilisateur
*/
private EtatConnexionVue etatConnexionVue=null;
/**
* Texte d'invite connexion
*/
private final String texteDeconnexion="Utilisez ce carnet en ligne pour saisir vos observations, <u>identifiez-vous</u> pour les transmettre à Tela Botanica";
/**
* Boolean indiquant un essai de connexion
*/
private boolean tentativeConnection=false;
/**
* Booleen indique que la licence a été acceptée
*/
private boolean licenceUtilisateurAcceptee = false;
/**
* Formulaire de connexion (lazy instantiation)
*
*/
private FormulaireDeConnexionVue formulaireDeConnexionVue=null;
/**
*
*/
private Panel bandeau = null ;
private Panel panneauAdmin = null ;
Tool cacherPanneau = null ;
private FenetreLicenceVue fenetreAcceptationLicence = null;
/**
* Mediateur Gestion des images
*/
private ImageMediateur imageMediateur=null;
/**
* Mediateur Gestion des observations
*/
private ObservationMediateur observationMediateur=null;
/**
* Utilisateur en cours
*/
private Utilisateur utilisateur=null;
public static CarnetEnLigneMediateur Instance()
{
if(!estInstancie || thisMediateur==null)
{
estInstancie = true ;
thisMediateur = new CarnetEnLigneMediateur() ;
}
return thisMediateur ;
}
/**
* constructeur privé (on accède a la classe par la méthode getInstance
*/
private CarnetEnLigneMediateur() {
panneauPrincipalCarnetEnLigne = new Panel("Carnet en ligne");
// Disposition
panneauPrincipalCarnetEnLigne.setLayout(new RowLayout());
// Pourrait etre fait plus loin ...
carnetEnLigneModele=CarnetEnLigneModele.Instance();
bandeau = new Panel();
bandeau.setId("x-up-bandeau") ;
etatConnexionVue=new EtatConnexionVue(this);
etatConnexionVue.setLayout(new FitLayout()) ;
// Le panneau à onglet qui contient les 2 applications Observation et Images
ongletsObservationsImages = new TabPanel();
panneauPrincipalCarnetEnLigne.add(etatConnexionVue,new RowLayoutData(16));
panneauAdmin = new Panel();
panneauAdmin.setId("panneau_admin");
panneauPrincipalCarnetEnLigne.add(panneauAdmin, new RowLayoutData(16));
panneauAdmin.setBorder(false);
panneauAdmin.hide();
panneauPrincipalCarnetEnLigne.add(ongletsObservationsImages,new RowLayoutData());
//panneauPrincipalCarnetEnLigne.addTool(cacherPanneau) ;
// On ajoute les applications
observationMediateur = ObservationMediateur.Instance(this);
imageMediateur= ImageMediateur.Instance(this);
if(!GWT.isScript()) {
//temp dd viewport desactive ajout de cette ligne
getPanneauPrincipalCarnetEnLigne().setHeight(Window.getClientHeight()) ;
}
panneauPrincipalCarnetEnLigne.addListener(new ContainerListenerAdapter() {
@Override
public void onResize(BoxComponent component, int adjWidth,
int adjHeight, int rawWidth, int rawHeight) {
CarnetEnLigneMediateur.fireResize();
observationMediateur.redimensionnerPanneaux(adjHeight, adjWidth);
}
});
ongletsObservationsImages.addListener(new TabPanelListenerAdapter() {
public void onTabChange(TabPanel source, Panel tab) {
if(tab.equals(imageMediateur.getPanneauPrincipalImage())) {
Timer t = new Timer() {
public void run() {
imageMediateur.obtenirNombreMiniListeObservations();
imageMediateur.rafraichirToutesVues();
}
};
t.schedule(150);
}
}
});
// on ajoute les panneaux principaux des applications au panneau à onglets
ongletsObservationsImages.add(observationMediateur.getPanneauPrincipalObservation());
ongletsObservationsImages.add(imageMediateur.getPanneauPrincipalImage());
}
public void getEtatUtilisateur() {
carnetEnLigneModele.getEtatUtilisateur(this);
}
// Methode publiques
/**
* Recherche Identifiant utilisateur en cours et etat de connection
* @return Utilisateur
*/
public Utilisateur getUtilisateur() {
return utilisateur;
}
/**
* Deconnecte l'utilisateur passe en parametre
*/
public void deconnecterUtilisateur() {
licenceUtilisateurAcceptee = false;
// TODO: vider proprement toutes les vues (méthode à voir)
carnetEnLigneModele.deconnecterUtilisateur(this, utilisateur.getIdentifiant());
observationMediateur.deconnecterUtilisateur() ;
imageMediateur.deconnecterUtilisateur();
panneauAdmin.setVisible(false);
}
public void connecterUtilisateur(String login, String password) {
tentativeConnection=true;
carnetEnLigneModele.connecterUtilisateur(this, login, password);
}
/**
* Affichage etat de la connexion
*/
private void afficheEtatConnexion() {
if (!utilisateur.isIdentifie()) {
etatConnexionVue.setEtat("",false);
}
else {
if(utilisateur.isAdmin()) {
afficherLienAdmin();
panneauAdmin.setVisible(true);
} else {
cacherLienAdmin();
}
etatConnexionVue.setEtat(utilisateur.getIdentifiant(),true);
}
}
private void afficherFenetreAcceptationLicence() {
fenetreAcceptationLicence = new FenetreLicenceVue(this);
// On le positionne à peu près au milieu de l'écran
int left = (Window.getClientWidth() - 512) / 2;
int top = (Window.getClientHeight() - 256) / 5;
fenetreAcceptationLicence.setPosition(left, top);
fenetreAcceptationLicence.setHeight(350);
fenetreAcceptationLicence.setWidth(550);
fenetreAcceptationLicence.setModal(true);
fenetreAcceptationLicence.show();
}
/**
*
* Affichage boite de connexion
*
*/
public void afficherDialogueConnexion() {
if (formulaireDeConnexionVue==null) {
formulaireDeConnexionVue= new FormulaireDeConnexionVue(this);
}
// On le positionne à peu près au milieu de l'écran
int left = (Window.getClientWidth() - 512) / 2;
int top = (Window.getClientHeight() - 256) / 2;
formulaireDeConnexionVue.setPopupPosition(left, top);
formulaireDeConnexionVue.show();
}
public Panel getPanneauPrincipalCarnetEnLigne() {
return panneauPrincipalCarnetEnLigne;
}
// TODO : repandre rafraichissement
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
if (nouvelleDonnees instanceof Utilisateur) {
utilisateur = (Utilisateur) nouvelleDonnees;
if ((tentativeConnection) && !utilisateur.isIdentifie()) {
panneauAdmin.setVisible(false);
formulaireDeConnexionVue.afficherMessageAlerte();
}
else {
if ((tentativeConnection) && utilisateur.isIdentifie()) {
afficherLienAdmin();
formulaireDeConnexionVue.cacher();
}
}
if(utilisateur.isIdentifie() && !utilisateur.getLicenceAcceptee()) {
afficherFenetreAcceptationLicence();
} else {
if(tentativeConnection && utilisateur.isIdentifie() && observationMediateur.listeAvoirObservations() && !utilisateur.isAdmin()) {
if(Window.confirm("Voulez vous importer vos observations déjà saisies dans votre compte une fois connecté ?")) {
observationMediateur.setImporterObservationsAnonymes(true);
}
}
afficheEtatConnexion();
// On lance l'affichage des observations
observationMediateur.connecterUtilisateur();
imageMediateur.connecterUtilisateur();
}
}
if(nouvelleDonnees instanceof String) {
String evenement = (String)nouvelleDonnees;
if(evenement.equals("licence_acceptee")) {
licenceUtilisateurAcceptee = true;
accepterLicenceUtilisateur();
} else {
if(utilisateur.isIdentifie()) {
deconnecterUtilisateur();
return;
}
}
if(observationMediateur.listeAvoirObservations() && !utilisateur.isAdmin()) {
if(Window.confirm("Voulez vous importer vos observations déjà saisies dans votre compte une fois connecté ?")) {
observationMediateur.setImporterObservationsAnonymes(true);
}
}
afficheEtatConnexion();
observationMediateur.connecterUtilisateur();
imageMediateur.connecterUtilisateur();
fenetreAcceptationLicence.close();
}
}
private void accepterLicenceUtilisateur() {
utilisateur.setLicenceAcceptee(true);
carnetEnLigneModele.accepterLicenceUtilisateur(utilisateur.getIdentifiant());
}
public void afficherListeUtilisateurs() {
ListeUtilisateurAdminVue listeUtilisateur = new ListeUtilisateurAdminVue(this) ;
listeUtilisateur.show(Ext.get("LienChangerUtilisateur").getDOM());
listeUtilisateur.focusChampUtilisateur();
}
public void afficherLienAdmin() {
String labelAdmin = "<div id=\"lienAdmin\">Vous consultez les données de "+utilisateur.getIdentite()+" <a id=\"LienChangerUtilisateur\" href=\"#\">Changer d'utilisateur</a></div>" ;
panneauAdmin.setHtml(labelAdmin);
ExtElement lienChangerUt = Ext.get("LienChangerUtilisateur");
if(lienChangerUt != null)
{
lienChangerUt.removeAllListeners();
lienChangerUt.addListener("click", new EventCallback() {
public void execute(EventObject e) {
afficherListeUtilisateurs();
}
});
}
else
{
panneauAdmin.addListener(new ContainerListenerAdapter()
{
public void onAfterLayout(Container c)
{
ExtElement lienChangerUt = Ext.get("LienChangerUtilisateur");
lienChangerUt.removeAllListeners();
lienChangerUt.addListener("click", new EventCallback() {
public void execute(EventObject e) {
afficherListeUtilisateurs();
}
});
}
});
}
}
public void cacherLienAdmin() {
panneauAdmin.hide();
}
public void changerIdentite(String nouvelleIdentite) {
utilisateur.setIdentite(nouvelleIdentite);
afficherLienAdmin();
observationMediateur.connecterUtilisateur();
imageMediateur.connecterUtilisateur();
}
public void obtenirListeUtilisateurs(String rech, Rafraichissable r) {
carnetEnLigneModele.obtenirListeUtilisateur(r,rech,utilisateur.getIdentifiant());
}
public void donneesImagesVersObs(Object o) {
observationMediateur.donneesExterieures(o);
}
public void donneesObsVersImages(Object o) {
imageMediateur.donneesExterieures(o);
}
public void obtenirListeObservations(Rafraichissable r) {
observationMediateur.obtenirCacheObservation(r) ;
}
public static native void fireResize() /*-{
$wnd.Ext.EventManager.fireResize();
}-*/;
}