Subversion Repositories eFlore/Applications.cel

Rev

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