Subversion Repositories eFlore/Archives.cel-v2

Rev

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

Rev 30 Rev 31
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
 
6
 
6
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.modeles.ImageAsynchroneDAO;
8
import org.tela_botanica.client.modeles.ImageAsynchroneDAO;
8
import org.tela_botanica.client.modeles.ImageCarnet;
9
import org.tela_botanica.client.modeles.ImageCarnet;
9
import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;
10
import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;
10
import org.tela_botanica.client.modeles.ListeImageCarnet;
11
import org.tela_botanica.client.modeles.ListeImageCarnet;
11
import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;
12
import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;
12
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;
13
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;
-
 
14
import org.tela_botanica.client.modeles.NombreImageAsynchroneDAO;
13
 
15
 
14
import com.google.gwt.json.client.JSONArray;
16
import com.google.gwt.json.client.JSONArray;
15
import com.google.gwt.json.client.JSONObject;
17
import com.google.gwt.json.client.JSONObject;
-
 
18
import com.gwtext.client.core.Ext;
-
 
19
import com.gwtext.client.core.ExtElement;
16
import com.gwtext.client.data.ArrayReader;
20
import com.gwtext.client.data.ArrayReader;
17
import com.gwtext.client.data.FieldDef;
21
import com.gwtext.client.data.FieldDef;
18
import com.gwtext.client.data.IntegerFieldDef;
22
import com.gwtext.client.data.IntegerFieldDef;
19
import com.gwtext.client.data.MemoryProxy;
23
import com.gwtext.client.data.MemoryProxy;
20
import com.gwtext.client.data.Node;
24
import com.gwtext.client.data.Node;
21
import com.gwtext.client.data.NodeTraversalCallback;
25
import com.gwtext.client.data.NodeTraversalCallback;
22
import com.gwtext.client.data.RecordDef;
26
import com.gwtext.client.data.RecordDef;
23
import com.gwtext.client.data.Store;
27
import com.gwtext.client.data.Store;
24
import com.gwtext.client.data.StringFieldDef;
28
import com.gwtext.client.data.StringFieldDef;
25
import com.gwtext.client.data.Tree;
29
import com.gwtext.client.data.Tree;
26
import com.gwtext.client.widgets.tree.TreeNode;
30
import com.gwtext.client.widgets.tree.TreeNode;
27
 
31
 
28
/**
32
/**
29
 * Modèle d'accès aux données pour les images.
33
 * Modèle d'accès aux données pour les images.
30
 * C'est un singleton
34
 * C'est un singleton
31
 * @author aurelien
35
 * @author aurelien
32
 *
36
 *
33
 */
37
 */
