Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2669 → Rev 2670

/branches/v2.20-pistolet-arroseur/src/org/tela_botanica/client/image/ImageMediateur.java
New file
0,0 → 1,1820
package org.tela_botanica.client.image;
 
 
import org.tela_botanica.client.CarnetEnLigneMediateur;
import org.tela_botanica.client.cel2;
import org.tela_botanica.client.i18n.Msg;
import org.tela_botanica.client.interfaces.IdVue;
import org.tela_botanica.client.interfaces.ListePaginable;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.interfaces.VueListable;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.modeles.objets.ListeObservation;
import org.tela_botanica.client.vues.image.BarreOutilsVue;
import org.tela_botanica.client.vues.image.FenetreGestionMotsCles;
import org.tela_botanica.client.vues.image.GalerieImageVue;
import org.tela_botanica.client.vues.image.ListeImageVue;
import org.tela_botanica.client.vues.image.MenuImageVue;
import org.tela_botanica.client.vues.image.MiniListeObservationVue;
import org.tela_botanica.client.vues.image.PanneauMetadonneesVue;
import org.tela_botanica.client.vues.image.ZoomImageVue;
import org.tela_botanica.client.vues.image.filtres.BarreRechercheFiltreVue;
import org.tela_botanica.client.vues.image.filtres.PanneauFiltresImagesVues;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
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.data.Record;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.Tree;
import com.gwtext.client.dd.DragData;
import com.gwtext.client.dd.DragSource;
import com.gwtext.client.widgets.BoxComponent;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.DataView;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.TabPanel;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.event.WindowListenerAdapter;
import com.gwtext.client.widgets.grid.GridDragData;
import com.gwtext.client.widgets.layout.BorderLayout;
import com.gwtext.client.widgets.layout.BorderLayoutData;
import com.gwtext.client.widgets.menu.BaseItem;
import com.gwtext.client.widgets.menu.Item;
import com.gwtext.client.widgets.menu.Menu;
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
import com.gwtext.client.widgets.tree.TreeEditor;
import com.gwtext.client.widgets.tree.TreeNode;
 
/**
* Mediateur gérant les interactions entre vues et les echanges de données C'est
* un singleton.
*
* @author aurelien
*
*/
 
// TODO : Deporter les methodes de ListePaginable dans la liste d'images
 
