Subversion Repositories eFlore/Archives.cel-v2

Rev

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

Rev Author Line No. Line
4 aperonnet 1
package org.tela_botanica.client.image;
2
 
48 aperonnet 3
import org.tela_botanica.client.interfaces.IdVue;
5 aperonnet 4
import org.tela_botanica.client.interfaces.Rafraichissable;
19 aperonnet 5
import org.tela_botanica.client.interfaces.VueListable;
43 aperonnet 6
import org.tela_botanica.client.vues.ArbreMotsClesFiltreVue;
20 aperonnet 7
import org.tela_botanica.client.vues.BarreOutilsVue;
43 aperonnet 8
import org.tela_botanica.client.vues.BarreRechercheFiltreVue;
4 aperonnet 9
import org.tela_botanica.client.vues.GalerieImageVue;
10
import org.tela_botanica.client.vues.ListeImageVue;
48 aperonnet 11
import org.tela_botanica.client.vues.MenuFiltreVue;
12 aperonnet 12
import org.tela_botanica.client.vues.MenuImageVue;
16 aperonnet 13
import org.tela_botanica.client.vues.PanneauMetadonneesVue;
4 aperonnet 14
import org.tela_botanica.client.vues.ZoomImageVue;
20 aperonnet 15
 
5 aperonnet 16
import com.google.gwt.user.client.DOM;
17
import com.google.gwt.user.client.Element;
18
import com.google.gwt.user.client.Event;
16 aperonnet 19
import com.google.gwt.user.client.Window;
5 aperonnet 20
import com.gwtext.client.core.EventObject;
31 aperonnet 21
import com.gwtext.client.core.Ext;
22
import com.gwtext.client.core.ExtElement;
4 aperonnet 23
import com.gwtext.client.core.RegionPosition;
5 aperonnet 24
import com.gwtext.client.data.Record;
25
import com.gwtext.client.data.Store;
28 aperonnet 26
import com.gwtext.client.data.Tree;
5 aperonnet 27
import com.gwtext.client.widgets.DataView;
4 aperonnet 28
import com.gwtext.client.widgets.Panel;
29
import com.gwtext.client.widgets.TabPanel;
30
import com.gwtext.client.widgets.layout.BorderLayout;
31
import com.gwtext.client.widgets.layout.BorderLayoutData;
12 aperonnet 32
import com.gwtext.client.widgets.layout.FitLayout;
25 aperonnet 33
import com.gwtext.client.widgets.menu.BaseItem;
34
import com.gwtext.client.widgets.menu.Item;
35
import com.gwtext.client.widgets.menu.Menu;
36
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
37
import com.gwtext.client.widgets.tree.TreeEditor;
38
import com.gwtext.client.widgets.tree.TreeNode;
4 aperonnet 39
 
12 aperonnet 40
/**
41
 * Mediateur gérant les interactions entre vues et les echanges de données
42
 * C'est un singleton.
43
 * @author aurelien
44
 *
45
 */
