Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
195 david 1
package org.tela_botanica.client.vues.image;
2 aperonnet 2
 
268 aurelien 3
 
2 aperonnet 4
import org.tela_botanica.client.image.ImageMediateur;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
 
408 aurelien 7
import com.google.gwt.event.dom.client.ClickEvent;
8
import com.google.gwt.event.dom.client.ClickHandler;
9
import com.google.gwt.event.dom.client.LoadEvent;
10
import com.google.gwt.event.dom.client.LoadHandler;
11
import com.google.gwt.event.dom.client.MouseWheelEvent;
12
import com.google.gwt.event.dom.client.MouseWheelHandler;
207 aurelien 13
import com.google.gwt.user.client.Timer;
2 aperonnet 14
import com.google.gwt.user.client.ui.Image;
5 aperonnet 15
import com.gwtext.client.core.EventObject;
207 aurelien 16
import com.gwtext.client.core.Ext;
17
import com.gwtext.client.core.ExtElement;
18
 
2 aperonnet 19
import com.gwtext.client.core.RegionPosition;
5 aperonnet 20
import com.gwtext.client.dd.DragData;
21
import com.gwtext.client.dd.DragSource;
22
import com.gwtext.client.dd.DropTarget;
23
import com.gwtext.client.dd.DropTargetConfig;
2 aperonnet 24
import com.gwtext.client.widgets.Container;
25
import com.gwtext.client.widgets.Panel;
99 jpm 26
import com.gwtext.client.widgets.ToolTip;
268 aurelien 27
import com.gwtext.client.widgets.Toolbar;
28
import com.gwtext.client.widgets.ToolbarButton;
29
import com.gwtext.client.widgets.ToolbarTextItem;
2 aperonnet 30
import com.gwtext.client.widgets.event.PanelListenerAdapter;
5 aperonnet 31
import com.gwtext.client.widgets.grid.GridDragData;
2 aperonnet 32
import com.gwtext.client.widgets.layout.BorderLayout;
33
import com.gwtext.client.widgets.layout.BorderLayoutData;
34
 
35
/**
36
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
5 aperonnet 37
 *
2 aperonnet 38
 * @author aurelien
5 aperonnet 39
 *
2 aperonnet 40
 */
