Subversion Repositories eFlore/Applications.del

Rev

Rev 1704 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
608 aurelien 1
package org.tela_botanica.del.client.composants.fenetreoverlay;
2
 
3
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilantePresenteur.Vue;
4
 
5
import com.google.gwt.core.client.GWT;
1563 aurelien 6
import com.google.gwt.dom.client.Element;
7
import com.google.gwt.event.dom.client.ClickEvent;
608 aurelien 8
import com.google.gwt.event.dom.client.HasClickHandlers;
9
import com.google.gwt.event.dom.client.HasKeyDownHandlers;
10
import com.google.gwt.event.logical.shared.ResizeEvent;
11
import com.google.gwt.event.logical.shared.ResizeHandler;
12
import com.google.gwt.uibinder.client.UiBinder;
13
import com.google.gwt.uibinder.client.UiField;
14
import com.google.gwt.user.client.DOM;
1563 aurelien 15
import com.google.gwt.user.client.Event;
608 aurelien 16
import com.google.gwt.user.client.Timer;
17
import com.google.gwt.user.client.Window;
18
import com.google.gwt.user.client.ui.Button;
19
import com.google.gwt.user.client.ui.Composite;
20
import com.google.gwt.user.client.ui.FocusPanel;
21
import com.google.gwt.user.client.ui.HasVisibility;
22
import com.google.gwt.user.client.ui.HasWidgets;
23
import com.google.gwt.user.client.ui.HorizontalPanel;
24
import com.google.gwt.user.client.ui.IsWidget;
25
import com.google.gwt.user.client.ui.UIObject;
26
import com.google.gwt.user.client.ui.VerticalPanel;
27
import com.google.gwt.user.client.ui.Widget;
28
 
