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