Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 30 | Rev 35 | 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;
7 aperonnet 15
 
30 aperonnet 16
import com.google.gwt.json.client.JSONArray;
17
import com.google.gwt.json.client.JSONObject;
31 aperonnet 18
import com.gwtext.client.core.Ext;
19
import com.gwtext.client.core.ExtElement;
20 aperonnet 20
import com.gwtext.client.data.ArrayReader;
21
import com.gwtext.client.data.FieldDef;
22
import com.gwtext.client.data.IntegerFieldDef;
23
import com.gwtext.client.data.MemoryProxy;
25 aperonnet 24
import com.gwtext.client.data.Node;
28 aperonnet 25
import com.gwtext.client.data.NodeTraversalCallback;
20 aperonnet 26
import com.gwtext.client.data.RecordDef;
27
import com.gwtext.client.data.Store;
28
import com.gwtext.client.data.StringFieldDef;
28 aperonnet 29
import com.gwtext.client.data.Tree;
25 aperonnet 30
import com.gwtext.client.widgets.tree.TreeNode;
20 aperonnet 31
 
12 aperonnet 32
/**
33
 * Modèle d'accès aux données pour les images.
34
 * C'est un singleton
35
 * @author aurelien
36
 *
37
 */
20 aperonnet 38
public class ImageModele implements Rafraichissable {
7 aperonnet 39
 
31 aperonnet 40
	/**
41
	 * Booleen indiquant si le médiateur est instancié (l'instance doit être unique donc le booleen est static)
42
	 */
12 aperonnet 43
	private static boolean estInstancie = false ;
31 aperonnet 44
	/**
45
	 * Le médiateur associé au modèle
46
	 */
7 aperonnet 47
	private ImageMediateur iMediateur = null ;
31 aperonnet 48
	/**
49
	 * La liste des image affichées en cours
50
	 */
19 aperonnet 51
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
31 aperonnet 52
	/**
53
	 * Table de correspondance entre les mots clés et leurs identifiants
54
	 */
28 aperonnet 55
	private HashMap motsCles = new HashMap(0) ;
31 aperonnet 56
	/**
57
	 * Le store contenant les données à afficher, que le modèle transmet au médiateur quand il le demande
58
	 */
20 aperonnet 59
	private Store st = null ;
31 aperonnet 60
	/**
61
	 * Arbre des mots clés
62
	 */
30 aperonnet 63
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
25 aperonnet 64
 
31 aperonnet 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
85
	 * @return l'instance du modèle
86
	 */
12 aperonnet 87
	static ImageModele Instance(ImageMediateur im)
88
	{
31 aperonnet 89
		// si le modèle n'est pas encore instancié
12 aperonnet 90
		if(!estInstancie)
91
		{
31 aperonnet 92
			// on en crée un nouveau
12 aperonnet 93
			return new ImageModele(im);
94
		}
95
		else
96
		{
31 aperonnet 97
			// sinon on renvoit null, interdisant explicitement la création d'un autre exemplaire
12 aperonnet 98
			return null ;
99
		}
100
	}
101
 
31 aperonnet 102
	/**
103
	 * Le constructeur est privé et seule la méthode instance y accède
104
	 * @param im le médiateur à associé
105
	 */
12 aperonnet 106
	private ImageModele(ImageMediateur im) {
7 aperonnet 107
 
108
		iMediateur = im ;
109
	}
110
 
31 aperonnet 111
	/**
112
	 * Accesseur pour le médiateur
113
	 * @return
114
	 */
18 aperonnet 115
	public ImageMediateur getIMediateur()
116
	{
117
		return iMediateur ;
118
	}
119
 
30 aperonnet 120
	/**
121
	 * Appelle le DAO asynchrone pour obtenir la liste des images
122
	 * @param r le rafraichissable auxquel on enverra les données
123
	 */
7 aperonnet 124
	public void obtenirPhotoGalerie(Rafraichissable r)
125
	{
31 aperonnet 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
7 aperonnet 135
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
31 aperonnet 136
		liaDAO.ObtenirListeImages(this, criteres2);
7 aperonnet 137
	}
12 aperonnet 138
 
30 aperonnet 139
	/**
140
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
141
	 * et lancer l'interface appropriée
142
	 */
12 aperonnet 143
	public void uploaderImages()
144
	{
18 aperonnet 145
		ImageUploaderAsynchroneDAO IuADaO = new ImageUploaderAsynchroneDAO() ;
146
		IuADaO.setIMediateur(getIMediateur());
147
		IuADaO.choisirMethodeUpload() ;
12 aperonnet 148
	}
16 aperonnet 149
 
30 aperonnet 150
	/**
151
	 * Met à jour la liste des images à partir d'un objet
152
	 * @param o la nouvelle liste d'image
153
	 */
16 aperonnet 154
	public void rafraichirListeImage(Object o)
155
	{
19 aperonnet 156
		cacheImage = (ListeImageCarnet)o ;
16 aperonnet 157
	}
158
 
30 aperonnet 159
	/**
160
	 * Met à jour l'arbre des mots clés à partir d'un objet
161
	 * @param o le nouvel arbre de mots clés
162
	 */
25 aperonnet 163
	public void rafraichirArbreMotsCles(Object o)
164
	{
28 aperonnet 165
		arbreMotsCles = (com.gwtext.client.data.Tree)o ;
25 aperonnet 166
	}
167
 
30 aperonnet 168
	/**
169
	 * Met à jour la table de correspondance mots clés / ids
170
	 * à partir d'un objet
171
	 * @param o la nouvelle table des mots clés
172
	 */
25 aperonnet 173
	public void rafraichirMotsCles(Object o)
174
	{
28 aperonnet 175
		motsCles = (HashMap)o ;
25 aperonnet 176
	}
177
 
30 aperonnet 178
	/**
179
	 * Va chercher les métadonnées associées à une image dans la liste
180
	 * des images chargée dans le modèle
181
	 * @param r le rafraichissable auquel on enverra les informations
182
	 * @param id l'identifiant de l'image
183
	 */
16 aperonnet 184
	public void obtenirMetadonnees(Rafraichissable r, String id)
30 aperonnet 185
	{
25 aperonnet 186
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
16 aperonnet 187
 
30 aperonnet 188
		Object meta[] = new Object[3] ;
189
		meta[0] = im.getMetadonnesExif() ;
190
		meta[1] = im.getMetadonnesIptc() ;
191
		meta[2] = im.getInfoGenerales() ;
192
 
193
		r.rafraichir(meta,false) ;
16 aperonnet 194
	}
18 aperonnet 195
 
30 aperonnet 196
	/**
197
	 * Va chercher les mots clés associés à une image dans la liste
198
	 * des images chargée dans le modèle
199
	 * @param r le rafraichissable auquel on enverra les informations
200
	 * @param id l'identifiant de l'image
201
	 */
25 aperonnet 202
	public void obtenirMotsClesId(Rafraichissable r, String id)
30 aperonnet 203
	{
25 aperonnet 204
		ImageCarnet im = (ImageCarnet)cacheImage.get(id) ;
205
		String motsClesId = im.getMotsCles() ;
206
		String[] motsClesIdTab = motsClesId.split(",") ;
207
 
208
		r.rafraichir(motsClesIdTab, false) ;
209
	}
210
 
30 aperonnet 211
	/**
212
	 * Met à jour la liste des images en local et appelle le DAO de mise
213
	 * à jour pour les commentaires et la date des images selectionnées
214
	 * @param commentaires le commentaire à appliquer
215
	 * @param date la date à appliquer
216
	 * @param ids les identifiants des images selectionnées
217
	 */
18 aperonnet 218
	public void mettreAJourCacheImage(String commentaires, String date, String ids[])
219
	{
25 aperonnet 220
			for (int i = 0; i < ids.length; i++)
221
			{
18 aperonnet 222
				String key = ids[i] ;
223
				ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
224
				ic.miseAJourInfoGenerales(commentaires, date) ;
28 aperonnet 225
				mettreAjourBaseDeDonneesImageCarnet(ic) ;
18 aperonnet 226
			}
227
	}
19 aperonnet 228
 
30 aperonnet 229
	/**
230
	 * Ajoute un nouveau mot clés à la liste des mots clés locale
231
	 * @param text le mot clé
232
	 * @param id l'identifiant du mot clé
233
	 */
25 aperonnet 234
	public void mettreAjourMotsClesId(String text, String id)
235
	{
28 aperonnet 236
				 motsCles.put(id, text) ;
25 aperonnet 237
	}
238
 
30 aperonnet 239
	/**
240
	 * Appelle le DAO chargé de mettre à jour la base de données avec
241
	 * les toutes les informations des images modifiées par l'utilisateur
242
	 */
28 aperonnet 243
	public void mettreAJourBaseDeDonneesListeImageCarnet()
244
	{
19 aperonnet 245
		ListeImageAsynchroneDAO liDaO = new ListeImageAsynchroneDAO();
246
		liDaO.setIMediateur(iMediateur);
247
 
248
		liDaO.SynchroniserBaseDeDonnees(cacheImage);
249
	}
250
 
30 aperonnet 251
	/**
252
	 * Appelle le DAO chargé de mettre à jour la base de données avec
253
	 * les toutes les informations d'une image donnée
254
	 * @param ic l'image à synchroniser avec la base
255
	 */
28 aperonnet 256
	public void mettreAjourBaseDeDonneesImageCarnet(ImageCarnet ic)
19 aperonnet 257
	{
258
		ImageAsynchroneDAO iaDaO = new ImageAsynchroneDAO();
259
		iaDaO.setIMediateur(iMediateur);
260
		iaDaO.SynchroniserBaseDeDonnees(ic) ;
261
	}
7 aperonnet 262
 
30 aperonnet 263
	/**
264
	 * Supprime les images données du cache local et appelle le DAO
265
	 * qui les supprime de la base de données
266
	 * @param ids les identifiants des images selectionnées
267
	 */
268
	public void supprimerImages(String[] ids)
269
	{
20 aperonnet 270
		String rids[] = new String[ids.length] ;
271
		ListeImageAsynchroneDAO liDao = new ListeImageAsynchroneDAO() ;
272
		liDao.setIMediateur(iMediateur);
273
 
30 aperonnet 274
		for (int i = 0; i < ids.length; i++)
275
		{
20 aperonnet 276
			String key = ids[i] ;
277
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
278
			rids[i] = ic.getId() ;
31 aperonnet 279
 
280
			cacheImage.remove(key) ;
20 aperonnet 281
		}
282
 
283
		if(rids.length != 0)
31 aperonnet 284
		{
20 aperonnet 285
			liDao.supprimerBaseDeDonnees(rids);
30 aperonnet 286
		}
20 aperonnet 287
	}
288
 
30 aperonnet 289
	/**
290
	 * Met à jour les données locales suivant le type des nouvelles données
291
	 * et appelle le médiateur pour le notifier de la mise à jour
292
	 */
293
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement)
294
	{
31 aperonnet 295
		// si l'on a reçu une liste d'images
30 aperonnet 296
		if(nouvelleDonnees instanceof ListeImageCarnet)
297
		{
298
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
299
				Object[][] photoData = new Object[data.size()][7];
300
				int i = 0 ;
31 aperonnet 301
				// on la parse et on récupère les informations quiç nous interessent
30 aperonnet 302
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
303
				{
304
					ImageCarnet im = (ImageCarnet) data.get(it.next());
305
					photoData[i][0] = im.getOrdre() ;
306
					photoData[i][1] = im.getDate() ;
307
					photoData[i][2] = im.getIptcCity() ;
308
					photoData[i][3] = im.getMake()+" "+im.getModel() ;
309
					photoData[i][4] = im.getSUrl() ;
310
					photoData[i][5] = im.getMUrl() ;
311
					photoData[i][6] = im.getUrl() ;
312
 
313
					i++ ;
314
				}
20 aperonnet 315
 
31 aperonnet 316
				// creation du store qui les contient
30 aperonnet 317
				FieldDef defNumImage = new IntegerFieldDef("num_image");
318
				FieldDef defDatImage = new StringFieldDef("dat_image");
319
				FieldDef defLieImage = new StringFieldDef("lie_image");
320
				FieldDef defAppImage = new StringFieldDef("app_image");
321
				FieldDef defUrlImageS = new StringFieldDef("url_image_S");
322
				FieldDef defUrlImageM = new StringFieldDef("url_image_M");
323
				FieldDef defUrlImage = new StringFieldDef("url_image");
324
				FieldDef[] defTab = {defNumImage,defDatImage,defLieImage,defAppImage,defUrlImageS,defUrlImageM,defUrlImage};
325
				RecordDef rd = new RecordDef(defTab) ;
25 aperonnet 326
 
30 aperonnet 327
				final MemoryProxy dataProxy = new MemoryProxy(photoData);
328
				final ArrayReader reader = new ArrayReader(rd);
329
 
330
				final Store photoStore = new Store(dataProxy, reader);
331
 
332
				rafraichirListeImage(nouvelleDonnees);
333
 
334
				st = photoStore ;
31 aperonnet 335
				st.load() ;
336
 
337
				// par défaut le store est trié sur le numéro d'image
338
				st.sort("num_image") ;
339
 
20 aperonnet 340
 
31 aperonnet 341
				// si on doit répandre les données, on notifie le médiateur qui les distribuera à son tour
30 aperonnet 342
				if(repandreRafraichissement)
343
				{
344
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
345
				}
346
		}
347
 
31 aperonnet 348
		// si on reçoit un tableau JSON
30 aperonnet 349
		if(nouvelleDonnees instanceof JSONArray)
350
		{
31 aperonnet 351
			// alors on a reçu les informations sur les mots clés
30 aperonnet 352
			JSONArray reponse = (JSONArray)nouvelleDonnees ;
25 aperonnet 353
 
30 aperonnet 354
			final int taillemax = reponse.size();
25 aperonnet 355
 
31 aperonnet 356
			// si le tableau est vide
30 aperonnet 357
			if(taillemax == 0)
25 aperonnet 358
			{
31 aperonnet 359
				// on crée un arbre vide
30 aperonnet 360
				TreeNode root = new TreeNode() ;
361
				root.setId("racine") ;
362
				root.setText("Tags") ;
363
				root.setIcon("tela.png") ;
364
				String[] usObj = {"Tags","racine"} ;
365
				root.setUserObject(usObj) ;
366
				arbreMotsCles.setRootNode(root) ;
25 aperonnet 367
			}
30 aperonnet 368
 
31 aperonnet 369
			// pour chacun des élements du tableau
30 aperonnet 370
			for (int j = 0; j < taillemax ; j++)
371
			{
31 aperonnet 372
				// on extrait les élements du tableau
30 aperonnet 373
				if(reponse.get(j).isObject() != null)
374
				{
375
					JSONObject noeud = (JSONObject)reponse.get(j) ;
376
 
377
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
378
					String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;
379
					String parent = noeud.get("cmc_id_parent").isString().stringValue() ;
380
 
381
					String[] usObj = {mot_cle, id_noeud} ;
382
 
31 aperonnet 383
					// et on construit l'arbre à partir de la racine (qui est toujoursl e premier élément)
30 aperonnet 384
					if(id_noeud.equals("racine"))
385
					{
386
						TreeNode root = new TreeNode() ;
387
						root.setId(id_noeud) ;
388
						root.setText(mot_cle) ;
389
						root.setIcon("tela.png") ;
390
						root.setUserObject(usObj) ;
391
						arbreMotsCles.setRootNode(root) ;
392
					}
393
					else
394
					{
31 aperonnet 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)
30 aperonnet 397
						TreeNode node = new TreeNode() ;
398
						node.setId(id_noeud) ;
399
						node.setText(mot_cle) ;
400
						node.setChecked(false) ;
401
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
402
						node.setIcon("tela.png") ;
403
						node.setUserObject(usObj) ;
404
						parentNode.appendChild(node) ;
405
					}
406
				}
31 aperonnet 407
			}
408
				// enfin on met à jour l'arbre des mots clés contenu dans le modèle
30 aperonnet 409
				rafraichirArbreMotsCles(arbreMotsCles) ;
31 aperonnet 410
				// et on notifie le médiateur de la mise à jour en lui passant une copie des données
411
				getIMediateur().rafraichirArbreMotsCles(arbreMotsCles) ;
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
		}