public class ImageMediateur implements ListePaginable {
 
/**
* le mediateur des observations qui lie la partie images au carnet
*/
private CarnetEnLigneMediateur cMediateur = null;
 
private static ImageMediateur thisMediateur = null ;
/**
* booleen qui verifie l'unicite de l'instance (donc static)
*/
private static boolean estInstancie = false;
 
/**
* modele de données
*/
private ImageModele iModele = null;
 
/**
* L'identifiant utilisateur. Par défaut, il vaut 0
*/
private String identifiant = "0";
 
/**
* panneau principal des images (onglet "images")
*/
private Panel panneauPrincipalImage = null ;
 
/**
* panneau a onglet pour la liste, la galerie et la vue en grand
*/
private TabPanel ongletsImage = null;
 
/**
* panneau de filtrage
*/
private PanneauFiltresImagesVues filtres = null;
 
/**
* conteneur du panneau a onglets
*/
private Panel panneauMenuEtOngletsImage = null;
 
/**
* galerie de miniature
*/
private GalerieImageVue galerieImage = null;
 
/**
* liste détaillée des images
*/
private ListeImageVue listeImage = null;
 
/**
* vue agrandie de la l'image selectionnée
*/
private ZoomImageVue zoomImage = null;
 
/**
* panneau a onglets affichant les métadonnées et les mots clés
*/
private PanneauMetadonneesVue metadonneesIptcExif = null;
 
/**
* panneau conteneur pour le panneau a onglet des metadonnées
*/
private final Panel detailsEtMotsCles = new Panel(Msg.get("details-images-obs"));
 
/**
* menu contextuel de manipulation des images
*/
private MenuImageVue menuImageVue = null;
 
/**
* barre d'outils
*/
private BarreOutilsVue barreOutilsVue = null;
 
/**
* l'indice du dernier onglet sélectionné
*/
private int dernierIndexOnglet = 0;
 
/**
* booleen explicitant s'il y a une selection en cours
*/
private boolean selection = false;
 
 
/**
* Filtre pour les commentaires
*/
private BarreRechercheFiltreVue filtreCommentaires = null;
/**
* Fenetre modale de gestion des mots clés
*/
private FenetreGestionMotsCles fnMc = null;
/**
* Boolean indiquand si le médiateur a seulement été crée ou bien si tous
* les composants ont été crées
*/
private boolean estInitialise = false;
 
/**
* constructeur privé (on accède a la classe par la méthode getInstance)
*/
private ImageMediateur() {
initialiser() ;
}
 
/**
* constructeur avec paramètres privé (on accède a la classe par la méthode
* getInstance)
*
* @param cm
* le médiateur du carnet à associer à la partie image
*/
private ImageMediateur(CarnetEnLigneMediateur cm) {
cMediateur = cm;
panneauPrincipalImage = new Panel(Msg.get("images")) ;
panneauPrincipalImage.addListener(new PanelListenerAdapter() {
@Override
public boolean doBeforeRender(Component c) {
if(!estInitialise) {
initialiser() ;
}
return true;
}
});
}
 
/**
* Change la valeur du booleen de selection
*
* @param selection
* la nouvelle valeur du booléen
*/
public void setSelection(boolean selection) {
this.selection = selection;
}
 
/**
* renvoie la valeur du booleen de selection
*
* @return la valeur du booleen de selection
*/
public boolean isSelection() {
return selection;
}
 
/**
* Retourne une instance de manière unique
*
* @return l'instance unique du médiateur
*/
public static ImageMediateur Instance() {
if (!estInstancie && thisMediateur == null) {
// on en crée un nouveau
estInstancie = true;
thisMediateur = new ImageMediateur();
}
// sinon on retourne le "pointeur" vers le médiateur lui-même
return thisMediateur;
}
 
/**
* Retourne une instance de manière unique en lui associant un médiateur
* pour les observations
*
* @param cm le médiateur de carnet à associer
* @return l'instance unique du médiateur
*/
public static ImageMediateur Instance(CarnetEnLigneMediateur cm) {
if (!estInstancie && thisMediateur == null) {
// on en crée un nouveau
estInstancie = true;
thisMediateur = new ImageMediateur(cm);
}
// sinon on retourne le "pointeur" vers le médiateur lui-même
return thisMediateur;
}
private void initialiser()
{
// 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);
regionEst.setSplit(true);
 
final BorderLayoutData regionOuest = new BorderLayoutData(
RegionPosition.WEST);
regionOuest.setSplit(true);
panneauPrincipalImage.setSize(cMediateur.getPanneauPrincipalCarnetEnLigne().getWidth(), cMediateur.getPanneauPrincipalCarnetEnLigne().getHeight()) ;
panneauPrincipalImage.setLayout(new BorderLayout()) ;
 
// on crée un modèle
iModele = ImageModele.Instance(this);
 
// on gère la mise en page du panneau principal
 
// on crée le panneau des filtres
filtres = new PanneauFiltresImagesVues(this);
filtres.setWidth("15%");
 
// le panneau à onglet qui contient les trois vues
ongletsImage = new TabPanel();
 
// la galerie
galerieImage = new GalerieImageVue(this);
 
// la liste des images
listeImage = new ListeImageVue(this);
listeImage.setTitle(Msg.get("liste")) ;
 
// le panneau zoom
zoomImage = new ZoomImageVue(this);
 
// on ajoute les panneaux au panneau à onglets
ongletsImage.add(galerieImage);
ongletsImage.add(listeImage);
ongletsImage.add(zoomImage);
 
// on crée les menu et la barre de vue
menuImageVue = new MenuImageVue(this);
barreOutilsVue = new BarreOutilsVue(this);
 
// on initialise le volet qui contient les mots clés
detailsEtMotsCles.setWidth("15%");
detailsEtMotsCles.setAnimCollapse(true);
detailsEtMotsCles.setTitleCollapse(true);
detailsEtMotsCles.setCollapsible(true);
 
// on crée le panneau conteneur des métadonnées et infos
metadonneesIptcExif = new PanneauMetadonneesVue(this);
// et on l'inclut dans le volet approprié
detailsEtMotsCles.add(metadonneesIptcExif);
panneauMenuEtOngletsImage = new Panel() ;
panneauMenuEtOngletsImage.setLayout(new BorderLayout()) ;
// on ajoute la barre de vue au nord du panneau qui contient menu et
// onglets d'images
panneauMenuEtOngletsImage.add(barreOutilsVue, regionNord);
// les onglets au centre
panneauMenuEtOngletsImage.add(ongletsImage, regionCentre);
// et le panneau de métadonnées et d'info sur le coté droit
panneauPrincipalImage.add(detailsEtMotsCles, regionEst);
// on ajoute le panneau qui contient le menu et les onglets d'images au
// centre
panneauPrincipalImage.add(panneauMenuEtOngletsImage, regionCentre);
// on ajoute les filtres au panneau gauche
panneauPrincipalImage.add(filtres,regionOuest) ;
detailsEtMotsCles.addListener(new ContainerListenerAdapter() {
 
@Override
public void onResize(BoxComponent component,int adjWidth,int adjHeight,int rawWidth,int rawHeight)
{
if(detailsEtMotsCles != null && detailsEtMotsCles.isRendered() && metadonneesIptcExif != null && metadonneesIptcExif.isRendered()) {
metadonneesIptcExif.doLayout();
}
}
});
creerPanneauGestionMotsCles();
// filtres.setCollapsed(false) ;
thisMediateur = this ;
estInitialise = true ;
changerUtilisateur() ;
}
 
/**
* Renvoie l'identifiant de l'utilisateur en cours
*
* @return l'identifiant de l'utilisateur
*/
public String getIdentifiant() {
return cMediateur.getUtilisateur().getIdentifiantUtilisateurConsulte();
}
 
/**
* . Setteur pour l'identifiant de l'utilisateur en cours
*
* @param id
* le nouvel identifiant utilisateur
*/
public void setIdentifiant(String id) {
identifiant = id;
}
 
/**
* Appelle les fonctions de chargement de données, suit généralement un
* appel à setIdentifiant, pour obtenir l'arbre des mots clés et les images
* du nouvel utilisateur
*/
public void changerUtilisateur() {
getIModele().initialiserArbreMotsCles();
obtenirPhotoGalerie(getGalerieImage());
}
 
/**
* Accesseur pour le modèle associé au médiateur
*
* @return le modèle associé
*/
public ImageModele getIModele() {
return iModele;
}
 
/**
* Accesseur pour le panneau principal
*
* @return le panneau principal
*/
public Panel getPanneauPrincipalImage() {
return panneauPrincipalImage;
}
 
/**
* Accesseur pour le panneau à onglets
*
* @return le panneau à onglets
*/
public TabPanel getOngletsImage() {
return ongletsImage;
}
 
/**
* Accesseur pour la galerie d'images
*
* @return la galerie d'image
*/
public GalerieImageVue getGalerieImage() {
return galerieImage;
}
 
public ListeImageVue getListeImage() {
return listeImage;
}
 
/**
* Accesseur pour le panneau "zoom"
*
* @return le panneau zoom
*/
public ZoomImageVue getZoomImage() {
return zoomImage;
}
 
/**
* Accesseur pour le panneau détails et mot clés
*
* @return le panneau détails et mots clés
*/
public Panel getDetailsEtMotsCles() {
return detailsEtMotsCles;
}
 
/**
* Accesseur pour le booleen d'instanciation
*
* @return le booleen d'instanciation
*/
public static boolean isEstInstancie() {
return estInstancie;
}
 
/**
* Accesseur pour la panneau contenant le menu et les onglets images
*
* @return le panneauMenuEtOngletsImage
*/
public Panel getPanneauMenuEtOngletsImage() {
return panneauMenuEtOngletsImage;
}
 
/**
* Accesseur pour le menu image
*
* @return the menuImageVue
*/
public MenuImageVue getMenuImageVue() {
return menuImageVue;
}
 
/**
* Accesseur pour la barre d'outils
*
* @return the barreOutilsVue
*/
public BarreOutilsVue getBarreOutilsVue() {
return barreOutilsVue;
}
 
/**
* Accesseur pour le panneau infos et métadonnées
*
* @return the metadonneesIptcExif
*/
public PanneauMetadonneesVue getMetadonneesIptcExif() {
return metadonneesIptcExif;
}
 
/**
* Renvoie l'index du dernier onglet sélectionné
*
* @return l'index du dernier onglet
*/
public int getDernierIndexOnglet() {
return dernierIndexOnglet;
}
 
 
/**
* Accesseur pour la barre de recherche
*
* @return la barre de recherche pour filtrer les commentaires
*/
public BarreRechercheFiltreVue getFiltreCommentaires() {
return filtreCommentaires;
}
 
/**
* Renvoie la vue sélectionné par l'utilisateur
*
* @return la vue selectionnée par l'utilisateur
*/
public VueListable getVueSelectionnee() {
Panel active = ongletsImage.getActiveTab();
if (active != zoomImage) {
if (active == galerieImage) {
return galerieImage;
} else {
return listeImage;
}
 
} else {
if (dernierIndexOnglet == 0) {
return galerieImage;
} else {
return listeImage;
}
 
}
 
}
 
/**
* Renvoie l'identifiant de la vue en cours
*
* @return l'identifiant de la vue en cours de visualisation
*/
public String getIdVueSelectionnee() {
Panel active = ongletsImage.getActiveTab();
if (active != zoomImage) {
if (active == galerieImage) {
return galerieImage.getId();
} else {
return listeImage.getId();
}
 
} else {
if (dernierIndexOnglet == 0) {
return galerieImage.getId();
} else {
return listeImage.getId();
}
 
}
 
}
 
/**
* Met a jour les données provenant du modèle et synchronise les vues entre
* elles
*
* @param o
* données de mises a jour pour les vues
* @param r
* le refraichissable qui a demandé la mise a jour
*/
public void synchroniserDonneesZoomListeGalerie(Object o, Rafraichissable r) {
 
if (o instanceof Store) {
 
Store li = (Store) o;
 
if (li.getCount() <= 0) {
aucuneSelection();
if (ongletsImage.getActiveTab().getId() == getZoomImage().getId()) {
ongletsImage.activate(0);
}
} else {
selection();
}
 
if (r != getGalerieImage()) {
getGalerieImage().rafraichir(o, false);
}
if (r != getZoomImage()) {
getZoomImage().rafraichir(o, false);
}
if (r != getListeImage()) {
getListeImage().rafraichir(o, false);
}
 
demasquerChargement();
 
}
}
 
public void obtenirPhotoGalerie() {
obtenirPhotoGalerie(getGalerieImage());
}
 
/**
* envoie au modèle une demande de mise a jour
*
* @param r
* la vue demandeuse de mise a jour
*/
public void obtenirPhotoGalerie(Rafraichissable r) {
masquerChargement();
getIModele().obtenirNombrePhotoGalerie(r);
}
 
/**
* demande au modèle les métadonnées associées a une image
*
* @param r
* la vue demandeuse de mise a jour
* @param id
* l'identifiant de l'image
*/
public void obtenirMetadonnees(Rafraichissable r, String id) {
getIModele().obtenirMetadonnees(r, id);
}
 
/**
* demande au modèle les ids des mots clés associés a une image
*
* @param r
* la vue demandeuse de mise a jour
* @param id
* l'identifiant de l'image
*/
public void obtenirMotsClesId(Rafraichissable r, String id) {
getIModele().obtenirMotsClesId(r, id);
}
 
public void obtenirMotsClesTexte(Rafraichissable r, String id) {
String[] texteMotsCles = getTexteMotsCles(getIModele().getMotsClesId(id));
r.rafraichir(texteMotsCles, false);
}
//TODO: devrait être dans le modèle
public String[] getTexteMotsCles(String idsMotsCles[]) {
String[] tableauMotsClesTexte = new String[idsMotsCles.length];
for(int i=0; i< idsMotsCles.length; i++) {
tableauMotsClesTexte[i] = iModele.obtenirTexteMotCle(idsMotsCles[i]);
}
return tableauMotsClesTexte;
}
 
/**
* Envoie au modèle une demande pour obtenir l'arbre des mots clés
*
* @param r
* le raffraichissable qui a demandé la mise à jour
*/
public void obtenirArbreMotsCles(Rafraichissable r) {
getIModele().initialiserArbreMotsCles();
}
 
/**
* envoie au modèle une demande de mise a jour des informations modifiables
* associées a une image
*
* @param commentaires
* le commentaire de l'image
* @param date
* la date modifiée par l'utilisateur
*/
public void mettreAJourInfo(String commentaires, String date, String note) {
String ids[] = getVueSelectionnee().getIdSelectionnees();
 
getIModele().mettreAJourCacheImage(commentaires, date, note, ids);
getListeImage().mettreAjourInfos(commentaires, date, note);
}
 
/**
* Met à jour l'arbre des mots clés affichés dans le volet de droite à
* partir de l'arbre passé en paramètre
*
* @param arbreMC
* le nouvel arbre des mots clés
*/
public void rafraichirArbreMotsCles(Tree arbreMC) {
rafraichirArbreMotsClesFiltre(arbreMC);
metadonneesIptcExif.getPanneauMotsCles().rafraichir(arbreMC, false);
if(fnMc != null) {
fnMc.rafraichir(arbreMC, false);
}
}
public void rafraichirArbreMotsClesFiltre(Tree arbreMc) {
filtres.getMotsClesFiltre().rafraichir(arbreMc, false);
}
 
/**
* envoie au modèle une demande pour lancer le formulaire ou l'application
* d'upload
*/
public void uploaderImages(boolean multiple) {
if(cMediateur.getUtilisateur().isIdentifie()) {
getIModele().uploaderImages(multiple);
}
else
{
if(Window.confirm(Msg.get("message-envoi-images-identifie"))) {
cMediateur.afficherDialogueConnexion();
}
else
{
}
}
}
 
/**
* Envoie une demande au modèle pour obtenir toutes les données annexes de
* l'image (métadonnées, note, etc ...), on y centralise tous les appels a
* obtenirQuelqueChose
*
* @param imgNum
* l'identifiant de l'image
*/
public void obtenirDonnes(String imgNum) {
if(metadonneesIptcExif.isVisible()) {
if(imgNum == null) {
return;
}
// si on est en mode liaison, on demande la liste des obs
if(getMetadonneesIptcExif().getMiniListeObservation().getMode())
{
obtenirObservationsAssociees() ;
}
obtenirMetadonnees(metadonneesIptcExif, imgNum);
obtenirMotsClesTexte(metadonneesIptcExif.getPanneauMotsCles(), imgNum);
obtenirNote(metadonneesIptcExif.getNoteVue(), imgNum);
}
obtenirMotsClesId(fnMc, imgNum);
}
public void changerModeLiaison(boolean mode) {
if(mode) {
obtenirObservationsAssociees() ;
metadonneesIptcExif.getRechercheFiltreTaxonVue().disable();
}
else {
obtenirNombreMiniListeObservations() ;
metadonneesIptcExif.getRechercheFiltreTaxonVue().enable();
}
}
 
/**
* Envoie une demande au modèle pour obtenir la note associée à une image
*
* @param noteVue
* le rafraichissable à qui est destiné cette information
* @param imgNum
* l'identifiant de l'image
*/
private void obtenirNote(Rafraichissable r, String imgNum) {
 
getIModele().obtenirNote(r, imgNum);
}
 
/**
* est appelé lors d'un clic de souris sur une vignette dans la galerie le
* médiateur gère alors les conséquences
*
* @param index
* l'index du noeud dans la galerie
* @param node
* le noeud selectionné
* @param e
* l'object source de l'évenement
*/
public void clicGalerieImage(int index, Element node, EventObject e) {
Record rd = getGalerieImage().getDView().getRecord(node);
String imgUrl = rd.getAsString("url_image");
String imgNum = rd.getAsString("num_image");
String imgTaxon = rd.getAsString("obs_associees");
String[] imgXY = getIModele().obtenirTailleImage(
rd.getAsString("num_image"));
String[] infosImage = { imgUrl, imgXY[0], imgXY[1], imgNum, imgTaxon};
 
getZoomImage().rafraichir(infosImage, false);
dernierIndexOnglet = 0;
 
if (DOM.eventGetType(e.getBrowserEvent()) == Event.ONDBLCLICK) {
 
getOngletsImage().setActiveTab(2);
}
 
obtenirDonnes(imgNum);
 
}
 
/**
* 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 clicListeImage(int rowIndex) {
Record rd = getListeImage().getSelectionModel().getSelected();
String imgUrl = rd.getAsString("url_image");
String imgNum = rd.getAsString("num_image");
String imgTaxon = rd.getAsString("obs_associees");
String[] imgXY = getIModele().obtenirTailleImage(
rd.getAsString("num_image"));
String[] infosImage = { imgUrl, imgXY[0], imgXY[1], imgNum, imgTaxon };
 
getZoomImage().rafraichir(infosImage, false);
dernierIndexOnglet = 1;
 
obtenirDonnes(imgNum);
}
 
/**
* gestion du double clic dans la liste
*
* @param rowIndex
*/
public void doubleClicListeImage(int rowIndex) {
getOngletsImage().setActiveTab(2);
}
 
/**
* envoie une demande de mise a jour des données au modèle
*/
public void rafraichirToutesVues() {
obtenirPhotoGalerie(getIModele());
}
 
/**
* montre le menu au coordonnées indiquées
*
* @param e
* l'objet source de l'évenement
*/
public void montrerContextMenu(EventObject e) {
menuImageVue.showAt(e.getXY());
}
/**
* montre le menu au coordonnées indiquées
*
* @param e
* l'objet source de l'évenement
*/
public void montrerContextMenu(int[] XY) {
menuImageVue.showAt(XY);
}
/**
* appelé lors du double clic sur l'image agrandie
*/
public void doubleClicZoomImage() {
getOngletsImage().setActiveTab(dernierIndexOnglet);
}
 
/**
* appelé lors du clic sur un des boutons de la zone zoom
*
* @param arg
* le nom du bouton qui a cliqué
*/
public void clicBoutonZoomImage(String arg) {
 
Store st;
int selected;
int storeIndex;
Record nRec = null;
 
// tout d'abord on obtient les index selectionnés suivant la vue
if (getVueSelectionnee() == galerieImage) {
DataView dv = getGalerieImage().getDView();
st = getGalerieImage().getSt();
 
if (st.getCount() <= 0) {
return;
}
 
selected = st.indexOf(dv.getSelectedRecords()[0]);
storeIndex = dv.indexOf(selected);
} else {
st = listeImage.getSt();
 
if (st.getCount() <= 0) {
return;
}
 
selected = st.indexOf(listeImage.getSelectionModel().getSelected());
storeIndex = selected;
}
 
if (arg.equals("prev")) {
// si la photo séléctionnée est la première, on passe a la
// dernière
if (selected == 0) {
storeIndex = st.getCount() - 1;
nRec = st.getAt(storeIndex);
 
} else {
storeIndex = storeIndex - 1;
nRec = st.getAt(storeIndex);
}
 
}
 
if (arg.equals("suiv")) {
// si la photo selectionnée est la dernière on passe a la
// première
if (selected == st.getCount() - 1) {
 
storeIndex = 0;
nRec = st.getAt(0);
} else {
storeIndex = storeIndex + 1;
nRec = st.getAt(storeIndex);
}
}
 
if (nRec != null) {
String imgUrl = nRec.getAsString("url_image");
String imgNum = nRec.getAsString("num_image");
String[] imgXY = getIModele().obtenirTailleImage(
nRec.getAsString("num_image"));
String imgTaxon = nRec.getAsString("obs_associees");
String[] infosImage = { imgUrl, imgXY[0], imgXY[1], imgNum, imgTaxon };
getZoomImage().rafraichir(infosImage, false);
 
if (getGalerieImage().isRendered()) {
getGalerieImage().getDView().select(storeIndex);
}
 
if (getListeImage().isRendered()) {
getListeImage().getSelectionModel().selectRecords(nRec);
}
 
obtenirDonnes(imgNum);
}
}
 
/**
* synchronise la selection entre la galerie et la liste
*
* @param string
* le nom de la vue qui doit être synchronisee
*/
public void synchroniserSelection(String string) {
 
if (string.equals("galerie") && getDernierIndexOnglet() != 2) {
Record[] sel = getGalerieImage().getDView().getSelectedRecords();
getListeImage().selectionnerEnregistrements(sel);
}
 
if (string.equals("liste") && getDernierIndexOnglet() != 0) {
 
Record[] sel = getListeImage().getSelectionModel().getSelections();
int[] ids = new int[sel.length];
 
for (int i = 0; i < sel.length; i++) {
 
ids[i] = getGalerieImage().getSt().indexOf(sel[i]);
}
 
getGalerieImage().selectionnerImages(ids);
}
 
}
 
/**
* fait une demande de suppression des images (en local et en distant) des
* images selectionnees
*/
public void supprimerImages() {
 
String[] ids = null;
 
if (dernierIndexOnglet == 0) {
ids = getGalerieImage().getIdSelectionnees();
} else {
ids = getListeImage().getIdSelectionnees();
}
 
if (ids.length > 0) {
 
if (com.google.gwt.user.client.Window
.confirm(Msg.get("indication-supprimer-images")+" ?")) {
masquerChargement();
getIModele().supprimerImages(ids);
aucuneSelection();
}
} else {
Window.alert(Msg.get("message-suppression-images-impossible"));
}
 
}
 
/**
* desactive les onglets de metadonnees et de zoom (dans le cas ou rien
* n'est selectionne)
*/
public void aucuneSelection() {
 
if (getListeImage().getSelectionModel().getCount() <= 0
&& getGalerieImage().getDView().getSelectionCount() <= 0) {
getZoomImage().disable();
getMetadonneesIptcExif().desactiverPanneau();
getZoomImage().desactiverPanneau();
setSelection(false);
}
}
 
/**
* reactive les onglet metadonnees et zoom (lors d'une selection alors qu'il
* n'y en avait pas)
*/
public void selection() {
 
if (!isSelection()) {
getMetadonneesIptcExif().activerPanneau();
getZoomImage().activerPanneau();
getZoomImage().enable();
setSelection(true);
}
}
 
/**
* Fait apparaitre le menu contextuel de l'arbre des mots clés au niveau
* d'un noeud donné
*
* @param n
* le noeud ou le menu doit apparaitre
* @param ev
* l'objet contenant les données sur l'évenement
* @param te
* l'éditeur associé à l'arbre qui permet de modifier les
* libellés des noeuds
*/
public void montrerContextMenuArbre(final TreeNode n, EventObject ev,
final TreeEditor te) {
Menu mn = new Menu();
final com.gwtext.client.widgets.menu.Item ajoutN = new Item(Msg.get("ajouter-mot-cle"));
final com.gwtext.client.widgets.menu.Item renommerN = new Item(Msg.get("renommer-mot-cle"));
final com.gwtext.client.widgets.menu.Item suppN = new Item("supprimer-mot-cle");
 
mn.addItem(ajoutN);
mn.addItem(renommerN);
mn.addItem(suppN);
 
mn.addListener(new MenuListenerAdapter() {
 
@Override
public void onItemClick(BaseItem item, EventObject e) {
if (item.equals(suppN)) {
fnMc.supprimerNoeud(n);
}
if (item.equals(renommerN)) {
fnMc.renommerNoeud(n);
}
if (item.equals(ajoutN)) {
fnMc.ajouterNoeud(
n);
}
}
});
 
mn.showAt(ev.getXY());
 
}
 
/**
* Appelle le modèle pour mettre à jour la paire mot-clé / identifiant du
* mot clé
*
* @param text
* le texte du mot clé
* @param id
* l'identifiant du mot clé
*/
public void mettreAjourMotsClesId(String text, String id) {
 
getIModele().mettreAjourMotsClesId(text, id);
 
}
/**
* Récupère les identifiants des images selectionnés et appelle le modèle
* pour qu'il mette à jour les associations mots clés/images
*
* @param motsClesEnCours
* les mots clés à associer aux images selectionnés séparés par
* une ','
* @param arbreMC
* l'arbre des mots clés à mettre à jour
*/
public void mettreAjourMotsCles(String motsClesEnCours, Tree arbreMC) {
 
String[] ids = getGalerieImage().getIdSelectionnees();
if(ids.length > 0) {
getIModele().mettreAjourMotsCles(ids, motsClesEnCours, arbreMC);
obtenirMotsClesTexte(metadonneesIptcExif.getPanneauMotsCles(), ids[ids.length - 1]);
}
 
}
 
/**
* Appelle le médiateur pour qu'il ajoute un mot clé dans l'arbre des mots
* clés
*
* @param n
* le noeud à ajouter à l'arbre
* @param arbreMC
* le nouvel arbre de mots clés à mettre à jour
*/
public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
getIModele().ajouterMotCleDansArbre(n, arbreMC, r);
filtres.getMotsClesFiltre().rafraichir(arbreMC, false);
mettreAJourListeMotsClesAffiches();
}
 
