Subversion Repositories eFlore/Archives.cel-v2

Rev

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

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