Subversion Repositories eFlore/Applications.cel

Rev

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