/**
* Appelle le médiateur pour qu'il supprime un mot clé et son sous arbre
* dans l'arbre des mots clés
*
* @param n
* le noeud à supprimer
* @param arbreMC
* le nouvel arbre de mots clés à mettre à jour
*/
public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
getIModele().supprimerMotCleDansArbre(n, arbreMC, r);
filtres.getMotsClesFiltre().rafraichir(arbreMC, false);
mettreAJourListeMotsClesAffiches();
}
 
/**
* Appelle le médiateur pour qu'il modifie un mot clé dans l'arbre des mots
* clés
*
* @param n
* le noeud à modifier
* @param arbreMC
* le nouvel arbre de mots clés à mettre à jour
*/
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
getIModele().modifierMotCleDansArbre(n, arbreMC, r);
getIModele().mettreAjourMotsClesId(n.getText(), n.getId());
filtres.getMotsClesFiltre().rafraichir(arbreMC, false);
mettreAJourListeMotsClesAffiches();
}
 
/**
* Appelle le médiateur pour qu'il déplace un mot clé et son sous arbre dans
* l'arbre des mots clés
*
* @param n
* le noeud à déplacer
* @param arbreMC
* le nouvel arbre de mots clés à mettre à jour
*/
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
getIModele().deplacerMotCleDansArbre(n, arbreMC, r);
filtres.getMotsClesFiltre().rafraichir(arbreMC, false);
mettreAJourListeMotsClesAffiches();
}
public void mettreAJourListeMotsClesAffiches() {
String[] ids = getGalerieImage().getIdSelectionnees();
if(ids.length > 0) {
obtenirMotsClesTexte(metadonneesIptcExif.getPanneauMotsCles(), ids[ids.length - 1]);
}
}
 