4 aperonnet 46
public class ImageMediateur {
47
 
24 aperonnet 48
	/**
31 aperonnet 49
	 * booleen qui verifie l'unicite de l'instance (donc static)
24 aperonnet 50
	 */
12 aperonnet 51
	private static boolean estInstancie = false ;
52
 
24 aperonnet 53
	/**
54
	 * modele de données
55
	 */
7 aperonnet 56
	private ImageModele iModele = null ;
4 aperonnet 57
 
48 aperonnet 58
	private String identifiant = "0" ;
31 aperonnet 59
 
24 aperonnet 60
	/**
61
	 * panneau principal des images (onglet "images")
62
	 */
4 aperonnet 63
	private final Panel panneauPrincipalImage = new Panel("Images");
64
 
24 aperonnet 65
	/**
30 aperonnet 66
	 * panneau a onglet pour la liste, la galerie et la vue en grand
24 aperonnet 67
	 */
4 aperonnet 68
	private TabPanel ongletsImage = null ;
24 aperonnet 69
 
70
	/**
30 aperonnet 71
	 * conteneur du panneau a onglets
24 aperonnet 72
	 */
16 aperonnet 73
	private Panel panneauMenuEtOngletsImage = null ;
4 aperonnet 74
 
24 aperonnet 75
	/**
76
	 * galerie de miniature
77
	 */
4 aperonnet 78
	private GalerieImageVue galerieImage = null ;
24 aperonnet 79
 
80
	/**
81
	 * liste détaillée des images
82
	 */
4 aperonnet 83
	private ListeImageVue listeImage = null ;
24 aperonnet 84
 
85
	/**
86
	 * vue agrandie de la l'image selectionnée
87
	 */
4 aperonnet 88
	private ZoomImageVue zoomImage = null ;
89
 
24 aperonnet 90
	/**
30 aperonnet 91
	 * panneau a onglets affichant les métadonnées et les mots clés
24 aperonnet 92
	 */
93
	private PanneauMetadonneesVue metadonneesIptcExif = null ;
94
 
95
	/**
30 aperonnet 96
	 * panneau conteneur pour le panneau a onglet des metadonnées
24 aperonnet 97
	 */
4 aperonnet 98
	private final Panel detailsEtMotsCles = new Panel("Détails et mots clés");
99
 
24 aperonnet 100
	/**
101
	 * menu contextuel de manipulation des images
102
	 */
12 aperonnet 103
	private MenuImageVue menuImageVue = null ;
4 aperonnet 104
 
24 aperonnet 105
	/**
106
	 * barre d'outils
107
	 */
20 aperonnet 108
	private BarreOutilsVue barreOutilsVue = null ;
109
 
24 aperonnet 110
	/**
111
	 * l'indice du dernier onglet sélectionné
112
	 */
19 aperonnet 113
	private int dernierIndexOnglet = 0 ;
114
 
24 aperonnet 115
	/**
116
	 * booleen explicitant s'il y a une selection en cours
117
	 */
20 aperonnet 118
	private boolean selection = false ;
119
 
120
	/**
43 aperonnet 121
	 * Filtre pour les mots cles
122
	 */
123
	private ArbreMotsClesFiltreVue filtreMotsCles = null ;
124
 
125
	/**
126
	 * Filtre pour les commentaires
127
	 */
128
	private BarreRechercheFiltreVue filtreCommentaires = null ;
48 aperonnet 129
 
43 aperonnet 130
	/**
30 aperonnet 131
	 * constructeur privé (on accède a la classe par la méthode getInstance
20 aperonnet 132
	 */
12 aperonnet 133
	private ImageMediateur()
134
	{
31 aperonnet 135
		// quelques variables de position pour les borderlayouts
12 aperonnet 136
		final BorderLayoutData regionNord = new BorderLayoutData(
137
				RegionPosition.NORTH) ;
138
 
139
		final BorderLayoutData regionCentre = new BorderLayoutData(
140
				RegionPosition.CENTER) ;
4 aperonnet 141
 
142
		final BorderLayoutData regionEst = new BorderLayoutData(
143
				RegionPosition.EAST);
144
		regionEst.setSplit(true);
48 aperonnet 145
 
146
		afficherMenuId() ;
4 aperonnet 147
 
148
 
31 aperonnet 149
		// on crée un modèle
12 aperonnet 150
		iModele = ImageModele.Instance(this);
31 aperonnet 151
		// et on demande l'arbre des mots clés
30 aperonnet 152
		iModele.initialiserArbreMotsCles() ;
4 aperonnet 153
 
31 aperonnet 154
		// on gère la mise en page du panneau principal
4 aperonnet 155
		panneauPrincipalImage.setLayout(new BorderLayout());
31 aperonnet 156
 
157
		// on crée le panneau qui contient les differentes onglets ainsi que le menu supérieur
16 aperonnet 158
		panneauMenuEtOngletsImage = new Panel() ;
159
		panneauMenuEtOngletsImage.setLayout(new BorderLayout()) ;
4 aperonnet 160
 
31 aperonnet 161
		// le panneau à onglet qui contient les trois vues
4 aperonnet 162
		ongletsImage = new TabPanel();
31 aperonnet 163
 
164
		// la galerie
4 aperonnet 165
		galerieImage = new GalerieImageVue(this) ;
166
 
31 aperonnet 167
		// la liste des images
4 aperonnet 168
		Panel panneauListeImage = new Panel("Liste");
169
		listeImage = new ListeImageVue(this);
12 aperonnet 170
		panneauListeImage.setLayout(new FitLayout());
4 aperonnet 171
		panneauListeImage.add(listeImage);
172
 
31 aperonnet 173
		// le panneau zoom
4 aperonnet 174
		zoomImage = new ZoomImageVue(this);
175
 
31 aperonnet 176
		// on ajoute les panneaux au panneau à onglets
4 aperonnet 177
		ongletsImage.add(galerieImage);
178
		ongletsImage.add(zoomImage);
179
		ongletsImage.add(panneauListeImage);
180
 
31 aperonnet 181
		// on crée les menu et la barre de vue
12 aperonnet 182
		menuImageVue = new MenuImageVue(this) ;
20 aperonnet 183
		barreOutilsVue = new BarreOutilsVue(this) ;
12 aperonnet 184
 
31 aperonnet 185
		// on initialise le volet qui contient les mots clés
25 aperonnet 186
		detailsEtMotsCles.setWidth("25%");
4 aperonnet 187
		detailsEtMotsCles.setAnimCollapse(true);
188
		detailsEtMotsCles.setTitleCollapse(true);
189
		detailsEtMotsCles.setCollapsible(true);
190
 
43 aperonnet 191
		filtreMotsCles = new ArbreMotsClesFiltreVue(this) ;
192
		filtreCommentaires = new BarreRechercheFiltreVue(this) ;
193
 
31 aperonnet 194
		// on crée le panneau conteneur des métadonnées et infos
16 aperonnet 195
		metadonneesIptcExif = new PanneauMetadonneesVue(this) ;
31 aperonnet 196
		// et on l'inclut dans le volet approprié
16 aperonnet 197
		detailsEtMotsCles.add(metadonneesIptcExif) ;
198
 
31 aperonnet 199
		// on ajoute la barre de vue au nord du panneau qui contient menu et onglets d'images
20 aperonnet 200
		panneauMenuEtOngletsImage.add(barreOutilsVue,regionNord) ;
31 aperonnet 201
		// les onglets au centre
16 aperonnet 202
		panneauMenuEtOngletsImage.add(ongletsImage,regionCentre);
203
 
31 aperonnet 204
		// on ajoute le panneau qui contient le menu et les onglets d'images au centre
16 aperonnet 205
		panneauPrincipalImage.add(panneauMenuEtOngletsImage,regionCentre);
31 aperonnet 206
		// et le panneau de métadonnées et d'info sur le coté droit
4 aperonnet 207
		panneauPrincipalImage.add(detailsEtMotsCles,regionEst);
208
 
209
	}
210
 
24 aperonnet 211
	/**
35 aperonnet 212
	 * Change la valeur du booleen de selection
213
	 * @param selection la nouvelle valeur du booléen
24 aperonnet 214
	 */
215
	public void setSelection(boolean selection) {
216
		this.selection = selection;
217
	}
218
 
219
	/**
35 aperonnet 220
	 * renvoie la valeur du booleen de selection
31 aperonnet 221
	 * @return la valeur du booleen de selection
24 aperonnet 222
	 */
223
	public boolean isSelection() {
224
		return selection;
225
	}
226
 
31 aperonnet 227
	/**
228
	 * Retourne une instance de manière unique
35 aperonnet 229
	 * @return l'instance unique du médiateur
31 aperonnet 230
	 */
24 aperonnet 231
	public static ImageMediateur Instance()
232
	{
233
			if(!estInstancie)
234
			{
235
				estInstancie = true ;
236
				return new ImageMediateur() ;
237
			}
238
			else
239
			{
240
				return null ;
48 aperonnet 241
 
24 aperonnet 242
			}
243
	}
244
 
31 aperonnet 245
	/**
246
	 * Renvoie l'identifiant de l'utilisateur en cours
247
	 * @return l'identifiant de l'utilisateur
248
	 */
18 aperonnet 249
	public String getIdentifiant()
250
	{
48 aperonnet 251
		return identifiant ;
18 aperonnet 252
	}
48 aperonnet 253
 
254
	public void setIdentifiant(String id)
255
	{
256
		identifiant = id ;
257
	}
258
 
259
	public void changerUtilisateur()
260
	{
261
		getIModele().initialiserArbreMotsCles() ;
262
		obtenirPhotoGalerie(getGalerieImage()) ;
263
	}
4 aperonnet 264
 
31 aperonnet 265
	/**
266
	 * Accesseur pour le modèle associé au médiateur
267
	 * @return le modèle associé
268
	 */
7 aperonnet 269
	public ImageModele getIModele() {
270
		return iModele;
4 aperonnet 271
	}
272
 
31 aperonnet 273
	/**
274
	 * Accesseur pour le panneau principal
275
	 * @return le panneau principal
276
	 */
4 aperonnet 277
	public Panel getPanneauPrincipalImage() {
278
		return panneauPrincipalImage;
279
	}
280
 
31 aperonnet 281
	/**
282
	 * Accesseur pour le panneau à onglets
283
	 * @return le panneau à onglets
284
	 */
4 aperonnet 285
	public TabPanel getOngletsImage() {
286
		return ongletsImage;
287
	}
288
 
31 aperonnet 289
	/**
290
	 * Accesseur pour la galerie d'images
291
	 * @return la galerie d'image
292
	 */
4 aperonnet 293
	public GalerieImageVue getGalerieImage() {
294
		return galerieImage;
295
	}
296
 
297
	public ListeImageVue getListeImage() {
298
		return listeImage;
299
	}
300
 
31 aperonnet 301
	/**
302
	 * Accesseur pour le panneau "zoom"
303
	 * @return le panneau zoom
304
	 */
4 aperonnet 305
	public ZoomImageVue getZoomImage() {
306
		return zoomImage;
307
	}
308
 
31 aperonnet 309
	/**
310
	 * Accesseur pour le panneau détails et mot clés
311
	 * @return le panneau détails et mots clés
312
	 */
4 aperonnet 313
	public Panel getDetailsEtMotsCles() {
314
		return detailsEtMotsCles;
315
	}
316
 
20 aperonnet 317
	/**
31 aperonnet 318
	 * Accesseur pour le booleen d'instanciation
319
	 * @return le booleen d'instanciation
20 aperonnet 320
	 */
321
	public static boolean isEstInstancie() {
322
		return estInstancie;
323
	}
324
 
325
	/**
35 aperonnet 326
	 * Accesseur pour la panneau contenant le menu et les onglets images
31 aperonnet 327
	 * @return le panneauMenuEtOngletsImage
20 aperonnet 328
	 */
329
	public Panel getPanneauMenuEtOngletsImage() {
330
		return panneauMenuEtOngletsImage;
331
	}
332
 
333
	/**
48 aperonnet 334
	 * Accesseur pour le menu image
20 aperonnet 335
	 * @return the menuImageVue
336
	 */
337
	public MenuImageVue getMenuImageVue() {
338
		return menuImageVue;
339
	}
340
 
341
	/**
31 aperonnet 342
	 * Accesseur pour la barre d'outils
20 aperonnet 343
	 * @return the barreOutilsVue
344
	 */
345
	public BarreOutilsVue getBarreOutilsVue() {
346
		return barreOutilsVue;
347
	}
348
 
349
	/**
31 aperonnet 350
	 * Accesseur pour le panneau infos et métadonnées
20 aperonnet 351
	 * @return the metadonneesIptcExif
352
	 */
353
	public PanneauMetadonneesVue getMetadonneesIptcExif() {
354
		return metadonneesIptcExif;
355
	}
356
 
357
	/**
31 aperonnet 358
	 * Renvoie l'index du dernier onglet sélectionné
359
	 * @return l'index du dernier onglet
20 aperonnet 360
	 */
361
	public int getDernierIndexOnglet() {
362
		return dernierIndexOnglet;
363
	}
364
 
24 aperonnet 365
	/**
43 aperonnet 366
	 * Accesseur pour l'arbre des filtres
367
	 * @return l'arbre pour filtrer les mots clés
368
	 */
369
	public ArbreMotsClesFiltreVue getFiltreMotsCles()
370
	{
371
		return filtreMotsCles ;
372
	}
373
 
374
	/**
375
	 * Accesseur pour la barre de recherche
376
	 * @return la barre de recherche pour filtrer les commentaires
377
	 */
378
	public BarreRechercheFiltreVue getFiltreCommentaires()
379
	{
380
		return filtreCommentaires ;
381
	}
382
 
383
	/**
31 aperonnet 384
	 * Renvoie la vue sélectionné par l'utilisateur
24 aperonnet 385
	 * @return la vue selectionnée par l'utilisateur
386
	 */
19 aperonnet 387
	public VueListable getVueSelectionnee()
5 aperonnet 388
	{
19 aperonnet 389
		Panel active = ongletsImage.getActiveTab() ;
390
		if(active != zoomImage)
391
		{
392
			if(active == galerieImage)
393
			{
394
				return galerieImage ;
395
			}
396
			else
397
			{
398
				return listeImage ;
399
			}
400
 
401
		}
402
		else
403
		{
404
			if(dernierIndexOnglet == 0)
405
			{
406
				return galerieImage ;
407
			}
408
			else
409
			{
410
				return listeImage ;
411
			}
412
 
413
		}
16 aperonnet 414
 
19 aperonnet 415
	}
416
 
24 aperonnet 417
	/**
31 aperonnet 418
	 * Renvoie l'identifiant de la vue en cours
419
	 * @return l'identifiant de la vue en cours de visualisation
420
	 */
421
	public String getIdVueSelectionnee()
422
	{
423
		Panel active = ongletsImage.getActiveTab() ;
424
		if(active != zoomImage)
425
		{
426
			if(active == galerieImage)
427
			{
428
				return galerieImage.getId() ;
429
			}
430
			else
431
			{
432
				return listeImage.getId() ;
433
			}
434
 
435
		}
436
		else
437
		{
438
			if(dernierIndexOnglet == 0)
439
			{
440
				return galerieImage.getId() ;
441
			}
442
			else
443
			{
444
				return listeImage.getId() ;
445
			}
446
 
447
		}
448
 
449
	}
450
 
451
	/**
452
	 * Met a jour les données provenant du modèle et synchronise les vues entre elles
30 aperonnet 453
	 * @param o données de mises a jour pour les vues
454
	 * @param r le refraichissable qui a demandé la mise a jour
24 aperonnet 455
	 */
20 aperonnet 456
	public void synchroniserDonneesZoomListeGalerie(Object o, Rafraichissable r)
19 aperonnet 457
	{
16 aperonnet 458
 
20 aperonnet 459
		if(o instanceof Store) {
460
 
461
			Store li = (Store)o ;
462
 
463
			if(li.getCount() <= 0)
464
			{
465
				aucuneSelection() ;
466
			}
467
			else
468
			{
469
				selection() ;
470
			}
471
 
472
		}
473
 
5 aperonnet 474
		if(r != getGalerieImage())
475
		{
16 aperonnet 476
			getGalerieImage().rafraichir(o,false);
5 aperonnet 477
		}
478
		if(r != getZoomImage())
479
		{
16 aperonnet 480
			getZoomImage().rafraichir(o,false);
5 aperonnet 481
		}
482
		if(r != getListeImage())
483
		{
16 aperonnet 484
			getListeImage().rafraichir(o,false);
20 aperonnet 485
		}
486
 
487
		aucuneSelection() ;
31 aperonnet 488
		demasquerChargement() ;
5 aperonnet 489
	}
490
 
24 aperonnet 491
	/**
30 aperonnet 492
	 * envoie au modèle une demande de mise a jour
493
	 * @param r la vue demandeuse de mise a jour
24 aperonnet 494
	 */
6 aperonnet 495
	public void obtenirPhotoGalerie(Rafraichissable r)
5 aperonnet 496
	{
7 aperonnet 497
		getIModele().obtenirPhotoGalerie(r) ;
5 aperonnet 498
	}
499
 
24 aperonnet 500
	/**
30 aperonnet 501
	 * demande au modèle les métadonnées associées a une image
502
	 * @param r la vue demandeuse de mise a jour
24 aperonnet 503
	 * @param id l'identifiant de l'image
504
	 */
16 aperonnet 505
	public void obtenirMetadonnees(Rafraichissable r, String id)
506
	{
507
		getIModele().obtenirMetadonnees(r, id) ;
508
	}
509
 
24 aperonnet 510
	/**
30 aperonnet 511
	 * demande au modèle les ids des mots clés associés a une image
512
	 * @param r la vue demandeuse de mise a jour
25 aperonnet 513
	 * @param id l'identifiant de l'image
514
	 */
515
	public void obtenirMotsClesId(Rafraichissable r, String id)
516
	{
517
		getIModele().obtenirMotsClesId(r, id) ;
518
	}
519
 
31 aperonnet 520
	/**
521
	 * Envoie au modèle une demande pour obtenir l'arbre des mots clés
522
	 * @param r le raffraichissable qui a demandé la mise à jour
523
	 */
30 aperonnet 524
	public void obtenirArbreMotsCles(Rafraichissable r)
525
	{
526
		getIModele().obtenirArbreMotCle(r) ;
527
	}
528
 
25 aperonnet 529
	/**
30 aperonnet 530
	 * envoie au modèle une demande de mise a jour des informations modifiables
531
	 * associées a une image
24 aperonnet 532
	 * @param commentaires le commentaire de l'image
533
	 * @param date la date modifiée par l'utilisateur
534
	 */
46 aperonnet 535
	public void mettreAJourInfo(String commentaires, String date, String note)
18 aperonnet 536
	{
19 aperonnet 537
		String ids[] = getVueSelectionnee().getIdSelectionnees() ;
18 aperonnet 538
 
46 aperonnet 539
			getIModele().mettreAJourCacheImage(commentaires, date, note, ids) ;
48 aperonnet 540
			getListeImage().mettreAjourInfos(commentaires, date, note) ;
18 aperonnet 541
	}
542
 
31 aperonnet 543
	/**
544
	 * Met à jour l'arbre des mots clés affichés dans le volet de droite à partir de l'arbre passé en paramètre
545
	 * @param arbreMC le nouvel arbre des mots clés
546
	 */
30 aperonnet 547
	public void rafraichirArbreMotsCles(Tree arbreMC)
548
	{
549
		metadonneesIptcExif.getPanneauMotsCles().rafraichir(arbreMC, false) ;
550
	}
551
 
24 aperonnet 552
	/**
553
	 * envoie au modèle une demande pour lancer le formulaire ou l'application d'upload
554
	 */
19 aperonnet 555
	public void uploaderImages()
12 aperonnet 556
	{
557
		getIModele().uploaderImages() ;
558
	}
559
 
24 aperonnet 560
	/**
46 aperonnet 561
	 * Envoie une demande au modèle pour obtenir toutes les données annexes de l'image (métadonnées, note, etc ...),
562
	 * on y centralise tous les appels a obtenirQuelqueChose
563
	 * @param imgNum l'identifiant de l'image
564
	 */
565
	public void obtenirDonnes(String imgNum)
566
	{
567
		obtenirMetadonnees(metadonneesIptcExif,imgNum) ;
568
		obtenirMotsClesId(metadonneesIptcExif.getPanneauMotsCles(), imgNum) ;
569
		obtenirNote(metadonneesIptcExif.getNoteVue(), imgNum) ;
570
	}
571
 
572
	/**
573
	 * Envoie une demande au modèle pour obtenir la note associée à une image
574
	 * @param noteVue le rafraichissable à qui est destiné cette information
575
	 * @param imgNum l'identifiant de l'image
576
	 */
577
	private void obtenirNote(Rafraichissable r, String imgNum) {
578
 
579
		getIModele().obtenirNote(r,imgNum) ;
580
	}
581
 
582
	/**
24 aperonnet 583
	 * est appelé lors d'un clic de souris sur une vignette dans la galerie
584
	 * le médiateur gère alors les conséquences
585
	 * @param index l'index du noeud dans la galerie
586
	 * @param node le noeud selectionné
587
	 * @param e l'object source de l'évenement
588
	 */
12 aperonnet 589
	public void clicGalerieImage(int index, Element node,
5 aperonnet 590
			EventObject e)
591
	{
592
		Record rd = getGalerieImage().getDView().getRecord(node) ;
35 aperonnet 593
		String imgUrl = rd.getAsString("url_image");
5 aperonnet 594
 
35 aperonnet 595
		String[] imgXY = getIModele().obtenirTailleImage(rd.getAsString("num_image")) ;
596
 
597
		String[] infosImage = {imgUrl , imgXY[0] , imgXY[1] } ;
598
 
599
		getZoomImage().rafraichir(infosImage,false);
19 aperonnet 600
		dernierIndexOnglet = 0 ;
5 aperonnet 601
 
602
		if(DOM.eventGetType(e.getBrowserEvent()) == Event.ONDBLCLICK)
603
		{
35 aperonnet 604
 
5 aperonnet 605
			getOngletsImage().setActiveTab(1);
606
		}
16 aperonnet 607
 
608
		String imgNum = rd.getAsString("num_image");
46 aperonnet 609
		obtenirDonnes(imgNum) ;
25 aperonnet 610
 
5 aperonnet 611
	}
612
 
24 aperonnet 613
	/**
614
	 * est appelé lors d'un clic de souris sur un enregistrement de la liste
615
	 * le médiateur gère alors les conséquences
616
	 * @param rowIndex le numéro de ligne selectionné
617
	 */
20 aperonnet 618
	public void clicListeImage(int rowIndex)
19 aperonnet 619
	{
620
		Record rd = getListeImage().getSelectionModel().getSelected() ;
621
		String imgUrl = rd.getAsString("url_image");
622
 
35 aperonnet 623
		String[] imgXY = getIModele().obtenirTailleImage(rd.getAsString("num_image")) ;
19 aperonnet 624
 
35 aperonnet 625
		String[] infosImage = {imgUrl , imgXY[0] , imgXY[1] } ;
626
 
627
		getZoomImage().rafraichir(infosImage,false);
628
 
19 aperonnet 629
		dernierIndexOnglet = 2 ;
630
 
631
		String imgNum = rd.getAsString("num_image");
46 aperonnet 632
		obtenirDonnes(imgNum) ;
19 aperonnet 633
	}
634
 
24 aperonnet 635
	/**
636
	 * gestion du double clic dans la liste
637
	 * @param rowIndex
638
	 */
20 aperonnet 639
	public void doubleClicListeImage(int rowIndex)
19 aperonnet 640
	{
20 aperonnet 641
		clicListeImage(rowIndex) ;
19 aperonnet 642
		getOngletsImage().setActiveTab(1);
643
	}
644
 
24 aperonnet 645
	/**
30 aperonnet 646
	 * envoie une demande de mise a jour des données au modèle
24 aperonnet 647
	 */
18 aperonnet 648
	public void rafraichirToutesVues()
649
	{
24 aperonnet 650
		obtenirPhotoGalerie(getIModele());
18 aperonnet 651
	}
16 aperonnet 652
 
24 aperonnet 653
	/**
654
	 * montre le menu au coordonnées indiquées
655
	 * @param e l'objet source de l'évenement
656
	 */
12 aperonnet 657
	public void montrerContextMenu(EventObject e)
5 aperonnet 658
	{
12 aperonnet 659
		menuImageVue.showAt(e.getXY()) ;
660
	}
661
 
24 aperonnet 662
	/**
663
	 * appelé lors du double clic sur l'image agrandie
664
	 */
12 aperonnet 665
	public void doubleClicZoomImage()
666
	{
19 aperonnet 667
		getOngletsImage().setActiveTab(dernierIndexOnglet);
5 aperonnet 668
	}
669
 
24 aperonnet 670
	/**
671
	 * appelé lors du clic sur un des boutons de la zone zoom
672
	 * @param arg le nom du bouton qui a cliqué
673
	 */
12 aperonnet 674
	public void clicBoutonZoomImage(String arg)
5 aperonnet 675
	{
676
 
19 aperonnet 677
		Store st ;
678
		int selected ;
679
		int storeIndex ;
5 aperonnet 680
		Record nRec = null ;
681
 
31 aperonnet 682
		// tout d'abord on obtient les index selectionnés suivant la vue
19 aperonnet 683
		if(getVueSelectionnee() == galerieImage)
684
		{
685
			DataView dv = getGalerieImage().getDView();
686
			st = getGalerieImage().getSt();
687
 
20 aperonnet 688
			if(st.getCount() <= 0)
689
			{
690
				return ;
691
			}
692
 
19 aperonnet 693
			selected = st.indexOf(dv.getSelectedRecords()[0]);
694
			storeIndex = dv.indexOf(selected);
695
		}
696
		else
697
		{
698
			st = listeImage.getSt() ;
20 aperonnet 699
 
700
			if(st.getCount() <= 0)
701
			{
702
				return ;
703
			}
704
 
19 aperonnet 705
			selected = st.indexOf(listeImage.getSelectionModel().getSelected()) ;
706
			storeIndex = selected ;
707
		}
5 aperonnet 708
 
709
		if(arg.equals("prev"))
710
		{
30 aperonnet 711
			// si la photo séléctionnée est la première, on passe a la
5 aperonnet 712
			// dernière
713
			if (selected == 0) {
714
				storeIndex = st.getCount() - 1 ;
715
				nRec = st.getAt(storeIndex);
716
 
717
			}
718
			else
719
			{
720
				storeIndex = storeIndex - 1 ;
721
				nRec = st.getAt(storeIndex);
722
			}
723
 
724
 
725
		}
726
 
727
		if(arg.equals("suiv"))
728
		{
30 aperonnet 729
			// si la photo selectionnée est la dernière on passe a la
5 aperonnet 730
			// première
731
			if (selected == st.getCount() - 1) {
732
 
733
				storeIndex = 0 ;
734
				nRec = st.getAt(0);
735
			}
736
			else
737
			{
738
				storeIndex = storeIndex + 1 ;
739
				nRec = st.getAt(storeIndex);
740
			}
741
		}
742
 
743
		if(nRec != null)
744
		{
35 aperonnet 745
			String imgUrl = nRec.getAsString("url_image");
746
			String[] imgXY = getIModele().obtenirTailleImage(nRec.getAsString("num_image")) ;
747
			String[] infosImage = {imgUrl , imgXY[0] , imgXY[1] } ;
748
			getZoomImage().rafraichir(infosImage,false);
19 aperonnet 749
 
750
			if(getGalerieImage().isRendered())
751
			{
752
				getGalerieImage().getDView().select(storeIndex);
753
			}
16 aperonnet 754
 
19 aperonnet 755
			if(getListeImage().isRendered())
756
			{
757
				getListeImage().getSelectionModel().selectRecords(nRec) ;
758
			}
759
 
16 aperonnet 760
			String imgNum = nRec.getAsString("num_image");
46 aperonnet 761
			obtenirDonnes(imgNum) ;
5 aperonnet 762
		}
763
	}
764
 
20 aperonnet 765
 
24 aperonnet 766
	/**
767
	 * synchronise la selection entre la galerie et la liste
30 aperonnet 768
	 * @param string le nom de la vue qui doit être synchronisee
24 aperonnet 769
	 */
20 aperonnet 770
	public void synchroniserSelection(String string) {
771
 
772
		if(string.equals("galerie") && getDernierIndexOnglet() != 2)
773
		{
774
				Record[] sel = getGalerieImage().getDView().getSelectedRecords() ;
775
				getListeImage().selectionnerEnregistrements(sel) ;
776
		}
777
 
778
		if(string.equals("liste") && getDernierIndexOnglet() != 0)
779
		{
780
 
781
				Record[] sel = getListeImage().getSelectionModel().getSelections() ;
782
				int[] ids = new int[sel.length] ;
783
 
784
				for (int i = 0; i < sel.length; i++) {
785
 
786
					ids[i] = getGalerieImage().getSt().indexOf(sel[i]) ;
787
				}
788
 
789
				getGalerieImage().selectionnerImages(ids) ;
790
		}
791
 
792
	}
793
 
24 aperonnet 794
	/**
795
	 * fait une demande de suppression des images (en local et en distant)
30 aperonnet 796
	 * des images selectionnees
24 aperonnet 797
	 */
20 aperonnet 798
	public void supprimerImages() {
799
 
800
		String[] ids = null ;
801
 
802
 
803
			if(dernierIndexOnglet == 0)
804
			{
805
				ids = getGalerieImage().getIdSelectionnees() ;
806
			}
807
			else
808
			{
809
				ids = getListeImage().getIdSelectionnees() ;
810
			}
811
 
812
		if(ids.length > 0)
813
		{
814
 
815
			if(com.google.gwt.user.client.Window
30 aperonnet 816
					.confirm("Supprimer les images selectionnees ?"))
20 aperonnet 817
			{
31 aperonnet 818
				masquerChargement() ;
20 aperonnet 819
				getIModele().supprimerImages(ids) ;
820
				aucuneSelection() ;
821
			}
822
		}
823
		else
824
		{
30 aperonnet 825
			Window.alert("Impossible de supprimer : aucune image selectionnee") ;
20 aperonnet 826
		}
827
 
828
	}
829
 
24 aperonnet 830
	/**
30 aperonnet 831
	 * desactive les onglets de metadonnees et de zoom (dans le cas ou rien n'est selectionne)
24 aperonnet 832
	 */
20 aperonnet 833
	public void aucuneSelection() {
834
 
835
		if(getListeImage().getSelectionModel().getCount() <= 0 && getGalerieImage().getDView().getSelectionCount() <= 0)
836
		{
837
			getMetadonneesIptcExif().desactiverPanneau() ;
838
			getZoomImage().desactiverPanneau() ;
839
			setSelection(false) ;
840
		}
841
 
842
	}
12 aperonnet 843
 
24 aperonnet 844
	/**
31 aperonnet 845
	 * reactive les onglet metadonnees et zoom (lors d'une selection alors qu'il n'y en avait pas)
24 aperonnet 846
	 */
20 aperonnet 847
	public void selection() {
848
 
849
		if(!isSelection())
850
		{
851
			getMetadonneesIptcExif().activerPanneau() ;
852
			getZoomImage().activerPanneau() ;
853
			setSelection(true);
854
		}
855
	}
25 aperonnet 856
 
31 aperonnet 857
	/**
858
	 * Fait apparaitre le menu contextuel de l'arbre des mots clés au niveau d'un noeud donné
859
	 * @param n le noeud ou le menu doit apparaitre
860
	 * @param ev l'objet contenant les données sur l'évenement
861
	 * @param te l'éditeur associé à l'arbre qui permet de modifier les libellés des noeuds
862
	 */
25 aperonnet 863
	public void montrerContextMenuArbre(final TreeNode n, EventObject ev, final TreeEditor te)
864
	{
865
		Menu mn = new Menu() ;
30 aperonnet 866
		final com.gwtext.client.widgets.menu.Item ajoutN = new Item("Ajouter mot cle");
867
		final com.gwtext.client.widgets.menu.Item suppN = new Item("Supprimer mot cle");
25 aperonnet 868
 
869
		mn.addItem(ajoutN);
870
		mn.addItem(suppN);
871
 
872
		mn.addListener(new MenuListenerAdapter() {
873
 
48 aperonnet 874
 
25 aperonnet 875
			public void onItemClick(BaseItem item, EventObject e)
30 aperonnet 876
			{
25 aperonnet 877
				if(item.equals(suppN))
878
				{
879
					getMetadonneesIptcExif().getPanneauMotsCles().supprimerNoeud(n) ;
880
				}
881
				if(item.equals(ajoutN))
882
				{
883
					getMetadonneesIptcExif().getPanneauMotsCles().ajouterNoeud(n) ;
884
				}
885
			}
886
		});
887
 
888
		mn.showAt(ev.getXY());
889
 
890
	}
30 aperonnet 891
 
31 aperonnet 892
	/**
893
	 * Appelle le modèle pour mettre à jour la paire mot-clé / identifiant du mot clé
894
	 * @param text le texte du mot clé
895
	 * @param id l'identifiant du mot clé
896
	 */
25 aperonnet 897
	public void mettreAjourMotsClesId(String text, String id) {
898
 
899
		getIModele().mettreAjourMotsClesId(text, id) ;
900
 
901
	}
902
 
31 aperonnet 903
	/**
904
	 * Récupère les identifiants des images selectionnés
905
	 * et appelle le modèle pour qu'il mette à jour les associations mots clés/images
906
	 * @param motsClesEnCours les mots clés à associer aux images selectionnés séparés par une ','
907
	 * @param arbreMC l'arbre des mots clés à mettre à jour
908
	 */
28 aperonnet 909
	public void mettreAjourMotsCles(String motsClesEnCours, Tree arbreMC) {
25 aperonnet 910
 
911
		String[] ids = getGalerieImage().getIdSelectionnees() ;
28 aperonnet 912
		getIModele().mettreAjourMotsCles(ids,motsClesEnCours,arbreMC) ;
25 aperonnet 913
 
914
	}
20 aperonnet 915
 
31 aperonnet 916
	/**
917
	 * Appelle le médiateur pour qu'il ajoute un mot clé dans l'arbre des mots clés
918
	 * @param n le noeud parent pour l'ajout
919
	 * @param arbreMC le nouvel arbre de mots clés à mettre à jour
920
	 */
28 aperonnet 921
	public void ajouterMotCleDansArbre(TreeNode n,Tree arbreMC)
922
	{
923
		getIModele().ajouterMotCleDansArbre(n, arbreMC) ;
924
	}
925
 
31 aperonnet 926
	/**
927
	 * Appelle le médiateur pour qu'il supprime un mot clé et son sous arbre dans l'arbre des mots clés
928
	 * @param n le noeud à supprimer
929
	 * @param arbreMC le nouvel arbre de mots clés à mettre à jour
930
	 */
28 aperonnet 931
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC) {
932
 
933
		getIModele().supprimerMotCleDansArbre(n,arbreMC) ;
934
 
935
	}
