Subversion Repositories eFlore/Archives.cel-v2

Rev

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