Subversion Repositories eFlore/Archives.cel-v2

Rev

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