Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
199 david 1
package org.tela_botanica.client.vues.observation.indicateurs;
54 david 2
 
3
import org.tela_botanica.client.interfaces.Rafraichissable;
4
import org.tela_botanica.client.observation.ObservationMediateur;
5
 
97 jpm 6
import com.google.gwt.user.client.DOM;
7
import com.google.gwt.user.client.Event;
8
import com.google.gwt.user.client.Window;
54 david 9
import com.google.gwt.user.client.ui.Image;
10
import com.gwtext.client.widgets.Panel;
99 jpm 11
import com.gwtext.client.widgets.ToolTip;
54 david 12
 
13
/**
14
 * Un panneau affichant la repartition d'une plante
15
 *
16
 * @author David Delon
17
 *
18
 */
19
public class InformationRepartitionVue extends Panel implements Rafraichissable {
20
 
21
	/**
22
	 * Le médiateur associé
23
	 */
24
 
25
	private ObservationMediateur observationMediateur = null;
26
 
27
 
28
	/**
29
	 * l'image à afficher
30
	 */
31
	private Image image = new Image();
32
 
97 jpm 33
	private String urlImage = "" ;
54 david 34
 
99 jpm 35
	private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour agrandir l'image </div>") ;
36
 
97 jpm 37
	com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window("Agrandissement") ;
99 jpm 38
 
97 jpm 39
 
54 david 40
	/**
41
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
42
	 */
43
 
44
	@SuppressWarnings("unused")
45
	private InformationRepartitionVue() {
46
		super();
47
	}
48
 
49
	/**
50
	 * Constructeur avec argument
51
	 * @param obs le médiateur à associer
52
	 */
53
 
54
 
55
	public InformationRepartitionVue(ObservationMediateur obs) {
56
 
57
 
58
		this.observationMediateur = obs;
59
 
97 jpm 60
		imgZoom.setCloseAction(com.gwtext.client.widgets.Window.HIDE) ;
61
		image = new Image() {
62
 
63
			public void onBrowserEvent(Event event) {
64
 
65
				// lors du double clic
66
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
67
 
68
					// on notifie le médiateur
69
					agrandirImage() ;
70
				}
99 jpm 71
 
97 jpm 72
			}
73
 
74
		};
75
 
99 jpm 76
		tp.applyTo(image.getElement()) ;
77
 
97 jpm 78
		image.sinkEvents(Event.ONDBLCLICK);
79
 
80
		this.setCls("x-image-info-rep") ;
140 aurelien 81
		add(image);
54 david 82
		image.setPixelSize(150, 150);
83
 
84
		// on ajoute les listeners
85
		ajouterListeners();
86
 
87
	}
88
 
89
 
90
	/**
91
	 * Affichage carte de repartition
92
	 *
93
	 */
94
 
95
	public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {
96
 
97
		// si on recoit une String contenant une URL
98
		if (nouvelleDonnees instanceof String) {
99
 
97 jpm 100
			urlImage=(String) nouvelleDonnees;
54 david 101
 
140 aurelien 102
			if (urlImage == null || urlImage.equals("null") || urlImage.length()==0) {
103
				image.setUrl("ill_choro.png") ;
104
				image.setPixelSize(150, 150);
54 david 105
			}
106
			else {
107
				image.setUrl(urlImage);
130 aurelien 108
				verifierEtRetaillerImage();
54 david 109
			}
110
		}
111
 
112
	}
97 jpm 113
 
114
	public void agrandirImage() {
115
 
116
		if(!imgZoom.isVisible())
117
		{
118
			String urlAgrandie = urlImage.replace("min", "max") ;
119
 
279 aurelien 120
			imgZoom.setHtml("<img height="+Window.getClientHeight()*0.75+"px src=\""+urlAgrandie+"\" />") ;
97 jpm 121
			imgZoom.setPagePosition( Window.getClientWidth()/2, Window.getClientHeight()/5) ;
122
			imgZoom.setAutoHeight(true) ;
123
			imgZoom.setAutoWidth(true) ;
124
			imgZoom.show(this.getElement()) ;
279 aurelien 125
		} else {
126
			imgZoom.hide();
97 jpm 127
		}
128
 
129
	}
130 aurelien 130
 
131
	public void verifierEtRetaillerImage() {
132
		// si l'image est nulle
133
		if (image == null) {
134
			// on ne fait rien
135
			return;
136
		}
54 david 137
 
130 aurelien 138
		// on prend la taille originale de l'image
139
		int originalX = image.getWidth();
140
		int originalY = image.getHeight();
141
 
142
		// on la transforme en float (la division entre entier donne de curieux
143
		// résultats)
144
		float fOriginalX = (new Float(originalX)).floatValue();
145
		float fOriginalY = (new Float(originalY)).floatValue();
146
 
147
		// et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
148
		float rapportTaille = fOriginalX / fOriginalY;
149
 
150
		// la nouvelle taille est pour le moment égale à l'ancienne
151
		int nouvelleTailleX = originalX;
152
		int nouvelleTailleY = originalY;
153
 
154
		// on prend la taille du conteneur
155
		int tailleConteneurX = getWidth();
156
		int tailleConteneurY = getHeight();
157
 
158
		int maxConteneur = Math.min(tailleConteneurX, tailleConteneurY);
159
		int max = Math.min(maxConteneur, 300);
160
 
161
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop
162
		// grande)
163
		// si la longueur de l'image est la plus grande des deux
164
 
165
			int maxImage = Math.max(originalX, originalY);
166
 
167
			if(maxImage == originalX) {
168
				// on prend la longueur comme taille de référence, qu'on met à
169
				// la longueur du conteneur
170
				nouvelleTailleX = max;
171
				// et on recalcule la hauteur, par rapport à la nouvelle
172
				// longueur, en gardant le format de 'limage
173
				nouvelleTailleY = (int) Math.floor(nouvelleTailleX * 1
174
						/ rapportTaille);
175
			}
176
			else
177
			{
178
				// si la hauteur est la plus grande, on fait le même genre
179
				// d'opération en prenant la hauteur comme référence
180
				nouvelleTailleY = max;
181
				nouvelleTailleX = (int) Math.floor(nouvelleTailleY
182
						* rapportTaille);
183
			}
184
 
185
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
186
		image.setPixelSize(nouvelleTailleX ,
187
				nouvelleTailleY);
188
 
189
		doLayout();
190
	}
191
 
192
 
54 david 193
 
194
	/**
195
	 * Ajoute les listeners pour la gestions d'évènement
196
	 */
197
	public void ajouterListeners() {
198
 
199
	}
200
 
84 jpm 201
	public void raz() {
202
		image.setUrl("");
203
	}
54 david 204
 
205
}