25 aperonnet 427
	}
20 aperonnet 428
 
30 aperonnet 429
	/**
430
	 * Affiche les paires / valeur de tous les mots clés stockés
431
	 */
25 aperonnet 432
	public void afficherMotsCles()
433
	{
28 aperonnet 434
		for(Iterator it = motsCles.keySet().iterator() ; it.hasNext() ;)
20 aperonnet 435
		{
25 aperonnet 436
			String key = (String)it.next() ;
28 aperonnet 437
			String valeur = (String)motsCles.get(key) ;
25 aperonnet 438
			System.out.println("clé : "+key+" valeur : "+valeur);
20 aperonnet 439
		}
25 aperonnet 440
	}
441
 
30 aperonnet 442
	/**
443
	 * Met à jour les mots clés associés à une image et appelle le DAO pour synchroniser la base de données
444
	 * @param ids les identifiants des images selectionnées
445
	 * @param motsClesEnCours les mots clés à appliquer aux images
446
	 * @param arbreMC l'arbre de mots clés en cours
447
	 */
448
	public void mettreAjourMotsCles(String[] ids, String motsClesEnCours, com.gwtext.client.data.Tree arbreMC)
449
	{
450
		for (int i = 0; i < ids.length; i++)
451
		{
25 aperonnet 452
			if(cacheImage.containsKey(ids[i]))
453
			{
454
				ImageCarnet ic = (ImageCarnet)cacheImage.get(ids[i]) ;
455
				ic.mettreAjourMotsCles(motsClesEnCours) ;
30 aperonnet 456
 
457
				ImageAsynchroneDAO imgDao = new ImageAsynchroneDAO() ;
458
				imgDao.setIMediateur(getIMediateur()) ;
459
				imgDao.SynchroniserMotsClesImageBaseDeDonnees(ic) ;
25 aperonnet 460
			}
461
		}
462
 
28 aperonnet 463
		rafraichirArbreMotsCles(arbreMC) ;
25 aperonnet 464
	}
