Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

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