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