Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 30 | Rev 35 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 30 Rev 31
Line 1... Line 1...
1
package org.tela_botanica.client.image;
1
package org.tela_botanica.client.image;
Line 2... Line 2...
2
 
2
 
3
import java.util.HashMap;
3
import java.util.HashMap;
-
 
4
import java.util.Iterator;
Line 4... Line 5...
4
import java.util.Iterator;
5
import java.util.Vector;
5
 
6
 
6
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
7
import org.tela_botanica.client.modeles.ImageAsynchroneDAO;
8
import org.tela_botanica.client.modeles.ImageAsynchroneDAO;
8
import org.tela_botanica.client.modeles.ImageCarnet;
9
import org.tela_botanica.client.modeles.ImageCarnet;
9
import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;
10
import org.tela_botanica.client.modeles.ImageUploaderAsynchroneDAO;
10
import org.tela_botanica.client.modeles.ListeImageCarnet;
11
import org.tela_botanica.client.modeles.ListeImageCarnet;
-
 
12
import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;
Line 11... Line 13...
11
import org.tela_botanica.client.modeles.ListeImageAsynchroneDAO;
13
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;
12
import org.tela_botanica.client.modeles.MotsClesAsynchroneDAO;
14
import org.tela_botanica.client.modeles.NombreImageAsynchroneDAO;
-
 
15
 
-
 
16
import com.google.gwt.json.client.JSONArray;
13
 
17
import com.google.gwt.json.client.JSONObject;
14
import com.google.gwt.json.client.JSONArray;
18
import com.gwtext.client.core.Ext;
15
import com.google.gwt.json.client.JSONObject;
19
import com.gwtext.client.core.ExtElement;
16
import com.gwtext.client.data.ArrayReader;
20
import com.gwtext.client.data.ArrayReader;
17
import com.gwtext.client.data.FieldDef;
21
import com.gwtext.client.data.FieldDef;
Line 31... Line 35...
31
 * @author aurelien
35
 * @author aurelien
32
 *
36
 *
33
 */
37
 */