34
public class ImageModele implements Rafraichissable {
38
public class ImageModele implements Rafraichissable {
-
 
39
	
-
 
40
	/**
-
 
41
	 * Booleen indiquant si le médiateur est instancié (l'instance doit être unique donc le booleen est static)
35
	
42
	 */
-
 
43
	private static boolean estInstancie = false ;
-
 
44
	/**
36
	private static boolean estInstancie = false ;
45
	 * Le médiateur associé au modèle
37
	
46
	 */
-
 
47
	private ImageMediateur iMediateur = null ;
-
 
48
	/**
38
	private ImageMediateur iMediateur = null ;
49
	 * La liste des image affichées en cours
39
	
50
	 */
-
 
51
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
-
 
52
	/**
40
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
53
	 * Table de correspondance entre les mots clés et leurs identifiants
41
	
54
	 */
-
 
55
	private HashMap motsCles = new HashMap(0) ;
-
 
56
	/**
42
	private HashMap motsCles = new HashMap(0) ;
57
	 * Le store contenant les données à afficher, que le modèle transmet au médiateur quand il le demande
43
	
58
	 */
-
 
59
	private Store st = null ;
-
 
60
	/**
44
	private Store st = null ;
61
	 * Arbre des mots clés
45
	
62
	 */
-
 
63
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
-
 
64
	
-
 
65
	/**
-
 
66
	 * Numéro de page en cours
-
 
67
	 */
-
 
68
	private int pageEncours = 0 ;
-
 
69
	/**
-
 
70
	 * Nombre de pages totales
-
 
71
	 */
-
 
72
	private int pageMax = 1 ;
-
 
73
	/**
-
 
74
	 * Taille de page (par défaut 50)
-
 
75
	 */
-
 
76
	private int taillePage = 50 ;
-
 
77
	/**
-
 
78
	 * Nombre d'éléments total correspondant à la requete
-
 
79
	 */
-
 
80
	private int nbElements = 0 ;
-
 
81
	
-
 
82
	/**
-
 
83
	 * Retourne une instance de manière unique
-
 
84
	 * @param im le médiateur à associer
46
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
85
	 * @return l'instance du modèle
47
	
86
	 */
-
 
87
	static ImageModele Instance(ImageMediateur im)
48
	static ImageModele Instance(ImageMediateur im)
88
	{
49
	{
89
		// si le modèle n'est pas encore instancié
-
 
90
		if(!estInstancie)
50
		if(!estInstancie)
91
		{
51
		{
92
			// on en crée un nouveau
52
			return new ImageModele(im);
93
			return new ImageModele(im);
53
		}
94
		}
54
		else
95
		else
55
		{
96
		{
-
 
97
			// sinon on renvoit null, interdisant explicitement la création d'un autre exemplaire
56
			return null ;
98
			return null ;
57
		}
99
		}
58
	}
100
	}
-
 
101
	
-
 
102
	/**
-
 
103
	 * Le constructeur est privé et seule la méthode instance y accède
-
 
104
	 * @param im le médiateur à associé
59
	
105
	 */
60
	private ImageModele(ImageMediateur im) {
106
	private ImageModele(ImageMediateur im) {
61
		
107
		
62
		iMediateur = im ;
108
		iMediateur = im ;
63
	}
109
	}
-
 
110
	
-
 
111
	/**
-
 
112
	 * Accesseur pour le médiateur
-
 
113
	 * @return
64
	
114
	 */
65
	public ImageMediateur getIMediateur()
115
	public ImageMediateur getIMediateur()
66
	{
116
	{
67
		return iMediateur ;
117
		return iMediateur ;
68
	}
118
	}
69
	
119
	
70
	/**
120
	/**
71
	 * Appelle le DAO asynchrone pour obtenir la liste des images
121
	 * Appelle le DAO asynchrone pour obtenir la liste des images
72
	 * @param r le rafraichissable auxquel on enverra les données
122
	 * @param r le rafraichissable auxquel on enverra les données
73
	 */
123
	 */
74
	public void obtenirPhotoGalerie(Rafraichissable r)
124
	public void obtenirPhotoGalerie(Rafraichissable r)
75
	{
125
	{
-
 
126
		// on rassemble les critères
-
 
127
		String[][] criteres = {{"ci_ce_utilisateur", ""+getIMediateur().getIdentifiant()} } ;
-
 
128
		// on les crée un DAO auquel on les transmet et qui demande le nombre d'images correspondantes (pour les pages)
-
 
129
		NombreImageAsynchroneDAO niaDAO = new NombreImageAsynchroneDAO() ;
-
 
130
		niaDAO.obtenirNombreImages(this, criteres) ;
-
 
131
		
-
 
132
		// ensuite on demande la page correspondante avec les mêmes critères
-
 
133
		String[][] criteres2 = { {"ci_limite" ,""+taillePage },{"ci_numero_page",""+pageEncours} } ;
-
 
134
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
76
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
135
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
77
		liaDAO.ObtenirListeImages(this);		
136
		liaDAO.ObtenirListeImages(this, criteres2);		
78
	}
137
	}
79
	
138
	
80
	/**
139
	/**
81
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
140
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
82
	 * et lancer l'interface appropriée
141
	 * et lancer l'interface appropriée
83
	 */
142
	 */
84
	public void uploaderImages()
143
	public void uploaderImages()
85
	{
144
	{
86
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO() ;
145
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO() ;
87
		IuADaO.setIMediateur(getIMediateur());
146
		IuADaO.setIMediateur(getIMediateur());
88
		IuADaO.choisirMethodeUpload() ;
147
		IuADaO.choisirMethodeUpload() ;
89
	}
148
	}
90
	
149
	
91
	/**
150
	/**
92
	 * Met à jour la liste des images à partir d'un objet
151
	 * Met à jour la liste des images à partir d'un objet
93
	 * @param o la nouvelle liste d'image 
152
	 * @param o la nouvelle liste d'image 
94
	 */
153
	 */
95
	public void rafraichirListeImage(Object o)
154
	public void rafraichirListeImage(Object o)
96
	{
155
	{
97
		cacheImage = (ListeImageCarnet)o ;
156
		cacheImage = (ListeImageCarnet)o ;
98
	}
157
	}
99
	
158
	
100
	/**
159
	/**
101
	 * Met à jour l'arbre des mots clés à partir d'un objet
160
	 * Met à jour l'arbre des mots clés à partir d'un objet
102
	 * @param o le nouvel arbre de mots clés
161
	 * @param o le nouvel arbre de mots clés
103
	 */
162
	 */
104
	public void rafraichirArbreMotsCles(Object o)
163
	public void rafraichirArbreMotsCles(Object o)
105
	{
164
	{
106
		arbreMotsCles = (com.gwtext.client.data.Tree)o ;
165
		arbreMotsCles = (com.gwtext.client.data.Tree)o ;
107
	}
166
	}
108
	
167
	
109
	/**
168
	/**
110
	 * Met à jour la table de correspondance mots clés / ids
169
	 * Met à jour la table de correspondance mots clés / ids
111
	 * à partir d'un objet
170
	 * à partir d'un objet
112
	 * @param o la nouvelle table des mots clés
171
	 * @param o la nouvelle table des mots clés
113
	 */
172
	 */
114
	public void rafraichirMotsCles(Object o)
173
	public void rafraichirMotsCles(Object o)
115
	{
174
	{
116
		motsCles = (HashMap)o ;
175
		motsCles = (HashMap)o ;
117
	}
176
	}
118
	
177
	
119
	/**
178
	/**
120
	 * Va chercher les métadonnées associées à une image dans la liste 
179
	 * Va chercher les métadonnées associées à une image dans la liste 
121
	 * des images chargée dans le modèle
180
	 * des images chargée dans le modèle
122
	 * @param r le rafraichissable auquel on enverra les informations
181
	 * @param r le rafraichissable auquel on enverra les informations
123
	 * @param id l'identifiant de l'image
182
	 * @param id l'identifiant de l'image
124
	 */
183
	 */
125
	public void obtenirMetadonnees(Rafraichissable r, String id)
184
	public void obtenirMetadonnees(Rafraichissable r, String id)
126
	{			
185
	{			
127
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
186
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
128
				
187
				
129
		Object meta[] = new Object[3] ;
188
		Object meta[] = new Object[3] ;
130
		meta[0] = im.getMetadonnesExif() ;
189
		meta[0] = im.getMetadonnesExif() ;
131
		meta[1] = im.getMetadonnesIptc() ;
190
		meta[1] = im.getMetadonnesIptc() ;
132
		meta[2] = im.getInfoGenerales() ;
191
		meta[2] = im.getInfoGenerales() ;
133
		
192
		
134
		r.rafraichir(meta,false) ;	
193
		r.rafraichir(meta,false) ;	
135
	}
194
	}
136
	
195
	
137
	/**
196
	/**
138
	 * Va chercher les mots clés associés à une image dans la liste 
197
	 * Va chercher les mots clés associés à une image dans la liste 
139
	 * des images chargée dans le modèle
198
	 * des images chargée dans le modèle
140
	 * @param r le rafraichissable auquel on enverra les informations
199
	 * @param r le rafraichissable auquel on enverra les informations
141
	 * @param id l'identifiant de l'image
200
	 * @param id l'identifiant de l'image
142
	 */
201
	 */
143
	public void obtenirMotsClesId(Rafraichissable r, String id)
202
	public void obtenirMotsClesId(Rafraichissable r, String id)
144
	{	
203
	{	
145
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
204
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
146
		String motsClesId = im.getMotsCles() ;
205
		String motsClesId = im.getMotsCles() ;
147
		String[] motsClesIdTab = motsClesId.split(",") ;
206
		String[] motsClesIdTab = motsClesId.split(",") ;
148
		
207
		
149
		r.rafraichir(motsClesIdTab, false) ;
208
		r.rafraichir(motsClesIdTab, false) ;
150
	}
209
	}
151
	
210
	
152
	/**
211
	/**
153
	 * Met à jour la liste des images en local et appelle le DAO de mise
212
	 * Met à jour la liste des images en local et appelle le DAO de mise
154
	 * à jour pour les commentaires et la date des images selectionnées
213
	 * à jour pour les commentaires et la date des images selectionnées
155
	 * @param commentaires le commentaire à appliquer
214
	 * @param commentaires le commentaire à appliquer
156
	 * @param date la date à appliquer
215
	 * @param date la date à appliquer
157
	 * @param ids les identifiants des images selectionnées
216
	 * @param ids les identifiants des images selectionnées
158
	 */
217
	 */
159
	public void mettreAJourCacheImage(String commentaires, String date, String ids[])
218
	public void mettreAJourCacheImage(String commentaires, String date, String ids[])
160
	{
219
	{
161
			for (int i = 0; i < ids.length; i++) 
220
			for (int i = 0; i < ids.length; i++) 
162
			{	
221
			{	
163
				String key = ids[i] ;
222
				String key = ids[i] ;
164
				ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
223
				ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
165
				ic.miseAJourInfoGenerales(commentaires, date) ;
224
				ic.miseAJourInfoGenerales(commentaires, date) ;
166
				mettreAjourBaseDeDonneesImageCarnet(ic) ;	
225
				mettreAjourBaseDeDonneesImageCarnet(ic) ;	
167
			}
226
			}
168
	}
227
	}
169
	
228
	
170
	/**
229
	/**
171
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
230
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
172
	 * @param text le mot clé
231
	 * @param text le mot clé
173
	 * @param id l'identifiant du mot clé
232
	 * @param id l'identifiant du mot clé
174
	 */
233
	 */
175
	public void mettreAjourMotsClesId(String text, String id)
234
	public void mettreAjourMotsClesId(String text, String id)
176
	{
235
	{
177
				 motsCles.put(id, text) ;
236
				 motsCles.put(id, text) ;
178
	}
237
	}
179
	
238
	
180
	/**
239
	/**
181
	 * Appelle le DAO chargé de mettre à jour la base de données avec
240
	 * Appelle le DAO chargé de mettre à jour la base de données avec
182
	 * les toutes les informations des images modifiées par l'utilisateur
241
	 * les toutes les informations des images modifiées par l'utilisateur
183
	 */
242
	 */
184
	public void mettreAJourBaseDeDonneesListeImageCarnet()
243
	public void mettreAJourBaseDeDonneesListeImageCarnet()
185
	{
244
	{
186
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO();
245
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO();
187
		liDaO.setIMediateur(iMediateur);
246
		liDaO.setIMediateur(iMediateur);
188
		
247
		
189
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
248
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
190
	}
249
	}
191
	
250
	
192
	/**
251
	/**
193
	 * Appelle le DAO chargé de mettre à jour la base de données avec
252
	 * Appelle le DAO chargé de mettre à jour la base de données avec
194
	 * les toutes les informations d'une image donnée
253
	 * les toutes les informations d'une image donnée
195
	 * @param ic l'image à synchroniser avec la base
254
	 * @param ic l'image à synchroniser avec la base
196
	 */
255
	 */
197
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic)
256
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic)
198
	{
257
	{
199
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO();
258
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO();
200
		iaDaO.setIMediateur(iMediateur);
259
		iaDaO.setIMediateur(iMediateur);
201
		iaDaO.SynchroniserBaseDeDonnees(ic) ;
260
		iaDaO.SynchroniserBaseDeDonnees(ic) ;
202
	}
261
	}