28 aperonnet 465
 
30 aperonnet 466
 
467
	/**
468
	 * Appelle le DAO des mots clés pour obtenir l'arbre complet stocké dans la base de données
469
	 */
470
	public void initialiserArbreMotsCles()
471
	{
472
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
473
		MCDao.setIMediateur(getIMediateur()) ;
474
 
475
		MCDao.obtenirListeMotsCles(this) ;
476
	}
477
 
478
	/**
479
	 * Envoie l'arbre des mots clés stocké localement à l'élément rafrachissable donné, qui le demande
480
	 * @param r le rafraichissable demandeur de l'arbre
481
	 */
482
	public void obtenirArbreMotCle(Rafraichissable r)
483
	{
484
		r.rafraichir(arbreMotsCles, false) ;
485
	}
28 aperonnet 486
 
30 aperonnet 487
	/**
488
	 * Ajoute un mot clé à l'arbre des mots clés local et appelle le DAO qui fait la mise
489
	 * à jour de l'arbre des mots clés dans la base
490
	 * @param n le nouveau noeud contenant le mot clé
491
	 * @param arbreMC l'arbre des mots cles en cours
492
	 */
493
	public void ajouterMotCleDansArbre(TreeNode n, com.gwtext.client.data.Tree arbreMC)
494
	{
28 aperonnet 495
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
496
		MCDao.setIMediateur(getIMediateur()) ;
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
 
528
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
529
		MCDao.setIMediateur(getIMediateur()) ;
530
 
531
		String[] usObj = (String[])n.getUserObject() ;
532
		String motCle = usObj[0] ;
533
		String id = usObj[1] ;
534
 
535
		String motCleASupprimer = id ;
536
 
537
		MCDao.supprimerBaseDeDonnees(id) ;
538
 
539
	}
