Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 20 | Rev 25 | 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;
20 aperonnet 5
import org.tela_botanica.client.vues.BarreOutilsVue;
4 aperonnet 6
import org.tela_botanica.client.vues.GalerieImageVue;
7
import org.tela_botanica.client.vues.ListeImageVue;
12 aperonnet 8
import org.tela_botanica.client.vues.MenuImageVue;
16 aperonnet 9
import org.tela_botanica.client.vues.PanneauMetadonneesVue;
4 aperonnet 10
import org.tela_botanica.client.vues.ZoomImageVue;
20 aperonnet 11
 
5 aperonnet 12
import com.google.gwt.user.client.DOM;
13
import com.google.gwt.user.client.Element;
14
import com.google.gwt.user.client.Event;
16 aperonnet 15
import com.google.gwt.user.client.Window;
5 aperonnet 16
import com.gwtext.client.core.EventObject;
4 aperonnet 17
import com.gwtext.client.core.RegionPosition;
5 aperonnet 18
import com.gwtext.client.data.Record;
19
import com.gwtext.client.data.Store;
20
import com.gwtext.client.widgets.DataView;
4 aperonnet 21
import com.gwtext.client.widgets.Panel;
22
import com.gwtext.client.widgets.TabPanel;
23
import com.gwtext.client.widgets.layout.BorderLayout;
24
import com.gwtext.client.widgets.layout.BorderLayoutData;
12 aperonnet 25
import com.gwtext.client.widgets.layout.FitLayout;
4 aperonnet 26
 
12 aperonnet 27
/**
28
 * Mediateur gérant les interactions entre vues et les echanges de données
29
 * C'est un singleton.
30
 * @author aurelien
31
 *
32
 */
