/trunk/src/org/tela_botanica/client/modeles/ImageCarnet.java |
---|
214,6 → 214,11 |
return metaGen ; |
} |
public String getMotsCles() { |
return renvoyerValeurCorrecte("ci_meta_mots_cles") ; |
} |
public void miseAJourInfoGenerales(String commentaires, String date) |
{ |
put("ci_meta_comment",commentaires) ; |
220,4 → 225,10 |
put("ci_meta_date",date) ; |
} |
public void mettreAjourMotsCles(String motsClesEnCours) { |
put("ci_meta_mots_cles",motsClesEnCours) ; |
} |
} |
/trunk/src/org/tela_botanica/client/modeles/ListeImageAsynchroneDAO.java |
---|
88,8 → 88,6 |
ImageCarnet enCours = (ImageCarnet)li.get(listIt.next()) ; |
System.out.println(enCours.toString()+"\n"); |
for(Iterator imgIt = enCours.keySet().iterator();imgIt.hasNext();) |
{ |
String key = (String)imgIt.next() ; |
99,7 → 97,6 |
} |
//System.out.println(postData); |
HTTPRequest.asyncPost("jrest/inventoryImage/0/", postData, new ResponseTextHandler() { |
public void onCompletion(String responseText) { |
/trunk/src/org/tela_botanica/client/modeles/MotsClesAsynchroneDAO.java |
---|
New file |
0,0 → 1,5 |
package org.tela_botanica.client.modeles; |
public class MotsClesAsynchroneDAO { |
} |
/trunk/src/org/tela_botanica/client/vues/GalerieImageVue.java |
---|
1,48 → 1,31 |
package org.tela_botanica.client.vues; |
import java.util.Iterator; |
import org.tela_botanica.client.image.ImageMediateur; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.interfaces.VueListable; |
import org.tela_botanica.client.modeles.ImageCarnet; |
import org.tela_botanica.client.modeles.ListeImageCarnet; |
import com.google.gwt.core.client.JavaScriptObject; |
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.XTemplate; |
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.Record; |
import com.gwtext.client.data.RecordDef; |
import com.gwtext.client.data.Store; |
import com.gwtext.client.data.StringFieldDef; |
import com.gwtext.client.util.Format; |
import com.gwtext.client.widgets.BoxComponent; |
import com.gwtext.client.widgets.Component; |
import com.gwtext.client.widgets.Container; |
import com.gwtext.client.widgets.DataView; |
import com.gwtext.client.widgets.Observable; |
import com.gwtext.client.widgets.Panel; |
import com.gwtext.client.widgets.DataView.Data; |
import com.gwtext.client.widgets.event.ContainerListener; |
import com.gwtext.client.widgets.event.ContainerListenerAdapter; |
import com.gwtext.client.widgets.event.DataViewListener; |
import com.gwtext.client.widgets.event.DataViewListenerAdapter; |
/** |
* Galerie d'images miniatures |
* |
* @author aurelien |
* |
*/ |
public class GalerieImageVue extends Panel implements Rafraichissable, VueListable { |
public class GalerieImageVue extends Panel implements Rafraichissable, |
VueListable { |
// instance du médiateur |
private ImageMediateur iMediateur = null; |
49,31 → 32,25 |
private DataView dView = null ; |
private Store st = null ; |
public GalerieImageVue(ImageMediateur im) |
{ |
public GalerieImageVue(ImageMediateur im) { |
super("Galerie"); |
iMediateur = im ; |
this.addListener(new ContainerListenerAdapter() { |
public void onHide(Component component) { |
// TODO Auto-generated method stub |
} |
public void onRender(Component component) { |
// TODO Auto-generated method stub |
} |
public void onShow(Component component) { |
if(dView == null) |
{ |
if (dView == null) { |
initialiser(); |
} |
} |
82,16 → 59,12 |
} |
public void ajouterListenersDataView() { |
public void ajouterListenersDataView() |
{ |
// ajout de listeners pour la gestion de la selection |
// dans la galerie |
dView.addListener(new DataViewListenerAdapter() { |
public void onClick(DataView source, int index, Element node, |
EventObject e) { |
99,13 → 72,11 |
} |
public void onContainerClick(DataView source, EventObject e) { |
//TODO: appeler le mediateur |
} |
public void onContextMenu(DataView source, int index, Element node, |
EventObject e) { |
114,7 → 85,6 |
} |
public void onDblClick(DataView source, int index, Element node, |
EventObject e) { |
123,15 → 93,11 |
} |
public void onSelectionChange(DataView view, Element[] selections) { |
if(selections.length <= 0) |
{ |
if (selections.length <= 0) { |
getIMediateur().aucuneSelection(); |
} |
else |
{ |
} else { |
getIMediateur().selection() ; |
getIMediateur().synchroniserSelection("galerie") ; |
} |
140,10 → 106,33 |
}); |
} |
public DataView getDView() { |
return dView; |
} |
public String[] getIdSelectionnees() { |
Record[] selection = getDView().getSelectedRecords(); |
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; |
} |
public ImageMediateur getIMediateur() { |
return iMediateur; |
} |
public Store getSt() { |
return st; |
} |
// instantiation paresseuse |
public void initialiser() |
{ |
public void initialiser() { |
// Preparation de la dataview et du template |
// le template va créer une div contenant une image |
// pour chacune des photos |
159,6 → 148,7 |
// la dataview affichera les images en accord avec le template |
// cree precedemment |
dView = new DataView("div.thumb-wrap") { |
public void prepareData(Data data) { |
data.setProperty("shortName", Format.ellipsis(data |
.getProperty("num_image"), 15)); |
173,7 → 163,6 |
dView.setOverCls("x-view-over"); |
dView.setEmptyText("Aucune image à afficher"); |
// creation du store |
FieldDef defNumImage = new IntegerFieldDef("num_image"); |
FieldDef defDatImage = new StringFieldDef("dat_image"); |
182,7 → 171,8 |
FieldDef defUrlImageS = new StringFieldDef("url_image_S"); |
FieldDef defUrlImageM = new StringFieldDef("url_image_M"); |
FieldDef defUrlImage = new StringFieldDef("url_image"); |
FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage}; |
FieldDef[] defTab = { defNumImage, defDatImage, defLieImage, |
defAppImage, defUrlImageS, defUrlImageM, defUrlImage }; |
RecordDef rd = new RecordDef(defTab) ; |
st = new Store(rd) ; |
dView.setStore(st); |
197,12 → 187,10 |
getIMediateur().obtenirPhotoGalerie(this); |
} |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRafraichissement) { |
public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) { |
if(nouvelleDonnees instanceof Store) |
{ |
if (nouvelleDonnees instanceof Store) { |
st = (Store)nouvelleDonnees; |
st.load() ; |
dView.setStore(st); |
209,42 → 197,12 |
dView.refresh(); |
} |
if(repandreRafraichissement) |
{ |
getIMediateur().synchroniserDonneesZoomListeGalerie(nouvelleDonnees, this) ; |
if (repandreRafraichissement) { |
getIMediateur().synchroniserDonneesZoomListeGalerie( |
nouvelleDonnees, this); |
} |
} |
public ImageMediateur getIMediateur() { |
return iMediateur; |
} |
public DataView getDView() { |
return dView; |
} |
public Store getSt() { |
return st; |
} |
public String[] getIdSelectionnees() |
{ |
Record[] selection = getDView().getSelectedRecords() ; |
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 ; |
} |
public void selectionnerImages(int[] ids) { |
getDView().select(ids) ; |
/trunk/src/org/tela_botanica/client/vues/ListeImageVue.java |
---|
1,7 → 1,5 |
package org.tela_botanica.client.vues; |
import java.util.Iterator; |
import org.tela_botanica.client.image.ImageMediateur; |
10,7 → 8,6 |
import org.tela_botanica.client.modeles.ImageCarnet; |
import org.tela_botanica.client.modeles.ListeImageCarnet; |
import com.google.gwt.core.client.JavaScriptObject; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.core.EventObject; |
50,17 → 47,15 |
/** |
* Liste d'image composée de miniatures et d'information sur l'image |
* |
* @author aurelien |
* |
*/ |
public class ListeImageVue extends GridPanel implements Rafraichissable, VueListable { |
public class ListeImageVue extends GridPanel implements Rafraichissable, |
VueListable { |
// instance du médiateur |
private ImageMediateur iMediateur = null; |
private ColumnConfig numImage ; |
private ColumnConfig urlImage ; |
private ColumnConfig lieImage ; |
70,14 → 65,11 |
private boolean estInstancie = false ; |
// données locales |
// store qui gère les données de la liste d'images |
private Store st = null ; |
private ColumnConfig cl = null ; |
public ListeImageVue(ImageMediateur im) { |
super() ; |
90,14 → 82,17 |
datImage = new ColumnConfig("date","dat_image",120,true); |
lieImage = new ColumnConfig("lieu","lie_image",120,true); |
appImage = new ColumnConfig("appareil","app_image",200,true); |
urlImage = new ColumnConfig("Image","url_image_S",200,true,new Renderer() { |
urlImage = new ColumnConfig("Image", "url_image_S", 200, true, |
new Renderer() { |
public String render(Object value, CellMetadata cellMetadata, |
Record record, int rowIndex, int colNum, Store store) { |
public String render(Object value, |
CellMetadata cellMetadata, Record record, |
int rowIndex, int colNum, Store store) { |
String ImgUrl = record.getAsString("url_image_S"); |
String ImgNum = record.getAsString("num_image"); |
return "<div class=\"img-list\"> <img src=\""+ImgUrl+"\" title='"+ImgNum+"'> </div>"; |
return "<div class=\"img-list\"> <img src=\"" + ImgUrl |
+ "\" title='" + ImgNum + "'> </div>"; |
} |
}); |
108,7 → 103,6 |
this.setAutoScroll(true); |
this.setAutoWidth(true); |
// creation du store |
FieldDef defNumImage = new IntegerFieldDef("num_image"); |
FieldDef defDatImage = new StringFieldDef("dat_image"); |
117,7 → 111,8 |
FieldDef defUrlImageS = new StringFieldDef("url_image_S"); |
FieldDef defUrlImageM = new StringFieldDef("url_image_M"); |
FieldDef defUrlImage = new StringFieldDef("url_image"); |
FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage}; |
FieldDef[] defTab = { defNumImage, defDatImage, defLieImage, |
defAppImage, defUrlImageS, defUrlImageM, defUrlImage }; |
RecordDef rd = new RecordDef(defTab) ; |
st = new Store(rd) ; |
this.setStore(st); |
128,43 → 123,33 |
ajouterListeners() ; |
} |
public void ajouterListeners() |
{ |
public void ajouterListeners() { |
this.addListener(new ContainerListenerAdapter() { |
public void onHide(Component component) { |
// TODO Auto-generated method stub |
} |
public void onRender(Component component) { |
if(!isEstInstancie()) |
{ |
if (!isEstInstancie()) { |
setEstInstancie(true) ; |
getIMediateur().synchroniserSelection("galerie") ; |
} |
} |
public void onShow(Component component) { |
} |
}); |
this.addGridRowListener(new GridRowListener() { |
public void onRowClick(GridPanel grid, int rowIndex, EventObject e) { |
public void onRowClick(GridPanel grid, int rowIndex, EventObject e) { |
; |
getIMediateur().clicListeImage(rowIndex) ; |
} |
172,18 → 157,13 |
EventObject e) { |
getIMediateur().montrerContextMenu(e) ; |
} |
public void onRowDblClick(GridPanel grid, int rowIndex, |
EventObject e) { |
getIMediateur().doubleClicListeImage(rowIndex) ; |
} |
}); |
this.getSelectionModel().addListener(new RowSelectionListenerAdapter() { |
190,23 → 170,21 |
public void onSelectionChange(RowSelectionModel sm) { |
if(sm.getCount() <= 0) |
{ |
if (sm.getCount() <= 0) { |
getIMediateur().aucuneSelection() ; |
} |
else |
{ |
} else { |
getIMediateur().selection() ; |
getIMediateur().synchroniserSelection("liste"); |
} |
} |
}); |
} |
public String[] getIdSelectionnees() |
{ |
public ColumnConfig getCl() { |
return cl; |
} |
public String[] getIdSelectionnees() { |
Record[] selection = this.getSelectionModel().getSelections() ; |
int taille = selection.length ; |
String id_selection[] = new String[taille] ; |
219,86 → 197,71 |
return id_selection ; |
} |
public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) { |
if(nouvelleDonnees instanceof Store) |
{ |
st = (Store)nouvelleDonnees; |
st.load(); |
this.reconfigure(st, this.getColumnModel()); |
} |
if(repandreRafraichissement) |
{ |
getIMediateur().synchroniserDonneesZoomListeGalerie(nouvelleDonnees, this) ; |
} |
} |
public ImageMediateur getIMediateur() { |
return iMediateur; |
} |
public ColumnModel getModeleColonnes() { |
return modeleColonnes; |
} |
public ColumnConfig getNumImage() { |
return numImage; |
} |
public Store getSt() { |
return st; |
} |
public ColumnConfig getUrlImage() { |
return urlImage; |
} |
public ColumnModel getModeleColonnes() { |
return modeleColonnes; |
/** |
* @return the estInstancie |
*/ |
public boolean isEstInstancie() { |
return estInstancie; |
} |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRafraichissement) { |
public Store getSt() { |
return st; |
if (nouvelleDonnees instanceof Store) { |
st = (Store) nouvelleDonnees; |
st.load(); |
this.reconfigure(st, this.getColumnModel()); |
} |
public ColumnConfig getCl() { |
return cl; |
if (repandreRafraichissement) { |
getIMediateur().synchroniserDonneesZoomListeGalerie( |
nouvelleDonnees, this); |
} |
} |
public void selectionnerEnregistrements(Record[] sel) { |
/** |
* @return the estInstancie |
*/ |
public boolean isEstInstancie() { |
return estInstancie; |
if (isEstInstancie()) { |
getSelectionModel().clearSelections(); |
getSelectionModel().selectRecords(sel); |
} |
} |
/** |
* @param estInstancie the estInstancie to set |
* @param estInstancie |
* the estInstancie to set |
*/ |
public void setEstInstancie(boolean estInstancie) { |
this.estInstancie = estInstancie; |
} |
/** |
* @param mediateur the iMediateur to set |
* @param mediateur |
* the iMediateur to set |
*/ |
public void setIMediateur(ImageMediateur mediateur) { |
iMediateur = mediateur; |
} |
public void selectionnerEnregistrements(Record[] sel) { |
if(isEstInstancie()) |
{ |
getSelectionModel().clearSelections() ; |
getSelectionModel().selectRecords(sel) ; |
} |
} |
} |
/trunk/src/org/tela_botanica/client/vues/ArbreMotsClesVue.java |
---|
New file |
0,0 → 1,256 |
package org.tela_botanica.client.vues; |
import java.util.HashMap; |
import org.tela_botanica.client.image.ImageMediateur; |
import org.tela_botanica.client.interfaces.Rafraichissable; |
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO; |
import com.google.gwt.core.client.JavaScriptObject; |
import com.google.gwt.user.client.Window; |
import com.gwtext.client.core.EventObject; |
import com.gwtext.client.data.Node; |
import com.gwtext.client.data.NodeTraversalCallback; |
import com.gwtext.client.data.Tree; |
import com.gwtext.client.dd.DD; |
import com.gwtext.client.dd.DragData; |
import com.gwtext.client.dd.DragDrop; |
import com.gwtext.client.widgets.BoxComponent; |
import com.gwtext.client.widgets.Button; |
import com.gwtext.client.widgets.Component; |
import com.gwtext.client.widgets.Container; |
import com.gwtext.client.widgets.Panel; |
import com.gwtext.client.widgets.event.ButtonListener; |
import com.gwtext.client.widgets.event.ButtonListenerAdapter; |
import com.gwtext.client.widgets.event.EditorListener; |
import com.gwtext.client.widgets.form.TextField; |
import com.gwtext.client.widgets.layout.RowLayout; |
import com.gwtext.client.widgets.layout.RowLayoutData; |
import com.gwtext.client.widgets.menu.Menu; |
import com.gwtext.client.widgets.tree.DropNodeCallback; |
import com.gwtext.client.widgets.tree.TreeEditor; |
import com.gwtext.client.widgets.tree.TreeNode; |
import com.gwtext.client.widgets.tree.TreePanel; |
import com.gwtext.client.widgets.tree.event.TreePanelListener; |
import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter; |
public class ArbreMotsClesVue extends Panel implements Rafraichissable { |
private ImageMediateur iMediateur = null ; |
private TreePanel arbreMotsCles = null ; |
private TreeEditor te = null ; |
private TextField tfEdit = null ; |
private Button valider = null ; |
private String motsClesEnCours = "" ; |
public ArbreMotsClesVue(ImageMediateur im) |
{ |
super("Mots clés") ; |
this.setLayout(new RowLayout()); |
iMediateur = im ; |
arbreMotsCles = new TreePanel() ; |
arbreMotsCles.setEnableDD(true) ; |
TreeNode root = new TreeNode("Mots clés") ; |
root.setId("racine") ; |
String[] usObject = {"Mots clés" , "racine" } ; |
root.setUserObject(usObject) ; |
arbreMotsCles.setRootNode(root) ; |
arbreMotsCles.setRootVisible(true) ; |
arbreMotsCles.getRootNode().setIcon("tela.png") ; |
tfEdit = new TextField() ; |
te = new TreeEditor(arbreMotsCles,tfEdit) ; |
valider = new Button("OK") ; |
arbreMotsCles.add(te) ; |
this.add(arbreMotsCles,new RowLayoutData("90%")) ; |
this.add(valider,new RowLayoutData("10%")) ; |
ajouterListeners() ; |
} |
private ImageMediateur GetIMediateur() { |
return iMediateur ; |
} |
/** |
* @return the arbreMotsCles |
*/ |
public TreePanel getArbreMotsCles() { |
return arbreMotsCles; |
} |
/** |
* @return the te |
*/ |
public TreeEditor getTe() { |
return te; |
} |
/** |
* @return the tfEdit |
*/ |
public TextField getTfEdit() { |
return tfEdit; |
} |
public void ajouterListeners() |
{ |
arbreMotsCles.addListener(new TreePanelListenerAdapter() { |
public void onClick(TreeNode node, EventObject e) { |
gererClicNoeud(node); |
} |
public void onContextMenu(TreeNode node, EventObject e) { |
e.stopEvent() ; |
GetIMediateur().montrerContextMenuArbre(node, e , getTe()) ; |
} |
public void onDblClick(TreeNode node, EventObject e) { |
te.startEdit(node); |
} |
public void onTextChange(TreeNode node, String text, String oldText) { |
String[] usObject = new String[2] ; |
usObject[0] = text ; |
usObject[1] = ((String[])node.getUserObject())[1] ; |
node.setUserObject(usObject) ; |
} |
public void onCheckChange(TreeNode node, boolean checked) { |
if(checked) |
{ |
node.bubble(new NodeTraversalCallback() { |
public boolean execute(Node node) |
{ |
TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ; |
tn.getUI().toggleCheck(true) ; |
return true ; |
} |
}) ; |
} |
} |
}) ; |
valider.addListener(new ButtonListenerAdapter() { |
public void onClick(Button button, EventObject e) { |
motsClesEnCours = "" ; |
getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() { |
public boolean execute(Node node) { |
TreeNode tn = getArbreMotsCles().getNodeById(node.getId()) ; |
String[] usObject = (String[])tn.getUserObject() ; |
GetIMediateur().mettreAjourMotsClesId(usObject[0],usObject[1]) ; |
if(tn.getUI().isChecked()) |
{ |
motsClesEnCours += usObject[1]+"," ; |
} |
return true ; |
} |
}); |
GetIMediateur().mettreAjourMotsCles(motsClesEnCours) ; |
} |
}) ; |
} |
public void supprimerNoeud(TreeNode n) |
{ |
n.getParentNode().removeChild(n); |
n.destroy() ; |
} |
public void ajouterNoeud(TreeNode parent) |
{ |
TreeNode nd = new TreeNode(""); |
nd.setIcon("tela.png") ; |
nd.setChecked(true); |
String[] usObject = new String[2] ; |
usObject[0] = "" ; |
usObject[1] = Integer.toString(nd.hashCode()) ; |
nd.setId(usObject[1]) ; |
nd.setUserObject(usObject) ; |
parent.appendChild(nd); |
parent.expand(); |
te.startEdit(nd); |
} |
public void gererClicNoeud(TreeNode node) |
{ |
if(node.getUI().isChecked()) |
{ |
node.setChecked(false) ; |
} |
else |
{ |
node.setChecked(true) ; |
} |
} |
public void cocherMotsCles(final String[] motsClesIds) |
{ |
getArbreMotsCles().getRootNode().cascade(new NodeTraversalCallback() { |
public boolean execute(Node node) { |
for(int i = 0 ; i < motsClesIds.length ; i++) |
{ |
String usObject[] = (String[])node.getUserObject() ; |
String nodeId = usObject[1] ; |
getArbreMotsCles().getNodeById(node.getId()).getUI().toggleCheck(false) ; |
if(nodeId.equals(motsClesIds[i])) |
{ |
getArbreMotsCles().getNodeById(nodeId).getUI().toggleCheck(true) ; |
return true ; |
} |
} |
return true; |
} |
}) ; |
} |
public void rafraichir(Object nouvelleDonnees, |
boolean repandreRaffraichissement) { |
if(nouvelleDonnees instanceof Tree) |
{ |
Tree nouvelArbre = (Tree)nouvelleDonnees ; |
getArbreMotsCles().setRootNode(nouvelArbre.getRootNode()) ; |
} |
if(nouvelleDonnees instanceof String[]) |
{ |
String[] motsClesIds = (String[])nouvelleDonnees ; |
cocherMotsCles(motsClesIds) ; |
} |
} |
} |
/trunk/src/org/tela_botanica/client/vues/PanneauMetadonneesVue.java |
---|
47,10 → 47,8 |
private Panel panneauExifGrid = null; |
private Panel panneauIptcGrid = null ; |
private Panel panneauInfoGrid = null ; |
private ArbreMotsClesVue panneauMotsCles = null ; |
private TreePanel panneauMotsCles = null ; |
private HashMap motclesIds = null ; |
private TextField commentaireGeneral = null ; |
private DateField dateImage = null ; |
Button validerInfo = null ; |
66,13 → 64,8 |
panneauExifGrid = new Panel("Exif") ; |
panneauIptcGrid = new Panel("Iptc") ; |
panneauInfoGrid = new Panel("info") ; |
panneauMotsCles = new TreePanel("Mots clés") ; |
panneauMotsCles = new ArbreMotsClesVue(im) ; |
TreeNode root = new TreeNode("Mots clés") ; |
panneauMotsCles.setRootNode(root) ; |
panneauMotsCles.setRootVisible(false); |
panneauInfoGrid.setLayout(new VerticalLayout()); |
panneauInfoGrid.setHeight(500); |
Label labelComm = new Label("Commentaires :") ; |
202,4 → 195,11 |
} |
} |
/** |
* @return the panneauMotsCles |
*/ |
public ArbreMotsClesVue getPanneauMotsCles() { |
return panneauMotsCles; |
} |
} |