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