Subversion Repositories eFlore/Applications.cel

Rev

Rev 30 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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