Subversion Repositories eFlore/Applications.cel

Rev

Rev 2618 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2618 Rev 2726
1
package org.tela_botanica.client.image;
1
package org.tela_botanica.client.image;
2
 
2
 
3
import java.util.HashMap;
3
import java.util.HashMap;
4
import java.util.Iterator;
4
import java.util.Iterator;
5
import java.util.Vector;
5
import java.util.Vector;
6
 
6
 
7
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
8
import org.tela_botanica.client.modeles.dao.ImageAsynchroneDAO;
8
import org.tela_botanica.client.modeles.dao.ImageAsynchroneDAO;
9
import org.tela_botanica.client.modeles.dao.ImageUploaderAsynchroneDAO;
9
import org.tela_botanica.client.modeles.dao.ImageUploaderAsynchroneDAO;
10
import org.tela_botanica.client.modeles.dao.LiaisonMotsClesImageAsynchroneDAO;
10
import org.tela_botanica.client.modeles.dao.LiaisonMotsClesImageAsynchroneDAO;
11
import org.tela_botanica.client.modeles.dao.LienImageAsynchroneDAO;
11
import org.tela_botanica.client.modeles.dao.LienImageAsynchroneDAO;
12
import org.tela_botanica.client.modeles.dao.ListeDateImageAsynchroneDAO;
12
import org.tela_botanica.client.modeles.dao.ListeDateImageAsynchroneDAO;
13
import org.tela_botanica.client.modeles.dao.ListeImageAsynchroneDAO;
13
import org.tela_botanica.client.modeles.dao.ListeImageAsynchroneDAO;
14
import org.tela_botanica.client.modeles.dao.ListeObservationAsynchroneDAO;
14
import org.tela_botanica.client.modeles.dao.ListeObservationAsynchroneDAO;
15
import org.tela_botanica.client.modeles.dao.MotsClesAsynchroneDAO;
15
import org.tela_botanica.client.modeles.dao.MotsClesAsynchroneDAO;
16
import org.tela_botanica.client.modeles.dao.NombreImageAsynchroneDAO;
16
import org.tela_botanica.client.modeles.dao.NombreImageAsynchroneDAO;
17
import org.tela_botanica.client.modeles.dao.NombreObservationAsynchroneDAO;
17
import org.tela_botanica.client.modeles.dao.NombreObservationAsynchroneDAO;
18
import org.tela_botanica.client.modeles.objets.Configuration;
18
import org.tela_botanica.client.modeles.objets.Configuration;
19
import org.tela_botanica.client.modeles.objets.ImageCarnet;
19
import org.tela_botanica.client.modeles.objets.ImageCarnet;
20
import org.tela_botanica.client.modeles.objets.ListeImageCarnet;
20
import org.tela_botanica.client.modeles.objets.ListeImageCarnet;
21
import org.tela_botanica.client.modeles.objets.ListeObservation;
21
import org.tela_botanica.client.modeles.objets.ListeObservation;
22
import org.tela_botanica.client.modeles.objets.Utilisateur;
22
import org.tela_botanica.client.modeles.objets.Utilisateur;
23
import org.tela_botanica.client.util.MotsClesUtilitaire;
23
import org.tela_botanica.client.util.MotsClesUtilitaire;
24
 
24
 
25
import com.google.gwt.json.client.JSONArray;
25
import com.google.gwt.json.client.JSONArray;
26
import com.google.gwt.user.client.Window;
26
import com.google.gwt.user.client.Window;
27
import com.gwtext.client.data.ArrayReader;
27
import com.gwtext.client.data.ArrayReader;
28
import com.gwtext.client.data.FieldDef;
28
import com.gwtext.client.data.FieldDef;
29
import com.gwtext.client.data.IntegerFieldDef;
29
import com.gwtext.client.data.IntegerFieldDef;
30
import com.gwtext.client.data.MemoryProxy;
30
import com.gwtext.client.data.MemoryProxy;
31
import com.gwtext.client.data.RecordDef;
31
import com.gwtext.client.data.RecordDef;
32
import com.gwtext.client.data.Store;
32
import com.gwtext.client.data.Store;
33
import com.gwtext.client.data.StringFieldDef;
33
import com.gwtext.client.data.StringFieldDef;
34
import com.gwtext.client.data.Tree;
34
import com.gwtext.client.data.Tree;
35
import com.gwtext.client.widgets.tree.TreeNode;
35
import com.gwtext.client.widgets.tree.TreeNode;
36
 
36
 
37
/**
37
/**
38
 * Modèle d'accès aux données pour les images. C'est un singleton
38
 * Modèle d'accès aux données pour les images. C'est un singleton
39
 * 
39
 * 
40
 * @author aurelien
40
 * @author aurelien
41
 * 
41
 * 
42
 */
42
 */
43
public class ImageModele implements Rafraichissable {
43
public class ImageModele implements Rafraichissable {
44
 
44
 
45
	/**
45
	/**
46
	 * Booleen indiquant si le médiateur est instancié (l'instance doit être
46
	 * Booleen indiquant si le médiateur est instancié (l'instance doit être
47
	 * unique donc le booleen est static)
47
	 * unique donc le booleen est static)
48
	 */
48
	 */
49
	private static boolean estInstancie = false;
49
	private static boolean estInstancie = false;
50
 
50
 
51
	/**
51
	/**
52
	 * le modèle lui même
52
	 * le modèle lui même
53
	 */
53
	 */
54
	private static ImageModele thisModele = null;
54
	private static ImageModele thisModele = null;
55
 
55
 
56
	/**
56
	/**
57
	 * Le médiateur associé au modèle
57
	 * Le médiateur associé au modèle
58
	 */
58
	 */
59
	private ImageMediateur iMediateur = null;
59
	private ImageMediateur iMediateur = null;
60
 
60
 
61
	/**
61
	/**
62
	 * La configuration en cours
62
	 * La configuration en cours
63
	 */
63
	 */
64
	private Configuration config = null;
64
	private Configuration config = null;
65
 
65
 
66
	/**
66
	/**
67
	 * La liste des image affichées en cours
67
	 * La liste des image affichées en cours
68
	 */
68
	 */
69
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0);
69
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0);
70
	/**
70
	/**
71
	 * Table de correspondance entre les mots clés et leurs identifiants
71
	 * Table de correspondance entre les mots clés et leurs identifiants
72
	 */
72
	 */
73
	private HashMap<String, String> motsCles = new HashMap<String, String>(0);
73
	private HashMap<String, String> motsCles = new HashMap<String, String>(0);
74
	/**
74
	/**
75
	 * Le store contenant les données à afficher, que le modèle transmet au
75
	 * Le store contenant les données à afficher, que le modèle transmet au
76
	 * médiateur quand il le demande
76
	 * médiateur quand il le demande
77
	 */
77
	 */
78
	private Store st = null;
78
	private Store st = null;
79
	/**
79
	/**
80
	 * Arbre des mots clés
80
	 * Arbre des mots clés
81
	 */
81
	 */
82
	private com.gwtext.client.data.Tree arbreMotsCles = new Tree();
82
	private com.gwtext.client.data.Tree arbreMotsCles = new Tree();
83
 
83
 
84
	/**
84
	/**
85
	 * Numéro de page en cours
85
	 * Numéro de page en cours
86
	 */
86
	 */
87
	private int pageEncours = 0;
87
	private int pageEncours = 0;
88
	/**
88
	/**
89
	 * Nombre de pages totales
89
	 * Nombre de pages totales
90
	 */
90
	 */
91
	private int pageMax = 1;
91
	private int pageMax = 1;
92
	/**
92
	/**
93
	 * Taille de page (par défaut 50)
93
	 * Taille de page (par défaut 50)
94
	 */
94
	 */
95
	private int taillePage = 50;
95
	private int taillePage = 50;
96
	/**
96
	/**
97
	 * Nombre d'éléments total correspondant à la requete
97
	 * Nombre d'éléments total correspondant à la requete
98
	 */
98
	 */
99
	private int nbElements = 0;
99
	private int nbElements = 0;
100
 
100
 
101
	/**
101
	/**
102
	 * "Presse papier" pour les images qui permet de garder en mémoire une
102
	 * "Presse papier" pour les images qui permet de garder en mémoire une
103
	 * sélection
103
	 * sélection
104
	 */
104
	 */
105
	private Vector<String> selectionImages = new Vector<String>(0);
105
	private Vector<String> selectionImages = new Vector<String>(0);
106
 
106
 
