Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 43 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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