Subversion Repositories eFlore/Applications.cel

Rev

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

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