540
 
30 aperonnet 541
	/**
542
	 * Modifie le noeud donné dans l'arbre des mots clés en cours et appelle le DAO
543
	 * qui synchronise la modification dans la base de données
544
	 * @param n le noeud modifié
545
	 * @param arbreMC l'arbre des mots clés en cours
546
	 */
547
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC)
548
	{
28 aperonnet 549
 
550
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
551
		MCDao.setIMediateur(getIMediateur()) ;
552
 
553
		String[] usObj = (String[])n.getUserObject() ;
554
		String motCle = usObj[0] ;
555
		String id = usObj[1] ;
30 aperonnet 556
		String parentId = "" ;
557
 
28 aperonnet 558
		if(!id.equals("racine"))
559
		{
560
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
561
			parentId = parentUsObj[1] ;
562
		}
563
		else
564
		{
565
			parentId = "racine" ;
566
		}
567
 
568
		rafraichirArbreMotsCles(arbreMC) ;
569
 
30 aperonnet 570
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
28 aperonnet 571
		MCDao.modifierBaseDeDonnees(motCleModifie) ;
572
 
573
	}
574
 
30 aperonnet 575
	/**
576
	 * Deplace un noeud dans l'arbre des mots cles et appelle le DAO qui reorganise l'arbre
577
	 * dans la base de donnees suivant le changement
578
	 * @param n le noeud deplace (et son sous arbre associe)
579
	 * @param arbreMC l'arbre des mots cles en cours
580
	 */
28 aperonnet 581
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC)
582
	{
583
		MotsClesAsynchroneDAO MCDao = new MotsClesAsynchroneDAO() ;
584
		MCDao.setIMediateur(getIMediateur()) ;
585
 
586
		String[] usObj = (String[])n.getUserObject() ;
587
		String motCle = usObj[0] ;
588
		String id = usObj[1] ;
30 aperonnet 589
		String parentId = "" ;
28 aperonnet 590
		if(!id.equals("racine"))
591
		{
592
			String[] parentUsObj = (String[])n.getParentNode().getUserObject() ;
593
			parentId = parentUsObj[1] ;
594
		}
595
		else
596
		{
597
			parentId = "racine" ;
598
		}
599
 
600
		rafraichirArbreMotsCles(arbreMC) ;
601
 
30 aperonnet 602
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;
28 aperonnet 603
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
604
	}
605
 
31 aperonnet 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
	}
665
 
7 aperonnet 666
}