203
 
262
 
204
	/**
263
	/**
205
	 * Supprime les images données du cache local et appelle le DAO
264
	 * Supprime les images données du cache local et appelle le DAO
206
	 * qui les supprime de la base de données
265
	 * qui les supprime de la base de données
207
	 * @param ids les identifiants des images selectionnées
266
	 * @param ids les identifiants des images selectionnées
208
	 */
267
	 */
209
	public void supprimerImages(String[] ids) 
268
	public void supprimerImages(String[] ids) 
210
	{
269
	{
211
		String rids[] = new String[ids.length] ;
270
		String rids[] = new String[ids.length] ;
212
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO() ;
271
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO() ;
213
		liDao.setIMediateur(iMediateur);
272
		liDao.setIMediateur(iMediateur);
214
		
273
		
215
		for (int i = 0; i < ids.length; i++) 
274
		for (int i = 0; i < ids.length; i++) 
216
		{				
275
		{				
217
			String key = ids[i] ;
276
			String key = ids[i] ;
218
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
277
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
219
			rids[i] = ic.getId() ;
278
			rids[i] = ic.getId() ;
-
 
279
			
-
 
280
			cacheImage.remove(key) ;
220
		}
281
		}
221
		
282
		
222
		if(rids.length != 0)
283
		if(rids.length != 0)
223
		{
284
		{	
224
			liDao.supprimerBaseDeDonnees(rids);
285
			liDao.supprimerBaseDeDonnees(rids);
225
		}		
286
		}		
226
	}
287
	}