/**
* initialise les mots clés cochés par rapport aux images sélectionnées
*/
public void initialiserMotsCleCoches() {
obtenirMotsClesId(metadonneesIptcExif.getPanneauMotsCles(),getGalerieImage().getIdSelectionnees()[0]);
}
 
/**
* Appelle le modèle pour lui demander les données d'une page à afficher
*
* @param pageCourante
* le numéro de page à affciher
*/
@Override
public void changerNumeroPage(int pageCourante) {
 
// on met le mesage d'attente
masquerChargement();
 
// on appelle le modèle
getIModele().changerNumeroPage(pageCourante);
 
// et met à jour les numéros de page dans les barre d'outils
getGalerieImage().getToolBarVue().changerPageCourante(pageCourante);
getListeImage().getToolBarVue().changerPageCourante(pageCourante);
}
 
/**
* Appelle le modèle pour qu'il change la taille de page utilisée
*
* @param nouvelleTaillePage
* la nouvelle taille de page
*/
@Override
public void changerTaillePage(int nouvelleTaillePage) {
// on met le message d'attente
masquerChargement();
 
// on appelle le modèle
getIModele().changerTaillePage(nouvelleTaillePage);
 
// et on met à jour la taille de page dans les barres d'outils
getGalerieImage().getToolBarVue().selectionnerTaillePage(
nouvelleTaillePage);
getListeImage().getToolBarVue().selectionnerTaillePage(
nouvelleTaillePage);
}
 
/**
* Met à jour les barre d'outils avec des nouvelles valeurs
*
* @param pageMax
* le nombre de pages
* @param pageEncours
* la page en cours
* @param taillePage
* la taille de page
* @param nbElement
* le nombre d'élements par page
*/
public void changerPageMaxEtCourante(int pageMax, int pageEncours,
int taillePage, int nbElement) {
 
int[] pages = { pageMax, pageEncours, taillePage, nbElement };
getGalerieImage().getToolBarVue().rafraichir(pages, false);
getListeImage().getToolBarVue().rafraichir(pages, false);
 
}
 
/**
* Recherche l'élement actuellement affiché et affiche son message de
* chargement
*/
public void masquerChargement() {
if(GWT.isScript()) {
ExtElement masked = Ext.get(getIdVueSelectionnee());
if (masked != null && !masked.isMasked()) {
masked.mask(Msg.get("chargement"), true);
}
}
}
 
/**
* Recherche l'élement actuellement affiché et retire son message de
* chargement si l'était affiché
*/
public void demasquerChargement() {
if(GWT.isScript()) {
ExtElement masked = Ext.get(getIdVueSelectionnee());
if (masked != null && masked.isMasked()) {
masked.unmask();
}
}
}
 
public void afficherMenuId() {
IdVue i = new IdVue(this);
i.show();
}
 
/**
* 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() {
String[][] valeursFiltres = filtres.renvoyerValeursAFiltrer();
barreOutilsVue.setFiltresEnCours(valeursFiltres);
 
return valeursFiltres;
}
 
/**
* Indique si les filtres ont changés depuis la dernière requête (il faut
* faire un OR sur le résultat de toutes les fonctions renvoyerEtatFiltre
* s'il y a plus d'un filtre)
*
* @return true si au moins un des filtres a changé, false sinon
*/
public boolean getEtatFiltres() {
return (filtres.renvoyerEtatFiltre());
}
 
/**
* Accesseur pour le panneau de droite contenant les filtres
*
* @return le panneau contenant les filtres
*/
public PanneauFiltresImagesVues getPanneauFiltres() {
return filtres;
}
/**
* Réinitialise tous les filtres en cours
*
*/
public void viderFiltres() {
filtres.viderFiltres();
obtenirPhotoGalerie();
}
/**
* Réinitialise un filtre en cours suivant le nom donné
*
* @param String le nom du filtre
*/
public void viderFiltre(String nom) {
filtres.viderFiltre(nom);
obtenirPhotoGalerie();
}
 
/**
* ajoute les images séléctionnées dans la vue courante au tampon
*/
public void ajouterImagesSelection() {
String[] ids = getVueSelectionnee().getIdSelectionnees();
String id = "";
for (int i = 0; i < ids.length; i++) {
id += " - " + ids[i];
}
getIModele().ajouterImagesSelection(ids);
String[] stParams = {ids.length+""};
Window.alert(Msg.get("nb-images-ajoutees-tampon", stParams));
 
}
/**
* Affiche les ids des images contenues dans le tampon
*/
public void afficherIdSelectionImages() {
Window.alert(Msg.get("contenu-tampon")+" : " + getIModele().renvoyerSelection());
 
}
/**
* Renvoie les ids des images contenues dans le tampon en une seule string
* @return une string de la forme id1, id2, id3
*/
public String renvoyerSelection() {
return getIModele().renvoyerSelection();
}
/**
* Vide le tampon d'images
*/
public void viderSelection() {
 
getIModele().viderSelection();
Window.alert(Msg.get("tampon-a-ete-vide"));
 
}
public int getCompteSelection() {
return getIModele().getCompteSelection();
}
 