936
 
31 aperonnet 937
	/**
938
	 * Appelle le médiateur pour qu'il modifie un mot clé dans l'arbre des mots clés
939
	 * @param n le noeud à modifier
940
	 * @param arbreMC le nouvel arbre de mots clés à mettre à jour
941
	 */
28 aperonnet 942
	public void modifierMotCleDansArbre(TreeNode n , Tree arbreMC) {
943
 
944
		getIModele().modifierMotCleDansArbre(n,arbreMC) ;
945
 
946
	}
20 aperonnet 947
 
31 aperonnet 948
	/**
949
	 * Appelle le médiateur pour qu'il déplace un mot clé et son sous arbre dans l'arbre des mots clés
950
	 * @param n le noeud à déplacer
951
	 * @param arbreMC le nouvel arbre de mots clés à mettre à jour
952
	 */
28 aperonnet 953
	public void deplacerMotCleDansArbre(TreeNode n , Tree arbreMC) {
954
 
955
		getIModele().deplacerMotCleDansArbre(n, arbreMC) ;
956
	}
30 aperonnet 957
 
31 aperonnet 958
	/**
959
	 * initialise les mots clés cochés par rapport aux images sélectionnées
960
	 */
30 aperonnet 961
	public void initialiserMotsCleCoches() {
962
 
963
		obtenirMotsClesId(metadonneesIptcExif.getPanneauMotsCles(), getGalerieImage().getIdSelectionnees()[0]) ;
964
	}
