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