Subversion Repositories eFlore/Archives.cel-v2

Rev

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