31 aperonnet 965
 
966
	/**
967
	 * Appelle le modèle pour lui demander les données d'une page à afficher
968
	 * @param pageCourante le numéro de page à affciher
969
	 */
970
	public void changerNumeroPage(int pageCourante) {
971
 
972
		// on met le mesage d'attente
973
		masquerChargement() ;
974
 
975
		// on appelle le modèle
976
		getIModele().changerNumeroPage(pageCourante) ;
977
 
978
		// et met à jour les numéros de page dans les barre d'outils
979
		getGalerieImage().getToolBarVue().changerPageCourante(pageCourante);
980
		getListeImage().getToolBarVue().changerPageCourante(pageCourante);
981
	}
28 aperonnet 982
 
31 aperonnet 983
	/**
984
	 * Appelle le modèle pour qu'il change la taille de page utilisée
985
	 * @param nouvelleTaillePage la nouvelle taille de page
986
	 */
987
	public void changerTaillePage(int nouvelleTaillePage)
988
	{
989
		// on met le message d'attente
990
		masquerChargement() ;
991
 
992
		// on appelle le modèle
993
		getIModele().changerTaillePage(nouvelleTaillePage) ;
994
 
995
		// et on met à jour la taille de page dans les barres d'outils
996
		getGalerieImage().getToolBarVue().selectionnerTaillePage(nouvelleTaillePage);
997
		getListeImage().getToolBarVue().selectionnerTaillePage(nouvelleTaillePage);
998
	}
