Subversion Repositories eFlore/Applications.cel

Rev

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

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