41
public class ZoomImageVue extends Panel implements Rafraichissable {
5 aperonnet 42
 
2 aperonnet 43
	/**
44
	 * Le médiateur associé à la vue
45
	 */
5 aperonnet 46
	private ImageMediateur iMediateur = null;
47
 
2 aperonnet 48
	/**
49
	 * Panneau conteneur pour l'image
50
	 */
5 aperonnet 51
	private Panel imageConteneur = null;
2 aperonnet 52
	/**
53
	 * l'image à afficher
54
	 */
5 aperonnet 55
	private Image image = new Image("vide.jpg");
2 aperonnet 56
	/**
57
	 * Bouton précédent
58
	 */
59
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button();
60
	/**
61
	 * Bouton suivant
62
	 */
63
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button();
5 aperonnet 64
 
2 aperonnet 65
	/**
66
	 * Taille originale Y de l'image
67
	 */
5 aperonnet 68
	private int imageHeight = 0;
69
 
2 aperonnet 70
	/**
71
	 * Taille originale X de l'image
72
	 */
5 aperonnet 73
	private int imageWidth = 0;
2 aperonnet 74
 
75
	/**
5 aperonnet 76
	 * Identifiant de l'image
77
	 */
78
	private String idImage = "0" ;
79
 
80
	/**
2 aperonnet 81
	 * Booleen d'initalisation général
82
	 */
5 aperonnet 83
	private boolean initialise = false;
408 aurelien 84
 
85
	private Panel infosTaxon = new Panel();
5 aperonnet 86
 
2 aperonnet 87
	/**
88
	 * Booleen d'initalisation du conteneur d'image
89
	 */
5 aperonnet 90
	private boolean conteneurInitialise = false;
99 jpm 91
 
92
	private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour revenir à la vue précédente, utilisez la roulette ou les boutons fléchés pour faire défiler les images </div>") ;
207 aurelien 93
 
94
	/**.
95
	 * boolean de gestion du double clic
96
	 */
97
	private boolean enClic = false;
98
 
268 aurelien 99
	private ToolbarButton modeZoom = null;
100
 
101
	private ToolbarTextItem valeurZoom = new ToolbarTextItem("x 1");
102
 
103
	protected boolean scroll = false;
104
 
207 aurelien 105
	/**
2 aperonnet 106
	 * Constructeur sans argument (privé car ne doit être utilisé)
107
	 */
108
	@SuppressWarnings("unused")
5 aperonnet 109
	private ZoomImageVue() {
110
		super();
2 aperonnet 111
	}
5 aperonnet 112
 
2 aperonnet 113
	/**
114
	 * Constructeur avec argument
5 aperonnet 115
	 *
116
	 * @param im
117
	 *            le médiateur à associer à la vue
2 aperonnet 118
	 */
5 aperonnet 119
	public ZoomImageVue(ImageMediateur im) {
2 aperonnet 120
		super("Zoom");
5 aperonnet 121
		setId("x-view-zoom-panel");
2 aperonnet 122
		// on associe le médiateur
5 aperonnet 123
		iMediateur = im;
2 aperonnet 124
 
5 aperonnet 125
		prev.setStylePrimaryName("x-view-zoom-button-p");
126
		suiv.setStylePrimaryName("x-view-zoom-button-s");
127
 
2 aperonnet 128
		// on crée une image qui gère le double clic et la roulette de la souris
207 aurelien 129
		image = new Image();
130
 
5 aperonnet 131
		this.setHeader(false);
132
 
207 aurelien 133
		imageConteneur = new Panel();
134
 
2 aperonnet 135
		imageConteneur.setBorder(false);
5 aperonnet 136
 
137
		imageConteneur.add(image);
138
		imageConteneur.setId("x-view-zoom-img");
139
 
2 aperonnet 140
		// l'image de base est vide
141
		image.setUrl("vide.jpg");
5 aperonnet 142
 
2 aperonnet 143
		this.setLayout(new BorderLayout());
5 aperonnet 144
 
2 aperonnet 145
		prev.setWidth("60px");
146
		suiv.setWidth("60px");
5 aperonnet 147
 
268 aurelien 148
 
149
		modeZoom = new ToolbarButton("Mode Zoom");
150
		Toolbar tb = new Toolbar();
151
		tb.addButton(modeZoom);
152
		tb.addItem(valeurZoom);
153
 
154
		//setTopToolbar(tb);
155
 
408 aurelien 156
		infosTaxon = new Panel();
157
		infosTaxon.setHeader(false);
158
		//infosTaxon.setBorder(false);
159
		infosTaxon.setHeight("30px");
160
 
5 aperonnet 161
		this.add(prev, new BorderLayoutData(RegionPosition.WEST));
162
		this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
163
		this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
408 aurelien 164
		this.add(infosTaxon, new BorderLayoutData(RegionPosition.SOUTH));
5 aperonnet 165
 
166
		imageConteneur.setMaskDisabled(true);
2 aperonnet 167
		this.setBorder(false);
5 aperonnet 168
 
169
		conteneurInitialise = true;
170
		initialise = true;
2 aperonnet 171
 
5 aperonnet 172
		configDragAndDrop() ;
173
 
2 aperonnet 174
		// on ajoute les listeners
175
		ajouterListeners();
99 jpm 176
 
268 aurelien 177
		tp.setDismissDelay(1050);
99 jpm 178
		tp.applyTo(image.getElement()) ;
2 aperonnet 179
 
180
	}
181
 
182
	/**
183
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 184
	 *
185
	 * @param nouvelleDonnees
186
	 *            les nouvelles données
187
	 * @param repandreRafraichissement
188
	 *            le booleen qui dit si on doit répnadre l'évènement
2 aperonnet 189
	 */
5 aperonnet 190
	public void rafraichir(Object nouvelleDonnees,
191
			boolean repandreRafraichissement) {
192
 
268 aurelien 193
		//niveauZoom = 1;
2 aperonnet 194
		// si on reçoit une string
5 aperonnet 195
		if (nouvelleDonnees instanceof String[] && initialise
196
				&& conteneurInitialise) {
722 aurelien 197
 
5 aperonnet 198
			String[] infos = (String[]) nouvelleDonnees;
408 aurelien 199
 
2 aperonnet 200
			// c'est l'url de l'image qu'on associe à la vue
5 aperonnet 201
			if (infos[0] != null && infos[1] != null && infos[2] != null && infos[3] != null) {
202
				getImage().setUrl(infos[0]);
203
				int x = Integer.parseInt(infos[1]);
204
				int y = Integer.parseInt(infos[2]);
205
 
206
				setTailleImage(x, y);
2 aperonnet 207
 
5 aperonnet 208
				setIdImage(infos[3]) ;
408 aurelien 209
 
210
				String infosTaxon = "" ;
211
 
212
				if(infos.length == 5 && infos[4] != null)  {
213
					infosTaxon = infos[4];
214
				}
215
 
216
				setInfosTaxon(infosTaxon);
217
				verifierEtRetaillerImage();
2 aperonnet 218
			}
219
		}
220
	}
5 aperonnet 221
 
2 aperonnet 222
	/**
223
	 * Desactive visuellement le panneau et les boutons
224
	 */
5 aperonnet 225
	public void desactiverPanneau() {
638 aurelien 226
		getImage().setUrl("vide.jpg");
5 aperonnet 227
		prev.setEnabled(false);
2 aperonnet 228
		suiv.setEnabled(false);
229
	}
5 aperonnet 230
 
2 aperonnet 231
	/**
232
	 * Active visuellement le panneau et les boutons
233
	 */
5 aperonnet 234
	public void activerPanneau() {
2 aperonnet 235
		prev.setEnabled(true);
236
		suiv.setEnabled(true);
237
	}
225 aurelien 238
 
239
	public void masquerChargement() {
240
		ExtElement imgEl = Ext.get(imageConteneur.getElement());
324 aurelien 241
		if(imgEl != null) {
225 aurelien 242
			imgEl.mask("Chargement");
243
		}
244
	}
245
 
246
	public void demasquerChargement() {
247
		ExtElement imgEl = Ext.get(imageConteneur.getElement());
324 aurelien 248
		if(imgEl != null) {
225 aurelien 249
			imgEl.unmask();
250
		}
251
	}
5 aperonnet 252
 
2 aperonnet 253
	/**
254
	 * Ajoute les listeners pour la gestions d'évènement
255
	 */
5 aperonnet 256
	public void ajouterListeners() {
207 aurelien 257
 
408 aurelien 258
		image.addClickHandler(new ClickHandler() {
207 aurelien 259
 
408 aurelien 260
			public void onClick(ClickEvent event) {
722 aurelien 261
 
268 aurelien 262
				if(!scroll) {
207 aurelien 263
					if(enClic) {
264
						getIMediateur().doubleClicZoomImage();
265
					} else {
266
						Timer t = new Timer() {
267
							public void run() {
268
								enClic = false;
269
							}
270
 
271
						};
272
						enClic = true;
273
						t.schedule(800);
274
					}
268 aurelien 275
				}
207 aurelien 276
			}
277
		});
278
 
408 aurelien 279
		image.addLoadHandler(new LoadHandler() {
280
 
281
			public void onLoad(LoadEvent event) {
207 aurelien 282
 
408 aurelien 283
				verifierEtRetaillerImage();
284
				Ext.get(image.getElement()).center(imageConteneur.getElement());
285
				demasquerChargement();
207 aurelien 286
			}
287
		});
288
 
408 aurelien 289
		image.addMouseWheelHandler(new MouseWheelHandler() {
290
 
291
			public void onMouseWheel(MouseWheelEvent event) {
268 aurelien 292
 
408 aurelien 293
				if(event.isNorth()) {
294
					masquerChargement();
295
					getIMediateur().clicBoutonZoomImage("suiv");
296
				} else {
297
					masquerChargement();
298
					getIMediateur().clicBoutonZoomImage("prev");
299
				}
268 aurelien 300
			}
301
		});
302
 
2 aperonnet 303
		// gestion du clic sur le bouton précedent
408 aurelien 304
		prev.addClickHandler(new ClickHandler() {
2 aperonnet 305
 
306
			// en cas de clic
408 aurelien 307
			public void onClick(ClickEvent event) {
2 aperonnet 308
				// on notifie le médiateur
225 aurelien 309
				masquerChargement();
2 aperonnet 310
				getIMediateur().clicBoutonZoomImage("prev");
311
			}
312
		});
5 aperonnet 313
 
2 aperonnet 314
		// gestion du clic sur le bouton suivant
408 aurelien 315
		suiv.addClickHandler(new ClickHandler() {
2 aperonnet 316
 
317
			// en cas de clic
408 aurelien 318
			public void onClick(ClickEvent event) {
5 aperonnet 319
				// on notifie le médiateur
225 aurelien 320
				masquerChargement();
2 aperonnet 321
				getIMediateur().clicBoutonZoomImage("suiv");
322
			}
5 aperonnet 323
 
2 aperonnet 324
		});
5 aperonnet 325
 
2 aperonnet 326
		// gestion du redimensionnement
327
		this.addListener(new PanelListenerAdapter() {
5 aperonnet 328
 
2 aperonnet 329
			// lors d'un redimensionnement de l'application
5 aperonnet 330
 
331
			public void onBodyResize(Panel panel, java.lang.String width,
332
					java.lang.String height) {
2 aperonnet 333
				// on vérifie et on retaille l'image
5 aperonnet 334
				verifierEtRetaillerImage();
2 aperonnet 335
			}
5 aperonnet 336
		});
337
 
2 aperonnet 338
		// gestion du redimensionnement lors de l'affichage du conteneur
339
		imageConteneur.addListener(new PanelListenerAdapter() {
5 aperonnet 340
 
2 aperonnet 341
			// avant de finir d'afficher
5 aperonnet 342
 
343
			public void onAfterLayout(Container self) {
2 aperonnet 344
				// on redimensionne
5 aperonnet 345
				verifierEtRetaillerImage();
2 aperonnet 346
			}
5 aperonnet 347
		});
2 aperonnet 348
	}
349
 
350
	/**
5 aperonnet 351
	 * Verifie si l'image est plus grande que le conteneur et la retaille le cas
352
	 * echeant
2 aperonnet 353
	 */
5 aperonnet 354
	public void verifierEtRetaillerImage() {
408 aurelien 355
 
2 aperonnet 356
		// si l'image est nulle
5 aperonnet 357
		if (image == null) {
2 aperonnet 358
			// on ne fait rien
5 aperonnet 359
			return;
360
		}
408 aurelien 361
 
2 aperonnet 362
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
268 aurelien 363
		int max = Math.min(imageConteneur.getHeight(), imageConteneur.getWidth());
364
 
365
		int[] tailleImage = new int[2];
366
 
408 aurelien 367
		if(Ext.isIE()) {
368
			image.setHeight(calculerDimensions(getTailleImage(),max,max)[1]+"px");
369
			image.setWidth(calculerDimensions(getTailleImage(),max,max)[0]+"px");
268 aurelien 370
		} else {
408 aurelien 371
 
372
			if(max == imageConteneur.getHeight()) {
373
				tailleImage[0] = getTailleImage()[0];
374
				tailleImage[1] = max;
375
				image.setHeight(max+"px");
376
 
377
			} else {
378
				tailleImage[1] = getTailleImage()[0];
379
				tailleImage[0] = max;
380
				image.setWidth(max+"px");
381
			}
268 aurelien 382
		}
2 aperonnet 383
	}
5 aperonnet 384
 
207 aurelien 385
	public int[] calculerDimensions(int[] tailleXY, double tailleMax, double tailleConteneur) {
386
 
387
		float[] tailleXYf = {new Float(tailleXY[0]),new Float(tailleXY[1])} ;
388
        float tailleOr = Math.min(new Float(tailleMax),new Float(tailleConteneur)) ;
389
        float maxTaille = Math.max(tailleXYf[1],tailleXYf[0]) ;
390
        float[] XYresize = new float[2];
391
 
392
        if(maxTaille == tailleXY[0]) {
393
            float rapport = tailleXYf[1]/tailleXYf[0] ;
394
            XYresize[0] = tailleOr ;
395
            XYresize[1] = tailleOr*rapport ;
396
        }else {
397
            float rapport = tailleXYf[0]/tailleXYf[1] ;
398
            XYresize[1] = tailleOr ;
399
            XYresize[0] = tailleOr*rapport ;
400
        }
401
 
408 aurelien 402
        int[] res = {(int)Math.round(XYresize[0]),(int) Math.round(XYresize[1])} ;
207 aurelien 403
 
404
        return res;
405
    }
406
 
5 aperonnet 407
	public void configDragAndDrop()
408
	{
2 aperonnet 409
 
5 aperonnet 410
		// on fabrique la nouvelle configuration
411
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
412
		DropTargetConfig dtc = new DropTargetConfig();
413
		dtc.setdDdGroup("DragGroupName");
414
 
415
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
416
		@SuppressWarnings("unused")
417
		DropTarget tg = new DropTarget(this, dtc)
418
		{
419
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
420
 
421
				// si on reçoit des données provenant d'une grille
422
				if(data instanceof GridDragData)
423
		    	  {
424
		    		  		// on appelle le médiateur
425
		    		  		return iMediateur.lierObsDD(source, e, data,getId()) ;
426
		    	  }
427
				return false ;
428
			}
429
 
430
			public String notifyOver(DragSource source, EventObject e, DragData data){
431
			    return "x-dd-drop-ok";
432
			}
433
		};
434
 
435
	}
