Subversion Repositories eFlore/Applications.cel

Rev

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