Rev 125 | Go to most recent revision | Blame | Last modification | View Log | RSS feed
package org.tela_botanica.client.observation;
// TODO : systematiser les onQuelquechose, appelle depuis les vues
import org.tela_botanica.client.CarnetEnLigneMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.ListeObservation;
import org.tela_botanica.client.modeles.Observation;
import org.tela_botanica.client.vues.FormulaireSaisieObservationVue;
import org.tela_botanica.client.vues.ImageGeneriqueVue;
import org.tela_botanica.client.vues.InformationRepartitionVue;
import org.tela_botanica.client.vues.ListeObservationVue;
import org.tela_botanica.client.vues.MenuObservationVue;
import org.tela_botanica.client.vues.MiniZoomImageVue;
import org.tela_botanica.client.vues.NuageMotsClesVue;
import org.tela_botanica.client.vues.PanneauFiltresObservationVues;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Window;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.ExtElement;
import com.gwtext.client.core.RegionPosition;
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.event.ContainerListener;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.layout.BorderLayout;
import com.gwtext.client.widgets.layout.BorderLayoutData;
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 aurelien
*
*/
public class ObservationMediateur {
/**
* booleen qui verifie l'unicite de l'instance (donc static)
*/
private static boolean estInstancie = false ;
/**
* pointeur sur le médiateur (pour le pattern singleton)
*/
private static ObservationMediateur thisMediateur = null ;
/** Mediateur general de l'application carnet en ligne
*
*
*/
private CarnetEnLigneMediateur carnetEnLigneMediateur = null ;
/**
* modele de données
*/
private ObservationModele observationModele = null ;
/**
* panneau principal des Observation (onglet "observation")
*/
private final Panel panneauPrincipalObservation = new Panel("Observation");
/**
* liste détaillée des Observations
*/
private ListeObservationVue listeObservation = null ;
/**
* Saisie des Observations
*/
private FormulaireSaisieObservationVue formulaireSaisieObservationVue=null;
/**
* booleen explicitant s'il y a une selection en cours
*/
private boolean selection = false ;
/**
* La liste des observations affichées en cours (verifier utilité)
*/
private ListeObservation cacheObservation = new ListeObservation(0) ;
/**
/**
* panneau conteneur pour le panneau des informations lies à l'observation
*/
private Panel details = new Panel("Détails");
/**
* panneau conteneur pour le panneau des filtres
*/
private PanneauFiltresObservationVues filtres = null;
/**
* panneau d'information de repartition sur le nom selectionné
*
*/
private InformationRepartitionVue informationRepartitionVue=null;
/**
* panneau d'affichage d'une image generique associe au nom selectionne
*
*/
private ImageGeneriqueVue imageGeneriqueVue=null;
private MiniZoomImageVue mvz = null ;
private NuageMotsClesVue nuaMC = null;
private Panel conteneurFormulaire = null ;
/**
* constructeur privé (on accède a la classe par la méthode getInstance
*/
private ObservationMediateur(CarnetEnLigneMediateur carnetEnLigneMediateur )
{
this.carnetEnLigneMediateur=carnetEnLigneMediateur;
// on crée un modèle
observationModele = ObservationModele.Instance(this);
listeObservation = new ListeObservationVue(this);
listeObservation.setTitle("Observations");
// quelques variables de position pour les borderlayouts
final BorderLayoutData regionNord = new BorderLayoutData(
RegionPosition.NORTH);
final BorderLayoutData regionCentre = new BorderLayoutData(
RegionPosition.CENTER);
final BorderLayoutData regionEst = new BorderLayoutData(
RegionPosition.EAST);
if (GWT.isScript()) { // FIXME : ne fonctionne pas en mode hosted
regionEst.setSplit(true);
}
final BorderLayoutData regionOuest = new BorderLayoutData(
RegionPosition.WEST);
if (GWT.isScript()) { // FIXME : ne fonctionne pas en mode hosted
regionOuest.setSplit(true);
}
panneauPrincipalObservation.setLayout(new BorderLayout()) ;
// on ajoute un panneau supplémentaire pour contenir le formulaire, pour éviter un bug de taille
// des panneaux
conteneurFormulaire = new Panel();
// Le formulaire de saisie / modification d'observation
formulaireSaisieObservationVue = new FormulaireSaisieObservationVue(this);
formulaireSaisieObservationVue.setHeader(false);
conteneurFormulaire.setTitle("Saisie");
conteneurFormulaire.setTitleCollapse(true);
conteneurFormulaire.setCollapsible(true) ;
final Panel centre = new Panel();
centre.setLayout(new RowLayout());
centre.setHeight(panneauPrincipalObservation.getHeight());
formulaireSaisieObservationVue.setBorder(false);
conteneurFormulaire.add(formulaireSaisieObservationVue);
centre.add(conteneurFormulaire, new RowLayoutData(210));
centre.add(listeObservation, new RowLayoutData());
// on initialise le volet qui contient les details
details.setWidth("15%");
details.setTitleCollapse(true);
details.setCollapsible(true);
details.setLayout(new RowLayout());
// Information de repartition
informationRepartitionVue=new InformationRepartitionVue(this);
// TODO : calcul de la hauteur automatique par le panel ?
informationRepartitionVue.setHeight(160);
details.add(informationRepartitionVue);
// Image generique
imageGeneriqueVue=new ImageGeneriqueVue(this);
// TODO : calcul de la hauteur automatique par le panel ?
imageGeneriqueVue.setHeight(160);
details.add(imageGeneriqueVue);
mvz = new MiniZoomImageVue(this) ;
mvz.setHeight(300) ;
details.add(mvz) ;
// on crée le panneau des filtres
filtres = new PanneauFiltresObservationVues(this);
// on initialise le volet qui contient les filtres
filtres.setWidth("15%");
filtres.setHeight(700) ;
filtres.setTitleCollapse(true);
filtres.setCollapsible(true);
panneauPrincipalObservation.add(details,regionEst);
panneauPrincipalObservation.add(filtres,regionOuest);
panneauPrincipalObservation.add(centre,regionCentre);
}
/**
* Retourne une instance de manière unique
* @return l'instance unique du médiateur
*/
public static ObservationMediateur Instance(CarnetEnLigneMediateur carnetEnLigneMediateur)
{
if(!estInstancie || thisMediateur == null)
{
estInstancie = true ;
thisMediateur = new ObservationMediateur(carnetEnLigneMediateur) ;
}
return thisMediateur ;
}
// ACTIONS a entreprendre lors d'un evenement particulier
/**
* Lors du raffraichissement de la liste d'observation
*/
public void onRafraichissementListeObservations() {
cacheObservation = listeObservation.getCacheListeObservation() ;
if(cacheObservation.size() == 0)
{
//formulaireSaisieObservationVue.raz() ;
}
carnetEnLigneMediateur.donneesRafraichies(cacheObservation) ;
}
/**
*
* TODO : fonction plus generique, appelle sur un clic ou une selection de ligne, a appeller : SelectionnerObservation
* est appelé lors d'un clic de souris sur un enregistrement de la liste le
* médiateur gère alors les conséquences
*
* @param rowIndex
* le numéro de ligne selectionné
*/
public void onClicListeObservation(int rowIndex, String ordreObservation) {
Observation obs = cacheObservation.get(ordreObservation) ;
if(GWT.isScript()) {
masquerChargementInfosObservations() ;
}
// Affichage de la carte de repartition correspondante
String numeroNomenclaturalSaisiObservation = obs.getNumeroNomenclaturalSaisi() ;
observationModele.obtenirImageInformationRepartition(informationRepartitionVue,numeroNomenclaturalSaisiObservation) ;
// affichage des détails dans le formulaire d'observation
formulaireSaisieObservationVue.rafraichir(obs, false) ;
// Affichage de l'image correspondante
observationModele.obtenirImageGenerique(imageGeneriqueVue,numeroNomenclaturalSaisiObservation) ;
observationModele.obtenirLiaisonImage(mvz, ordreObservation) ;
}
public void obtenirImageInformationExternes(String numeroNomenclaturalSaisiObservation) {
if(GWT.isScript()) {
masquerChargementInfosObservations() ;
}
observationModele.obtenirImageInformationRepartition(informationRepartitionVue,numeroNomenclaturalSaisiObservation) ;
observationModele.obtenirImageGenerique(imageGeneriqueVue,numeroNomenclaturalSaisiObservation) ;
}
// ACCES au Modèle
// C du CRUD
/**
* TODO : afficher un message du type "observation ajouté".
* Lance la creation d'une observation
* @param obs : l'observation saisie
*/
public void ajouterObservation(Observation obs) {
// On raffraichi la liste d'observation
observationModele.ajouterObservation(listeObservation, obs) ;
filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
filtres.getArbreDateObservationFiltreVue().rafraichir(obs,true) ;
}
// R du CRUD
/**
* Demande au modele le nombre d'Observation à afficher
* TODO : grouper cette demande avec la demande d'affichage de liste ?
*/
public void obtenirNombreObservation() {
listeObservation.masquerChargement() ;
mvz.raz() ;
imageGeneriqueVue.raz() ;
informationRepartitionVue.raz() ;
observationModele.obtenirNombreObservation(listeObservation) ;
}
public void obtenirListeObservation() {
obtenirListeObservation(listeObservation);
}
/**
* Demande au modele le detail des Observations à afficher
* TODO : grouper cette demande avec la demande d'affichage de liste ?
*/
public void obtenirListeObservation(Rafraichissable r) {
listeObservation.masquerChargement() ;
observationModele.obtenirListeObservation(r,listeObservation.getTaillePage(),listeObservation.getPageEncours()) ;
}
public void obtenirCacheObservation(Rafraichissable r) {
r.rafraichir(cacheObservation, false) ;
}
/**
* Envoie au modèle une demande pour obtenir l'arbre des localites
*
* @param r
* le raffraichissable qui a demandé la mise à jour
*/
public void obtenirListeEntiteGeographique() {
observationModele.obtenirListeEntiteGeographique(filtres.getArbreEntiteGeographiqueObservationFiltreVue());
}
// U du CRUD
public void modifierObservation(Observation obs) {
// On raffraichi la liste d'observation
observationModele.modifierObservation(listeObservation, obs) ;
filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
}
// D du CRUD
/**
* TODO : afficher un message du type "observation modifie".
* Lance la modification d'une observation
* @param obs : l'observation a modifier
*/
public void supprimerObservation(Rafraichissable r, String numeroOrdre) {
if(listeObservation.getSelectionModel().getCount() > 0)
{
if(Window.confirm("Êtes vous sur de vouloir supprimer cette observation ?")) {
observationModele.supprimerObservation(r,numeroOrdre) ;
}
}
}
// Assistants de saisie
/**
*
* Lance un appel de recherche d'une liste de commune correspondant aux criteres de selectionne
* @param r : la vue demandeuse de donnee
* @param critere : les criteres de selection
*/
public void obtenirListeReferentielCommune(Rafraichissable r, String critere) {
observationModele.obtenirListeReferentielCommune(r,critere) ;
}
/**
*
* Lance un appel de recherche d'une liste de nom scientifique correspondant aux criteres de selectionne
* @param r : la vue demandeuse de donnee
* @param critere : les criteres de selection
*/
public void obtenirListeReferentielNom(Rafraichissable r, String critere) {
observationModele.obtenirListeReferentielNom(r,critere) ;
}
// Etat du syteme
/**
* C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
* sous forme de tableau [nom, valeur]
* @return Les noms et valeurs des filtres
*/
public String[][] renvoyerFiltres()
{
int longueur = 0;
/*String[] filtresMotsCles = filtres.getMotsClesObsVue().renvoyerValeursAFiltrer();
if(filtresMotsCles.length > 0) {
longueur++ ;
}*/
String[] filtresEntitesGeo = filtres.getArbreEntiteGeographiqueObservationFiltreVue().renvoyerValeursAFiltrer() ;
String chaineNomsFiltresGeo = filtresEntitesGeo[0] ;
String chaineValFiltresGeo = filtresEntitesGeo[1] ;
String[] filtresDate = filtres.getArbreDateObservationFiltreVue().renvoyerValeursAFiltrer() ;
String chaineNomsFiltresDate = filtresDate[0] ;
String chaineValFiltresDate = filtresDate[1] ;
String chaineNomsFiltres = chaineNomsFiltresGeo+","+chaineNomsFiltresDate ;
String chaineValFiltres = chaineValFiltresGeo+","+chaineValFiltresDate ;
String[] nomsFiltres = chaineNomsFiltres.split(",") ;
String[] valsFiltres = chaineValFiltres.split(",") ;
longueur += nomsFiltres.length;
String [][] valeursFiltres = new String[longueur][2] ;
listeObservation.afficherFiltres(chaineValFiltresGeo, chaineValFiltresDate) ;
int i = 0;
if(nomsFiltres.length > 0)
{
for(i = 0 ; i < nomsFiltres.length ; i++)
{
valeursFiltres[i][0] = nomsFiltres[i] ;
if(valsFiltres[i].equals("Inconnue"))
{
valeursFiltres[i][1] = "000null" ;
}
else
{
valeursFiltres[i][1] = valsFiltres[i] ;
}
}
}
/*if(filtresMotsCles.length > 0) {
valeursFiltres[i][0] = filtresMotsCles[0] ;
filtresMotsCles[1] = filtresMotsCles[1].replace("\n", " ");
valeursFiltres[i][1] = filtresMotsCles[1].replace(" ", ";") ;
}*/
return valeursFiltres ;
}
/**
* Retourne l'identifiant de l'utilisateur connecte
* @return : identifiant de l'utilisateur connecte
*/
public String getIdentifiant() {
return carnetEnLigneMediateur.getUtilisateur().getIdentifiant();
}
/**
*
* @return
*
*/
public Panel getPanneauPrincipalObservation() {
return panneauPrincipalObservation;
}
public void montrerContextMenu(EventObject e) {
MenuObservationVue mvo = new MenuObservationVue(this) ;
mvo.showAt(e.getXY()) ;
}
public void doubleClicListeObservation(int rowIndex) {
}
// Getters
public PanneauFiltresObservationVues getPanneauFiltres() {
return filtres;
}
public void masquerChargementInfosObservations()
{
ExtElement masked = Ext.get(details.getId());
if (masked != null && !masked.isMasked()) {
informationRepartitionVue.raz() ;
imageGeneriqueVue.raz() ;
masked.mask("Chargement", true);
}
}
public void deMasquerChargementInfosObservations()
{
ExtElement masked = Ext.get(details.getId());
if (masked != null && masked.isMasked()) {
masked.unmask() ;
}
}
public void obtenirDatesObservation() {
observationModele.obtenirDatesObservation(filtres.getArbreDateObservationFiltreVue()) ;
}
public void exporterObservations() {
observationModele.exporterObservations() ;
}
public void deconnecterUtilisateur() {
listeObservation.raz() ;
formulaireSaisieObservationVue.raz() ;
filtres.getArbreDateObservationFiltreVue().raz() ;
filtres.getArbreEntiteGeographiqueObservationFiltreVue().raz() ;
informationRepartitionVue.raz() ;
imageGeneriqueVue.raz() ;
mvz.raz() ;
}
public void supprimerLiaisonObsImage() {
String idObs = listeObservation.getIdSelectionnees()[0] ;
String idImg = mvz.getIdImage() ;
if(Window.confirm("Supprimer le lien entre l'image "+idImg+" et l'observations "+idObs+" ?"))
{
mvz.supprimerLiaisonImage() ;
observationModele.supprimerLiaisonImages(idImg,idObs) ;
}
}
public void supprimerObservations() {
if(listeObservation.getIdSelectionnees().length > 0) {
if(Window.confirm("Êtes vous sur de vouloir supprimer les observations sélectionnées ?")) {
String[] numObs = listeObservation.getIdSelectionnees();
String numObsapl = "" ;
for(int i = 0 ; i < numObs.length ; i++) {
numObsapl += numObs[i]+"," ;
}
observationModele.supprimerListeObservation(listeObservation,numObsapl) ;
}
}
else
{
Window.alert("Aucune observation sélectionnée");
}
}
public void transmettreObservations() {
if(listeObservation.getIdSelectionnees().length > 0) {
if(Window.confirm("Êtes vous sur de vouloir transmettre les observations sélectionnées ?")) {
String[] numObs = listeObservation.getIdSelectionnees();
String numObsApl = "" ;
for(int i = 0 ; i < numObs.length ; i++) {
numObsApl += numObs[i] ;
if(i != numObs.length - 1) {
numObsApl +="," ;
}
}
observationModele.transmettreListeObservation(listeObservation,numObsApl) ;
}
}
else
{
Window.alert("Aucune observation sélectionnée");
}
}
/*public void ajouterMotCleRecherche(String motCle) {
filtres.getMotsClesObsVue().rafraichir(motCle, false);
}
public void obtenirNuageMotsCles(Rafraichissable r) {
observationModele.obtenirNuageMotsCles(r);
}
public void afficherNuageMotsCles() {
if(nuaMC != null && nuaMC.isVisible()) {
nuaMC.hide();
nuaMC.close();
nuaMC = null;
}
else {
nuaMC = new NuageMotsClesVue(this);
nuaMC.show(filtres.getMotsClesObsVue().getElement());
}
}
public void AjouterMotsClesEnMasse(String motsAAjouter) {
String[] numObs = listeObservation.getIdSelectionnees();
String numObsApl = "" ;
if(numObs.length < 1) {
return;
}
for(int i = 0 ; i < numObs.length ; i++) {
numObsApl += numObs[i] ;
if(i != numObs.length - 1) {
numObsApl +="," ;
}
}
motsAAjouter = motsAAjouter.replace("\n", " ");
motsAAjouter = motsAAjouter.replace(" ", ";");
observationModele.ajouterMotsCles(listeObservation,numObsApl,motsAAjouter);
}
public void afficherSaisieMotsCles(Element e) {
SaisieMotsClesVue suaMC = new SaisieMotsClesVue(this);
suaMC.show(e.getId());
}*/
}