/**
* Fonction appelée lors du drag 'n drop d'une image sur une observation
* @param source la source du drag
* @param e l'objet sur lequel on a fait le drop
* @param data les données
* @return une booleen indiquant le succès ou l'échec de l'opération
*/
public boolean lierImagesDD(DragSource source, EventObject e, DragData data) {
// on peut convertir directement les données car on a testé avant le type de données
GridDragData gdd = (GridDragData)data ;
// les ids des images sont initialisées
String idsImg = "" ;
// on obtient la liste des selections dans la source
Record[] aLier = gdd.getSelections() ;
for (int i = 0; i < aLier.length; i++)
{
// on les concatènes en une seule chaine
idsImg += aLier[i].getAsString("id_image")+"," ;
}
MiniListeObservationVue mv = getMetadonneesIptcExif().getMiniListeObservation() ;
// on cherche quel est la ligne sur laquelle on a fait le drop dans la la liste des observations
int index = mv.getView().findRowIndex(e) ;
Record rddrop = mv.getStore().getRecordAt(index) ;
// SI l'enregistrement existe bel et bien
if(rddrop != null)
{
String idObss = rddrop.getAsString("id_obs")+"," ;
String message = "";
idObss = rddrop.getAsString("id_obs")+",";
message = Msg.get("question-lier-images-obs-sel")+" ?";
if(Window.confirm(message)) {
lierImagesObservation(idObss, idsImg) ;
}
}
return true ;
}
/**
* Fonction appelée lors du drag 'n drop d'une observation sur une image
* @param source la source du drag
* @param e l'objet sur lequel on a fait le drop
* @param data les données
* @return une booleen indiquant le succès ou l'échec de l'opération
*/
public boolean lierObsDD(DragSource source, EventObject e, DragData data, String idDest) {
// on peut convertir directement les données car on a testé avant le type de données
GridDragData gdd = (GridDragData)data ;
// les ids des images sont initialisées
String idsObs = "" ;
// on obtient la liste des selections dans la source
Record[] aLier = gdd.getSelections() ;
for (int i = 0; i < aLier.length; i++)
{
// on les concatènes en une seule chaine
idsObs += aLier[i].getAsString("id_obs")+"," ;
}
Record rddrop = null ;
int index = -1;
// si la destination est la galerie d'images
if(idDest.equals(getGalerieImage().getId()))
{
GalerieImageVue gv = getGalerieImage() ;
// alors l'élément sur lequel on a fait le drop n'est pas le bon
index = gv.getDView().indexOf(e.getTarget()) ;
Element el = e.getTarget() ;
// alors on cherche son parent tant que celui-ci n'est pas présent dans la dataview
while(index == -1 && el != null)
{
index = gv.getDView().indexOf(el) ;
el = (Element) el.getParentElement() ;
}
// si on l'a trouvé, on obtient l'enregistrement qui correspond
if(index != -1)
{
rddrop = gv.getSt().getAt(index) ;
}
}
// si la destination est la liste d'images
if(idDest.equals(getListeImage().getId()))
{
// on obtient directement l'enregistrement correspondant à l'élément sur lequel on a fait le drop
ListeImageVue lv = getListeImage() ;
index = lv.getView().findRowIndex(e) ;
rddrop = lv.getSt().getAt(index) ;
}
// si on a bien obtenu un enregistrement
if(rddrop != null)
{
String idImgs = "";
Record[] selection = galerieImage.getDView().getSelectedRecords();
boolean lierSelection = false;
String message = "";
// si l'element sur lequel on a fait le drop fait partie
// de la selection alors on lie tout à la selection
if(galerieImage.getDView().isSelected(index)) {
lierSelection = true;
// on itère sur toutes les images selectionnées
for(int i=0; i<selection.length; i++) {
// et on récupère leur ids
idImgs += selection[i].getAsString("id_image")+"," ;
}
}
if(!lierSelection) {
idImgs = rddrop.getAsString("id_image")+",";
message = Msg.get("question-lier-obs-image-point")+" ?";
} else {
message = Msg.get("question-lier-obs-images-sel")+" ?";
}
if(Window.confirm(message)) {
lierImagesObservation(idsObs, idImgs) ;
}
return true ;
}
// si la destination est l'image zoomée
if(idDest.equals(getZoomImage().getId()))
{
// on obtient directement l'id correspondant
ZoomImageVue zv = getZoomImage() ;
String idImg = zv.getIdImage() ;
lierImagesObservation(idsObs, idImg) ;
return true ;
}
return false ;
}
public void LierTamponObservations() {
Record[] obsRec = getMetadonneesIptcExif().getMiniListeObservation().getSelectionModel().getSelections() ;
String idsObs = "" ;
for(int i =0 ; i< obsRec.length ; i++)
{
idsObs += obsRec[i].getAsString("id_obs")+"," ;
}
if(getIModele().renvoyerSelection().equals("-255"))
{
Window.alert(Msg.get("tampon-vide"));
return ;
}
if(obsRec.length == 0)
{
Window.alert(Msg.get("aucune-obs-selectionnee")) ;
return ;
}
else
{
lierImagesObservation(idsObs, getIModele().renvoyerSelection()) ;
}
}
public void LierObservations() {
Record[] obsRec = getMetadonneesIptcExif().getMiniListeObservation().getSelectionModel().getSelections() ;
String idsObs = "" ;
String[] idsImg = getGalerieImage().getIdSelectionnees();
String selectionImages = "";
if(idsImg.length <= 0)
{
Window.alert(Msg.get("aucune-image-selectionnee")) ;
return ;
} else {
for (int i = 0; i < idsImg.length; i++) {
String idEncours = iModele.obtenirIdPourOrdre(idsImg[i]);
selectionImages += idEncours + ",";
}
}
if(obsRec.length == 0)
{
Window.alert(Msg.get("aucune-obs-selectionnee")) ;
return ;
} else {
for(int i =0 ; i< obsRec.length ; i++)
{
idsObs += obsRec[i].getAsString("id_obs")+"," ;
}
}
String message = Msg.get("question-lier-obs-sel-images-sel")+" ?";
if(Window.confirm(message)) {
lierImagesObservation(idsObs, selectionImages) ;
}
}
/**
* Lie une ou plusieurs images à une ou plusieurs observations
* @param idsObs les identifiants des observations séparés par des ","
* @param idsImg les identifiants des images séparés par des ","
*/
public void lierImagesObservation(String idsObs, String idsImg)
{
getIModele().lierImagesObervations(idsObs,idsImg) ;
}
 
public void deconnecterUtilisateur() {
if(panneauPrincipalImage.isVisible())
{
setIdentifiant(cMediateur.getUtilisateur().getIdentifiantUtilisateurConnecte()) ;
changerUtilisateur() ;
}
else
{
panneauPrincipalImage.addListener(new ContainerListenerAdapter()
{
@Override
public void onRender(Component component)
{
setIdentifiant(cMediateur.getUtilisateur().getIdentifiantUtilisateurConnecte()) ;
changerUtilisateur() ;
panneauPrincipalImage.purgeListeners() ;
}
}) ;
}
}
public void connecterUtilisateur() {
if(panneauPrincipalImage.isVisible()) {
setIdentifiant(cMediateur.getUtilisateur().getIdentifiantUtilisateurConnecte());
getIModele().initialiserArbreMotsCles();
filtres.getArbreDateRecherche().initialiser();
obtenirPhotoGalerie(getGalerieImage());
}
else
{
panneauPrincipalImage.addListener(new ContainerListenerAdapter()
{
@Override
public void onRender(Component c)
{
setIdentifiant(cMediateur.getUtilisateur().getIdentifiantUtilisateurConnecte());
getIModele().initialiserArbreMotsCles();
filtres.getArbreDateRecherche().initialiser();
obtenirPhotoGalerie(getGalerieImage());
panneauPrincipalImage.purgeListeners() ;
}
}) ;
}
}
public String[] renvoyerFiltresObservation() {
String[] rien = {"nom_taxon",""};
if(getMetadonneesIptcExif() != null) {
return getMetadonneesIptcExif().getRechercheFiltreTaxonVue().renvoyerValeursAFiltrer();
} else {
return rien;
}
}
public void obtenirNombreMiniListeObservations(
Rafraichissable r) {
iModele.obtenirNombreMiniListeObservations(r, renvoyerFiltresObservation());
}
 
public void obtenirNombreMiniListeObservations() {
iModele.obtenirNombreMiniListeObservations(getMetadonneesIptcExif().getMiniListeObservation(), renvoyerFiltresObservation());
}
 
public void obtenirMiniListeObservations(
Rafraichissable r, int taillePage, int numeroPage) {
iModele.obtenirMiniListeObservations(r, renvoyerFiltresObservation(), taillePage, numeroPage) ;
}
 
public void afficherAide() {
String aideUrl = Configuration.getAideBaseUrl() ;
Window.open(aideUrl, "", "") ;
}
 
public void soumettreBugRemarque() {
String suiviUrl = Configuration.getSuiviBugUrl() ;
Window.open(suiviUrl, "", "") ;
}
 
public void obtenirObservationsAssociees() {
String ids[] = getVueSelectionnee().getIdSelectionnees() ;
if(ids.length > 0) {
getMetadonneesIptcExif().getMiniListeObservation().masquerChargement() ;
getIModele().obtenirLiaisonObservations(this,ids[0]);
}
}
public void rafraichirMiniListeObservations(ListeObservation listeObs) {
if(getMetadonneesIptcExif() != null && getMetadonneesIptcExif().isCreated()) {
if(getMetadonneesIptcExif().getMiniListeObservation().isCreated())
{
getMetadonneesIptcExif().getMiniListeObservation().rafraichir(listeObs, false) ;
}
}
}
 
public void supprimerLiaisonObsImage() {
 
String idsImg[] = getVueSelectionnee().getIdSelectionnees() ;
String idObs = getMetadonneesIptcExif().getMiniListeObservation().getIdSelectionnees() ;
if(Window.confirm(Msg.get("supprimer-lien-images-obs")+" ?"))
{
getMetadonneesIptcExif().getMiniListeObservation().supprimerLiaison() ;
iModele.supprimerLiaisonImages(idsImg,idObs) ;
}
}
public boolean estInstancie() {
return estInstancie ;
}
 