436
 
2 aperonnet 437
	/**
438
	 * Accesseur pour le médiateur
5 aperonnet 439
	 *
2 aperonnet 440
	 * @return le médiateur associé à la vue
441
	 */
442
	public ImageMediateur getIMediateur() {
443
		return iMediateur;
444
	}
445
 
446
	/**
447
	 * Accesseur au conteneur de l'image
5 aperonnet 448
	 *
2 aperonnet 449
	 * @return le conteneur de l'image
450
	 */
451
	public Image getImage() {
452
		return image;
453
	}
5 aperonnet 454
 
455
	/**
456
	 * Acesseurs pour l'identifiant de l'image
457
	 * @return l'id de l'image
458
	 */
459
	public String getIdImage()
460
	{
461
		return idImage ;
462
	}
2 aperonnet 463
 
464
	/**
465
	 * Accesseur pour le bouton précédent
5 aperonnet 466
	 *
2 aperonnet 467
	 * @return le bouton précédent
468
	 */
469
	public com.google.gwt.user.client.ui.Button getPrev() {
470
		return prev;
471
	}
472
 
473
	/**
474
	 * Accesseur pour le bouton suivant
5 aperonnet 475
	 *
2 aperonnet 476
	 * @return le bouton suivant
477
	 */
478
	public com.google.gwt.user.client.ui.Button getSuiv() {
479
		return suiv;
480
	}