107
	/**
107
	/**
108
	 * Retourne une instance de manière unique
108
	 * Retourne une instance de manière unique
109
	 * 
109
	 * 
110
	 * @param im
110
	 * @param im
111
	 *            le médiateur à associer
111
	 *            le médiateur à associer
112
	 * @return l'instance du modèle
112
	 * @return l'instance du modèle
113
	 */
113
	 */
114
	static ImageModele Instance(ImageMediateur im) {
114
	static ImageModele Instance(ImageMediateur im) {
115
		// si le modèle n'est pas encore instancié
115
		// si le modèle n'est pas encore instancié
116
		if (!estInstancie) {
116
		if (!estInstancie) {
117
			// on en crée un nouveau
117
			// on en crée un nouveau
118
			estInstancie = true;
118
			estInstancie = true;
119
			thisModele = new ImageModele(im);
119
			thisModele = new ImageModele(im);
120
		}
120
		}
121
 
121
 
122
		// sinon on retourne le "pointeur" vers le modèle lui-même
122
		// sinon on retourne le "pointeur" vers le modèle lui-même
123
		return thisModele;
123
		return thisModele;
124
 
124
 
125
	}
125
	}
126
 
126
 
127
	/**
127
	/**
128
	 * Le constructeur est privé et seule la méthode instance y accède
128
	 * Le constructeur est privé et seule la méthode instance y accède
129
	 * 
129
	 * 
130
	 * @param im
130
	 * @param im
131
	 *            le médiateur à associer
131
	 *            le médiateur à associer
132
	 */
132
	 */
133
	private ImageModele(ImageMediateur im) {
133
	private ImageModele(ImageMediateur im) {
134
 
134
 
135
		iMediateur = im;
135
		iMediateur = im;
136
		config = new Configuration();
136
		config = new Configuration();
137
	}
137
	}
138
 
138
 
139
	/**
139
	/**
140
	 * Accesseur pour le médiateur
140
	 * Accesseur pour le médiateur
141
	 * 
141
	 * 
142
	 * @return le médiateur associé
142
	 * @return le médiateur associé
143
	 */
143
	 */
144
	public ImageMediateur getIMediateur() {
144
	public ImageMediateur getIMediateur() {
145
		return iMediateur;
145
		return iMediateur;
146
	}
146
	}
147
 
147
	
148
	/**
-
 
149
	 * Appelle le DAO asynchrone pour obtenir la liste des images
-
 
150
	 * 
-
 
151
	 * @param r
-
 
152
	 *            le rafraichissable auxquel on enverra les données
-
 
153
	 */
-
 
154
	public void obtenirNombrePhotoGalerie(Rafraichissable r) {
148
	public String[][] obtenirFiltresPourComptage() {
155
 
149
 
156
		String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
150
		String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
157
 
151
 
158
		int tailleFiltres = valeursFiltres.length;
152
		int tailleFiltres = valeursFiltres.length;
159
 
153
 
160
		String[][] criteres = new String[tailleFiltres][2];
154
		String[][] criteres = new String[tailleFiltres][2];
161
 
155
 
162
		String[] utilisateur = {
156
		String[] utilisateur = {
163
				"" + getIMediateur().getIdentifiant() };
157
				"" + getIMediateur().getIdentifiant() };
164
		criteres[0] = utilisateur;
158
		criteres[0] = utilisateur;
165
 
159
 
166
 
160
 
167
		for (int i = 0; i < valeursFiltres.length; i++) {
161
		for (int i = 0; i < valeursFiltres.length; i++) {
168
			criteres[i] = valeursFiltres[i];
162
			criteres[i] = valeursFiltres[i];
169
		}
163
		}
-
 
164
		
-
 
165
		return criteres;
-
 
166
	}
-
 
167
	
-
 
168
	public String[][] obtenirFiltresPourDonnees() {
-
 
169
 
-
 
170
		String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
-
 
171
		
-
 
172
		int tailleFiltres = valeursFiltres.length;
-
 
173
		
-
 
174
		String[][] criteres2 = new String[tailleFiltres + 2][2];
-
 
175
		
-
 
176
		String[] limite = { "limite", "" + taillePage };
-
 
177
		String[] taillePage = { "numero_page", "" + pageEncours };
-
 
178
		
-
 
179
		criteres2[0] = limite;
-
 
180
		criteres2[1] = taillePage;
-
 
181
 
-
 
182
		for (int i = 0; i < valeursFiltres.length; i++) {
-
 
183
			criteres2[i + 2] = valeursFiltres[i];
-
 
184
		}
-
 
185
		
-
 
186
		return valeursFiltres;
-
 
187
	}
-
 
188
 
-
 
189
	/**
-
 
190
	 * Appelle le DAO asynchrone pour obtenir la liste des images
-
 
191
	 * 
-
 
192
	 * @param r
-
 
193
	 *            le rafraichissable auxquel on enverra les données
-
 
194
	 */
-
 
195
	public void obtenirNombrePhotoGalerie(Rafraichissable r) {
-
 
196
 
-
 
197
		String[][] criteres = obtenirFiltresPourComptage();
170
 
198
 
171
		// on les crée un DAO auquel on les transmet et qui demande le nombre
199
		// on les crée un DAO auquel on les transmet et qui demande le nombre
172
		// d'images correspondantes (pour les pages)
200
		// d'images correspondantes (pour les pages)
173
		NombreImageAsynchroneDAO niaDAO = new NombreImageAsynchroneDAO(this);
201
		NombreImageAsynchroneDAO niaDAO = new NombreImageAsynchroneDAO(this);
174
		niaDAO.obtenirNombreImages(this, criteres);
202
		niaDAO.obtenirNombreImages(this, criteres);
175
	}
203
	}
176
	
204
	
177
	public void obtenirPhotoGalerie(Rafraichissable r)
205
	public void obtenirPhotoGalerie(Rafraichissable r)
178
	{
206
	{
179
		String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
207
		String valeursFiltres[][] = getIMediateur().renvoyerFiltres();
180
		
208
		
181
		int tailleFiltres = valeursFiltres.length;
209
		int tailleFiltres = valeursFiltres.length;
182
		
210
		
-
 
211
		String[][] criteres2 = new String[tailleFiltres + 4][2];
-
 
212
		
-
 
213
		String[] tri = { "tri", "" + getIMediateur().getTri() };
183
		String[][] criteres2 = new String[tailleFiltres + 2][2];
214
		String[] triDir = { "dir", "" + getIMediateur().getDirectionTri()};
184
		
215
		
185
		String[] limite = { "limite", "" + taillePage };
216
		String[] limite = { "limite", "" + taillePage };
186
		String[] taillePage = { "numero_page", "" + pageEncours };
217
		String[] taillePage = { "numero_page", "" + pageEncours };
187
		
218
		
188
		criteres2[0] = limite;
219
		criteres2[0] = limite;
189
		criteres2[1] = taillePage;
220
		criteres2[1] = taillePage;
-
 
221
		
-
 
222
		criteres2[2] = tri;
-
 
223
		criteres2[3] = triDir;
190
 
224
 
191
		for (int i = 0; i < valeursFiltres.length; i++) {
225
		for (int i = 0; i < valeursFiltres.length; i++) {
192
			criteres2[i + 2] = valeursFiltres[i];
226
			criteres2[i + 4] = valeursFiltres[i];
193
		}
227
		}
194
		
228
		
195
		// et on crée un DAO auquel on les transmet et qui envoie une requete
229
		// et on crée un DAO auquel on les transmet et qui envoie une requete
196
		// pour recevoir les images
230
		// pour recevoir les images
197
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO(this);
231
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO(this);
198
		liaDAO.ObtenirListeImages(this, criteres2);
232
		liaDAO.ObtenirListeImages(this, criteres2);
199
	}
233
	}
200
 
234
 
201
	/**
235
	/**
202
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée et
236
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée et
203
	 * lancer l'interface appropriée
237
	 * lancer l'interface appropriée
204
	 */
238
	 */
205
	@SuppressWarnings("static-access")
239
	@SuppressWarnings("static-access")
206
	public void uploaderImages(boolean multiple) {
240
	public void uploaderImages(boolean multiple) {
207
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO(this);
241
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO(this);
208
		if(multiple) {
242
		if(multiple) {
209
			IuADaO.appelerUploadMultiple();
243
			IuADaO.appelerUploadMultiple();
210
		}
244
		}
211
		else 
245
		else 
212
		{
246
		{
213
			IuADaO.appelerUploadSimple();
247
			IuADaO.appelerUploadSimple();
214
		}
248
		}
215
	}
249
	}
216
 
250
 
