Rev 1292 | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues.image;import org.tela_botanica.client.image.ImageMediateur;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.vues.BarrePaginationVue;import com.gwtext.client.core.EventObject;import com.gwtext.client.data.FieldDef;import com.gwtext.client.data.IntegerFieldDef;import com.gwtext.client.data.Record;import com.gwtext.client.data.RecordDef;import com.gwtext.client.data.Store;import com.gwtext.client.data.StringFieldDef;import com.gwtext.client.dd.DragData;import com.gwtext.client.dd.DragSource;import com.gwtext.client.dd.DropTarget;import com.gwtext.client.dd.DropTargetConfig;import com.gwtext.client.widgets.Component;import com.gwtext.client.widgets.event.ContainerListenerAdapter;import com.gwtext.client.widgets.grid.CellMetadata;import com.gwtext.client.widgets.grid.ColumnConfig;import com.gwtext.client.widgets.grid.ColumnModel;import com.gwtext.client.widgets.grid.GridDragData;import com.gwtext.client.widgets.grid.GridPanel;import com.gwtext.client.widgets.grid.Renderer;import com.gwtext.client.widgets.grid.RowSelectionModel;import com.gwtext.client.widgets.grid.event.GridRowListener;import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;/*** Liste d'image composée de miniatures et d'information sur l'image, implémente* l'interface rafraichissable et l'interface vueListable** @author aurelien*/public class ListeImageVue extends GridPanel implements Rafraichissable,VueListable, ListePaginable {/*** Le médiateur associé à la vue*/private ImageMediateur iMediateur = null;/*** Config de colonne*/private ColumnConfig numImage;/*** Config de colonne*/private ColumnConfig transmisImage;/*** Config de colonne*/private ColumnConfig urlImage;/*** Config de colonne*/private ColumnConfig lieImage;/*** Config de colonne*/private ColumnConfig datImage;/*** Config de colonne*/private ColumnConfig appImage;/*** Config de colonne*/private ColumnConfig noteImage;/*** Config de colonne*/private ColumnConfig nomImage;/*** Config de colonne*/private ColumnConfig obsAssociees;/*** Modele de colonnes*/private ColumnModel modeleColonnes;/*** Booleen d'instanciation*/private boolean estInstancie = false;/*** Store qui contient les données à afficher*/private Store st = null;/*** Configuration des colonnes du store*/private ColumnConfig cl = null;/*** Barre de pagination*/private BarrePaginationVue bt = null;/*** Taille max des images dans la liste*/private int tailleOr = 50 ;/*** Garder ou non l'aspet original des images*/private boolean garderRatio = true;/*** Constructeur sans arguments (privé car ne doit pas être utilisé)*/private ListeImageVue() {super();}/*** Constructeur avec argument** @param im* le médiateur à associer*/public ListeImageVue(ImageMediateur im) {new ListeImageVue();this.setId("listeImageGrid");// on associe le médiateurthis.iMediateur = im;// on place la barre de paginationbt = new BarrePaginationVue(this);bt.setLabelElement("Images");bt.setTaillePageParDefaut(50);setBottomToolbar(bt);// on construit le modèle de colonnesnumImage = new ColumnConfig("Numéro", "num_image", 30, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String ImgNum = record.getAsString("num_image");return "<div class=\"centered-list\">" + ImgNum+ "</div>";}});transmisImage = new ColumnConfig(" ", "obs_associees", 10, true, new Renderer() {@Overridepublic String render(Object value, CellMetadata cellMetadata,Record record, int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String nomObs = record.getAsString("obs_associees");if(nomObs == null) {return "";}boolean transmise = estAssocieeTransmise(nomObs)[1];if(transmise){return "<img src=\"tela.png\"/></img>" ;}else{return "" ;}}});datImage = new ColumnConfig("Date", "dat_image", 80, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String ImgDat = record.getAsString("dat_image");if (ImgDat == null) {ImgDat = " ";}return "<div class=\"centered-list\">" + ImgDat+ "</div>";}});lieImage = new ColumnConfig("Lieu", "lie_image", 120, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String ImgLie = record.getAsString("lie_image");if (ImgLie == null) {ImgLie = " ";}return "<div class=\"centered-list\">" + ImgLie+ "</div>";}});appImage = new ColumnConfig("Appareil", "app_image", 120, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String ImgApp = record.getAsString("app_image");if (ImgApp == null) {ImgApp = " ";}return "<div class=\"centered-list\">" + ImgApp+ "</div>";}});// la colonne url possède une méthode de rendu spécialeurlImage = new ColumnConfig("Image", "url_image_S", 30, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");// on affiche une div contenant l'image pointée par// l'urlint[] XY = {record.getAsInteger("taille_x") ,record.getAsInteger("taille_y")} ;int[] XYresize = {tailleOr,tailleOr} ;if(garderRatio) {XYresize = calculerDimensions(XY);}String ImgUrl = record.getAsString("url_image_S");String ImgNum = record.getAsString("num_image");return "<div class=\"img-list centered-list\"> <img src=\""+ ImgUrl + "\" title='" + ImgNum + "' width=\""+XYresize[0]+" px\" height=\""+XYresize[1]+" px\"> </div>";}});noteImage = new ColumnConfig("Note", "note_image", 80, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String htmlImage = "";int noteImg = record.getAsInteger("note_image");if (noteImg >= 0) {htmlImage += "<div class=\"img-note centered-list\">";for (int i = 0; i <= noteImg; i++) {htmlImage += "<img src=\"note-on.gif\">";}htmlImage += "</div>";}return htmlImage;}});nomImage = new ColumnConfig("Nom original", "nom_original", 120, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String imgNomOr = record.getAsString("nom_original");if (imgNomOr == null) {imgNomOr = " ";}return "<div class=\"centered-list\">" + imgNomOr+ "</div>";}});obsAssociees = new ColumnConfig("Nom associé", "obs_associees", 80, true,new Renderer() {@Overridepublic String render(Object value,CellMetadata cellMetadata, Record record,int rowIndex, int colNum, Store store) {cellMetadata.setCssClass("centered-list");String nomObs = record.getAsString("obs_associees");if(nomObs == null) {return "";}String nomFormate = getNomsObservationsFormatees(nomObs);return "<div class=\"centered-list\">" + nomFormate+ "</div>";}});// on associe le modèle de colonnesColumnConfig[] cm = { numImage, transmisImage, urlImage, obsAssociees, datImage, lieImage, appImage,noteImage,nomImage} ;modeleColonnes = new ColumnModel(cm);this.setColumnModel(modeleColonnes);this.setAutoScroll(true);this.setAutoWidth(true);this.setEnableColumnResize(true);// creation du storeFieldDef defNumImage = new IntegerFieldDef("num_image");FieldDef defTransmisImage = new IntegerFieldDef("obs_associees");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 StringFieldDef("note_image");FieldDef defTailleX = new IntegerFieldDef("taille_x");FieldDef defTailleY = new IntegerFieldDef("taille_y");FieldDef defObsAssociees = new StringFieldDef("obs_associees");FieldDef[] defTab = { defNumImage,defTransmisImage, defNomImage, defDatImage, defLieImage,defAppImage, defUrlImageS, defUrlImageM, defUrlImage,defNoteImage, defTailleX, defTailleY, defObsAssociees};RecordDef rd = new RecordDef(defTab);st = new Store(rd);// on associe le storethis.setStore(st);this.getView().setAutoFill(true);// on crée un masque de chargement qui s'affichera lors des mises à jourthis.setLoadMask("chargement");//Enable drag and dropthis.setEnableDragDrop(true);//You need to set the same group for both gridsthis.setDdGroup("DragGroupName");// on ajoute les listenersajouterListeners();}/*** Ajoute les listeners pour la gestion des évènements*/private void ajouterListeners() {this.addListener(new ContainerListenerAdapter() {@Overridepublic void onHide(Component component) {}// lors du premier rendu on demande les données qui sont déjà// contenues dans la galerie qui est le premier élément affiché@Overridepublic void onRender(Component component) {if (!isEstInstancie()) {setEstInstancie(true);setDragDropText("Glissez les images sur la liste d'observation pour les lier") ;getIMediateur().synchroniserSelection("galerie");}}@Overridepublic void onShow(Component component) {}});this.addGridRowListener(new GridRowListener() {// gestion du clic sur une ligne@Overridepublic void onRowClick(GridPanel grid, int rowIndex, EventObject e) {// on notifie le médiateur et on lui passe le numéro de lignegetIMediateur().clicListeImage(rowIndex);}// gestion du clic droit@Overridepublic void onRowContextMenu(GridPanel grid, int rowIndex,EventObject e) {// on stoppe l'évenement pour empecher le navigateur d'afficher// son propre menue.stopEvent();// on notifie le médiateur en lui passant l'évenementgetIMediateur().montrerContextMenu(e);}// gestion du double clic@Overridepublic void onRowDblClick(GridPanel grid, int rowIndex,EventObject e) {// on notifie le médiateur en lui passant le numéro de lignegetIMediateur().doubleClicListeImage(rowIndex);}});this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {// gestion de la sélection@Overridepublic void onSelectionChange(RowSelectionModel sm) {// si on a rien de sélectionnéif (sm.getCount() <= 0) {// on notifie le médiateur (qui désactive notamment l'accès// à certaines infos)getIMediateur().aucuneSelection();} else {// sinon on notifie le médiateurgetIMediateur().selection();// et on lui demande de synchroniser la selection avec les// autres vuesgetIMediateur().synchroniserSelection("liste");}}});//Enable drag and dropthis.setEnableDragDrop(true);//Same name in destinationthis.setDdGroup("DragGroupName");DropTargetConfig dtc = new DropTargetConfig();dtc.setdDdGroup("DragGroupName");//Now this is the important part, you need a drop target@SuppressWarnings("unused")DropTarget tg = new DropTarget(this, dtc){@Overridepublic boolean notifyDrop(DragSource source, EventObject e, DragData data){if(data instanceof GridDragData){GridDragData gdd = (GridDragData)data ;if(gdd.getGrid().getId().equals("listeImageGrid")){return false ;}else{return iMediateur.lierObsDD(source, e, data, getId()) ;}}else{return false ;}}@Overridepublic String notifyOver(DragSource source, EventObject e, DragData data){return "x-dd-drop-ok";}};}/*** Méthode héritée de l'interface VueListable Sélectionne les images dans la* galerie suivant les identifiants donnés en paramètres*/@Overridepublic String[] getIdSelectionnees() {Record[] selection = this.getSelectionModel().getSelections();int taille = selection.length;String id_selection[] = new String[taille];for (int i = 0; i < selection.length; i++) {id_selection[i] = selection[i].getAsString("num_image");}return id_selection;}/*** Accesseur pour la config de colonnes** @return la config de colonnes*/public ColumnConfig getCl() {return cl;}/*** Accesseur pour le médiateur** @return le médiateur associé*/public ImageMediateur getIMediateur() {return iMediateur;}/*** Accesseur pour le modèle de colonnes** @return le modèle de colonnes*/public ColumnModel getModeleColonnes() {return modeleColonnes;}/*** Accesseur pour le store** @return le store contenant les données*/public Store getSt() {return st;}/*** Accesseur pour le booleen d'instanciation** @return le booleen d'instanciation*/public boolean isEstInstancie() {return estInstancie;}/*** Méthode héritée de l'interface rafraichissable** @param nouvelleDonnees* les nouvelles données* @param repandreRafraichissement* le booleen de notification du rafraichissement*/@Overridepublic void rafraichir(Object nouvelleDonnees,boolean repandreRafraichissement) {// si on reçoit un storeif (nouvelleDonnees instanceof Store) {// on affecte celui-ci comme gestionnaire de donnéesst = (Store) nouvelleDonnees;st.load();// et on reconfigure et rafraichit la vuethis.reconfigure(st, this.getColumnModel());}// si on doit répandre l'évenementif (repandreRafraichissement) {// on notifie le médiateur avec une copie des donnéesgetIMediateur().synchroniserDonneesZoomListeGalerie(nouvelleDonnees, this);}}/*** Sélectionne des enregistrements donné** @param sel* un tableau d'enregistrement à selectionner*/public void selectionnerEnregistrements(Record[] sel) {if (isEstInstancie()) {getSelectionModel().clearSelections();getSelectionModel().selectRecords(sel);}}/*** Accesseur pour la toolbar de pagination** @return la toolbar de pagination*/public BarrePaginationVue getToolBarVue() {return bt;}/*** Setteur pour le booleen d'instanciation** @param estInstancie* la nouvelle valeur du booleen*/public void setEstInstancie(boolean estInstancie) {this.estInstancie = estInstancie;}public void mettreAjourInfos(String commentaires, String date, String note) {for (int i = 0; i < getSelectionModel().getCount(); i++) {getSelectionModel().getSelections()[i].set("note_image", note);getSelectionModel().getSelections()[i].set("dat_image", date);}}@Overridepublic void changerNumeroPage(int pageCourante) {iMediateur.changerNumeroPage(pageCourante) ;}@Overridepublic void changerTaillePage(int nouvelleTaillePage) {iMediateur.changerTaillePage(nouvelleTaillePage) ;}public int[] calculerDimensions(int[] tailleXY) {float[] tailleXYf = {new Float(tailleXY[0]),new Float(tailleXY[1])} ;float tailleOr = this.tailleOr ;float maxTaille = Math.max(tailleXYf[1],tailleXYf[0]) ;float[] XYresize = new float[2];if(maxTaille == tailleXY[0]) {float rapport = tailleXYf[1]/tailleXYf[0] ;XYresize[0] = tailleOr ;XYresize[1] = tailleOr*rapport ;}else {float rapport = tailleXYf[0]/tailleXYf[1] ;XYresize[1] = tailleOr ;XYresize[0] = tailleOr*rapport ;}int[] res = {Math.round(XYresize[0]),Math.round(XYresize[1])} ;return res;}private String getNomsObservationsFormatees(String nomObs) {String htmlInfobulle = "";String[][] obs = getObservationsAssociees(nomObs);for(int i = 0; i < obs.length; i++) {if(obs[i].length == 3 && obs[i][1] != null && !obs[i][1].equals("")) {htmlInfobulle += ", "+obs[i][1];}}htmlInfobulle = htmlInfobulle.replaceFirst(", ", "");return htmlInfobulle;}private String[][] getObservationsAssociees(String nomObs) {if(nomObs.trim().equals("")) {return new String[0][0];}String[] obsTab = nomObs.split(";;");String[][] obsAnalysees = new String[obsTab.length][3];for(int i = 0; i < obsTab.length; i++) {obsAnalysees[i] = obsTab[i].split("#");}return obsAnalysees;}private boolean[] estAssocieeTransmise(String nomObs) {String[][] obs = getObservationsAssociees(nomObs);boolean[] associeesTranmises = {false, false};if(obs.length > 0) {associeesTranmises[0] = true;}for(int i = 0; i < obs.length; i++) {if(obs[i].length == 3 && obs[i][2] != null && obs[i][2].equals("1")) {associeesTranmises[1] = true;}}return associeesTranmises;}}