999
 
1000
	/**
1001
	 * Met à jour les barre d'outils avec des nouvelles valeurs
1002
	 * @param pageMax le nombre de pages
1003
	 * @param pageEncours la page en cours
1004
	 * @param taillePage la taille de page
1005
	 * @param nbElement le nombre d'élements par page
1006
	 */
1007
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement)
1008
	{
1009
 
1010
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
1011
		getGalerieImage().getToolBarVue().rafraichir(pages, false) ;
1012
		getListeImage().getToolBarVue().rafraichir(pages, false) ;
1013
 
1014
	}
28 aperonnet 1015
 
31 aperonnet 1016
	/**
1017
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
1018
	 */
1019
	public void masquerChargement()
1020
	{
1021
			ExtElement masked = Ext.get(getIdVueSelectionnee()) ;
4 aperonnet 1022
 
31 aperonnet 1023
				masked.mask("Chargement") ;
1024
 
1025
	}
1026
 
1027
	/**
1028
	 * Recherche l'élement actuellement affiché et retire son message de chargement si l'était affiché
1029
	 */
1030
	public void demasquerChargement()
1031
	{
1032
				ExtElement masked = Ext.get(getIdVueSelectionnee()) ;
1033
				if(masked.isMasked())
1034
				{
1035
					masked.unmask() ;
1036
				}
1037
	}