public void donneesExterieures(Object o) {
if(estInitialise) {
iModele.rafraichir(o, true);
}
}
 
public void obtenirDatesImages(Rafraichissable r) {
iModele.obtenirDatesImages(r);
}
public void creerPanneauGestionMotsCles() {
fnMc = new FenetreGestionMotsCles() {
@Override
protected void surSuppressionMotCle(TreeNode node, Tree arbre) {
supprimerMotCleDansArbre(node, arbre, fnMc);
}
@Override
protected void surDeplacementMotCle(TreeNode node, Tree arbre) {
deplacerMotCleDansArbre(node, arbre, fnMc);
}
@Override
protected void surClicValider(String chaineMotsCles, Tree arbre) {
mettreAjourMotsCles(chaineMotsCles, arbre);
}
@Override
protected void surChangementTexte(TreeNode node, Tree arbre) {
modifierMotCleDansArbre(node, arbre, fnMc);
}
@Override
protected void surAjoutMotCle(TreeNode node, Tree arbre) {
ajouterMotCleDansArbre(node, arbre, fnMc);
}
@Override
protected void surAffichageMenuContextuel(TreeNode node, EventObject e,
TreeEditor te) {
montrerContextMenuArbre(node, e, te);
}
@Override
protected void demanderArbreMotsCles(Rafraichissable r) {
ImageMediateur.this.obtenirArbreMotsCles(r);
}
protected void surRetourWebService(Tree arbreMc) {
rafraichirArbreMotsClesFiltre(arbreMc);
}
};
fnMc.setModal(true);
fnMc.setHeight(420);
fnMc.setWidth(285);
fnMc.addListener(new WindowListenerAdapter() {
 
@Override
public void onClose(Panel panel) {
}
 
});
//fnMc.activerBoutonValider(selection);
}
 
public void afficherFenetreGestionMotsCles() {
fnMc.show();
String[] ids = getVueSelectionnee().getIdSelectionnees();
if(ids.length > 0) {
obtenirMotsClesId(fnMc, ids[ids.length - 1]);
}
}
 
}
/branches/v2.20-pistolet-arroseur/src/org/tela_botanica/client/image/ImageModele.java
New file
0,0 → 1,940
package org.tela_botanica.client.image;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
 
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.ImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.ImageUploaderAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.LiaisonMotsClesImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.LienImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.ListeDateImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.ListeImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.ListeObservationAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.MotsClesAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.NombreImageAsynchroneDAO;
import org.tela_botanica.client.modeles.dao.NombreObservationAsynchroneDAO;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.modeles.objets.ImageCarnet;
import org.tela_botanica.client.modeles.objets.ListeImageCarnet;
import org.tela_botanica.client.modeles.objets.ListeObservation;
import org.tela_botanica.client.modeles.objets.Utilisateur;
import org.tela_botanica.client.util.MotsClesUtilitaire;
 
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.user.client.Window;
import com.gwtext.client.data.ArrayReader;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.MemoryProxy;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.data.Tree;
import com.gwtext.client.widgets.tree.TreeNode;
 
/**
* Modèle d'accès aux données pour les images. C'est un singleton
*
* @author aurelien
*
*/
public class ImageModele implements Rafraichissable {
 
/**
* Booleen indiquant si le médiateur est instancié (l'instance doit être
* unique donc le booleen est static)
*/
private static boolean estInstancie = false;
 
/**
* le modèle lui même
*/
private static ImageModele thisModele = null;
 
/**
* Le médiateur associé au modèle
*/
private ImageMediateur iMediateur = null;
 
/**
* La configuration en cours
*/
private Configuration config = null;
 
/**
* La liste des image affichées en cours
*/
private ListeImageCarnet cacheImage = new ListeImageCarnet(0);
/**
* Table de correspondance entre les mots clés et leurs identifiants
*/
private HashMap<String, String> motsCles = new HashMap<String, String>(0);
/**
* Le store contenant les données à afficher, que le modèle transmet au
* médiateur quand il le demande
*/
private Store st = null;
/**
* Arbre des mots clés
*/
private com.gwtext.client.data.Tree arbreMotsCles = new Tree();
 
/**
* Numéro de page en cours
*/
private int pageEncours = 0;
/**
* Nombre de pages totales
*/
private int pageMax = 1;
/**
* Taille de page (par défaut 50)
*/
private int taillePage = 50;
/**
* Nombre d'éléments total correspondant à la requete
*/
private int nbElements = 0;
 
/**
* "Presse papier" pour les images qui permet de garder en mémoire une
* sélection
*/
private Vector<String> selectionImages = new Vector<String>(0);
 
/**
* Retourne une instance de manière unique
*
* @param im
* le médiateur à associer
* @return l'instance du modèle
*/
static ImageModele Instance(ImageMediateur im) {
// si le modèle n'est pas encore instancié
if (!estInstancie) {
// on en crée un nouveau
estInstancie = true;
thisModele = new ImageModele(im);
}
 
// sinon on retourne le "pointeur" vers le modèle lui-même
return thisModele;
 
}
 
/**
* Le constructeur est privé et seule la méthode instance y accède
*
* @param im
* le médiateur à associer
*/
private ImageModele(ImageMediateur im) {
 
iMediateur = im;
config = new Configuration();
}
 
/**
* Accesseur pour le médiateur
*
* @return le médiateur associé
*/
public ImageMediateur getIMediateur() {
return iMediateur;
}
 
/**
* Appelle le DAO asynchrone pour obtenir la liste des images
*
* @param r
* le rafraichissable auxquel on enverra les données
*/
public void obtenirNombrePhotoGalerie(Rafraichissable r) {
 
String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
 
int tailleFiltres = valeursFiltres.length;
 
String[][] criteres = new String[tailleFiltres][2];
 
String[] utilisateur = {
"" + getIMediateur().getIdentifiant() };
criteres[0] = utilisateur;
 
 
for (int i = 0; i < valeursFiltres.length; i++) {
criteres[i] = valeursFiltres[i];
}
 
// on les crée un DAO auquel on les transmet et qui demande le nombre
// d'images correspondantes (pour les pages)
NombreImageAsynchroneDAO niaDAO = new NombreImageAsynchroneDAO(this);
niaDAO.obtenirNombreImages(this, criteres);
}
public void obtenirPhotoGalerie(Rafraichissable r)
{
String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
int tailleFiltres = valeursFiltres.length;
String[][] criteres2 = new String[tailleFiltres + 2][2];
String[] limite = { "limite", "" + taillePage };
String[] taillePage = { "numero_page", "" + pageEncours };
criteres2[0] = limite;
criteres2[1] = taillePage;
 
for (int i = 0; i < valeursFiltres.length; i++) {
criteres2[i + 2] = valeursFiltres[i];
}
// et on crée un DAO auquel on les transmet et qui envoie une requete
// pour recevoir les images
ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO(this);
liaDAO.ObtenirListeImages(this, criteres2);
}
 
/**
* Appelle le DAO d'upload qui va choisir la methode d'upload adaptée et
* lancer l'interface appropriée
*/
@SuppressWarnings("static-access")
public void uploaderImages(boolean multiple) {
ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO(this);
if(multiple) {
IuADaO.appelerUploadMultiple();
}
else
{
IuADaO.appelerUploadSimple();
}
}
 
/**
* Met à jour la liste des images à partir d'un objet
*
* @param o
* la nouvelle liste d'image
*/
public void rafraichirListeImage(Object o) {
cacheImage = (ListeImageCarnet) o;
}
 
/**
* Met à jour l'arbre des mots clés à partir d'un objet
*
* @param o
* le nouvel arbre de mots clés
*/
public void rafraichirArbreMotsCles(Object o) {
arbreMotsCles = (com.gwtext.client.data.Tree) o;
}
 
/**
* Met à jour la table de correspondance mots clés / ids à partir d'un objet
*
* @param o
* la nouvelle table des mots clés
*/
@SuppressWarnings("unchecked")
public void rafraichirMotsCles(Object o) {
if (o instanceof HashMap) {
motsCles = (HashMap<String, String>) o;
}
}
 
/**
* Va chercher les métadonnées associées à une image dans la liste des
* images chargée dans le modèle
*
* @param r
* le rafraichissable auquel on enverra les informations
* @param id
* l'identifiant de l'image
*/
public void obtenirMetadonnees(Rafraichissable r, String id) {
ImageCarnet im = cacheImage.get(id);
 
Object meta[] = new Object[3];
meta[0] = im.getMetadonnesExif();
meta[1] = im.getMetadonnesIptc();
meta[2] = im.getInfoGenerales();
 
r.rafraichir(meta, false);
}
 
/**
* Va chercher les mots clés associés à une image dans la liste des images
* chargée dans le modèle
*
* @param r
* le rafraichissable auquel on enverra les informations
* @param id
* l'identifiant de l'image
*/
public void obtenirMotsClesId(Rafraichissable r, String id) {
 
String[] motsClesIdTab = getMotsClesId(id);
r.rafraichir(motsClesIdTab, false);
}
public String[] getMotsClesId(String idImage) {
ImageCarnet im = cacheImage.get(idImage);
String motsClesId = im.getMotsCles();
String[] motsClesIdTab = motsClesId.split(",");
return motsClesIdTab;
}
/**
* Va chercher le nom du mot clé associé à un id dans le cache local
*
* @param String id
* id du mot clé
* @return le mot clé associé à l'identifiant
*/
public String obtenirTexteMotCle(String id) {
String correspondanceId = "";
String motCleTexte = motsCles.get(id);
if(motCleTexte != null) {
correspondanceId = motCleTexte;
}
return correspondanceId;
}
/**
* Construit une chaine contenant le texte des mots clés séparés par des virgules
*/
public String renvoyerChaineMotClesTexte(ImageCarnet ic) {
String chaineMotsCles = ic.getMotsCles();
String[] tabMotsCles = chaineMotsCles.split(",");
String chaineMotsClesTexte = "";
for (int i = 0; i < tabMotsCles.length; i++) {
chaineMotsClesTexte += motsCles.get(tabMotsCles[i]);
chaineMotsClesTexte += (i != tabMotsCles.length - 1) ? "," : "";
}
return chaineMotsClesTexte;
}
 
/**
* Met à jour la liste des images en local et appelle le DAO de mise à jour
* pour les commentaires et la date des images selectionnées
*
* @param commentaires
* le commentaire à appliquer
* @param date
* la date à appliquer
* @param ids
* les identifiants des images selectionnées
*/
public void mettreAJourCacheImage(String commentaires, String date,
String note, String ids[]) {
for (int i = 0; i < ids.length; i++) {
String key = ids[i];
ImageCarnet ic = cacheImage.get(key);
ic.miseAJourInfoGenerales(commentaires, date, note);
mettreAjourBaseDeDonneesImageCarnet(ic);
}
 
}
 
/**
* Ajoute un nouveau mot clés à la liste des mots clés locale
*
* @param text
* le mot clé
* @param id
* l'identifiant du mot clé
*/
public void mettreAjourMotsClesId(String text, String id) {
motsCles.put(id, text);
}
 
/**
* Appelle le DAO chargé de mettre à jour la base de données avec les toutes
* les informations des images modifiées par l'utilisateur
*/
public void mettreAJourBaseDeDonneesListeImageCarnet() {
ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO(this);
 
liDaO.SynchroniserBaseDeDonnees(cacheImage);
}
 
/**
* Appelle le DAO chargé de mettre à jour la base de données avec les toutes
* les informations d'une image donnée
*
* @param ic
* l'image à synchroniser avec la base
*/
public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic) {
ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO(this);
iaDaO.SynchroniserBaseDeDonnees(ic);
}
 
