Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
94 jpm 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
104 jpm 5
import org.tela_botanica.client.modeles.Configuration;
94 jpm 6
import org.tela_botanica.client.observation.ObservationMediateur;
7
 
8
import com.google.gwt.user.client.DOM;
9
import com.google.gwt.user.client.Event;
10
import com.google.gwt.user.client.Window;
11
import com.google.gwt.user.client.ui.ClickListener;
12
import com.google.gwt.user.client.ui.Image;
104 jpm 13
import com.google.gwt.user.client.ui.MenuItem;
94 jpm 14
import com.google.gwt.user.client.ui.Widget;
15
import com.gwtext.client.core.EventObject;
16
import com.gwtext.client.core.RegionPosition;
17
import com.gwtext.client.dd.DragData;
18
import com.gwtext.client.dd.DragSource;
19
import com.gwtext.client.dd.DropTarget;
20
import com.gwtext.client.dd.DropTargetConfig;
21
import com.gwtext.client.widgets.Container;
22
import com.gwtext.client.widgets.Panel;
23
import com.gwtext.client.widgets.event.PanelListenerAdapter;
24
import com.gwtext.client.widgets.grid.GridDragData;
25
import com.gwtext.client.widgets.layout.BorderLayout;
26
import com.gwtext.client.widgets.layout.BorderLayoutData;
104 jpm 27
import com.gwtext.client.widgets.menu.BaseItem;
28
import com.gwtext.client.widgets.menu.Item;
29
import com.gwtext.client.widgets.menu.Menu;
30
import com.gwtext.client.widgets.menu.event.MenuListener;
31
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
94 jpm 32
 
33
/**
34
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
35
 *
36
 * @author aurelien
37
 *
38
 */
