Subversion Repositories eFlore/Applications.cel

Rev

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

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