5 aperonnet 481
 
2 aperonnet 482
	/**
483
	 * Setter pour la taille de l'image
5 aperonnet 484
	 *
7 aperonnet 485
	 * @param x
5 aperonnet 486
	 *            la largeur en pixels
7 aperonnet 487
	 * @param y
5 aperonnet 488
	 *            la hauteur en pixels
2 aperonnet 489
	 */
5 aperonnet 490
	public void setTailleImage(int x, int y) {
491
		imageHeight = y;
492
		imageWidth = x;
2 aperonnet 493
	}
494
 
495
	/**
5 aperonnet 496
	 * Setteur pour l'identifiant de l'image
497
	 * @param id le nouvel identifiant
498
	 */
499
	public void setIdImage(String id)
500
	{
501
		idImage = id ;
502
	}
408 aurelien 503
 
504
	public void setInfosTaxon(String nomTaxon) {
505
 
506
		if(nomTaxon != null && !nomTaxon.equals("")) {
507
			nomTaxon = getNomsObservationsFormatees(nomTaxon);
508
		}
509
 
510
		infosTaxon.setHtml("<div id='infos_taxon'><span class='texte_info_taxon'>"+nomTaxon+"</span></div>");
511
		infosTaxon.doLayout();
512
	}
5 aperonnet 513
 
