Subversion Repositories eFlore/Applications.cel

Rev

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