Subversion Repositories eFlore/Applications.cel

Rev

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