Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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