514
	/**
2 aperonnet 515
	 * renvoie la taille originale de l'image
5 aperonnet 516
	 *
2 aperonnet 517
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
518
	 */
5 aperonnet 519
	public int[] getTailleImage() {
520
		int[] taille = { imageHeight, imageWidth };
521
 
522
		return taille;
2 aperonnet 523
	}
5 aperonnet 524
 
408 aurelien 525
	public boolean estPortrait() {
526
		return imageHeight > imageWidth;
527
	}
528
 
529
	public boolean estPaysage() {
530
		return !estPortrait();
531
	}
532
 
5 aperonnet 533
	/**
534
	 * Accesseur pour le conteneur de l'image
535
	 * @return le conteur de l'image
536
	 */
537
	public Panel getImageConteneur() {
2 aperonnet 538
 
5 aperonnet 539
		return imageConteneur;
540
 
2 aperonnet 541
	}
268 aurelien 542
 
408 aurelien 543
	private String getNomsObservationsFormatees(String nomObs) {
544
 
545
		String htmlInfobulle = "";
546
 
547
		String[][] obs = getObservationsAssociees(nomObs);
548
 
549
		for(int i = 0; i < obs.length; i++) {
550
 
551
			if(obs[i].length == 3 && obs[i][1] != null && !obs[i][1].equals("")) {
552
				htmlInfobulle += ", "+obs[i][1];
268 aurelien 553
			}
554
		}
408 aurelien 555
 
556
		htmlInfobulle = htmlInfobulle.replaceFirst(", ", "");
557
 
558
		return htmlInfobulle;
268 aurelien 559
	}