43 aperonnet 1038
 
1039
	public void afficherFiltreMotsCles() {
1040
 
1041
		getIModele().obtenirArbreMotCle(filtreMotsCles) ;
1042
 
1043
	}
31 aperonnet 1044
 
48 aperonnet 1045
	public void afficherMenuId()
1046
	{
1047
		IdVue i = new IdVue(this) ;
1048
		i.show() ;
1049
	}
1050
 
43 aperonnet 1051
	/**
1052
	 * C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
1053
	 * sous forme de tableau [nom, valeur]
1054
	 * @return Les noms et valeurs des filtres
1055
	 */
1056
	public String[][] renvoyerFiltres()
1057
	{
1058
		String[][] valeursFiltres = { filtreMotsCles.renvoyerValeursAFiltrer() , filtreCommentaires.renvoyerValeursAFiltrer() } ;
1059
 
1060
		return valeursFiltres ;
1061
	}
31 aperonnet 1062
 
43 aperonnet 1063
	/**
1064
	 * Indique si les filtres ont changés depuis la dernière requête
1065
	 * (il faut faire un OR sur le résultat de toutes les fonctions
1066
	 * renvoyerEtatFiltre s'il y a plus d'un filtre)
1067
	 * @return Une indication de changements de filtres
1068
	 */
1069
	public boolean getEtatFiltres()
1070
	{
1071
		System.out.println("les filtres sont modifiés ? "+(filtreMotsCles.renvoyerEtatFiltre() || filtreCommentaires.renvoyerEtatFiltre())) ;
1072
		return (filtreMotsCles.renvoyerEtatFiltre() || filtreCommentaires.renvoyerEtatFiltre());
1073
	}
31 aperonnet 1074
 
43 aperonnet 1075
	public void afficherFiltreCommentaires() {
1076
 
1077
		filtreCommentaires.afficherFiltre() ;
1078
 
1079
	}
1080
 
1081
 
1082
 
4 aperonnet 1083
}