217
	/**
251
	/**
218
	 * Met à jour la liste des images à partir d'un objet
252
	 * Met à jour la liste des images à partir d'un objet
219
	 * 
253
	 * 
220
	 * @param o
254
	 * @param o
221
	 *            la nouvelle liste d'image
255
	 *            la nouvelle liste d'image
222
	 */
256
	 */
223
	public void rafraichirListeImage(Object o) {
257
	public void rafraichirListeImage(Object o) {
224
		cacheImage = (ListeImageCarnet) o;
258
		cacheImage = (ListeImageCarnet) o;
225
	}
259
	}
226
 
260
 
227
	/**
261
	/**
228
	 * Met à jour l'arbre des mots clés à partir d'un objet
262
	 * Met à jour l'arbre des mots clés à partir d'un objet
229
	 * 
263
	 * 
230
	 * @param o
264
	 * @param o
231
	 *            le nouvel arbre de mots clés
265
	 *            le nouvel arbre de mots clés
232
	 */
266
	 */
233
	public void rafraichirArbreMotsCles(Object o) {
267
	public void rafraichirArbreMotsCles(Object o) {
234
		arbreMotsCles = (com.gwtext.client.data.Tree) o;
268
		arbreMotsCles = (com.gwtext.client.data.Tree) o;
235
	}
269
	}
236
 
270
 
237
	/**
271
	/**
238
	 * Met à jour la table de correspondance mots clés / ids à partir d'un objet
272
	 * Met à jour la table de correspondance mots clés / ids à partir d'un objet
239
	 * 
273
	 * 
240
	 * @param o
274
	 * @param o
241
	 *            la nouvelle table des mots clés
275
	 *            la nouvelle table des mots clés
242
	 */
276
	 */
243
	@SuppressWarnings("unchecked")
277
	@SuppressWarnings("unchecked")
244
	public void rafraichirMotsCles(Object o) {
278
	public void rafraichirMotsCles(Object o) {
245
		if (o instanceof HashMap) {
279
		if (o instanceof HashMap) {
246
			motsCles = (HashMap<String, String>) o;
280
			motsCles = (HashMap<String, String>) o;
247
		}
281
		}
248
	}
282
	}
249
 
283
 
250
	/**
284
	/**
251
	 * Va chercher les métadonnées associées à une image dans la liste des
285
	 * Va chercher les métadonnées associées à une image dans la liste des
252
	 * images chargée dans le modèle
286
	 * images chargée dans le modèle
253
	 * 
287
	 * 
254
	 * @param r
288
	 * @param r
255
	 *            le rafraichissable auquel on enverra les informations
289
	 *            le rafraichissable auquel on enverra les informations
256
	 * @param id
290
	 * @param id
257
	 *            l'identifiant de l'image
291
	 *            l'identifiant de l'image
258
	 */
292
	 */
259
	public void obtenirMetadonnees(Rafraichissable r, String id) {
293
	public void obtenirMetadonnees(Rafraichissable r, String id) {
260
		ImageCarnet im = cacheImage.get(id);
294
		ImageCarnet im = cacheImage.get(id);
261
 
295
 
262
		Object meta[] = new Object[3];
296
		Object meta[] = new Object[3];
263
		meta[0] = im.getMetadonnesExif();
297
		meta[0] = im.getMetadonnesExif();
264
		meta[1] = im.getMetadonnesIptc();
298
		meta[1] = im.getMetadonnesIptc();
265
		meta[2] = im.getInfoGenerales();
299
		meta[2] = im.getInfoGenerales();
266
 
300
 
267
		r.rafraichir(meta, false);
301
		r.rafraichir(meta, false);
268
	}
302
	}
269
 
303
 
270
	/**
304
	/**
271
	 * Va chercher les mots clés associés à une image dans la liste des images
305
	 * Va chercher les mots clés associés à une image dans la liste des images
272
	 * chargée dans le modèle
306
	 * chargée dans le modèle
273
	 * 
307
	 * 
274
	 * @param r
308
	 * @param r
275
	 *            le rafraichissable auquel on enverra les informations
309
	 *            le rafraichissable auquel on enverra les informations
276
	 * @param id
310
	 * @param id
277
	 *            l'identifiant de l'image
311
	 *            l'identifiant de l'image
278
	 */
312
	 */
279
	public void obtenirMotsClesId(Rafraichissable r, String id) {
313
	public void obtenirMotsClesId(Rafraichissable r, String id) {
280
 
314
 
281
		String[] motsClesIdTab = getMotsClesId(id);
315
		String[] motsClesIdTab = getMotsClesId(id);
282
		r.rafraichir(motsClesIdTab, false);
316
		r.rafraichir(motsClesIdTab, false);
283
	}
317
	}
284
	
318
	
285
	public String[] getMotsClesId(String idImage) {
319
	public String[] getMotsClesId(String idImage) {
286
		ImageCarnet im = cacheImage.get(idImage);
320
		ImageCarnet im = cacheImage.get(idImage);
287
		String motsClesId = im.getMotsCles();
321
		String motsClesId = im.getMotsCles();
288
		String[] motsClesIdTab = motsClesId.split(",");
322
		String[] motsClesIdTab = motsClesId.split(",");
289
		
323
		
290
		return motsClesIdTab;
324
		return motsClesIdTab;
291
	}
325
	}
292
	
326
	
293
	/**
327
	/**
294
	 * Va chercher le nom du mot clé associé à un id dans le cache local
328
	 * Va chercher le nom du mot clé associé à un id dans le cache local
295
	 * 
329
	 * 
296
	 * @param String id
330
	 * @param String id
297
	 *            id du mot clé
331
	 *            id du mot clé
298
	 * @return le mot clé associé à l'identifiant
332
	 * @return le mot clé associé à l'identifiant
299
	 */
333
	 */
300
	public String obtenirTexteMotCle(String id) {
334
	public String obtenirTexteMotCle(String id) {
301
		
335
		
302
		String correspondanceId = "";
336
		String correspondanceId = "";
303
		
337
		
304
		String motCleTexte = motsCles.get(id);
338
		String motCleTexte = motsCles.get(id);
305
		
339
		
306
		if(motCleTexte != null) {
340
		if(motCleTexte != null) {
307
			correspondanceId = motCleTexte;
341
			correspondanceId = motCleTexte;
308
		}
342
		}
309
		
343
		
310
		return correspondanceId;
344
		return correspondanceId;
311
	}
345
	}
312
	
346
	
313
	/**
347
	/**
314
	 * Construit une chaine contenant le texte des mots clés séparés par des virgules
348
	 * Construit une chaine contenant le texte des mots clés séparés par des virgules
315
	*/
349
	*/
316
	public String renvoyerChaineMotClesTexte(ImageCarnet ic) {
350
	public String renvoyerChaineMotClesTexte(ImageCarnet ic) {
317
		String chaineMotsCles = ic.getMotsCles();
351
		String chaineMotsCles = ic.getMotsCles();
318
		String[] tabMotsCles = chaineMotsCles.split(",");
352
		String[] tabMotsCles = chaineMotsCles.split(",");
319
		String chaineMotsClesTexte = "";
353
		String chaineMotsClesTexte = "";
320
		for (int i = 0; i < tabMotsCles.length; i++) {
354
		for (int i = 0; i < tabMotsCles.length; i++) {
321
			chaineMotsClesTexte += motsCles.get(tabMotsCles[i]);
355
			chaineMotsClesTexte += motsCles.get(tabMotsCles[i]);
322
			chaineMotsClesTexte += (i != tabMotsCles.length - 1) ? "," : "";
356
			chaineMotsClesTexte += (i != tabMotsCles.length - 1) ? "," : "";
323
		}
357
		}
324
		return chaineMotsClesTexte;
358
		return chaineMotsClesTexte;
325
	}
359
	}
326
 
360
 
327
	/**
361
	/**
328
	 * Met à jour la liste des images en local et appelle le DAO de mise à jour
362
	 * Met à jour la liste des images en local et appelle le DAO de mise à jour
329
	 * pour les commentaires et la date des images selectionnées
363
	 * pour les commentaires et la date des images selectionnées
330
	 * 
364
	 * 
331
	 * @param commentaires
365
	 * @param commentaires
332
	 *            le commentaire à appliquer
366
	 *            le commentaire à appliquer
333
	 * @param date
367
	 * @param date
334
	 *            la date à appliquer
368
	 *            la date à appliquer
335
	 * @param ids
369
	 * @param ids
336
	 *            les identifiants des images selectionnées
370
	 *            les identifiants des images selectionnées
337
	 */
371
	 */