227
 
288
 
228
	/**
289
	/**
229
	 * Met à jour les données locales suivant le type des nouvelles données
290
	 * Met à jour les données locales suivant le type des nouvelles données
230
	 * et appelle le médiateur pour le notifier de la mise à jour
291
	 * et appelle le médiateur pour le notifier de la mise à jour
231
	 */
292
	 */
232
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) 
293
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) 
233
	{
294
	{
-
 
295
		// si l'on a reçu une liste d'images
234
		if(nouvelleDonnees instanceof ListeImageCarnet)
296
		if(nouvelleDonnees instanceof ListeImageCarnet)
235
		{
297
		{
236
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
298
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
237
				Object[][] photoData = new Object[data.size()][7];
299
				Object[][] photoData = new Object[data.size()][7];
238
				int i = 0 ;
300
				int i = 0 ;
-
 
301
				// on la parse et on récupère les informations quiç nous interessent
239
				for (Iterator it = data.keySet().iterator(); it.hasNext();) 
302
				for (Iterator it = data.keySet().iterator(); it.hasNext();) 
240
				{
303
				{
241
					ImageCarnet im = (ImageCarnet) data.get(it.next());
304
					ImageCarnet im = (ImageCarnet) data.get(it.next());
242
					photoData[i][0] = im.getOrdre() ;
305
					photoData[i][0] = im.getOrdre() ;
243
					photoData[i][1] = im.getDate() ;
306
					photoData[i][1] = im.getDate() ;
244
					photoData[i][2] = im.getIptcCity() ;
307
					photoData[i][2] = im.getIptcCity() ;
245
					photoData[i][3] = im.getMake()+" "+im.getModel() ;
308
					photoData[i][3] = im.getMake()+" "+im.getModel() ;
246
					photoData[i][4] = im.getSUrl() ;
309
					photoData[i][4] = im.getSUrl() ;
247
					photoData[i][5] = im.getMUrl() ;
310
					photoData[i][5] = im.getMUrl() ;
248
					photoData[i][6] = im.getUrl() ;
311
					photoData[i][6] = im.getUrl() ;
249
					
312
					
250
					i++ ;
313
					i++ ;
251
				}
314
				}
252
		
315
		
253
				// creation du store
316
				// creation du store qui les contient
254
				FieldDef defNumImage = new IntegerFieldDef("num_image");
317
				FieldDef defNumImage = new IntegerFieldDef("num_image");
255
				FieldDef defDatImage = new StringFieldDef("dat_image");
318
				FieldDef defDatImage = new StringFieldDef("dat_image");
256
				FieldDef defLieImage = new StringFieldDef("lie_image");
319
				FieldDef defLieImage = new StringFieldDef("lie_image");
257
				FieldDef defAppImage = new StringFieldDef("app_image");
320
				FieldDef defAppImage = new StringFieldDef("app_image");
258
				FieldDef defUrlImageS = new StringFieldDef("url_image_S");
321
				FieldDef defUrlImageS = new StringFieldDef("url_image_S");
259
				FieldDef defUrlImageM = new StringFieldDef("url_image_M");
322
				FieldDef defUrlImageM = new StringFieldDef("url_image_M");
260
				FieldDef defUrlImage = new StringFieldDef("url_image");
323
				FieldDef defUrlImage = new StringFieldDef("url_image");
261
				FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage};
324
				FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage};
262
				RecordDef rd = new RecordDef(defTab) ;
325
				RecordDef rd = new RecordDef(defTab) ;
263
				
326
				
264
				final MemoryProxy dataProxy = new MemoryProxy(photoData);
327
				final MemoryProxy dataProxy = new MemoryProxy(photoData);
265
				final ArrayReader reader = new ArrayReader(rd);
328
				final ArrayReader reader = new ArrayReader(rd);
266
		
329
		
267
				final Store photoStore = new Store(dataProxy, reader);
330
				final Store photoStore = new Store(dataProxy, reader);
268
				
331
				
269
				rafraichirListeImage(nouvelleDonnees);
332
				rafraichirListeImage(nouvelleDonnees);
270
				
333
				
271
				st = photoStore ;
334
				st = photoStore ;
-
 
335
				st.load() ;
-
 
336
				
-
 
337
				// par défaut le store est trié sur le numéro d'image
-
 
338
				st.sort("num_image") ;
-
 
339
 
-
 
340
			
272
			
341
				// si on doit répandre les données, on notifie le médiateur qui les distribuera à son tour
273
				if(repandreRafraichissement)
342
				if(repandreRafraichissement)
274
				{
343
				{
275
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
344
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
276
				}
345
				}
277
		}
346
		}