/**
* Supprime les images données du cache local et appelle le DAO qui les
* supprime de la base de données
*
* @param ids
* les identifiants des images selectionnées
*/
public void supprimerImages(String[] ids) {
String rids[] = new String[ids.length];
ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO(this);
 
for (int i = 0; i < ids.length; i++) {
String key = ids[i];
ImageCarnet ic = cacheImage.get(key);
rids[i] = ic.getId();
 
cacheImage.remove(key);
}
 
if (rids.length != 0) {
liDao.supprimerBaseDeDonnees(rids);
}
}
 
/**
* Met à jour les données locales suivant le type des nouvelles données et
* appelle le médiateur pour le notifier de la mise à jour
*/
@Override
public void rafraichir(Object nouvelleDonnees,
boolean repandreRafraichissement) {
// si l'on a reçu une liste d'images
if (nouvelleDonnees instanceof ListeImageCarnet) {
ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees;
Object[][] photoData = new Object[data.size()][13];
int i = 0;
 
if (data.size() == 0) {
pageEncours = 0;
}
 
// on la parse et on récupère les informations qui nous interessent
for (Iterator<String> it = data.keySet().iterator(); it.hasNext();) {
ImageCarnet im = data.get(it.next());
photoData[i][0] = im.getOrdre();
photoData[i][1] = im.getNomOriginal();
photoData[i][2] = im.getDate();
photoData[i][3] = im.getIptcCity();
photoData[i][4] = im.getFabriquantAppareil() + " " + im.getModeleAppareil();
photoData[i][5] = im.getUrlFormatListe();
photoData[i][6] = im.getUrlFormatGalerie();
photoData[i][7] = im.getUrlFormatZoom();
photoData[i][8] = im.getNote();
photoData[i][9] = im.getId();
photoData[i][10] = im.getTailleImage()[1];
photoData[i][11] = im.getTailleImage()[0];
photoData[i][12] = im.getIdsObsAssociees();
 
i++;
}
 
// creation du store qui les contient
FieldDef defNumImage = new IntegerFieldDef("num_image");
FieldDef defNomImage = new StringFieldDef("nom_original");
FieldDef defDatImage = new StringFieldDef("dat_image");
FieldDef defLieImage = new StringFieldDef("lie_image");
FieldDef defAppImage = new StringFieldDef("app_image");
FieldDef defUrlImageS = new StringFieldDef("url_image_S");
FieldDef defUrlImageM = new StringFieldDef("url_image_M");
FieldDef defUrlImage = new StringFieldDef("url_image");
FieldDef defNoteImage = new IntegerFieldDef("note_image");
FieldDef defIdImage = new IntegerFieldDef("id_image");
FieldDef defTailleX = new IntegerFieldDef("taille_x");
FieldDef defTailleY = new IntegerFieldDef("taille_y");
FieldDef defObsAssociees = new StringFieldDef("obs_associees");
FieldDef[] defTab = { defNumImage,defNomImage, defDatImage, defLieImage,
defAppImage, defUrlImageS, defUrlImageM, defUrlImage,
defNoteImage, defIdImage, defTailleX, defTailleY, defObsAssociees };
RecordDef rd = new RecordDef(defTab);
 
final MemoryProxy dataProxy = new MemoryProxy(photoData);
final ArrayReader reader = new ArrayReader(rd);
 
final Store photoStore = new Store(dataProxy, reader);
 
rafraichirListeImage(nouvelleDonnees);
 
st = photoStore;
st.load();
 
// par défaut le store est trié sur le numéro d'image
st.sort("num_image");
 
// si on doit répandre les données, on notifie le médiateur qui les
// distribuera à son tour
if (repandreRafraichissement) {
getIMediateur().synchroniserDonneesZoomListeGalerie(st, this);
}
}
 
// si on reçoit un tableau JSON
if (nouvelleDonnees instanceof JSONArray) {
// alors on a reçu les informations sur les mots clés
JSONArray donneesArbre = (JSONArray)nouvelleDonnees;
Object[] arbreEtCorrespondancesIds = MotsClesUtilitaire.construireArbre("Tags", "racine", donneesArbre, false);
arbreMotsCles = (Tree)arbreEtCorrespondancesIds[0];
motsCles = (HashMap<String, String>)arbreEtCorrespondancesIds[1];
 
// enfin on met à jour l'arbre des mots clés contenu dans le modèle
rafraichirArbreMotsCles(arbreMotsCles);
// la table de hachage
rafraichirMotsCles(motsCles);
// et on notifie le médiateur de la mise à jour en lui passant une
// copie des données
getIMediateur().rafraichirArbreMotsCles(arbreMotsCles);
}
 
// Si on reçoit un tableau d'entiers
// c'est un tableau d'un seul entier qui est le nombre d'images
// correspondant aux critères
if (nouvelleDonnees instanceof int[]) {
int[] pages = (int[]) nouvelleDonnees;
 
// on calcule le nombre de pages nécessaires et on les met à jour
// dans le modèle
pageMax = calculerNbPages(pages[0]);
nbElements = pages[0];
 
// et on notifie de le mediateur du changement des valeurs
getIMediateur().changerPageMaxEtCourante(pageMax, pageEncours,
taillePage, pages[0]);
obtenirPhotoGalerie(this) ;
}
if(nouvelleDonnees instanceof ListeObservation) {
getIMediateur().rafraichirMiniListeObservations((ListeObservation)nouvelleDonnees) ;
}
if(nouvelleDonnees instanceof Tree) {
rafraichirArbreMotsCles(nouvelleDonnees);
getIMediateur().rafraichirArbreMotsCles((Tree)nouvelleDonnees);
}
}
 
/**
* Met à jour les mots clés associés à une image et appelle le DAO pour
* synchroniser la base de données
*
* @param ids
* les identifiants des images selectionnées
* @param motsClesEnCours
* les mots clés à appliquer aux images
* @param arbreMC
* l'arbre de mots clés en cours
*/
public void mettreAjourMotsCles(String[] ids, String motsClesEnCours,
com.gwtext.client.data.Tree arbreMC) {
String idImgs = "";
for (int i = 0; i < ids.length; i++) {
String idImageEnCours = "";
if (cacheImage.containsKey(ids[i])) {
ImageCarnet ic = cacheImage.get(ids[i]);
idImageEnCours = ic.getId();
ic.mettreAjourMotsCles(motsClesEnCours);
}
idImgs += idImageEnCours;
idImgs += (i < (ids.length - 1)) ? ",": "";
}
LiaisonMotsClesImageAsynchroneDAO liMcDao = new LiaisonMotsClesImageAsynchroneDAO(this);
liMcDao.modifier(this, Utilisateur.getInstance().getIdentifiantUtilisateurConsulte(), idImgs, motsClesEnCours);
 
rafraichirArbreMotsCles(arbreMC);
}
 
/**
* Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la
* base de données
*/
public void initialiserArbreMotsCles() {
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
MCDao.obtenirListeMotsCles(this);
}
 