34
public class ImageModele implements Rafraichissable {
38
public class ImageModele implements Rafraichissable {
Line -... Line 39...
-
 
39
	
-
 
40
	/**
-
 
41
	 * Booleen indiquant si le médiateur est instancié (l'instance doit être unique donc le booleen est static)
35
	
42
	 */
-
 
43
	private static boolean estInstancie = false ;
-
 
44
	/**
36
	private static boolean estInstancie = false ;
45
	 * Le médiateur associé au modèle
37
	
46
	 */
-
 
47
	private ImageMediateur iMediateur = null ;
-
 
48
	/**
38
	private ImageMediateur iMediateur = null ;
49
	 * La liste des image affichées en cours
39
	
50
	 */
-
 
51
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
-
 
52
	/**
40
	private ListeImageCarnet cacheImage = new ListeImageCarnet(0) ;
53
	 * Table de correspondance entre les mots clés et leurs identifiants
41
	
54
	 */
-
 
55
	private HashMap motsCles = new HashMap(0) ;
-
 
56
	/**
42
	private HashMap motsCles = new HashMap(0) ;
57
	 * Le store contenant les données à afficher, que le modèle transmet au médiateur quand il le demande
43
	
58
	 */
-
 
59
	private Store st = null ;
-
 
60
	/**
44
	private Store st = null ;
61
	 * Arbre des mots clés
45
	
62
	 */
Line -... Line 63...
-
 
63
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
-
 
64
	
-
 
65
	/**
-
 
66
	 * Numéro de page en cours
-
 
67
	 */
-
 
68
	private int pageEncours = 0 ;
-
 
69
	/**
-
 
70
	 * Nombre de pages totales
-
 
71
	 */
-
 
72
	private int pageMax = 1 ;
-
 
73
	/**
-
 
74
	 * Taille de page (par défaut 50)
-
 
75
	 */
-
 
76
	private int taillePage = 50 ;
-
 
77
	/**
-
 
78
	 * Nombre d'éléments total correspondant à la requete
-
 
79
	 */
-
 
80
	private int nbElements = 0 ;
-
 
81
	
-
 
82
	/**
-
 
83
	 * Retourne une instance de manière unique
-
 
84
	 * @param im le médiateur à associer
46
	private com.gwtext.client.data.Tree arbreMotsCles =  new Tree() ;
85
	 * @return l'instance du modèle
47
	
86
	 */
-
 
87
	static ImageModele Instance(ImageMediateur im)
48
	static ImageModele Instance(ImageMediateur im)
88
	{
49
	{
89
		// si le modèle n'est pas encore instancié
-
 
90
		if(!estInstancie)
50
		if(!estInstancie)
91
		{
51
		{
92
			// on en crée un nouveau
52
			return new ImageModele(im);
93
			return new ImageModele(im);
53
		}
94
		}
-
 
95
		else
54
		else
96
		{
55
		{
97
			// sinon on renvoit null, interdisant explicitement la création d'un autre exemplaire
56
			return null ;
98
			return null ;
Line -... Line 99...
-
 
99
		}
-
 
100
	}
-
 
101
	
-
 
102
	/**
57
		}
103
	 * Le constructeur est privé et seule la méthode instance y accède
Line 58... Line 104...
58
	}
104
	 * @param im le médiateur à associé
59
	
105
	 */
Line -... Line 106...
-
 
106
	private ImageModele(ImageMediateur im) {
-
 
107
		
-
 
108
		iMediateur = im ;
-
 
109
	}
60
	private ImageModele(ImageMediateur im) {
110
	
61
		
111
	/**
62
		iMediateur = im ;
112
	 * Accesseur pour le médiateur
63
	}
113
	 * @return
Line 71... Line 121...
71
	 * Appelle le DAO asynchrone pour obtenir la liste des images
121
	 * Appelle le DAO asynchrone pour obtenir la liste des images
72
	 * @param r le rafraichissable auxquel on enverra les données
122
	 * @param r le rafraichissable auxquel on enverra les données
73
	 */
123
	 */
74
	public void obtenirPhotoGalerie(Rafraichissable r)
124
	public void obtenirPhotoGalerie(Rafraichissable r)
75
	{
125
	{
-
 
126
		// on rassemble les critères
-
 
127
		String[][] criteres = {{"ci_ce_utilisateur", ""+getIMediateur().getIdentifiant()} } ;
-
 
128
		// on les crée un DAO auquel on les transmet et qui demande le nombre d'images correspondantes (pour les pages)
-
 
129
		NombreImageAsynchroneDAO niaDAO = new NombreImageAsynchroneDAO() ;
-
 
130
		niaDAO.obtenirNombreImages(this, criteres) ;
-
 
131
		
-
 
132
		// ensuite on demande la page correspondante avec les mêmes critères
-
 
133
		String[][] criteres2 = { {"ci_limite" ,""+taillePage },{"ci_numero_page",""+pageEncours} } ;
-
 
134
		// et on crée un DAO auquel on les transmet et qui envoie une requete pour recevoir les images
76
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
135
		ListeImageAsynchroneDAO liaDAO = new ListeImageAsynchroneDAO();
77
		liaDAO.ObtenirListeImages(this);		
136
		liaDAO.ObtenirListeImages(this, criteres2);		
78
	}
137
	}
Line 79... Line 138...
79
	
138
	
80
	/**
139
	/**
81
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
140
	 * Appelle le DAO d'upload qui va choisir la methode d'upload adaptée
Line 215... Line 274...
215
		for (int i = 0; i < ids.length; i++) 
274
		for (int i = 0; i < ids.length; i++) 
216
		{				
275
		{				
217
			String key = ids[i] ;
276
			String key = ids[i] ;
218
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
277
			ImageCarnet ic = (ImageCarnet)cacheImage.get(key) ;
219
			rids[i] = ic.getId() ;
278
			rids[i] = ic.getId() ;
-
 
279
			
-
 
280
			cacheImage.remove(key) ;
220
		}
281
		}
Line 221... Line 282...
221
		
282
		
222
		if(rids.length != 0)
283
		if(rids.length != 0)
223
		{
284
		{	
224
			liDao.supprimerBaseDeDonnees(rids);
285
			liDao.supprimerBaseDeDonnees(rids);
225
		}		
286
		}		
Line 226... Line 287...
226
	}
287
	}
227
 
288
 
228
	/**
289
	/**
229
	 * Met à jour les données locales suivant le type des nouvelles données
290
	 * Met à jour les données locales suivant le type des nouvelles données
230
	 * et appelle le médiateur pour le notifier de la mise à jour
291
	 * et appelle le médiateur pour le notifier de la mise à jour
231
	 */
292
	 */
-
 
293
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) 
232
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) 
294
	{
233
	{
295
		// si l'on a reçu une liste d'images
234
		if(nouvelleDonnees instanceof ListeImageCarnet)
296
		if(nouvelleDonnees instanceof ListeImageCarnet)
235
		{
297
		{
236
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
298
				ListeImageCarnet data = (ListeImageCarnet) nouvelleDonnees ;
-
 
299
				Object[][] photoData = new Object[data.size()][7];
237
				Object[][] photoData = new Object[data.size()][7];
300
				int i = 0 ;
238
				int i = 0 ;
301
				// on la parse et on récupère les informations quiç nous interessent
239
				for (Iterator it = data.keySet().iterator(); it.hasNext();) 
302
				for (Iterator it = data.keySet().iterator(); it.hasNext();) 
240
				{
303
				{
241
					ImageCarnet im = (ImageCarnet) data.get(it.next());
304
					ImageCarnet im = (ImageCarnet) data.get(it.next());
Line 248... Line 311...
248
					photoData[i][6] = im.getUrl() ;
311
					photoData[i][6] = im.getUrl() ;
Line 249... Line 312...
249
					
312
					
250
					i++ ;
313
					i++ ;
Line 251... Line 314...
251
				}
314
				}
252
		
315
		
253
				// creation du store
316
				// creation du store qui les contient
254
				FieldDef defNumImage = new IntegerFieldDef("num_image");
317
				FieldDef defNumImage = new IntegerFieldDef("num_image");
255
				FieldDef defDatImage = new StringFieldDef("dat_image");
318
				FieldDef defDatImage = new StringFieldDef("dat_image");
256
				FieldDef defLieImage = new StringFieldDef("lie_image");
319
				FieldDef defLieImage = new StringFieldDef("lie_image");
Line 267... Line 330...
267
				final Store photoStore = new Store(dataProxy, reader);
330
				final Store photoStore = new Store(dataProxy, reader);
Line 268... Line 331...
268
				
331
				
Line 269... Line 332...
269
				rafraichirListeImage(nouvelleDonnees);
332
				rafraichirListeImage(nouvelleDonnees);
-
 
333
				
-
 
334
				st = photoStore ;
-
 
335
				st.load() ;
-
 
336
				
-
 
337
				// par défaut le store est trié sur le numéro d'image
Line -... Line 338...
-
 
338
				st.sort("num_image") ;
270
				
339
 
271
				st = photoStore ;
340
			
272
			
341
				// si on doit répandre les données, on notifie le médiateur qui les distribuera à son tour
273
				if(repandreRafraichissement)
342
				if(repandreRafraichissement)
274
				{
343
				{
Line -... Line 344...
-
 
344
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
275
					getIMediateur().synchroniserDonneesZoomListeGalerie(st, this) ;
345
				}
276
				}
346
		}
-
 
347
		
277
		}
348
		// si on reçoit un tableau JSON
Line 278... Line 349...
278
		
349
		if(nouvelleDonnees instanceof JSONArray)
Line -... Line 350...
-
 
350
		{
279
		if(nouvelleDonnees instanceof JSONArray)
351
			// alors on a reçu les informations sur les mots clés
280
		{
352
			JSONArray reponse = (JSONArray)nouvelleDonnees ; 
-
 
353
			
281
			JSONArray reponse = (JSONArray)nouvelleDonnees ; 
354
			final int taillemax = reponse.size();
282
			
355
			
283
			final int taillemax = reponse.size();
356
			// si le tableau est vide
284
			
357
			if(taillemax == 0)
285
			if(taillemax == 0)
358
			{
286
			{
359
				// on crée un arbre vide
287
				TreeNode root = new TreeNode() ;
360
				TreeNode root = new TreeNode() ;
288
				root.setId("racine") ;
361
				root.setId("racine") ;
Line -... Line 362...
-
 
362
				root.setText("Tags") ;
289
				root.setText("Tags") ;
363
				root.setIcon("tela.png") ;
290
				root.setIcon("tela.png") ;
364
				String[] usObj = {"Tags","racine"} ;
291
				String[] usObj = {"Tags","racine"} ;
-
 
-
 
365
				root.setUserObject(usObj) ;
292
				root.setUserObject(usObj) ;
366
				arbreMotsCles.setRootNode(root) ;				
293
				arbreMotsCles.setRootNode(root) ;				
367
			}
294
			}
368
			
Line 295... Line 369...
295
			
369
			// pour chacun des élements du tableau
296
			for (int j = 0; j < taillemax ; j++) 
370
			for (int j = 0; j < taillemax ; j++) 
297
			{
371
			{
Line 298... Line 372...
298
				
372
				// on extrait les élements du tableau
Line -... Line 373...
-
 
373
				if(reponse.get(j).isObject() != null)
299
				if(reponse.get(j).isObject() != null)
374
				{
300
				{
375
					JSONObject noeud = (JSONObject)reponse.get(j) ;
301
					JSONObject noeud = (JSONObject)reponse.get(j) ;
376
					
302
					
377
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
303
					String id_noeud = noeud.get("cmc_id_mot_cle_utilisateur").isString().stringValue() ;
378
					String mot_cle = noeud.get("cmc_mot_cle").isString().stringValue() ;
Line 315... Line 390...
315
						root.setUserObject(usObj) ;
390
						root.setUserObject(usObj) ;
316
						arbreMotsCles.setRootNode(root) ;
391
						arbreMotsCles.setRootNode(root) ;
317
					}
392
					}
318
					else
393
					else
319
					{
394
					{
-
 
395
						// et en ajoutant les noeuds un à un (qui sont renvoyé dans l'ordre hierarchique de leur niveau
-
 
396
						// ce qui permet de les traiter séquentiellement)
320
						TreeNode node = new TreeNode() ;
397
						TreeNode node = new TreeNode() ;
321
						node.setId(id_noeud) ;
398
						node.setId(id_noeud) ;
322
						node.setText(mot_cle) ;
399
						node.setText(mot_cle) ;
323
						node.setChecked(false) ;
400
						node.setChecked(false) ;
324
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
401
						Node parentNode = arbreMotsCles.getNodeById(parent) ;
325
						node.setIcon("tela.png") ;
402
						node.setIcon("tela.png") ;
326
						node.setUserObject(usObj) ;	
403
						node.setUserObject(usObj) ;	
327
						parentNode.appendChild(node) ;
404
						parentNode.appendChild(node) ;
328
					}
405
					}
329
				}
406
				}
330
			}			
407
			}		
-
 
408
				// enfin on met à jour l'arbre des mots clés contenu dans le modèle
331
				rafraichirArbreMotsCles(arbreMotsCles) ;
409
				rafraichirArbreMotsCles(arbreMotsCles) ;
-
 
410
				// et on notifie le médiateur de la mise à jour en lui passant une copie des données
332
				getIMediateur().getMetadonneesIptcExif().getPanneauMotsCles().rafraichir(arbreMotsCles, true) ;				
411
				getIMediateur().rafraichirArbreMotsCles(arbreMotsCles) ;			
333
		}		
412
		}
-
 
413
		
-
 
414
		// Si on reçoit un tableau d'entiers
-
 
415
		// c'est un tableau d'un seul entier qui est le nombre d'images correspondant aux critères
-
 
416
		if(nouvelleDonnees instanceof int[])
-
 
417
		{
-
 
418
			int[] pages = (int[])nouvelleDonnees ;
-
 
419
			
-
 
420
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
-
 
421
			pageMax  = calculerNbPages(pages[0]) ;
-
 
422
			nbElements = pages[0] ;
-
 
423
			
-
 
424
			// et on notifie de le mediateur du changement des valeurs
-
 
425
			getIMediateur().changerPageMaxEtCourante(pageMax,pageEncours,taillePage,pages[0]) ;
-
 
426
		}
334
	}
427
	}
Line 335... Line 428...
335
	
428
	
336
	/**
429
	/**
337
	 * Affiche les paires / valeur de tous les mots clés stockés
430
	 * Affiche les paires / valeur de tous les mots clés stockés
Line 508... Line 601...
508
		
601
		
509
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;		
602
		String motCleModifie = "&motcle="+motCle+"&id="+id+"&parent="+parentId ;		
510
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
603
		MCDao.deplacerBaseDeDonnees(motCleModifie) ;
Line -... Line 604...
-
 
604
	}
-
 
605
	
-
 
606
	/**
-
 
607
	 * Change le numéro de la page en cours et envoie une demande de mise à jour des données
-
 
608
	 * @param nouvellePageCourante la nouvelle page à afficher
-
 
609
	 */
-
 
610
	public void changerNumeroPage(int nouvellePageCourante)
-
 
611
	{
-
 
612
			pageEncours = nouvellePageCourante ;
-
 
613
			obtenirPhotoGalerie(this) ;		
-
 
614
	}
-
 
615
	
-
 
616
	/**
-
 
617
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
-
 
618
	 * en cours
-
 
619
	 * @param nbElements le nombre d'élements total
-
 
620
	 * @return le nombre de pages 
-
 
621
	 */
-
 
622
	public int calculerNbPages(int nbElements)
-
 
623
	{
-
 
624
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
-
 
625
		// pour eviter qu'il arrondisse mal la division
-
 
626
		// nombre de pages = (nombre d'element / taille de la page) arrondie à l'entier superieur 
-
 
627
		double nPage = (1.0*nbElements)/(1.0*taillePage) ; 
-
 
628
		double nPageRound = Math.ceil(nPage) ;
-
 
629
		Double nPageInt = new Double(nPageRound) ;
-
 
630
		
-
 
631
		// on convertit en entier
-
 
632
		return nPageInt.intValue() ; 
-
 
633
	}
-
 
634
	
-
 
635
	/**
-
 
636
	 * Recalcule la page en cours lors du changement du nombre d'élements
-
 
637
	 * @param nbElements le nombre d'élements total
-
 
638
	 * @return la nouvelle page encours
-
 
639
	 */
-
 
640
	public int calculerPageCourante(int nbElements)
-
 
641
	{
-
 
642
		// on calcule le nombre de page
-
 
643
		int nouvelNbPages = calculerNbPages(nbElements) ;
-
 
644
		// la nouvelle page en cours
-
 
645
		double nPageCourante = (1.0*pageEncours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
-
 
646
		
-
 
647
		// on arrondit au supérieur
-
 
648
		double nPageRound = Math.ceil(nPageCourante) ;
-
 
649
		Double nPageInt = new Double(nPageRound) ;
-
 
650
		
-
 
651
		// on convertit en entier
-
 
652
		return nPageInt.intValue() ; 
-
 
653
	}
-
 
654
	
-
 
655
	/**
-
 
656
	 * Change la taille de page et recalcule la page encours 
-
 
657
	 * @param nouvelleTaillePage la nouvelle taille de page à utiliser
-
 
658
	 */
-
 
659
	public void changerTaillePage(int nouvelleTaillePage)
-
 
660
	{
-
 
661
		taillePage = nouvelleTaillePage ;
-
 
662
		pageEncours = calculerPageCourante(nbElements) ;
-
 
663
		obtenirPhotoGalerie(this) ;
511
	}
664
	}