Subversion Repositories eFlore/Applications.cel

Rev

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

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