338
	public void mettreAJourCacheImage(String commentaires, String date,
372
	public void mettreAJourCacheImage(String commentaires, String date,
339
			String note, String ids[]) {
373
			String note, String ids[]) {
340
		for (int i = 0; i < ids.length; i++) {
374
		for (int i = 0; i < ids.length; i++) {
341
			String key = ids[i];
375
			String key = ids[i];
342
			ImageCarnet ic = cacheImage.get(key);
376
			ImageCarnet ic = cacheImage.get(key);
343
			ic.miseAJourInfoGenerales(commentaires, date, note);
377
			ic.miseAJourInfoGenerales(commentaires, date, note);
344
			mettreAjourBaseDeDonneesImageCarnet(ic);
378
			mettreAjourBaseDeDonneesImageCarnet(ic);
345
		}
379
		}
346
 
380
 
347
	}
381
	}
348
 
382
 
349
	/**
383
	/**
350
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
384
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
351
	 * 
385
	 * 
352
	 * @param text
386
	 * @param text
353
	 *            le mot clé
387
	 *            le mot clé
354
	 * @param id
388
	 * @param id
355
	 *            l'identifiant du mot clé
389
	 *            l'identifiant du mot clé
356
	 */
390
	 */
357
	public void mettreAjourMotsClesId(String text, String id) {
391
	public void mettreAjourMotsClesId(String text, String id) {
358
		motsCles.put(id, text);
392
		motsCles.put(id, text);
359
	}
393
	}
360
 
394
 
361
	/**
395
	/**
362
	 * Appelle le DAO chargé de mettre à jour la base de données avec les toutes
396
	 * Appelle le DAO chargé de mettre à jour la base de données avec les toutes
363
	 * les informations des images modifiées par l'utilisateur
397
	 * les informations des images modifiées par l'utilisateur
364
	 */
398
	 */
365
	public void mettreAJourBaseDeDonneesListeImageCarnet() {
399
	public void mettreAJourBaseDeDonneesListeImageCarnet() {
366
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO(this);
400
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO(this);
367
 
401
 
368
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
402
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
369
	}
403
	}
370
 
404
 
371
	/**
405
	/**
372
	 * Appelle le DAO chargé de mettre à jour la base de données avec les toutes
406
	 * Appelle le DAO chargé de mettre à jour la base de données avec les toutes
373
	 * les informations d'une image donnée
407
	 * les informations d'une image donnée
374
	 * 
408
	 * 
375
	 * @param ic
409
	 * @param ic
376
	 *            l'image à synchroniser avec la base
410
	 *            l'image à synchroniser avec la base
377
	 */
411
	 */
378
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic) {
412
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic) {
379
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO(this);
413
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO(this);
380
		iaDaO.SynchroniserBaseDeDonnees(ic);
414
		iaDaO.SynchroniserBaseDeDonnees(ic);
381
	}
415
	}
382
 
416
 
383
	/**
417
	/**
384
	 * Supprime les images données du cache local et appelle le DAO qui les
418
	 * Supprime les images données du cache local et appelle le DAO qui les
385
	 * supprime de la base de données
419
	 * supprime de la base de données
386
	 * 
420
	 * 
387
	 * @param ids
421
	 * @param ids
388
	 *            les identifiants des images selectionnées
422
	 *            les identifiants des images selectionnées
389
	 */
423
	 */
390
	public void supprimerImages(String[] ids) {
424
	public void supprimerImages(String[] ids) {
391
		String rids[] = new String[ids.length];
425
		String rids[] = new String[ids.length];
392
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO(this);
426
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO(this);
393
 
427
 
394
		for (int i = 0; i < ids.length; i++) {
428
		for (int i = 0; i < ids.length; i++) {
395
			String key = ids[i];
429
			String key = ids[i];
396
			ImageCarnet ic = cacheImage.get(key);
430
			ImageCarnet ic = cacheImage.get(key);
397
			rids[i] = ic.getId();
431
			rids[i] = ic.getId();
398
 
432
 
399
			cacheImage.remove(key);
433
			cacheImage.remove(key);
400
		}
434
		}
401
 
435
 
402
		if (rids.length != 0) {
436
		if (rids.length != 0) {
403
			liDao.supprimerBaseDeDonnees(rids);
437
			liDao.supprimerBaseDeDonnees(rids);
404
		}
438
		}
405
	}
439
	}
406
 
440
 
407
	/**
441
	/**
408
	 * Met à jour les données locales suivant le type des nouvelles données et
442
	 * Met à jour les données locales suivant le type des nouvelles données et
409
	 * appelle le médiateur pour le notifier de la mise à jour
443
	 * appelle le médiateur pour le notifier de la mise à jour
410
	 */
444
	 */
411
	@Override
445
	@Override