-
 
347
		
278
		
348
		// si on reçoit un tableau JSON
279
		if(nouvelleDonnees instanceof JSONArray)
349
		if(nouvelleDonnees instanceof JSONArray)
-
 
350
		{
280
		{
351
			// alors on a reçu les informations sur les mots clés
281
			JSONArray reponse = (JSONArray)nouvelleDonnees ; 
352
			JSONArray reponse = (JSONArray)nouvelleDonnees ; 
282
			
353
			
283
			final int taillemax = reponse.size();
354
			final int taillemax = reponse.size();
-
 
355
			
284
			
356
			// si le tableau est vide
285
			if(taillemax == 0)
357
			if(taillemax == 0)
-
 
358
			{
286
			{
359
				// on crée un arbre vide
287
				TreeNode root = new TreeNode() ;
360
				TreeNode root = new TreeNode() ;
288
				root.setId("racine") ;
361
				root.setId("racine") ;
289
				root.setText("Tags") ;
362
				root.setText("Tags") ;
290
				root.setIcon("tela.png") ;
363
				root.setIcon("tela.png") ;
291
				String[] usObj = {"Tags","racine"} ;
364
				String[] usObj = {"Tags","racine"} ;
292
				root.setUserObject(usObj) ;
365
				root.setUserObject(usObj) ;
293
				arbreMotsCles.setRootNode(root) ;				
366
				arbreMotsCles.setRootNode(root) ;				
294
			}
367
			}
-
 
368
			
295
			
369
			// pour chacun des élements du tableau
296
			for (int j = 0; j < taillemax ; j++) 
370
			for (int j = 0; j < taillemax ; j++) 
297
			{
-
 
-
 
371
			{
298
				
372
				// on extrait les élements du tableau
299
				if(reponse.get(j).isObject() != null)
373
				if(reponse.get(j).isObject() != null)
300
				{
374
				{
301
					JSONObject noeud = (JSONObject)reponse.get(j) ;
375
					JSONObject noeud = (JSONObject)reponse.get(j) ;
302
					
376
					
303
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
377
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
304
					String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;
378
					String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;
305
					String parent = noeud.get("cmc_id_parent").isString().stringValue() ;
379
					String parent = noeud.get("cmc_id_parent").isString().stringValue() ;
306
					
380
					
307
					String[] usObj = {mot_cle, id_noeud} ; 
381
					String[] usObj = {mot_cle, id_noeud} ; 
-
 
382
					
308
					
383
					// et on construit l'arbre à partir de la racine (qui est toujoursl e premier élément)
309
					if(id_noeud.equals("racine"))
384
					if(id_noeud.equals("racine"))
310
					{
385
					{
311
						TreeNode root = new TreeNode() ;
386
						TreeNode root = new TreeNode() ;
312
						root.setId(id_noeud) ;
387
						root.setId(id_noeud) ;
313
						root.setText(mot_cle) ;
388
						root.setText(mot_cle) ;
314
						root.setIcon("tela.png") ;
389
						root.setIcon("tela.png") ;
315
						root.setUserObject(usObj) ;
390
						root.setUserObject(usObj) ;
316
						arbreMotsCles.setRootNode(root) ;
391
						arbreMotsCles.setRootNode(root) ;
317
					}
392
					}
318
					else
393
					else
319
					{
394
					{
-
 
395
						// et en ajoutant les noeuds un à un (qui sont renvoyé dans l'ordre hierarchique de leur niveau
-
 
396
						// ce qui permet de les traiter séquentiellement)
320
						TreeNode node = new TreeNode() ;
397
						TreeNode node = new TreeNode() ;
321
						node.setId(id_noeud) ;
398
						node.setId(id_noeud) ;
322
						node.setText(mot_cle) ;
399
						node.setText(mot_cle) ;
323
						node.setChecked(false) ;
400
						node.setChecked(false) ;
324
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
401
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
325
						node.setIcon("tela.png") ;
402
						node.setIcon("tela.png") ;
326
						node.setUserObject(usObj) ;	
403
						node.setUserObject(usObj) ;	
327
						parentNode.appendChild(node) ;
404
						parentNode.appendChild(node) ;
328
					}
405
					}
329
				}
406
				}
330
			}			
407
			}		
-
 
408
				// enfin on met à jour l'arbre des mots clés contenu dans le modèle
331
				rafraichirArbreMotsCles(arbreMotsCles) ;
409
				rafraichirArbreMotsCles(arbreMotsCles) ;
-
 
410
				// et on notifie le médiateur de la mise à jour en lui passant une copie des données
332
				getIMediateur().getMetadonneesIptcExif().getPanneauMotsCles().rafraichir(arbreMotsCles, true) ;				
411
				getIMediateur().rafraichirArbreMotsCles(arbreMotsCles) ;			
333
		}		
412
		}