/**
* Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable
* donné, qui le demande
*
* @param r
* le rafraichissable demandeur de l'arbre
*/
public void obtenirArbreMotCle(Rafraichissable r) {
r.rafraichir(arbreMotsCles, false);
}
 
/**
* Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui
* fait la mise à jour de l'arbre des mots clés dans la base
*
* @param n
* le nouveau noeud contenant le mot clé
* @param arbreMC
* l'arbre des mots cles en cours
*/
public void ajouterMotCleDansArbre(TreeNode n,
com.gwtext.client.data.Tree arbreMC, Rafraichissable r) {
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
 
String[] usObj = (String[]) n.getUserObject();
String motCle = usObj[0];
String id = usObj[1];
String parentId = "";
 
if (!id.equals("racine")) {
String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
if(!parentUsObj[1].equals("racine")) {
parentId = parentUsObj[1];
}
}
 
rafraichirArbreMotsCles(arbreMC);
mettreAjourMotsClesId(motCle, id);
 
String nouveauMotCle = "&identifiant=" + getIdentifiant() + "&motcle="
+ motCle + "&id=" + id + "&parent=" + parentId;
MCDao.ajouterBaseDeDonnees(nouveauMotCle, r);
}
 
/**
* Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va
* supprimer les mots clés associés dans la base
*
* @param n
* le noeud à supprimer
* @param arbreMC
* l'arbre des mots clés en cours
*/
public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
 
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
 
String[] usObj = (String[]) n.getUserObject();
String id = usObj[1];
 
MCDao.supprimerBaseDeDonnees(id, r);
 
}
 
/**
* Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le
* DAO qui synchronise la modification dans la base de données
*
* @param n
* le noeud modifié
* @param arbreMC
* l'arbre des mots clés en cours
*/
public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
 
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
 
String[] usObj = (String[]) n.getUserObject();
String motCle = usObj[0];
String id = usObj[1];
String parentId = "";
 
if (!id.equals("racine")) {
String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
if(!parentUsObj[1].equals("racine")) {
parentId = parentUsObj[1];
}
}
 
rafraichirArbreMotsCles(arbreMC);
 
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
+ parentId;
MCDao.modifierBaseDeDonnees(motCleModifie, r);
 
}
 
/**
* Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui
* reorganise l'arbre dans la base de donnees suivant le changement
*
* @param n
* le noeud deplace (et son sous arbre associe)
* @param arbreMC
* l'arbre des mots cles en cours
*/
public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
 
String[] usObj = (String[]) n.getUserObject();
String motCle = usObj[0];
String id = usObj[1];
String parentId = "";
if (!id.equals("racine")) {
String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
if(!parentUsObj[1].equals("racine")) {
parentId = parentUsObj[1];
}
}
 
rafraichirArbreMotsCles(arbreMC);
 
String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
+ parentId;
MCDao.deplacerBaseDeDonnees(motCleModifie, r);
}
 
/**
* Change le numéro de la page en cours et envoie une demande de mise à jour
* des données
*
* @param nouvellePageCourante
* la nouvelle page à afficher
*/
public void changerNumeroPage(int nouvellePageCourante) {
pageEncours = nouvellePageCourante;
obtenirNombrePhotoGalerie(this);
}
 
/**
* Calcule le nombre de pages nécessaires pour afficher un nombre d'élements
* donnés en fonction de la taille de page en cours
*
* @param nbElements
* le nombre d'élements total
* @return le nombre de pages
*/
public int calculerNbPages(int nbElements) {
// A cause de la betise de java pour les conversion implicite on fait
// quelques conversions manuellement
// pour eviter qu'il arrondisse mal la division
// nombre de pages = (nombre d'element / taille de la page) arrondie à
// l'entier superieur
double nPage = (1.0 * nbElements) / (1.0 * taillePage);
double nPageRound = Math.ceil(nPage);
Double nPageInt = new Double(nPageRound);
 
// on convertit en entier
return nPageInt.intValue();
}
 
/**
* Recalcule la page en cours lors du changement du nombre d'élements
*
* @param nbElements
* le nombre d'élements total
* @return la nouvelle page encours
*/
public int calculerPageCourante(int nbElements) {
// on calcule le nombre de page
int nouvelNbPages = calculerNbPages(nbElements);
// la nouvelle page en cours
double nPageCourante = (1.0 * pageEncours) / (1.0 * pageMax)
* (1.0 * nouvelNbPages);
 
// on arrondit au supérieur
double nPageRound = Math.ceil(nPageCourante);
Double nPageInt = new Double(nPageRound);
 
// on convertit en entier
return Math.abs(nPageInt.intValue());
}
 
/**
* Change la taille de page et recalcule la page encours
*
* @param nouvelleTaillePage
* la nouvelle taille de page à utiliser
*/
public void changerTaillePage(int nouvelleTaillePage) {
taillePage = nouvelleTaillePage;
pageEncours = calculerPageCourante(nbElements);
obtenirNombrePhotoGalerie(this);
}
/**
* Met la valeur de la page en cours à la dernière
*/
public void setDernierePage() {
changerNumeroPage(pageMax);
}
 
/**
* Notifie le mediateur que l'upload ou le download est termine et qu'il
* faut rafraichir les vues avec les nouvelles données
*/
public void requeteTerminee() {
getIMediateur().demasquerChargement();
getIMediateur().rafraichirToutesVues();
}
 
/**
* Obtient l'identifiant de l'utilisateur auprès du médiateur
*
* @return id de l'utilisateur
*/
public String getIdentifiant() {
 
return getIMediateur().getIdentifiant();
}
 
/**
* renvoie la taille d'une image grâce à son identifiant
*
* @param id
* l'identifiant de l'image
* @return un tableau contenant la longueur et la hauteur de l'image
*/
public String[] obtenirTailleImage(String id) {
 
return (cacheImage.get(id)).getTailleImage();
 
}
 
/**
* Suivant l'id d'une image donnée, fais une demande au modèle pour qu'il
* renvoie la note associée au rafrachissable qui la demande
*
* @param r
* le rafraichissable demandeur de l'information
* @param id
* l'identifiant del'image
*/
public void obtenirNote(Rafraichissable r, String id) {
 
r.rafraichir((cacheImage.get(id)).getNote(), true);
 
}
 
/**
* Accesseur pour la configuration en cours d'utilisation
*
* @return la configuration
*/
public Configuration getConfig() {
 
return config;
}
 
/**
* Ajoute des images à la selection en cours
*
* @param ids
* les identifiants des images à ajouter
*/
public void ajouterImagesSelection(String[] ids) {
 
for (int i = 0; i < ids.length; i++) {
String idImg = cacheImage.get(ids[i]).getId();
selectionImages.add(idImg);
}
}
 
public int getCompteSelection() {
return selectionImages.size();
}
/**
* Vide la selection en cours
*/
public void viderSelection() {
selectionImages.clear();
}
 
public String renvoyerSelection() {
 
String selection = "";
if(selectionImages.size() <= 0)
{
selection += "-255" ;
}
else
{
for (Iterator<String> it = selectionImages.iterator(); it.hasNext();) {
String idEncours = it.next();
selection += idEncours + ",";
}
}
 
return selection;
}
 
public void lierImagesObervations(String idsObs, String idsImg) {
LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
lienDAO.lierImageBaseDeDonnees(idsImg, idsObs) ;
}
 
public void obtenirLiaisonObservations(ImageMediateur imageMediateur,
String id) {
String imgId = cacheImage.get(id).getId() ;
LienImageAsynchroneDAO lienDao = new LienImageAsynchroneDAO(this) ;
lienDao.obtenirLiaisonsImagesObservations(this, imgId) ;
}
 
public void supprimerLiaisonImages(String[] idsImg, String idObs) {
String chaineIdImg = "";
for(int i = 0; i < idsImg.length; i++) {
String idImg = cacheImage.get(idsImg[i]).getId() ;
chaineIdImg += ","+idImg;
}
chaineIdImg = chaineIdImg.replaceFirst(",", "");
LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
lienDAO.supprimerLienImageObservation(chaineIdImg, idObs) ;
}
 
public void obtenirMiniListeObservations(Rafraichissable r, String[] critere, int taillePage, int numeroPage) {
String[][] criteres = {{critere[0],critere[1]},{"limite",""+taillePage},{"numero_page",""+numeroPage}} ;
// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
ListeObservationAsynchroneDAO loaDAO = new ListeObservationAsynchroneDAO(this);
loaDAO.obtenirListeObservation(r, iMediateur.getIdentifiant(), criteres);
}
 
public void obtenirNombreMiniListeObservations(Rafraichissable r, String[] critere) {
String[][] criteres = {{critere[0],critere[1]}} ;
// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
NombreObservationAsynchroneDAO noaDAO = new NombreObservationAsynchroneDAO(this);
noaDAO.obtenirNombreObservation(r, iMediateur.getIdentifiant(), criteres);
}
 
public void obtenirDatesImages(Rafraichissable r) {
ListeDateImageAsynchroneDAO lDateDao = new ListeDateImageAsynchroneDAO(this);
lDateDao.obtenirListeDate(r, iMediateur.getIdentifiant());
}
public String obtenirIdPourOrdre(String ordreImage) {
return cacheImage.get(ordreImage).getId();
}
 
}