412
	public void rafraichir(Object nouvelleDonnees,
446
	public void rafraichir(Object nouvelleDonnees,
413
			boolean repandreRafraichissement) {
447
			boolean repandreRafraichissement) {
414
		// si l'on a reçu une liste d'images
448
		// si l'on a reçu une liste d'images
415
		if (nouvelleDonnees instanceof ListeImageCarnet) {
449
		if (nouvelleDonnees instanceof ListeImageCarnet) {
416
			ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees;
450
			ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees;
417
			Object[][] photoData = new Object[data.size()][13];
451
			Object[][] photoData = new Object[data.size()][14];
418
			int i = 0;
452
			int i = 0;
419
 
453
 
420
			if (data.size() == 0) {
454
			if (data.size() == 0) {
421
				pageEncours = 0;
455
				pageEncours = 0;
422
			}
456
			}
423
 
457
 
424
			// on la parse et on récupère les informations qui nous interessent
458
			// on la parse et on récupère les informations qui nous interessent
425
			for (Iterator<String> it = data.keySet().iterator(); it.hasNext();) {
459
			for (Iterator<String> it = data.keySet().iterator(); it.hasNext();) {
426
				ImageCarnet im = data.get(it.next());
460
				ImageCarnet im = data.get(it.next());
427
				photoData[i][0] = im.getOrdre();
461
				photoData[i][0] = im.getOrdre();
428
				photoData[i][1] = im.getNomOriginal();
462
				photoData[i][1] = im.getNomOriginal();
429
				photoData[i][2] = im.getDate();
463
				photoData[i][2] = im.getDate();
430
				photoData[i][3] = im.getIptcCity();
464
				photoData[i][3] = im.getIptcCity();
431
				photoData[i][4] = im.getFabriquantAppareil() + " " + im.getModeleAppareil();
465
				photoData[i][4] = im.getFabriquantAppareil() + " " + im.getModeleAppareil();
432
				photoData[i][5] = im.getUrlFormatListe();
466
				photoData[i][5] = im.getUrlFormatListe();
433
				photoData[i][6] = im.getUrlFormatGalerie();
467
				photoData[i][6] = im.getUrlFormatGalerie();
434
				photoData[i][7] = im.getUrlFormatZoom();
468
				photoData[i][7] = im.getUrlFormatZoom();
435
				photoData[i][8] = im.getNote();
469
				photoData[i][8] = im.getNote();
436
				photoData[i][9] = im.getId();
470
				photoData[i][9] = im.getId();
437
				photoData[i][10] = im.getTailleImage()[1];
471
				photoData[i][10] = im.getTailleImage()[1];
438
				photoData[i][11] = im.getTailleImage()[0];
472
				photoData[i][11] = im.getTailleImage()[0];
439
				photoData[i][12] = im.getIdsObsAssociees();
473
				photoData[i][12] = im.getIdsObsAssociees();
-
 
474
				photoData[i][13] = im.getIdsObsAssociees();
440
 
475
 
441
				i++;
476
				i++;
442
			}
477
			}
443
 
-
 
444
			// creation du store qui les contient
-
 
445
			FieldDef defNumImage = new IntegerFieldDef("num_image");
-
 
446
			FieldDef defNomImage = new StringFieldDef("nom_original");
-
 
447
			FieldDef defDatImage = new StringFieldDef("dat_image");
-
 
448
			FieldDef defLieImage = new StringFieldDef("lie_image");
-
 
449
			FieldDef defAppImage = new StringFieldDef("app_image");
-
 
450
			FieldDef defUrlImageS = new StringFieldDef("url_image_S");
-
 
451
			FieldDef defUrlImageM = new StringFieldDef("url_image_M");
-
 
452
			FieldDef defUrlImage = new StringFieldDef("url_image");
-
 
453
			FieldDef defNoteImage = new IntegerFieldDef("note_image");
-
 
454
			FieldDef defIdImage = new IntegerFieldDef("id_image");
-
 
-
 
478
 
455
			FieldDef defTailleX = new IntegerFieldDef("taille_x");
-
 
456
			FieldDef defTailleY = new IntegerFieldDef("taille_y");
-
 
457
			FieldDef defObsAssociees = new StringFieldDef("obs_associees");
-
 
458
			FieldDef[] defTab = { defNumImage,defNomImage, defDatImage, defLieImage,
-
 
459
					defAppImage, defUrlImageS, defUrlImageM, defUrlImage,
-
 
460
					defNoteImage, defIdImage, defTailleX, defTailleY, defObsAssociees };
479
 
461
			RecordDef rd = new RecordDef(defTab);
480
			RecordDef rd = new RecordDef(ImageMediateur.getDefinitionsChampsGrilleImages());
462
 
481
 
463
			final MemoryProxy dataProxy = new MemoryProxy(photoData);
482
			final MemoryProxy dataProxy = new MemoryProxy(photoData);
464
			final ArrayReader reader = new ArrayReader(rd);
483
			final ArrayReader reader = new ArrayReader(rd);
465
 
484
 
466
			final Store photoStore = new Store(dataProxy, reader);
485
			final Store photoStore = new Store(dataProxy, reader);
467
 
486
 
468
			rafraichirListeImage(nouvelleDonnees);
487
			rafraichirListeImage(nouvelleDonnees);
469
 
488
 
470
			st = photoStore;
489
			st = photoStore;
471
			st.load();
490
			st.load();
472
 
-
 
473
			// par défaut le store est trié sur le numéro d'image
-
 
474
			st.sort("num_image");
-
 
475
 
491
 
476
			// si on doit répandre les données, on notifie le médiateur qui les
492
			// si on doit répandre les données, on notifie le médiateur qui les
477
			// distribuera à son tour
493
			// distribuera à son tour
478
			if (repandreRafraichissement) {
494
			if (repandreRafraichissement) {
479
				getIMediateur().synchroniserDonneesZoomListeGalerie(st, this);
495
				getIMediateur().synchroniserDonneesZoomListeGalerie(st, this);
480
			}
496
			}
481
		}
497
		}
482
 
498
 
483
		// si on reçoit un tableau JSON
499
		// si on reçoit un tableau JSON
484
		if (nouvelleDonnees instanceof JSONArray) {
500
		if (nouvelleDonnees instanceof JSONArray) {
485
			// alors on a reçu les informations sur les mots clés			
501
			// alors on a reçu les informations sur les mots clés			
486
			JSONArray donneesArbre = (JSONArray)nouvelleDonnees;
502
			JSONArray donneesArbre = (JSONArray)nouvelleDonnees;
487
			
503
			
488
			Object[] arbreEtCorrespondancesIds = MotsClesUtilitaire.construireArbre("Tags", "racine", donneesArbre, false);
504
			Object[] arbreEtCorrespondancesIds = MotsClesUtilitaire.construireArbre("Tags", "racine", donneesArbre, false);
489
			
505
			
490
			arbreMotsCles = (Tree)arbreEtCorrespondancesIds[0];
506
			arbreMotsCles = (Tree)arbreEtCorrespondancesIds[0];
491
			motsCles = (HashMap<String, String>)arbreEtCorrespondancesIds[1];
507
			motsCles = (HashMap<String, String>)arbreEtCorrespondancesIds[1];
492
 
508
 
493
			// enfin on met à jour l'arbre des mots clés contenu dans le modèle
509
			// enfin on met à jour l'arbre des mots clés contenu dans le modèle
494
			rafraichirArbreMotsCles(arbreMotsCles);
510
			rafraichirArbreMotsCles(arbreMotsCles);
495
			// la table de hachage
511
			// la table de hachage
496
			rafraichirMotsCles(motsCles);
512
			rafraichirMotsCles(motsCles);
497
			// et on notifie le médiateur de la mise à jour en lui passant une
513
			// et on notifie le médiateur de la mise à jour en lui passant une
498
			// copie des données
514
			// copie des données
499
			getIMediateur().rafraichirArbreMotsCles(arbreMotsCles);
515
			getIMediateur().rafraichirArbreMotsCles(arbreMotsCles);
500
		}
516
		}
501
 
517
 
502
		// Si on reçoit un tableau d'entiers
518
		// Si on reçoit un tableau d'entiers
503
		// c'est un tableau d'un seul entier qui est le nombre d'images
519
		// c'est un tableau d'un seul entier qui est le nombre d'images
504
		// correspondant aux critères
520
		// correspondant aux critères
505
		if (nouvelleDonnees instanceof int[]) {
521
		if (nouvelleDonnees instanceof int[]) {
506
			int[] pages = (int[]) nouvelleDonnees;
522
			int[] pages = (int[]) nouvelleDonnees;
507
 
523
 
508
			// on calcule le nombre de pages nécessaires et on les met à jour
524
			// on calcule le nombre de pages nécessaires et on les met à jour
509
			// dans le modèle
525
			// dans le modèle
510
			pageMax = calculerNbPages(pages[0]);
526
			pageMax = calculerNbPages(pages[0]);
511
			nbElements = pages[0];
527
			nbElements = pages[0];
512
 
528
 
513
			// et on notifie de le mediateur du changement des valeurs
529
			// et on notifie de le mediateur du changement des valeurs
514
			getIMediateur().changerPageMaxEtCourante(pageMax, pageEncours,
530
			getIMediateur().changerPageMaxEtCourante(pageMax, pageEncours,
515
					taillePage, pages[0]);
531
					taillePage, pages[0]);
516
			
532
			
517
			obtenirPhotoGalerie(this) ;
533
			obtenirPhotoGalerie(this) ;
518
		}
534
		}
519
		
535
		
520
		if(nouvelleDonnees instanceof ListeObservation) {
536
		if(nouvelleDonnees instanceof ListeObservation) {
521
			
537
			
522
			getIMediateur().rafraichirMiniListeObservations((ListeObservation)nouvelleDonnees) ;
538
			getIMediateur().rafraichirMiniListeObservations((ListeObservation)nouvelleDonnees) ;
523
		}
539
		}
524
		
540
		
525
		if(nouvelleDonnees instanceof Tree) {
541
		if(nouvelleDonnees instanceof Tree) {
526
			rafraichirArbreMotsCles(nouvelleDonnees);
542
			rafraichirArbreMotsCles(nouvelleDonnees);
527
			getIMediateur().rafraichirArbreMotsCles((Tree)nouvelleDonnees);
543
			getIMediateur().rafraichirArbreMotsCles((Tree)nouvelleDonnees);
528
		}
544
		}
529
	}
545
	}
530
 
546
 
531
	/**
547
	/**
532
	 * Met à jour les mots clés associés à une image et appelle le DAO pour
548
	 * Met à jour les mots clés associés à une image et appelle le DAO pour
533
	 * synchroniser la base de données
549
	 * synchroniser la base de données
534
	 * 
550
	 * 
535
	 * @param ids
551
	 * @param ids
536
	 *            les identifiants des images selectionnées
552
	 *            les identifiants des images selectionnées
537
	 * @param motsClesEnCours
553
	 * @param motsClesEnCours
538
	 *            les mots clés à appliquer aux images
554
	 *            les mots clés à appliquer aux images
539
	 * @param arbreMC
555
	 * @param arbreMC
540
	 *            l'arbre de mots clés en cours
556
	 *            l'arbre de mots clés en cours
541
	 */
557
	 */
542
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours,
558
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours,
543
			com.gwtext.client.data.Tree arbreMC) {
559
			com.gwtext.client.data.Tree arbreMC) {
544
		
560
		
545
		String idImgs = ""; 
561
		String idImgs = ""; 
546
		for (int i = 0; i < ids.length; i++) {
562
		for (int i = 0; i < ids.length; i++) {
547
			String idImageEnCours = "";
563
			String idImageEnCours = "";
548
			if (cacheImage.containsKey(ids[i])) {
564
			if (cacheImage.containsKey(ids[i])) {
549
				ImageCarnet ic = cacheImage.get(ids[i]);
565
				ImageCarnet ic = cacheImage.get(ids[i]);
550
				idImageEnCours = ic.getId();
566
				idImageEnCours = ic.getId();
551
				ic.mettreAjourMotsCles(motsClesEnCours);
567
				ic.mettreAjourMotsCles(motsClesEnCours);
552
			}
568
			}
553
			idImgs += idImageEnCours;
569
			idImgs += idImageEnCours;
554
			idImgs += (i < (ids.length - 1)) ? ",": ""; 
570
			idImgs += (i < (ids.length - 1)) ? ",": ""; 
555
		}
571
		}
556
		
572
		
557
		LiaisonMotsClesImageAsynchroneDAO liMcDao = new LiaisonMotsClesImageAsynchroneDAO(this);
573
		LiaisonMotsClesImageAsynchroneDAO liMcDao = new LiaisonMotsClesImageAsynchroneDAO(this);
558
		liMcDao.modifier(this, Utilisateur.getInstance().getIdentifiantUtilisateurConsulte(), idImgs, motsClesEnCours);
574
		liMcDao.modifier(this, Utilisateur.getInstance().getIdentifiantUtilisateurConsulte(), idImgs, motsClesEnCours);
559
 
575
 
560
		rafraichirArbreMotsCles(arbreMC);
576
		rafraichirArbreMotsCles(arbreMC);
561
	}