-
 
413
		
-
 
414
		// Si on reçoit un tableau d'entiers
-
 
415
		// c'est un tableau d'un seul entier qui est le nombre d'images correspondant aux critères
-
 
416
		if(nouvelleDonnees instanceof int[])
-
 
417
		{
-
 
418
			int[] pages = (int[])nouvelleDonnees ;
-
 
419
			
-
 
420
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
-
 
421
			pageMax  = calculerNbPages(pages[0]) ;
-
 
422
			nbElements = pages[0] ;
-
 
423
			
-
 
424
			// et on notifie de le mediateur du changement des valeurs
-
 
425
			getIMediateur().changerPageMaxEtCourante(pageMax,pageEncours,taillePage,pages[0]) ;
-
 
426
		}
334
	}
427
	}
335
	
428
	
336
	/**
429
	/**
337
	 * Affiche les paires / valeur de tous les mots clés stockés
430
	 * Affiche les paires / valeur de tous les mots clés stockés
338
	 */
431
	 */
339
	public void afficherMotsCles()
432
	public void afficherMotsCles()
340
	{
433
	{
341
		for(Iterator it = motsCles.keySet().iterator() ; it.hasNext() ;)
434
		for(Iterator it = motsCles.keySet().iterator() ; it.hasNext() ;)
342
		{
435
		{
343
			String key = (String)it.next() ;
436
			String key = (String)it.next() ;
344
			String valeur = (String)motsCles.get(key) ; 
437
			String valeur = (String)motsCles.get(key) ; 
345
			System.out.println("clé : "+key+" valeur : "+valeur);
438
			System.out.println("clé : "+key+" valeur : "+valeur);
346
		}
439
		}
347
	}
440
	}
348
 
441
 
349
	/**
442
	/**
350
	 * Met à jour les mots clés associés à une image et appelle le DAO pour synchroniser la base de données
443
	 * Met à jour les mots clés associés à une image et appelle le DAO pour synchroniser la base de données
351
	 * @param ids les identifiants des images selectionnées
444
	 * @param ids les identifiants des images selectionnées
352
	 * @param motsClesEnCours les mots clés à appliquer aux images
445
	 * @param motsClesEnCours les mots clés à appliquer aux images
353
	 * @param arbreMC l'arbre de mots clés en cours
446
	 * @param arbreMC l'arbre de mots clés en cours
354
	 */
447
	 */
355
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours, com.gwtext.client.data.Tree arbreMC) 
448
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours, com.gwtext.client.data.Tree arbreMC) 
356
	{		
449
	{		
357
		for (int i = 0; i < ids.length; i++) 
450
		for (int i = 0; i < ids.length; i++) 
358
		{	
451
		{	
359
			if(cacheImage.containsKey(ids[i]))
452
			if(cacheImage.containsKey(ids[i]))
360
			{
453
			{
361
				ImageCarnet ic = (ImageCarnet)cacheImage.get(ids[i]) ;
454
				ImageCarnet ic = (ImageCarnet)cacheImage.get(ids[i]) ;
362
				ic.mettreAjourMotsCles(motsClesEnCours) ;	
455
				ic.mettreAjourMotsCles(motsClesEnCours) ;	
363
				
456
				
364
				ImageAsynchroneDAO imgDao = new ImageAsynchroneDAO() ;
457
				ImageAsynchroneDAO imgDao = new ImageAsynchroneDAO() ;
365
				imgDao.setIMediateur(getIMediateur()) ;
458
				imgDao.setIMediateur(getIMediateur()) ;
366
				imgDao.SynchroniserMotsClesImageBaseDeDonnees(ic) ;
459
				imgDao.SynchroniserMotsClesImageBaseDeDonnees(ic) ;
367
			}
460
			}
368
		}
461
		}
369
		
462
		
370
		rafraichirArbreMotsCles(arbreMC) ;
463
		rafraichirArbreMotsCles(arbreMC) ;
371
	}
464
	}
372
	
465
	
373
	
466
	
374
	/**
467
	/**
375
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la base de données
468
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la base de données
376
	 */
469
	 */
377
	public void initialiserArbreMotsCles()
470
	public void initialiserArbreMotsCles()
378
	{
471
	{
379
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
472
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
380
		MCDao.setIMediateur(getIMediateur()) ;
473
		MCDao.setIMediateur(getIMediateur()) ;
381
		
474
		
382
		MCDao.obtenirListeMotsCles(this) ;
475
		MCDao.obtenirListeMotsCles(this) ;
383
	}
476
	}
384
	
477
	
