Subversion Repositories eFlore/Applications.cel

Rev

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