577
	}
562
 
578
 
563
	/**
579
	/**
564
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la
580
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la
565
	 * base de données
581
	 * base de données
566
	 */
582
	 */
567
	public void initialiserArbreMotsCles() {
583
	public void initialiserArbreMotsCles() {
568
		
584
		
569
			MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
585
			MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
570
			MCDao.obtenirListeMotsCles(this);
586
			MCDao.obtenirListeMotsCles(this);
571
	}
587
	}
572
 
588
 
573
	/**
589
	/**
574
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable
590
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable
575
	 * donné, qui le demande
591
	 * donné, qui le demande
576
	 * 
592
	 * 
577
	 * @param r
593
	 * @param r
578
	 *            le rafraichissable demandeur de l'arbre
594
	 *            le rafraichissable demandeur de l'arbre
579
	 */
595
	 */
580
	public void obtenirArbreMotCle(Rafraichissable r) {
596
	public void obtenirArbreMotCle(Rafraichissable r) {
581
			r.rafraichir(arbreMotsCles, false);
597
			r.rafraichir(arbreMotsCles, false);
582
	}
598
	}
583
 
599
 
584
	/**
600
	/**
585
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui
601
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui
586
	 * fait la mise à jour de l'arbre des mots clés dans la base
602
	 * fait la mise à jour de l'arbre des mots clés dans la base
587
	 * 
603
	 * 
588
	 * @param n
604
	 * @param n
589
	 *            le nouveau noeud contenant le mot clé
605
	 *            le nouveau noeud contenant le mot clé
590
	 * @param arbreMC
606
	 * @param arbreMC
591
	 *            l'arbre des mots cles en cours
607
	 *            l'arbre des mots cles en cours
592
	 */
608
	 */
593
	public void ajouterMotCleDansArbre(TreeNode n,
609
	public void ajouterMotCleDansArbre(TreeNode n,
594
			com.gwtext.client.data.Tree arbreMC, Rafraichissable r) {
610
			com.gwtext.client.data.Tree arbreMC, Rafraichissable r) {
595
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
611
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
596
 
612
 
597
		String[] usObj = (String[]) n.getUserObject();
613
		String[] usObj = (String[]) n.getUserObject();
598
		String motCle = usObj[0];
614
		String motCle = usObj[0];
599
		String id = usObj[1];
615
		String id = usObj[1];
600
		String parentId = "";
616
		String parentId = "";
601
 
617
 
602
		if (!id.equals("racine")) {
618
		if (!id.equals("racine")) {
603
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
619
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
604
			if(!parentUsObj[1].equals("racine")) {
620
			if(!parentUsObj[1].equals("racine")) {
605
				parentId = parentUsObj[1];
621
				parentId = parentUsObj[1];
606
			}
622
			}
607
		}
623
		}
608
 
624
 
609
		rafraichirArbreMotsCles(arbreMC);
625
		rafraichirArbreMotsCles(arbreMC);
610
		mettreAjourMotsClesId(motCle, id);
626
		mettreAjourMotsClesId(motCle, id);
611
 
627
 
612
		String nouveauMotCle = "&identifiant=" + getIdentifiant() + "&motcle="
628
		String nouveauMotCle = "&identifiant=" + getIdentifiant() + "&motcle="
613
				+ motCle + "&id=" + id + "&parent=" + parentId;
629
				+ motCle + "&id=" + id + "&parent=" + parentId;
614
		MCDao.ajouterBaseDeDonnees(nouveauMotCle, r);
630
		MCDao.ajouterBaseDeDonnees(nouveauMotCle, r);
615
	}
631
	}
616
 
632
 
617
	/**
633
	/**
618
	 * Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va
634
	 * Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va
619
	 * supprimer les mots clés associés dans la base
635
	 * supprimer les mots clés associés dans la base
620
	 * 
636
	 * 
621
	 * @param n
637
	 * @param n
622
	 *            le noeud à supprimer
638
	 *            le noeud à supprimer
623
	 * @param arbreMC
639
	 * @param arbreMC
624
	 *            l'arbre des mots clés en cours
640
	 *            l'arbre des mots clés en cours
625
	 */
641
	 */
626
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
642
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
627
 
643
 
628
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
644
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
629
 
645
 
630
		String[] usObj = (String[]) n.getUserObject();
646
		String[] usObj = (String[]) n.getUserObject();
631
		String id = usObj[1];
647
		String id = usObj[1];
632
 
648
 
633
		MCDao.supprimerBaseDeDonnees(id, r);
649
		MCDao.supprimerBaseDeDonnees(id, r);
634
 
650
 
635
	}
651
	}
636
 
652
 
637
	/**
653
	/**
638
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le
654
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le
639
	 * DAO qui synchronise la modification dans la base de données
655
	 * DAO qui synchronise la modification dans la base de données
640
	 * 
656
	 * 
641
	 * @param n
657
	 * @param n
642
	 *            le noeud modifié
658
	 *            le noeud modifié
643
	 * @param arbreMC
659
	 * @param arbreMC
644
	 *            l'arbre des mots clés en cours
660
	 *            l'arbre des mots clés en cours
645
	 */
661
	 */
646
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
662
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
647
 
663
 
648
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
664
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
649
 
665
 
650
		String[] usObj = (String[]) n.getUserObject();
666
		String[] usObj = (String[]) n.getUserObject();
651
		String motCle = usObj[0];
667
		String motCle = usObj[0];
652
		String id = usObj[1];
668
		String id = usObj[1];
653
		String parentId = "";
669
		String parentId = "";
654
 
670
 
655
		if (!id.equals("racine")) {
671
		if (!id.equals("racine")) {
656
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
672
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
657
			if(!parentUsObj[1].equals("racine")) {
673
			if(!parentUsObj[1].equals("racine")) {
658
				parentId = parentUsObj[1];
674
				parentId = parentUsObj[1];
659
			}
675
			}
660
		}
676
		}
661
 
677
 
662
		rafraichirArbreMotsCles(arbreMC);
678
		rafraichirArbreMotsCles(arbreMC);
663
 
679
 
664
		String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
680
		String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
665
				+ parentId;
681
				+ parentId;
666
		MCDao.modifierBaseDeDonnees(motCleModifie, r);
682
		MCDao.modifierBaseDeDonnees(motCleModifie, r);
667
 
683
 
668
	}
684
	}
669
 
685
 
670
	/**
686
	/**
671
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui
687
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui
672
	 * reorganise l'arbre dans la base de donnees suivant le changement
688
	 * reorganise l'arbre dans la base de donnees suivant le changement
673
	 * 
689
	 * 
674
	 * @param n
690
	 * @param n
675
	 *            le noeud deplace (et son sous arbre associe)
691
	 *            le noeud deplace (et son sous arbre associe)
676
	 * @param arbreMC
692
	 * @param arbreMC
677
	 *            l'arbre des mots cles en cours
693
	 *            l'arbre des mots cles en cours
678
	 */
694
	 */
679
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
695
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
680
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
696
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO("images");
681
 
697
 
682
		String[] usObj = (String[]) n.getUserObject();
698
		String[] usObj = (String[]) n.getUserObject();
683
		String motCle = usObj[0];
699
		String motCle = usObj[0];
684
		String id = usObj[1];
700
		String id = usObj[1];
685
		String parentId = "";
701
		String parentId = "";
686
		
702
		
687
		if (!id.equals("racine")) {
703
		if (!id.equals("racine")) {
688
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
704
			String[] parentUsObj = (String[]) n.getParentNode().getUserObject();
689
			if(!parentUsObj[1].equals("racine")) {
705
			if(!parentUsObj[1].equals("racine")) {
690
				parentId = parentUsObj[1];
706
				parentId = parentUsObj[1];
691
			}
707
			}
692
		}
708
		}
693
 
709
 
694
		rafraichirArbreMotsCles(arbreMC);
710
		rafraichirArbreMotsCles(arbreMC);
695
 
711
 
696
		String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