385
	/**
478
	/**
386
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable donné, qui le demande
479
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable donné, qui le demande
387
	 * @param r le rafraichissable demandeur de l'arbre
480
	 * @param r le rafraichissable demandeur de l'arbre
388
	 */
481
	 */
389
	public void obtenirArbreMotCle(Rafraichissable r)
482
	public void obtenirArbreMotCle(Rafraichissable r)
390
	{
483
	{
391
		r.rafraichir(arbreMotsCles, false) ;
484
		r.rafraichir(arbreMotsCles, false) ;
392
	}
485
	}
393
 
486
 
394
	/**
487
	/**
395
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui fait la mise
488
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui fait la mise
396
	 * à jour de l'arbre des mots clés dans la base
489
	 * à jour de l'arbre des mots clés dans la base
397
	 * @param n le nouveau noeud contenant le mot clé
490
	 * @param n le nouveau noeud contenant le mot clé
398
	 * @param arbreMC l'arbre des mots cles en cours
491
	 * @param arbreMC l'arbre des mots cles en cours
399
	 */
492
	 */
400
	public void ajouterMotCleDansArbre(TreeNode n, com.gwtext.client.data.Tree arbreMC) 
493
	public void ajouterMotCleDansArbre(TreeNode n, com.gwtext.client.data.Tree arbreMC) 
401
	{	
494
	{	
402
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
495
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
403
		MCDao.setIMediateur(getIMediateur()) ;
496
		MCDao.setIMediateur(getIMediateur()) ;
404
		
497
		
405
		String[] usObj = (String[])n.getUserObject() ;
498
		String[] usObj = (String[])n.getUserObject() ;
406
		String motCle = usObj[0] ;
499
		String motCle = usObj[0] ;
407
		String id = usObj[1] ;
500
		String id = usObj[1] ;
408
		String parentId = "" ;
501
		String parentId = "" ;
409
		
502
		
410
		if(!id.equals("racine"))
503
		if(!id.equals("racine"))
411
		{
504
		{
412
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
505
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
413
			parentId = parentUsObj[1] ;
506
			parentId = parentUsObj[1] ;
414
		}
507
		}
415
		else
508
		else
416
		{
509
		{
417
			parentId = "racine" ;
510
			parentId = "racine" ;
418
		}
511
		}
419
		
512
		
420
		rafraichirArbreMotsCles(arbreMC) ;
513
		rafraichirArbreMotsCles(arbreMC) ;
421
		
514
		
422
		String nouveauMotCle = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
515
		String nouveauMotCle = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
423
		MCDao.ajouterBaseDeDonnees(nouveauMotCle) ;		
516
		MCDao.ajouterBaseDeDonnees(nouveauMotCle) ;		
424
	}
517
	}
425
 
518
 
426
	/**
519
	/**
427
	 * Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va supprimer
520
	 * Supprime un noeud de l'arbre des mots clés et appelle le DAO qui va supprimer
428
	 * les mots clés associés dans la base
521
	 * les mots clés associés dans la base
429
	 * @param n le noeud à supprimer
522
	 * @param n le noeud à supprimer
430
	 * @param arbreMC l'arbre des mots clés en cours
523
	 * @param arbreMC l'arbre des mots clés en cours
431
	 */
524
	 */
432
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC) 
525
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC) 
433
	{
526
	{
434
		
527
		
435
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
528
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
436
		MCDao.setIMediateur(getIMediateur()) ;
529
		MCDao.setIMediateur(getIMediateur()) ;
437
		
530
		
438
		String[] usObj = (String[])n.getUserObject() ;
531
		String[] usObj = (String[])n.getUserObject() ;
439
		String motCle = usObj[0] ;
532
		String motCle = usObj[0] ;
440
		String id = usObj[1] ;
533
		String id = usObj[1] ;
441
		
534
		
442
		String motCleASupprimer = id ;
535
		String motCleASupprimer = id ;
443
		
536
		
444
		MCDao.supprimerBaseDeDonnees(id) ;
537
		MCDao.supprimerBaseDeDonnees(id) ;
445
		
538
		
446
	}
539
	}
447
 
540
 
448
	/**
541
	/**
449
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le DAO
542
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le DAO
450
	 * qui synchronise la modification dans la base de données
543
	 * qui synchronise la modification dans la base de données
451
	 * @param n le noeud modifié
544
	 * @param n le noeud modifié
452
	 * @param arbreMC l'arbre des mots clés en cours
545
	 * @param arbreMC l'arbre des mots clés en cours
453
	 */
546
	 */
454
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) 
547
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) 
455
	{
548
	{
456
		
549
		
457
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
550
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
458
		MCDao.setIMediateur(getIMediateur()) ;
551
		MCDao.setIMediateur(getIMediateur()) ;
459
		
552
		
460
		String[] usObj = (String[])n.getUserObject() ;
553
		String[] usObj = (String[])n.getUserObject() ;
461
		String motCle = usObj[0] ;
554
		String motCle = usObj[0] ;
462
		String id = usObj[1] ;
555
		String id = usObj[1] ;
463
		String parentId = "" ;
556
		String parentId = "" ;
464
		
557
		
465
		if(!id.equals("racine"))
558
		if(!id.equals("racine"))
466
		{
559
		{
467
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
560
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
468
			parentId = parentUsObj[1] ;
561
			parentId = parentUsObj[1] ;
469
		}
562
		}
470
		else
563
		else
471
		{
564
		{
472
			parentId = "racine" ;
565
			parentId = "racine" ;
473
		}
566
		}
474
		
567
		
475
		rafraichirArbreMotsCles(arbreMC) ;
568
		rafraichirArbreMotsCles(arbreMC) ;
476
		
569
		
477
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;	
570
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;	
478
		MCDao.modifierBaseDeDonnees(motCleModifie) ;
571
		MCDao.modifierBaseDeDonnees(motCleModifie) ;
479
		
572
		
480
	}
573
	}