408 aurelien 560
 
561
	private String[][] getObservationsAssociees(String nomObs) {
562
 
563
		if(nomObs.trim().equals("")) {
564
			return new String[0][0];
268 aurelien 565
		}
408 aurelien 566
 
567
		String[] obsTab = nomObs.split(";;");
568
		String[][] obsAnalysees = new String[obsTab.length][3];
569
 
570
		for(int i = 0; i < obsTab.length; i++) {
571
 
572
			obsAnalysees[i] = obsTab[i].split("#");
573
 
574
		}
575
 
576
		return obsAnalysees;
268 aurelien 577
	}
578
 
408 aurelien 579
	private boolean[] estAssocieeTransmise(String nomObs) {
268 aurelien 580
 
408 aurelien 581
		String[][] obs = getObservationsAssociees(nomObs);
582
		boolean[] associeesTranmises = {false, false};
268 aurelien 583
 
408 aurelien 584
		if(obs.length > 0) {
585
			associeesTranmises[0] = true;
268 aurelien 586
		}
587
 
408 aurelien 588
		for(int i = 0; i < obs.length; i++) {
268 aurelien 589
 
408 aurelien 590
			if(obs[i].length == 3 && obs[i][2] != null && obs[i][2].equals("1")) {
591
				associeesTranmises[1] = true;
268 aurelien 592
			}
593
		}
408 aurelien 594
 
595
		return associeesTranmises;
268 aurelien 596
	}
2 aperonnet 597
}