Subversion Repositories eFlore/Applications.cel

Rev

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