Subversion Repositories eFlore/Applications.cel

Rev

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