4 aperonnet 33
public class ImageMediateur {
34
 
24 aperonnet 35
	/**
36
	 * booleen qui verifie l'unicite de l'instance
37
	 */
12 aperonnet 38
	private static boolean estInstancie = false ;
39
 
24 aperonnet 40
	/**
41
	 * modele de données
42
	 */
7 aperonnet 43
	private ImageModele iModele = null ;
4 aperonnet 44
 
45
 
24 aperonnet 46
	// Widget crées par le médiateur
47
	/**
48
	 * panneau principal des images (onglet "images")
49
	 */
4 aperonnet 50
	private final Panel panneauPrincipalImage = new Panel("Images");
51
 
24 aperonnet 52
	/**
53
	 * panneau à onglet pour la liste, la galerie et la vue en grand
54
	 */
4 aperonnet 55
	private TabPanel ongletsImage = null ;
24 aperonnet 56
 
57
	/**
58
	 * conteneur du panneau à onglets
59
	 */
16 aperonnet 60
	private Panel panneauMenuEtOngletsImage = null ;
4 aperonnet 61
 
24 aperonnet 62
	/**
63
	 * galerie de miniature
64
	 */
4 aperonnet 65
	private GalerieImageVue galerieImage = null ;
24 aperonnet 66
 
67
	/**
68
	 * liste détaillée des images
69
	 */
4 aperonnet 70
	private ListeImageVue listeImage = null ;
24 aperonnet 71
 
72
	/**
73
	 * vue agrandie de la l'image selectionnée
74
	 */
4 aperonnet 75
	private ZoomImageVue zoomImage = null ;
76
 
24 aperonnet 77
	/**
78
	 * panneau à onglets affichant les métadonnées et les mots clés
79
	 */
80
	private PanneauMetadonneesVue metadonneesIptcExif = null ;
81
 
82
	/**
83
	 * panneau conteneur pour le panneau à onglet des metadonnées
84
	 */
4 aperonnet 85
	private final Panel detailsEtMotsCles = new Panel("Détails et mots clés");
86
 
24 aperonnet 87
	/**
88
	 * menu contextuel de manipulation des images
89
	 */
12 aperonnet 90
	private MenuImageVue menuImageVue = null ;
4 aperonnet 91
 
24 aperonnet 92
	/**
93
	 * barre d'outils
94
	 */
20 aperonnet 95
	private BarreOutilsVue barreOutilsVue = null ;
96
 
24 aperonnet 97
	/**
98
	 * l'indice du dernier onglet sélectionné
99
	 */
19 aperonnet 100
	private int dernierIndexOnglet = 0 ;
101
 
24 aperonnet 102
	/**
103
	 * booleen explicitant s'il y a une selection en cours
104
	 */
20 aperonnet 105
	private boolean selection = false ;
106
 
107
	/**
24 aperonnet 108
	 * constructeur privé (on accède à la classe par la méthode getInstance
20 aperonnet 109
	 */
12 aperonnet 110
	private ImageMediateur()
111
	{
112
		final BorderLayoutData regionNord = new BorderLayoutData(
113
				RegionPosition.NORTH) ;
114
 
115
		final BorderLayoutData regionCentre = new BorderLayoutData(
116
				RegionPosition.CENTER) ;
4 aperonnet 117
 
118
		final BorderLayoutData regionEst = new BorderLayoutData(
119
				RegionPosition.EAST);
120
		regionEst.setSplit(true);
121
 
122
 
12 aperonnet 123
		iModele = ImageModele.Instance(this);
4 aperonnet 124
 
125
		panneauPrincipalImage.setLayout(new BorderLayout());
16 aperonnet 126
		panneauMenuEtOngletsImage = new Panel() ;
127
		panneauMenuEtOngletsImage.setLayout(new BorderLayout()) ;
4 aperonnet 128
 
129
		ongletsImage = new TabPanel();
130
		galerieImage = new GalerieImageVue(this) ;
131
 
132
		Panel panneauListeImage = new Panel("Liste");
133
		listeImage = new ListeImageVue(this);
12 aperonnet 134
		panneauListeImage.setLayout(new FitLayout());
4 aperonnet 135
		panneauListeImage.add(listeImage);
136
 
137
		zoomImage = new ZoomImageVue(this);
138
 
139
		ongletsImage.add(galerieImage);
140
		ongletsImage.add(zoomImage);
141
		ongletsImage.add(panneauListeImage);
142
 
12 aperonnet 143
		menuImageVue = new MenuImageVue(this) ;
20 aperonnet 144
		barreOutilsVue = new BarreOutilsVue(this) ;
12 aperonnet 145
 
4 aperonnet 146
		detailsEtMotsCles.setWidth("20%");
147
		detailsEtMotsCles.setAnimCollapse(true);
148
		detailsEtMotsCles.setTitleCollapse(true);
149
		detailsEtMotsCles.setCollapsible(true);
150
 
16 aperonnet 151
		metadonneesIptcExif = new PanneauMetadonneesVue(this) ;
152
		detailsEtMotsCles.add(metadonneesIptcExif) ;
153
 
154
 
20 aperonnet 155
		panneauMenuEtOngletsImage.add(barreOutilsVue,regionNord) ;
16 aperonnet 156
		panneauMenuEtOngletsImage.add(ongletsImage,regionCentre);
157
 
158
		panneauPrincipalImage.add(panneauMenuEtOngletsImage,regionCentre);
4 aperonnet 159
		panneauPrincipalImage.add(detailsEtMotsCles,regionEst);
160
 
161
	}
162
 
24 aperonnet 163
	/**
164
	 * @param selection the selection to set
165
	 */
166
	public void setSelection(boolean selection) {
167
		this.selection = selection;
168
	}
169
 
170
	/**
171
	 * @return the selection
172
	 */
173
	public boolean isSelection() {
174
		return selection;
175
	}
176
 
177
	public static ImageMediateur Instance()
178
	{
179
			if(!estInstancie)
180
			{
181
				estInstancie = true ;
182
				return new ImageMediateur() ;
183
			}
184
			else
185
			{
186
				return null ;
187
			}
188
	}
189
 
18 aperonnet 190
	public String getIdentifiant()
191
	{
192
		return "0" ;
193
	}
4 aperonnet 194
 
7 aperonnet 195
	public ImageModele getIModele() {
196
		return iModele;
4 aperonnet 197
	}
198
 
199
	public Panel getPanneauPrincipalImage() {
200
		return panneauPrincipalImage;
201
	}
202
 
203
	public TabPanel getOngletsImage() {
204
		return ongletsImage;
205
	}
206
 
207
	public GalerieImageVue getGalerieImage() {
208
		return galerieImage;
209
	}
210
 
211
	public ListeImageVue getListeImage() {
212
		return listeImage;
213
	}
214
 
215
	public ZoomImageVue getZoomImage() {
216
		return zoomImage;
217
	}
218
 
219
	public Panel getDetailsEtMotsCles() {
220
		return detailsEtMotsCles;
221
	}
222
 
20 aperonnet 223
	/**
224
	 * @return the estInstancie
225
	 */
226
	public static boolean isEstInstancie() {
227
		return estInstancie;
228
	}
229
 
230
	/**
231
	 * @return the panneauMenuEtOngletsImage
232
	 */
233
	public Panel getPanneauMenuEtOngletsImage() {
234
		return panneauMenuEtOngletsImage;
235
	}
236
 
237
	/**
238
	 * @return the menuImageVue
239
	 */
240
	public MenuImageVue getMenuImageVue() {
241
		return menuImageVue;
242
	}
243
 
244
	/**
245
	 * @return the barreOutilsVue
246
	 */
247
	public BarreOutilsVue getBarreOutilsVue() {
248
		return barreOutilsVue;
249
	}
250
 
251
	/**
252
	 * @return the metadonneesIptcExif
253
	 */
254
	public PanneauMetadonneesVue getMetadonneesIptcExif() {
255
		return metadonneesIptcExif;
256
	}
257
 
258
	/**
259
	 * @return the dernierIndexOnglet
260
	 */
261
	public int getDernierIndexOnglet() {
262
		return dernierIndexOnglet;
263
	}
264
 
24 aperonnet 265
	/**
266
	 *
267
	 * @return la vue selectionnée par l'utilisateur
268
	 */
19 aperonnet 269
	public VueListable getVueSelectionnee()
5 aperonnet 270
	{
19 aperonnet 271
		Panel active = ongletsImage.getActiveTab() ;
272
		if(active != zoomImage)
273
		{
274
			if(active == galerieImage)
275
			{
276
				return galerieImage ;
277
			}
278
			else
279
			{
280
				return listeImage ;
281
			}
282
 
283
		}
284
		else
285
		{
286
			if(dernierIndexOnglet == 0)
287
			{
288
				return galerieImage ;
289
			}
290
			else
291
			{
292
				return listeImage ;
293
			}
294
 
295
		}
16 aperonnet 296
 
19 aperonnet 297
	}
298
 
24 aperonnet 299
	/**
300
	 * met à jour les données provenant du modèle et synchronise les vues entre elles
301
	 * @param o données de mises à jour pour les vues
302
	 * @param r le refraichissable qui a demandé la mise à jour
303
	 */
20 aperonnet 304
	public void synchroniserDonneesZoomListeGalerie(Object o, Rafraichissable r)
19 aperonnet 305
	{
16 aperonnet 306
 
20 aperonnet 307
		if(o instanceof Store) {
308
 
309
			Store li = (Store)o ;
310
 
311
			if(li.getCount() <= 0)
312
			{
313
				aucuneSelection() ;
314
			}
315
			else
316
			{
317
				selection() ;
318
			}
319
 
320
		}
321
 
5 aperonnet 322
		if(r != getGalerieImage())
323
		{
16 aperonnet 324
			getGalerieImage().rafraichir(o,false);
5 aperonnet 325
		}
326
		if(r != getZoomImage())
327
		{
16 aperonnet 328
			getZoomImage().rafraichir(o,false);
5 aperonnet 329
		}
330
		if(r != getListeImage())
331
		{
16 aperonnet 332
			getListeImage().rafraichir(o,false);
20 aperonnet 333
		}
334
 
335
		aucuneSelection() ;
5 aperonnet 336
	}
337
 
24 aperonnet 338
	/**
339
	 * envoie au modèle une demande de mise à jour
340
	 * @param r la vue demandeuse de mise à jour
341
	 */
6 aperonnet 342
	public void obtenirPhotoGalerie(Rafraichissable r)
5 aperonnet 343
	{
7 aperonnet 344
		getIModele().obtenirPhotoGalerie(r) ;
5 aperonnet 345
	}
346
 
24 aperonnet 347
	/**
348
	 * demande au modèle les métadonnées associées à une image
349
	 * @param r la vue demandeuse de mise à jour
350
	 * @param id l'identifiant de l'image
351
	 */
16 aperonnet 352
	public void obtenirMetadonnees(Rafraichissable r, String id)
353
	{
354
		getIModele().obtenirMetadonnees(r, id) ;
355
	}
356
 
24 aperonnet 357
	/**
358
	 * envoie au modèle une demande de mise à jour des informations modifiables
359
	 * associées à une image
360
	 * @param commentaires le commentaire de l'image
361
	 * @param date la date modifiée par l'utilisateur
362
	 */
18 aperonnet 363
	public void mettreAJourInfo(String commentaires, String date)
364
	{
19 aperonnet 365
		String ids[] = getVueSelectionnee().getIdSelectionnees() ;
18 aperonnet 366
 
367
			getIModele().mettreAJourCacheImage(commentaires, date, ids) ;
368
	}
369
 
24 aperonnet 370
	/**
371
	 * envoie au modèle une demande pour lancer le formulaire ou l'application d'upload
372
	 */
19 aperonnet 373
	public void uploaderImages()
12 aperonnet 374
	{
375
		getIModele().uploaderImages() ;
376
	}
377
 
24 aperonnet 378
	/**
379
	 * est appelé lors d'un clic de souris sur une vignette dans la galerie
380
	 * le médiateur gère alors les conséquences
381
	 * @param index l'index du noeud dans la galerie
382
	 * @param node le noeud selectionné
383
	 * @param e l'object source de l'évenement
384
	 */
12 aperonnet 385
	public void clicGalerieImage(int index, Element node,
5 aperonnet 386
			EventObject e)
387
	{
388
		Record rd = getGalerieImage().getDView().getRecord(node) ;
389
		String imgUrl = rd.getAsString("url_image");
390
 
16 aperonnet 391
		getZoomImage().rafraichir(imgUrl,false);
19 aperonnet 392
		dernierIndexOnglet = 0 ;
5 aperonnet 393
 
394
		if(DOM.eventGetType(e.getBrowserEvent()) == Event.ONDBLCLICK)
395
		{
19 aperonnet 396
 
5 aperonnet 397
			getOngletsImage().setActiveTab(1);
398
		}
16 aperonnet 399
 
400
		String imgNum = rd.getAsString("num_image");
401
		obtenirMetadonnees(metadonneesIptcExif,imgNum) ;
5 aperonnet 402
	}
403
 
24 aperonnet 404
	/**
405
	 * est appelé lors d'un clic de souris sur un enregistrement de la liste
406
	 * le médiateur gère alors les conséquences
407
	 * @param rowIndex le numéro de ligne selectionné
408
	 */
20 aperonnet 409
	public void clicListeImage(int rowIndex)
19 aperonnet 410
	{
411
		Record rd = getListeImage().getSelectionModel().getSelected() ;
412
		String imgUrl = rd.getAsString("url_image");
413
 
414
		getZoomImage().rafraichir(imgUrl,false);
415
 
416
		dernierIndexOnglet = 2 ;
417
 
418
		String imgNum = rd.getAsString("num_image");
419
		obtenirMetadonnees(metadonneesIptcExif,imgNum) ;
420
	}
421
 
24 aperonnet 422
	/**
423
	 * gestion du double clic dans la liste
424
	 * @param rowIndex
425
	 */
20 aperonnet 426
	public void doubleClicListeImage(int rowIndex)
19 aperonnet 427
	{
20 aperonnet 428
		clicListeImage(rowIndex) ;
19 aperonnet 429
		getOngletsImage().setActiveTab(1);
430
	}
431
 
24 aperonnet 432
	/**
433
	 * envoie une demande de mise à jour des données au modèle
434
	 */
18 aperonnet 435
	public void rafraichirToutesVues()
436
	{
24 aperonnet 437
		obtenirPhotoGalerie(getIModele());
18 aperonnet 438
	}
16 aperonnet 439
 
24 aperonnet 440
	/**
441
	 * montre le menu au coordonnées indiquées
442
	 * @param e l'objet source de l'évenement
443
	 */
12 aperonnet 444
	public void montrerContextMenu(EventObject e)
5 aperonnet 445
	{
12 aperonnet 446
		menuImageVue.showAt(e.getXY()) ;
447
	}
448
 
24 aperonnet 449
	/**
450
	 * appelé lors du double clic sur l'image agrandie
451
	 */
12 aperonnet 452
	public void doubleClicZoomImage()
453
	{
19 aperonnet 454
		getOngletsImage().setActiveTab(dernierIndexOnglet);
5 aperonnet 455
	}
456
 
24 aperonnet 457
	/**
458
	 * appelé lors du clic sur un des boutons de la zone zoom
459
	 * @param arg le nom du bouton qui a cliqué
460
	 */
12 aperonnet 461
	public void clicBoutonZoomImage(String arg)
5 aperonnet 462
	{
463
 
19 aperonnet 464
		Store st ;
465
		int selected ;
466
		int storeIndex ;
5 aperonnet 467
		Record nRec = null ;
468
 
19 aperonnet 469
		if(getVueSelectionnee() == galerieImage)
470
		{
471
			DataView dv = getGalerieImage().getDView();
472
			st = getGalerieImage().getSt();
473
 
20 aperonnet 474
			if(st.getCount() <= 0)
475
			{
476
				return ;
477
			}
478
 
19 aperonnet 479
			selected = st.indexOf(dv.getSelectedRecords()[0]);
480
			storeIndex = dv.indexOf(selected);
481
		}
482
		else
483
		{
484
			st = listeImage.getSt() ;
20 aperonnet 485
 
486
			if(st.getCount() <= 0)
487
			{
488
				return ;
489
			}
490
 
19 aperonnet 491
			selected = st.indexOf(listeImage.getSelectionModel().getSelected()) ;
492
			storeIndex = selected ;
493
		}
5 aperonnet 494
 
495
		if(arg.equals("prev"))
496
		{
497
			// si la photo séléctionnée est la première, on passe à la
498
			// dernière
499
			if (selected == 0) {
500
				storeIndex = st.getCount() - 1 ;
501
				nRec = st.getAt(storeIndex);
502
 
503
			}
504
			else
505
			{
506
				storeIndex = storeIndex - 1 ;
507
				nRec = st.getAt(storeIndex);
508
			}
509
 
510
 
511
		}
512
 
513
		if(arg.equals("suiv"))
514
		{
515
			// si la photo selectionnée est la dernière on passe à la
516
			// première
517
			if (selected == st.getCount() - 1) {
518
 
519
				storeIndex = 0 ;
520
				nRec = st.getAt(0);
521
			}
522
			else
523
			{
524
				storeIndex = storeIndex + 1 ;
525
				nRec = st.getAt(storeIndex);
526
			}
527
		}
528
 
529
		if(nRec != null)
530
		{
19 aperonnet 531
 
16 aperonnet 532
			getZoomImage().rafraichir(nRec.getAsString("url_image"),false);
19 aperonnet 533
			if(getGalerieImage().isRendered())
534
			{
535
				getGalerieImage().getDView().select(storeIndex);
536
			}
16 aperonnet 537
 
19 aperonnet 538
			if(getListeImage().isRendered())
539
			{
540
				getListeImage().getSelectionModel().selectRecords(nRec) ;
541
			}
542
 
16 aperonnet 543
			String imgNum = nRec.getAsString("num_image");
544
			obtenirMetadonnees(metadonneesIptcExif,imgNum) ;
5 aperonnet 545
		}
546
	}
547
 
20 aperonnet 548
 
24 aperonnet 549
	/**
550
	 * synchronise la selection entre la galerie et la liste
551
	 * @param string le nom de la vue qui doit être synchronisée
552
	 */
20 aperonnet 553
	public void synchroniserSelection(String string) {
554
 
555
		if(string.equals("galerie") && getDernierIndexOnglet() != 2)
556
		{
557
				Record[] sel = getGalerieImage().getDView().getSelectedRecords() ;
558
				getListeImage().selectionnerEnregistrements(sel) ;
559
		}
560
 
561
		if(string.equals("liste") && getDernierIndexOnglet() != 0)
562
		{
563
 
564
				Record[] sel = getListeImage().getSelectionModel().getSelections() ;
565
				int[] ids = new int[sel.length] ;
566
 
567
				for (int i = 0; i < sel.length; i++) {
568
 
569
					ids[i] = getGalerieImage().getSt().indexOf(sel[i]) ;
570
				}
571
 
572
				getGalerieImage().selectionnerImages(ids) ;
573
		}
574
 
575
	}
576
 
24 aperonnet 577
	/**
578
	 * fait une demande de suppression des images (en local et en distant)
579
	 * des images selectionnées
580
	 */
20 aperonnet 581
	public void supprimerImages() {
582
 
583
		String[] ids = null ;
584
 
585
 
586
			if(dernierIndexOnglet == 0)
587
			{
588
				ids = getGalerieImage().getIdSelectionnees() ;
589
			}
590
			else
591
			{
592
				ids = getListeImage().getIdSelectionnees() ;
593
			}
594
 
595
		if(ids.length > 0)
596
		{
597
 
598
			if(com.google.gwt.user.client.Window
599
					.confirm("Supprimer les images sélectionnées ?"))
600
			{
601
				getIModele().supprimerImages(ids) ;
602
				aucuneSelection() ;
603
			}
604
		}
605
		else
606
		{
607
			Window.alert("Impossible de supprimer : aucune image selectionnée") ;
608
		}
609
 
610
	}
611
 
24 aperonnet 612
	/**
613
	 * désactive les onglets de métadonnées et de zoom (dans le cas ou rien n'est selectionné)
614
	 */
20 aperonnet 615
	public void aucuneSelection() {
616
 
617
		if(getListeImage().getSelectionModel().getCount() <= 0 && getGalerieImage().getDView().getSelectionCount() <= 0)
618
		{
619
			getMetadonneesIptcExif().desactiverPanneau() ;
620
			getZoomImage().desactiverPanneau() ;
621
			setSelection(false) ;
622
		}
623
 
624
	}
12 aperonnet 625
 
24 aperonnet 626
	/**
627
	 * réacative les onglet métadonnées et zoom (lors d'une sélection alors qu'il n'y en avait pas)
628
	 */
20 aperonnet 629
	public void selection() {
630
 
631
		if(!isSelection())
632
		{
633
			getMetadonneesIptcExif().activerPanneau() ;
634
			getZoomImage().activerPanneau() ;
635
			setSelection(true);
636
		}
637
	}
638
 
639
 
4 aperonnet 640
 
641
}