29
public class FenetreOverlayDefilanteVue extends Composite implements Vue {
30
 
1704 jpm 31
	interface MyUiBinder extends UiBinder<Widget, FenetreOverlayDefilanteVue> {}
608 aurelien 32
 
33
	@UiField
34
	VerticalPanel conteneurGlobal;
35
 
36
	@UiField
37
	FocusPanel overlay;
38
 
39
	@UiField
40
	FocusPanel overlayContenu;
41
 
42
	@UiField
43
	Button boutonFermer, boutonSuivant, boutonPrecedent;
44
 
45
	@UiField
46
	HorizontalPanel conteneurOverlayContenu;
47
 
48
	private int hauteurContenu = 0;
49
	private int largeurContenu = 0;
50
 
51
	// contiennent les coordonnées actuelles du scroll
52
	// pour le rétablir une fois la fenêtre fermée
53
	private int topFenetre = 0;
54
	private int gaucheFenetre = 0;
55
 
56
	private Timer timerPlacement = null;
57
 
58
	public FocusPanel getOverlay() {
59
		return overlay;
60
	}
61
 
62
	public FocusPanel getOverlayContenu() {
63
		return overlayContenu;
64
	}
65
 
66
	@Override
67
	public HasClickHandlers getOverlayHasClickHandlers() {
68
		return overlayContenu;
69
	}
70
 
71
	public Button getBoutonFermer() {
72
		return boutonFermer;
73
	}
74
 
75
	public Button getBoutonSuivant() {
76
		return boutonSuivant;
77
	}
78
 
79
	public Button getBoutonPrecedent() {
80
		return boutonPrecedent;
81
	}
82
 
83
	private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
84
 
85
	public FenetreOverlayDefilanteVue() {
86
		initWidget(uiBinder.createAndBindUi(this));
87
		boutonFermer.setStyleName("fermerOverlay");
88
		boutonPrecedent.setStyleName("precedentOverlay");
89
		boutonSuivant.setStyleName("suivantOverlay");
90
 
91
		Window.addResizeHandler(new ResizeHandler() {
92
			@Override
93
			public void onResize(ResizeEvent event) {
94
				gererDimensionsEtPositionnerBoutons();
95
			}
96
		});
97
	}
98
 
99
	@Override
100
	public HasKeyDownHandlers getConteneurGlobal() {
101
		return overlayContenu;
102
	}
103
 
104
	@Override
105
	public HasVisibility getOverlayVisibility() {
106
		return overlay;
107
	}
108
 
109
	@Override
110
	public HasVisibility getOverlayContenuVisibility() {
111
		return overlayContenu;
112
	}
113
 
114
	@Override
115
	public HasWidgets getOverlayContenuHasWidgets() {
116
		return overlayContenu;
117
	}
118
 
119
	@Override
120
	public void setStyleOverlay(String style) {
121
		overlay.setStyleName(style);
122
	}
123
 
124
	@Override
125
	public void setStyleOverlayContenu(String style) {
126
		overlayContenu.setStyleName(style);
127
	}
128
 
129
	@Override
130
	public void setOverlayContenu(IsWidget w) {
131
		overlayContenu.clear();
132
		overlayContenu.add(w);
133
	}
134
 
135
	@Override
136
	public void viderOverlay() {
137
		overlay.clear();
138
	}
139
 
140
	@Override
141
	public void viderOverlayContenu() {
142
		overlayContenu.clear();
143
	}
144
 
145
	private void gererDimensionsEtPositionnerBoutons() {
146
		UIObject overlayContenuUi = overlayContenu.getWidget();
147
 
1704 jpm 148
		if (overlayContenuUi == null) {
608 aurelien 149
			return;
150
		}
1243 gduche 151
 
152
		int topBoutonFermer = 65;
153
		int topBoutonsSuivantsPrecedent = (topBoutonFermer + overlayContenuUi.getOffsetHeight())/2 + 20;
154
 
155
 
608 aurelien 156
		int left = overlayContenuUi.getAbsoluteLeft() - 20;
157
		int right = overlayContenuUi.getAbsoluteLeft() + overlayContenuUi.getOffsetWidth() - 12;
158
 
159
		DOM.setStyleAttribute(boutonPrecedent.getElement(), "left",left+"px");
160
		DOM.setStyleAttribute(boutonPrecedent.getElement(), "top", topBoutonsSuivantsPrecedent+"px");
161
 
162
		DOM.setStyleAttribute(boutonSuivant.getElement(), "left",right+"px");
163
		DOM.setStyleAttribute(boutonSuivant.getElement(), "top", topBoutonsSuivantsPrecedent+"px");
164
 
165
		DOM.setStyleAttribute(boutonFermer.getElement(), "left",(right - 10)+"px");
166
		DOM.setStyleAttribute(boutonFermer.getElement(), "top", topBoutonFermer+"px");
167
 
168
		setDimensionsContenu(overlayContenuUi.getOffsetHeight(), overlayContenuUi.getOffsetWidth());
169
	}
170
 
171
	private void setDimensionsContenu(int hauteur, int largeur) {
172
		largeurContenu = largeur;
173
		hauteurContenu = hauteur;
174
	}
175
 
176
	@Override
177
	public void surOuvertureFenetre() {
178
		// enregistrement des coordonnées des scrool
179
		topFenetre = Window.getScrollTop();
180
		gaucheFenetre = Window.getScrollLeft();
181
 
182
		// scroll désactivé pour ne pas fausser le positionnement des boutons
183
		Window.enableScrolling(false);
184
		// Pas trouvé mieux que le timer pour bien redimensionner
185
		// à voir s il existe une meilleure solution qui n'oblige pas
186
		// par avance à connaitre le type d'objet contenu dans l'overlayContenu
187
		// ou bien la taille de la fenetre
188
		timerPlacement = new Timer() {
189
			@Override
190
			public void run() {
191
				if(tailleDuContenuEstModifiee()) {
192
					// On repositionne les boutons
193
					gererDimensionsEtPositionnerBoutons();
194
				}
195
			}
196
		};
197
		timerPlacement.scheduleRepeating(30);
198
	}
199
 
200
	private boolean tailleDuContenuEstModifiee() {
201
		UIObject overlayContenuUi = overlayContenu.getWidget();
202
		return overlayContenuUi != null
203
				&& (overlayContenuUi.getOffsetHeight() != hauteurContenu
204
				|| overlayContenuUi.getOffsetWidth() != largeurContenu);
205
	}
206
 
207
	@Override
208
	public void surFermetureFenetre() {
209
		Window.enableScrolling(true);
210
		// replacement de la fenêtre à la position de scroll d'origine
211
		Window.scrollTo(gaucheFenetre, topFenetre);
212
		timerPlacement.cancel();
213
	}
214
 
215
	@Override
216
	public void surSetContenuFenetre() {
217
		// nécessaire pour le défilement avec les touches du clavier
218
		overlayContenu.setFocus(true);
219
	}
220
 
221
	@Override
222
	public void afficherBoutonsSuivantsPrecedents(boolean afficher) {
223
		boutonPrecedent.setVisible(afficher);
224
		boutonSuivant.setVisible(afficher);
225
	}
1563 aurelien 226
 
227
	@Override
228
	public boolean testerFermetureClicExterieur(ClickEvent event) {
229
		Element e = DOM.eventGetTarget(Event.as(event.getNativeEvent()));
230
		return event.getRelativeElement() != null && (e == overlayContenu.getElement());
231
	}
608 aurelien 232
}