39
public class MiniZoomImageVue extends Panel implements Rafraichissable {
40
 
41
	/**
42
	 * Le médiateur associé à la vue
43
	 */
44
	private ObservationMediateur oMediateur = null;
45
 
46
	/**
47
	 * Panneau conteneur pour l'image
48
	 */
49
	private Panel imageConteneur = null;
50
	/**
51
	 * l'image à afficher
52
	 */
97 jpm 53
	private Image image = new Image("");
94 jpm 54
	/**
55
	 * Bouton précédent
56
	 */
57
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button();
58
	/**
59
	 * Bouton suivant
60
	 */
61
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button();
62
 
63
	/**
64
	 * Taille originale Y de l'image
65
	 */
66
	private int imageHeight = 0;
67
 
68
	/**
69
	 * Taille originale X de l'image
70
	 */
71
	private int imageWidth = 0;
72
 
73
	/**
74
	 * Identifiant de l'image
75
	 */
76
	private String idImage = "0" ;
77
 
78
	private String[] infosImages = null ;
79
 
80
	private int index = 0 ;
81
 
82
	/**
83
	 * Booleen d'initalisation général
84
	 */
85
	private boolean initialise = false;
86
 
87
	/**
88
	 * Booleen d'initalisation du conteneur d'image
89
	 */
90
	private boolean conteneurInitialise = false;
91
 
92
	/**
93
	 * Constructeur sans argument (privé car ne doit être utilisé)
94
	 */
95
	@SuppressWarnings("unused")
96
	private MiniZoomImageVue() {
97
		super();
98
	}
99
 
100
	/**
101
	 * Constructeur avec argument
102
	 *
103
	 * @param im
104
	 *            le médiateur à associer à la vue
105
	 */
106
	public MiniZoomImageVue(ObservationMediateur im) {
107
		super("Image liées");
108
		setId("x-view-mini-zoom-panel");
109
		// on associe le médiateur
110
		oMediateur = im;
111
 
112
		prev.setStylePrimaryName("x-view-zoom-button-p");
113
		suiv.setStylePrimaryName("x-view-zoom-button-s");
114
 
115
		// on crée une image qui gère le double clic et la roulette de la souris
116
		image = new Image() {
117
 
118
			public void onBrowserEvent(Event event) {
119
 
120
				// lors d'un déplacement de la roulette
121
				if (Event.ONMOUSEWHEEL == DOM.eventGetType(event)) {
122
 
123
					// on simule un clic sur le bouton précédent
124
					if (event.getMouseWheelVelocityY() >= 1) {
125
						prev.click();
126
					}
127
 
128
					// ou suivant
129
					if (event.getMouseWheelVelocityY() <= -1) {
130
						suiv.click();
131
					}
132
				}
104 jpm 133
 
134
				if(Event.ONCONTEXTMENU == DOM.eventGetType(event)) {
135
 
136
					event.preventDefault() ;
137
					int[] xy = {event.getClientX(),event.getClientY()} ;
138
					afficherMenu(xy) ;
139
				}
94 jpm 140
			}
141
 
142
		};
143
 
144
		infosImages = new String[0] ;
145
 
146
		this.setHeader(true);
147
 
148
		imageConteneur = new Panel() ;
149
		imageConteneur.setBorder(false);
150
 
151
		imageConteneur.add(image);
152
		imageConteneur.setId("x-view-mini-zoom-img");
153
 
154
		// il n'existe pas de méthode pour ajouter un listener pour le double
155
		// clic sur une image
156
		// alors on lui dit manuellement de capter l'évènement double clic
157
		image.sinkEvents(Event.ONDBLCLICK);
158
		image.sinkEvents(Event.ONMOUSEWHEEL);
104 jpm 159
		image.sinkEvents(Event.ONCONTEXTMENU) ;
94 jpm 160
 
161
		// l'image de base est vide
97 jpm 162
		image.setUrl("");
94 jpm 163
 
164
		this.setLayout(new BorderLayout());
165
 
166
		prev.setWidth("60px");
167
		suiv.setWidth("60px");
168
 
169
		this.add(prev, new BorderLayoutData(RegionPosition.WEST));
170
		this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
171
		this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
172
 
173
		imageConteneur.setMaskDisabled(true);
174
		this.setBorder(false);
175
 
176
		conteneurInitialise = true;
177
		initialise = true;
178
 
179
		// on ajoute les listeners
180
		ajouterListeners();
181
 
182
	}
183
 
184
	/**
185
	 * Méthode héritée de l'interface rafraichissable
186
	 *
187
	 * @param nouvelleDonnees
188
	 *            les nouvelles données
189
	 * @param repandreRafraichissement
190
	 *            le booleen qui dit si on doit répnadre l'évènement
191
	 */
192
	public void rafraichir(Object nouvelleDonnees,
193
			boolean repandreRafraichissement) {
194
 
195
		// si on reçoit une string
196
		if (nouvelleDonnees instanceof String[] && initialise
197
				&& conteneurInitialise) {
198
			infosImages = (String[]) nouvelleDonnees;
199
			index = 0 ;
200
			afficherImage() ;
201
 
202
		} else {
203
			// sinon on met une image vide
204
			infosImages = new String[0] ;
97 jpm 205
			getImage().setUrl("");
94 jpm 206
		}
207
	}
208
 
209
	public void afficherImage()
210
	{
211
		// c'est l'url de l'image qu'on associe à la vue
212
		if(infosImages.length != 0)
213
		{
97 jpm 214
			activerPanneau() ;
104 jpm 215
			getImage().setUrl(convertirIdEnUrl(infosImages[index]));
94 jpm 216
		}
217
		else
218
		{
97 jpm 219
			desactiverPanneau() ;
94 jpm 220
		}
221
	}
222
 
223
	/**
224
	 * Desactive visuellement le panneau et les boutons
225
	 */
226
	public void desactiverPanneau() {
97 jpm 227
		getImage().setUrl("");
94 jpm 228
		prev.setEnabled(false);
229
		suiv.setEnabled(false);
230
	}
231
 
232
	/**
233
	 * Active visuellement le panneau et les boutons
234
	 */
235
	public void activerPanneau() {
236
		prev.setEnabled(true);
237
		suiv.setEnabled(true);
238
	}
239
 
240
	/**
241
	 * Ajoute les listeners pour la gestions d'évènement
242
	 */
243
	public void ajouterListeners() {
244
 
245
		// gestion du clic sur le bouton précedent
246
		prev.addClickListener(new ClickListener() {
247
 
248
			// en cas de clic
249
			public void onClick(Widget sender) {
250
 
251
				if(infosImages.length != 0) {
252
					if(index == 0)
253
					{
254
						index = infosImages.length - 1 ;
255
					}
256
					else
257
					{
258
						index-- ;
259
					}
260
 
261
					afficherImage() ;
262
				}
263
			}
264
 
265
		});
266
 
267
		// gestion du clic sur le bouton suivant
268
		suiv.addClickListener(new ClickListener() {
269
 
270
			// en cas de clic
271
			public void onClick(Widget sender) {
272
 
273
				if(infosImages.length != 0) {
274
					if(index == infosImages.length - 1)
275
					{
276
						index = 0 ;
277
					}
278
					else
279
					{
280
						index++ ;
281
					}
282
 
283
					afficherImage() ;
284
				}
285
 
286
			}
287
 
288
		});
289
 
290
	}
291
 
292
	/**
293
	 * Accesseur pour le médiateur
294
	 *
295
	 * @return le médiateur associé à la vue
296
	 */
297
	public ObservationMediateur getIMediateur() {
298
		return oMediateur;
299
	}
300
 
301
	/**
302
	 * Accesseur au conteneur de l'image
303
	 *
304
	 * @return le conteneur de l'image
305
	 */
306
	public Image getImage() {
307
		return image;
308
	}
309
 
310
	/**
311
	 * Acesseurs pour l'identifiant de l'image
312
	 * @return l'id de l'image
313
	 */
314
	public String getIdImage()
315
	{
104 jpm 316
		return infosImages[index] ;
94 jpm 317
	}
318
 
319
	/**
320
	 * Accesseur pour le bouton précédent
321
	 *
322
	 * @return le bouton précédent
323
	 */
324
	public com.google.gwt.user.client.ui.Button getPrev() {
325
		return prev;
326
	}
327
 
328
	/**
329
	 * Accesseur pour le bouton suivant
330
	 *
331
	 * @return le bouton suivant
332
	 */
333
	public com.google.gwt.user.client.ui.Button getSuiv() {
334
		return suiv;
335
	}
336
 
337
	/**
338
	 * Setter pour la taille de l'image
339
	 *
340
	 * @param x
341
	 *            la largeur en pixels
342
	 * @param y
343
	 *            la hauteur en pixels
344
	 */
345
	public void setTailleImage(int x, int y) {
346
		imageHeight = y;
347
		imageWidth = x;
348
	}
349
 
350
	/**
351
	 * Setteur pour l'identifiant de l'image
352
	 * @param id le nouvel identifiant
353
	 */
354
	public void setIdImage(String id)
355
	{
356
		idImage = id ;
357
	}
358
 
359
	/**
360
	 * renvoie la taille originale de l'image
361
	 *
362
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
363
	 */
364
	public int[] getTailleImage() {
365
		int[] taille = { imageHeight, imageWidth };
366
 
367
		return taille;
368
	}
369
 
370
	/**
371
	 * Accesseur pour le conteneur de l'image
372
	 * @return le conteur de l'image
373
	 */
374
	public Panel getImageConteneur() {
375
 
376
		return imageConteneur;
377
 
378
	}
104 jpm 379
 
380
	public void raz() {
381
 
382
		infosImages = new String[0] ;
383
		getImage().setUrl("");
384
 
385
	}
386
 
387
	public void supprimerLiaisonImage() {
388
 
389
		if(infosImages.length > 0) {
390
 
391
			getImage().setUrl("") ;
392
			int nouvelleTaille = infosImages.length - 1 ;
393
			int indexSupp = index ;
394
 
395
			String[] nouveauInfosImages = new String[nouvelleTaille] ;
396
			int j = 0 ;
397
 
398
			for(int i = 0 ; i < infosImages.length ; i++) {
399
 
400
				if(i != indexSupp) {
401
 
402
					nouveauInfosImages[j] = infosImages[i] ;
403
					j++ ;
404
				}
405
			}
406
 
407
			infosImages = nouveauInfosImages ;
408
			index = 0 ;
409
 
410
			afficherImage() ;
411
		}
412
	}
413
 
414
	public void afficherMenu(int[] xy) {
415
 
416
		Menu mn = new Menu() ;
417
		final Item suppLiaison = new Item("Supprimer la liaison") ;
418
 
419
		mn.addItem(suppLiaison) ;
420
 
421
		mn.addListener(new MenuListenerAdapter() {
422
 
423
			public void onItemClick(BaseItem item, EventObject e) {
424
 
425
				// si c'est l'aide
426
				if (item.equals(suppLiaison)) {
427
					// on notifie le médiateur
428
					getIMediateur().supprimerLiaisonObsImage() ;
429
				}
430
			}
431
 
432
		}) ;
433
 
434
		mn.showAt(xy) ;
435
	}
436
 
437
	public String convertirIdEnUrl(String idImg)
438
	{
439
		int maxZeros = 9 - idImg.length();
440
 
441
		for (int j = 0; j < maxZeros; j++) {
442
			idImg = "0" + idImg;
443
		}
444
 
445
		String baseUrl = Configuration.getImageBaseUrl() ;
446
 
447
		String dossierNv1 = idImg.substring(0, 3);
448
		String dossierNv2 = idImg.substring(3, 6);
449
		String fichierNv = idImg.substring(6, 9);
450
 
451
		String nomFichier = dossierNv1 + "_" + dossierNv2 + "_" + fichierNv;
452
 
453
		String[] infosFichier = { nomFichier, dossierNv1, dossierNv2 };
454
 
455
		String urlImg = baseUrl + infosFichier[1] + "/" + infosFichier[2] + "/M/"
456
		+ infosFichier[0] + "_M.jpg";
457
 
458
		return urlImg ;
459
	}
94 jpm 460
}
461