712
		String motCleModifie = "&motcle=" + motCle + "&id=" + id + "&parent="
697
				+ parentId;
713
				+ parentId;
698
		MCDao.deplacerBaseDeDonnees(motCleModifie, r);
714
		MCDao.deplacerBaseDeDonnees(motCleModifie, r);
699
	}
715
	}
700
 
716
 
701
	/**
717
	/**
702
	 * Change le numéro de la page en cours et envoie une demande de mise à jour
718
	 * Change le numéro de la page en cours et envoie une demande de mise à jour
703
	 * des données
719
	 * des données
704
	 * 
720
	 * 
705
	 * @param nouvellePageCourante
721
	 * @param nouvellePageCourante
706
	 *            la nouvelle page à afficher
722
	 *            la nouvelle page à afficher
707
	 */
723
	 */
708
	public void changerNumeroPage(int nouvellePageCourante) {
724
	public void changerNumeroPage(int nouvellePageCourante) {
709
		pageEncours = nouvellePageCourante;
725
		pageEncours = nouvellePageCourante;
710
		obtenirNombrePhotoGalerie(this);
726
		obtenirNombrePhotoGalerie(this);
711
	}
727
	}
712
 
728
 
713
	/**
729
	/**
714
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements
730
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements
715
	 * donnés en fonction de la taille de page en cours
731
	 * donnés en fonction de la taille de page en cours
716
	 * 
732
	 * 
717
	 * @param nbElements
733
	 * @param nbElements
718
	 *            le nombre d'élements total
734
	 *            le nombre d'élements total
719
	 * @return le nombre de pages
735
	 * @return le nombre de pages
720
	 */
736
	 */
721
	public int calculerNbPages(int nbElements) {
737
	public int calculerNbPages(int nbElements) {
722
		// A cause de la betise de java pour les conversion implicite on fait
738
		// A cause de la betise de java pour les conversion implicite on fait
723
		// quelques conversions manuellement
739
		// quelques conversions manuellement
724
		// pour eviter qu'il arrondisse mal la division
740
		// pour eviter qu'il arrondisse mal la division
725
		// nombre de pages = (nombre d'element / taille de la page) arrondie à
741
		// nombre de pages = (nombre d'element / taille de la page) arrondie à
726
		// l'entier superieur
742
		// l'entier superieur
727
		double nPage = (1.0 * nbElements) / (1.0 * taillePage);
743
		double nPage = (1.0 * nbElements) / (1.0 * taillePage);
728
		double nPageRound = Math.ceil(nPage);
744
		double nPageRound = Math.ceil(nPage);
729
		Double nPageInt = new Double(nPageRound);
745
		Double nPageInt = new Double(nPageRound);
730
 
746
 
731
		// on convertit en entier
747
		// on convertit en entier
732
		return nPageInt.intValue();
748
		return nPageInt.intValue();
733
	}
749
	}
734
 
750
 
735
	/**
751
	/**
736
	 * Recalcule la page en cours lors du changement du nombre d'élements
752
	 * Recalcule la page en cours lors du changement du nombre d'élements
737
	 * 
753
	 * 
738
	 * @param nbElements
754
	 * @param nbElements
739
	 *            le nombre d'élements total
755
	 *            le nombre d'élements total
740
	 * @return la nouvelle page encours
756
	 * @return la nouvelle page encours
741
	 */
757
	 */
742
	public int calculerPageCourante(int nbElements) {
758
	public int calculerPageCourante(int nbElements) {
743
		// on calcule le nombre de page
759
		// on calcule le nombre de page
744
		int nouvelNbPages = calculerNbPages(nbElements);
760
		int nouvelNbPages = calculerNbPages(nbElements);
745
		// la nouvelle page en cours
761
		// la nouvelle page en cours
746
		double nPageCourante = (1.0 * pageEncours) / (1.0 * pageMax)
762
		double nPageCourante = (1.0 * pageEncours) / (1.0 * pageMax)
747
				* (1.0 * nouvelNbPages);
763
				* (1.0 * nouvelNbPages);
748
 
764
 
749
		// on arrondit au supérieur
765
		// on arrondit au supérieur
750
		double nPageRound = Math.ceil(nPageCourante);
766
		double nPageRound = Math.ceil(nPageCourante);
751
		Double nPageInt = new Double(nPageRound);
767
		Double nPageInt = new Double(nPageRound);
752
 
768
 
753
		// on convertit en entier
769
		// on convertit en entier
754
		return Math.abs(nPageInt.intValue());
770
		return Math.abs(nPageInt.intValue());
755
	}
771
	}
756
 
772
 
757
	/**
773
	/**
758
	 * Change la taille de page et recalcule la page encours
774
	 * Change la taille de page et recalcule la page encours
759
	 * 
775
	 * 
760
	 * @param nouvelleTaillePage
776
	 * @param nouvelleTaillePage
761
	 *            la nouvelle taille de page à utiliser
777
	 *            la nouvelle taille de page à utiliser
762
	 */
778
	 */
763
	public void changerTaillePage(int nouvelleTaillePage) {
779
	public void changerTaillePage(int nouvelleTaillePage) {
764
		taillePage = nouvelleTaillePage;
780
		taillePage = nouvelleTaillePage;
765
		pageEncours = calculerPageCourante(nbElements);
781
		pageEncours = calculerPageCourante(nbElements);
766
		obtenirNombrePhotoGalerie(this);
782
		obtenirNombrePhotoGalerie(this);
767
	}
783
	}
768
	
784
	
769
	/**
785
	/**
770
	 * Met la valeur de la page en cours à la dernière 
786
	 * Met la valeur de la page en cours à la dernière 
771
	 */
787
	 */
772
	public void setDernierePage() {
788
	public void setDernierePage() {
773
		changerNumeroPage(pageMax);
789
		changerNumeroPage(pageMax);
774
	}
790
	}
775
 
791
 
776
	/**
792
	/**
777
	 * Notifie le mediateur que l'upload ou le download est termine et qu'il
793
	 * Notifie le mediateur que l'upload ou le download est termine et qu'il
778
	 * faut rafraichir les vues avec les nouvelles données
794
	 * faut rafraichir les vues avec les nouvelles données
779
	 */
795
	 */
780
	public void requeteTerminee() {
796
	public void requeteTerminee() {
781
		getIMediateur().demasquerChargement();
797
		getIMediateur().demasquerChargement();
782
		getIMediateur().rafraichirToutesVues();
798
		getIMediateur().rafraichirToutesVues();
783
	}
799
	}
784
 
800
 
785
	/**
801
	/**
786
	 * Obtient l'identifiant de l'utilisateur auprès du médiateur
802
	 * Obtient l'identifiant de l'utilisateur auprès du médiateur
787
	 * 
803
	 * 
788
	 * @return id de l'utilisateur
804
	 * @return id de l'utilisateur
789
	 */
805
	 */
790
	public String getIdentifiant() {
806
	public String getIdentifiant() {
791
 
807
 
792
		return getIMediateur().getIdentifiant();
808
		return getIMediateur().getIdentifiant();
793
	}
809
	}
794
 
810
 
795
	/**
811
	/**
796
	 * renvoie la taille d'une image grâce à son identifiant
812
	 * renvoie la taille d'une image grâce à son identifiant
797
	 * 
813
	 * 
798
	 * @param id
814
	 * @param id
799
	 *            l'identifiant de l'image
815
	 *            l'identifiant de l'image
800
	 * @return un tableau contenant la longueur et la hauteur de l'image
816
	 * @return un tableau contenant la longueur et la hauteur de l'image
801
	 */
817
	 */
802
	public String[] obtenirTailleImage(String id) {
818
	public String[] obtenirTailleImage(String id) {
803
 
819
 
804
		return (cacheImage.get(id)).getTailleImage();
820
		return (cacheImage.get(id)).getTailleImage();
805
 
821
 
806
	}
822
	}
807
 
823
 
808
	/**
824
	/**
809
	 * Suivant l'id d'une image donnée, fais une demande au modèle pour qu'il
825
	 * Suivant l'id d'une image donnée, fais une demande au modèle pour qu'il
810
	 * renvoie la note associée au rafrachissable qui la demande
826
	 * renvoie la note associée au rafrachissable qui la demande
811
	 * 
827
	 * 
812
	 * @param r
828
	 * @param r
813
	 *            le rafraichissable demandeur de l'information
829
	 *            le rafraichissable demandeur de l'information
814
	 * @param id
830
	 * @param id
815
	 *            l'identifiant del'image
831
	 *            l'identifiant del'image
816
	 */
832
	 */
