Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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