481
	
574
	
482
	/**
575
	/**
483
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui reorganise l'arbre
576
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui reorganise l'arbre
484
	 * dans la base de donnees suivant le changement
577
	 * dans la base de donnees suivant le changement
485
	 * @param n le noeud deplace (et son sous arbre associe)
578
	 * @param n le noeud deplace (et son sous arbre associe)
486
	 * @param arbreMC l'arbre des mots cles en cours
579
	 * @param arbreMC l'arbre des mots cles en cours
487
	 */
580
	 */
488
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC)
581
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC)
489
	{
582
	{
490
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
583
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
491
		MCDao.setIMediateur(getIMediateur()) ;
584
		MCDao.setIMediateur(getIMediateur()) ;
492
		
585
		
493
		String[] usObj = (String[])n.getUserObject() ;
586
		String[] usObj = (String[])n.getUserObject() ;
494
		String motCle = usObj[0] ;
587
		String motCle = usObj[0] ;
495
		String id = usObj[1] ;
588
		String id = usObj[1] ;
496
		String parentId = "" ;		
589
		String parentId = "" ;		
497
		if(!id.equals("racine"))
590
		if(!id.equals("racine"))
498
		{
591
		{
499
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
592
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
500
			parentId = parentUsObj[1] ;
593
			parentId = parentUsObj[1] ;
501
		}
594
		}
502
		else
595
		else
503
		{
596
		{
504
			parentId = "racine" ;
597
			parentId = "racine" ;
505
		}
598
		}
506
		
599
		
507
		rafraichirArbreMotsCles(arbreMC) ;
600
		rafraichirArbreMotsCles(arbreMC) ;
508
		
601
		
509
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;		
602
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;		
510
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
603
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
511
	}
604
	}
-
 
605
	
-
 
606
	/**
-
 
607
	 * Change le numéro de la page en cours et envoie une demande de mise à jour des données
-
 
608
	 * @param nouvellePageCourante la nouvelle page à afficher
-
 
609
	 */
-
 
610
	public void changerNumeroPage(int nouvellePageCourante)
-
 
611
	{
-
 
612
			pageEncours = nouvellePageCourante ;
-
 
613
			obtenirPhotoGalerie(this) ;		
-
 
614
	}
-
 
615
	
-
 
616
	/**
-
 
617
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
-
 
618
	 * en cours
-
 
619
	 * @param nbElements le nombre d'élements total
-
 
620
	 * @return le nombre de pages 
-
 
621
	 */
-
 
622
	public int calculerNbPages(int nbElements)
-
 
623
	{
-
 
624
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
-
 
625
		// pour eviter qu'il arrondisse mal la division
-
 
626
		// nombre de pages = (nombre d'element / taille de la page) arrondie à l'entier superieur 
-
 
627
		double nPage = (1.0*nbElements)/(1.0*taillePage) ; 
-
 
628
		double nPageRound = Math.ceil(nPage) ;
-
 
629
		Double nPageInt = new Double(nPageRound) ;
-
 
630
		
-
 
631
		// on convertit en entier
-
 
632
		return nPageInt.intValue() ; 
-
 
633
	}
-
 
634
	
-
 
635
	/**
-
 
636
	 * Recalcule la page en cours lors du changement du nombre d'élements
-
 
637
	 * @param nbElements le nombre d'élements total
-
 
638
	 * @return la nouvelle page encours
-
 
639
	 */
-
 
640
	public int calculerPageCourante(int nbElements)
-
 
641
	{
-
 
642
		// on calcule le nombre de page
-
 
643
		int nouvelNbPages = calculerNbPages(nbElements) ;
-
 
644
		// la nouvelle page en cours
-
 
645
		double nPageCourante = (1.0*pageEncours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
-
 
646
		
-
 
647
		// on arrondit au supérieur
-
 
648
		double nPageRound = Math.ceil(nPageCourante) ;
-
 
649
		Double nPageInt = new Double(nPageRound) ;
-
 
650
		
-
 
651
		// on convertit en entier
-
 
652
		return nPageInt.intValue() ; 
-
 
653
	}
-
 
654
	
-
 
655
	/**
-
 
656
	 * Change la taille de page et recalcule la page encours 
-
 
657
	 * @param nouvelleTaillePage la nouvelle taille de page à utiliser
-
 
658
	 */
-
 
659
	public void changerTaillePage(int nouvelleTaillePage)
-
 
660
	{
-
 
661
		taillePage = nouvelleTaillePage ;
-
 
662
		pageEncours = calculerPageCourante(nbElements) ;
-
 
663
		obtenirPhotoGalerie(this) ;
-
 
664
	}
512
	
665
	
513
}
666
}