Subversion Repositories eFlore/Applications.cel

Rev

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