Subversion Repositories eFlore/Archives.cel-v2

Rev

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