Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

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