817
	public void obtenirNote(Rafraichissable r, String id) {
833
	public void obtenirNote(Rafraichissable r, String id) {
818
 
834
 
819
		r.rafraichir((cacheImage.get(id)).getNote(), true);
835
		r.rafraichir((cacheImage.get(id)).getNote(), true);
820
 
836
 
821
	}
837
	}
822
 
838
 
823
	/**
839
	/**
824
	 * Accesseur pour la configuration en cours d'utilisation
840
	 * Accesseur pour la configuration en cours d'utilisation
825
	 * 
841
	 * 
826
	 * @return la configuration
842
	 * @return la configuration
827
	 */
843
	 */
828
	public Configuration getConfig() {
844
	public Configuration getConfig() {
829
 
845
 
830
		return config;
846
		return config;
831
	}
847
	}
832
 
848
 
833
	/**
849
	/**
834
	 * Ajoute des images à la selection en cours
850
	 * Ajoute des images à la selection en cours
835
	 * 
851
	 * 
836
	 * @param ids
852
	 * @param ids
837
	 *            les identifiants des images à ajouter
853
	 *            les identifiants des images à ajouter
838
	 */
854
	 */
839
	public void ajouterImagesSelection(String[] ids) {
855
	public void ajouterImagesSelection(String[] ids) {
840
 
856
 
841
		for (int i = 0; i < ids.length; i++) {
857
		for (int i = 0; i < ids.length; i++) {
842
			
858
			
843
			String idImg = cacheImage.get(ids[i]).getId();
859
			String idImg = cacheImage.get(ids[i]).getId();
844
			selectionImages.add(idImg);
860
			selectionImages.add(idImg);
845
		}
861
		}
846
	}
862
	}
847
 
863
 
848
	public int getCompteSelection() {
864
	public int getCompteSelection() {
849
		return selectionImages.size();
865
		return selectionImages.size();
850
	}
866
	}
851
	
867
	
852
	/**
868
	/**
853
	 * Vide la selection en cours
869
	 * Vide la selection en cours
854
	 */
870
	 */
855
	public void viderSelection() {
871
	public void viderSelection() {
856
		selectionImages.clear();
872
		selectionImages.clear();
857
	}
873
	}
858
 
874
 
859
	public String renvoyerSelection() {
875
	public String renvoyerSelection() {
860
 
876
 
861
		String selection = "";
877
		String selection = "";
862
		
878
		
863
		if(selectionImages.size() <= 0)
879
		if(selectionImages.size() <= 0)
864
		{
880
		{
865
			selection += "-255" ;
881
			selection += "-255" ;
866
		}
882
		}
867
		else
883
		else
868
		{
884
		{
869
			for (Iterator<String> it = selectionImages.iterator(); it.hasNext();) {
885
			for (Iterator<String> it = selectionImages.iterator(); it.hasNext();) {
870
	
886
	
871
				String idEncours = it.next();
887
				String idEncours = it.next();
872
				selection += idEncours + ",";
888
				selection += idEncours + ",";
873
			}
889
			}
874
		}
890
		}
875
 
891
 
876
		return selection;
892
		return selection;
877
	}
893
	}
878
 
894
 
879
	public void lierImagesObervations(String idsObs, String idsImg) {
895
	public void lierImagesObervations(String idsObs, String idsImg) {
880
		
896
		
881
		LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
897
		LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
882
		lienDAO.lierImageBaseDeDonnees(idsImg, idsObs) ;
898
		lienDAO.lierImageBaseDeDonnees(idsImg, idsObs) ;
883
		
899
		
884
	}
900
	}
885
 
901
 
886
	public void obtenirLiaisonObservations(ImageMediateur imageMediateur,
902
	public void obtenirLiaisonObservations(ImageMediateur imageMediateur,
887
			String id) {
903
			String id) {
888
		
904
		
889
		String imgId = cacheImage.get(id).getId() ;
905
		String imgId = cacheImage.get(id).getId() ;
890
		
906
		
891
		LienImageAsynchroneDAO lienDao = new LienImageAsynchroneDAO(this) ;
907
		LienImageAsynchroneDAO lienDao = new LienImageAsynchroneDAO(this) ;
892
		lienDao.obtenirLiaisonsImagesObservations(this, imgId) ;
908
		lienDao.obtenirLiaisonsImagesObservations(this, imgId) ;
893
		
909
		
894
	}
910
	}
895
 
911
 
896
	public void supprimerLiaisonImages(String[] idsImg, String idObs) {
912
	public void supprimerLiaisonImages(String[] idsImg, String idObs) {
897
		
913
		
898
		String chaineIdImg = "";
914
		String chaineIdImg = "";
899
		
915
		
900
		for(int i = 0; i < idsImg.length; i++) {
916
		for(int i = 0; i < idsImg.length; i++) {
901
			String idImg = cacheImage.get(idsImg[i]).getId() ;
917
			String idImg = cacheImage.get(idsImg[i]).getId() ;
902
			chaineIdImg += ","+idImg;
918
			chaineIdImg += ","+idImg;
903
		}
919
		}
904
		
920
		
905
		chaineIdImg = chaineIdImg.replaceFirst(",", "");
921
		chaineIdImg = chaineIdImg.replaceFirst(",", "");
906
		
922
		
907
		LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
923
		LienImageAsynchroneDAO lienDAO = new LienImageAsynchroneDAO(this) ;
908
		lienDAO.supprimerLienImageObservation(chaineIdImg, idObs) ;		
924
		lienDAO.supprimerLienImageObservation(chaineIdImg, idObs) ;		
909
	}
925
	}
910
 
926
 
911
	public void obtenirMiniListeObservations(Rafraichissable r, String[] critere, int taillePage, int numeroPage) {
927
	public void obtenirMiniListeObservations(Rafraichissable r, String[] critere, int taillePage, int numeroPage) {
-
 
928
		
-
 
929
		String[] tri = { "tri", "" + getIMediateur().getTriMiniListeObs() };
-
 
930
		String[] triDir = { "tri_dir", "" + getIMediateur().getDirectionTriMiniListeObs()};
912
		
931
		
913
		String[][] criteres = {{critere[0],critere[1]},{"limite",""+taillePage},{"numero_page",""+numeroPage}} ;		
932
		String[][] criteres = {{critere[0],critere[1]},{"limite",""+taillePage},{"numero_page",""+numeroPage}, tri, triDir} ;		
914
		
933
		
915
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
934
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
916
		ListeObservationAsynchroneDAO loaDAO = new ListeObservationAsynchroneDAO(this);
935
		ListeObservationAsynchroneDAO loaDAO = new ListeObservationAsynchroneDAO(this);
917
		loaDAO.obtenirListeObservation(r, iMediateur.getIdentifiant(), criteres);	
936
		loaDAO.obtenirListeObservation(r, iMediateur.getIdentifiant(), criteres);	
918
		
937
		
919
	}
938
	}
920
 
939
 
921
	public void obtenirNombreMiniListeObservations(Rafraichissable r, String[] critere) {
940
	public void obtenirNombreMiniListeObservations(Rafraichissable r, String[] critere) {
922
		
941
		
923
		String[][] criteres = {{critere[0],critere[1]}} ;		
942
		String[][] criteres = {{critere[0],critere[1]}} ;		
924
		
943
		
925
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
944
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
926
		NombreObservationAsynchroneDAO noaDAO = new NombreObservationAsynchroneDAO(this);
945
		NombreObservationAsynchroneDAO noaDAO = new NombreObservationAsynchroneDAO(this);
927
		noaDAO.obtenirNombreObservation(r, iMediateur.getIdentifiant(), criteres);	
946
		noaDAO.obtenirNombreObservation(r, iMediateur.getIdentifiant(), criteres);	
928
		
947
		
929
	}
948
	}
930
 
949
 
931
	public void obtenirDatesImages(Rafraichissable r) {
950
	public void obtenirDatesImages(Rafraichissable r) {
932
		ListeDateImageAsynchroneDAO lDateDao = new ListeDateImageAsynchroneDAO(this);
951
		ListeDateImageAsynchroneDAO lDateDao = new ListeDateImageAsynchroneDAO(this);
933
		lDateDao.obtenirListeDate(r, iMediateur.getIdentifiant());
952
		lDateDao.obtenirListeDate(r, iMediateur.getIdentifiant());
934
	}
953
	}
935
	
954
	
936
	public String obtenirIdPourOrdre(String ordreImage) {
955
	public String obtenirIdPourOrdre(String ordreImage) {
937
		return cacheImage.get(ordreImage).getId();
956
		return cacheImage.get(ordreImage).getId();
938
	}
957
	}
939
 
958
 
940
}
959
}