Rev 608 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.del.client.composants.fenetreoverlay;import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilantePresenteur.Vue;import com.google.gwt.core.client.GWT;import com.google.gwt.event.dom.client.HasBlurHandlers;import com.google.gwt.event.dom.client.HasClickHandlers;import com.google.gwt.event.dom.client.HasFocusHandlers;import com.google.gwt.event.dom.client.HasKeyDownHandlers;import com.google.gwt.event.logical.shared.ResizeEvent;import com.google.gwt.event.logical.shared.ResizeHandler;import com.google.gwt.uibinder.client.UiBinder;import com.google.gwt.uibinder.client.UiField;import com.google.gwt.user.client.DOM;import com.google.gwt.user.client.Timer;import com.google.gwt.user.client.Window;import com.google.gwt.user.client.ui.Button;import com.google.gwt.user.client.ui.Composite;import com.google.gwt.user.client.ui.FocusPanel;import com.google.gwt.user.client.ui.HTMLPanel;import com.google.gwt.user.client.ui.HasVisibility;import com.google.gwt.user.client.ui.HasWidgets;import com.google.gwt.user.client.ui.HorizontalPanel;import com.google.gwt.user.client.ui.IsWidget;import com.google.gwt.user.client.ui.UIObject;import com.google.gwt.user.client.ui.VerticalPanel;import com.google.gwt.user.client.ui.Widget;public class FenetreOverlayDefilanteVue extends Composite implements Vue {interface MyUiBinder extends UiBinder<Widget, FenetreOverlayDefilanteVue> {}@UiFieldVerticalPanel conteneurGlobal;@UiFieldFocusPanel overlay;@UiFieldFocusPanel overlayContenu;@UiFieldButton boutonFermer, boutonSuivant, boutonPrecedent;@UiFieldHorizontalPanel conteneurOverlayContenu;private int hauteurContenu = 0;private int largeurContenu = 0;// contiennent les coordonnées actuelles du scroll// pour le rétablir une fois la fenêtre ferméeprivate int topFenetre = 0;private int gaucheFenetre = 0;private Timer timerPlacement = null;public FocusPanel getOverlay() {return overlay;}public FocusPanel getOverlayContenu() {return overlayContenu;}@Overridepublic HasClickHandlers getOverlayHasClickHandlers() {return overlayContenu;}public Button getBoutonFermer() {return boutonFermer;}public Button getBoutonSuivant() {return boutonSuivant;}public Button getBoutonPrecedent() {return boutonPrecedent;}private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);public FenetreOverlayDefilanteVue() {initWidget(uiBinder.createAndBindUi(this));boutonFermer.setStyleName("fermerOverlay");boutonPrecedent.setStyleName("precedentOverlay");boutonSuivant.setStyleName("suivantOverlay");Window.addResizeHandler(new ResizeHandler() {@Overridepublic void onResize(ResizeEvent event) {gererDimensionsEtPositionnerBoutons();}});}@Overridepublic HasKeyDownHandlers getConteneurGlobal() {return overlayContenu;}@Overridepublic HasVisibility getOverlayVisibility() {return overlay;}@Overridepublic HasVisibility getOverlayContenuVisibility() {return overlayContenu;}@Overridepublic HasWidgets getOverlayContenuHasWidgets() {return overlayContenu;}@Overridepublic void setStyleOverlay(String style) {overlay.setStyleName(style);}@Overridepublic void setStyleOverlayContenu(String style) {overlayContenu.setStyleName(style);}@Overridepublic void setOverlayContenu(IsWidget w) {overlayContenu.clear();overlayContenu.add(w);}@Overridepublic void viderOverlay() {overlay.clear();}@Overridepublic void viderOverlayContenu() {overlayContenu.clear();}private void gererDimensionsEtPositionnerBoutons() {UIObject overlayContenuUi = overlayContenu.getWidget();if(overlayContenuUi == null) {return;}int topBoutonFermer = 65;int topBoutonsSuivantsPrecedent = (topBoutonFermer + overlayContenuUi.getOffsetHeight())/2 + 20;int left = overlayContenuUi.getAbsoluteLeft() - 20;int right = overlayContenuUi.getAbsoluteLeft() + overlayContenuUi.getOffsetWidth() - 12;DOM.setStyleAttribute(boutonPrecedent.getElement(), "left",left+"px");DOM.setStyleAttribute(boutonPrecedent.getElement(), "top", topBoutonsSuivantsPrecedent+"px");DOM.setStyleAttribute(boutonSuivant.getElement(), "left",right+"px");DOM.setStyleAttribute(boutonSuivant.getElement(), "top", topBoutonsSuivantsPrecedent+"px");DOM.setStyleAttribute(boutonFermer.getElement(), "left",(right - 10)+"px");DOM.setStyleAttribute(boutonFermer.getElement(), "top", topBoutonFermer+"px");setDimensionsContenu(overlayContenuUi.getOffsetHeight(), overlayContenuUi.getOffsetWidth());}private void setDimensionsContenu(int hauteur, int largeur) {largeurContenu = largeur;hauteurContenu = hauteur;}@Overridepublic void surOuvertureFenetre() {// enregistrement des coordonnées des scrooltopFenetre = Window.getScrollTop();gaucheFenetre = Window.getScrollLeft();// scroll désactivé pour ne pas fausser le positionnement des boutonsWindow.enableScrolling(false);// Pas trouvé mieux que le timer pour bien redimensionner// à voir s il existe une meilleure solution qui n'oblige pas// par avance à connaitre le type d'objet contenu dans l'overlayContenu// ou bien la taille de la fenetretimerPlacement = new Timer() {@Overridepublic void run() {if(tailleDuContenuEstModifiee()) {// On repositionne les boutonsgererDimensionsEtPositionnerBoutons();}}};timerPlacement.scheduleRepeating(30);}private boolean tailleDuContenuEstModifiee() {UIObject overlayContenuUi = overlayContenu.getWidget();return overlayContenuUi != null&& (overlayContenuUi.getOffsetHeight() != hauteurContenu|| overlayContenuUi.getOffsetWidth() != largeurContenu);}@Overridepublic void surFermetureFenetre() {Window.enableScrolling(true);// replacement de la fenêtre à la position de scroll d'origineWindow.scrollTo(gaucheFenetre, topFenetre);timerPlacement.cancel();}@Overridepublic void surSetContenuFenetre() {// nécessaire pour le défilement avec les touches du clavieroverlayContenu.setFocus(true);}@Overridepublic void afficherBoutonsSuivantsPrecedents(boolean afficher) {boutonPrecedent.setVisible(afficher);boutonSuivant.setVisible(afficher);}}