Subversion Repositories eFlore/Applications.del

Rev

Rev 1704 | 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.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.HasClickHandlers;
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.Event;
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.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> {}
        
        @UiField
        VerticalPanel conteneurGlobal;

        @UiField
        FocusPanel overlay;
        
        @UiField
        FocusPanel overlayContenu;

        @UiField
        Button boutonFermer, boutonSuivant, boutonPrecedent;
        
        @UiField 
        HorizontalPanel 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ée
        private int topFenetre = 0;
        private int gaucheFenetre = 0;
        
        private Timer timerPlacement = null;
        
        public FocusPanel getOverlay() {
                return overlay;
        }

        public FocusPanel getOverlayContenu() {
                return overlayContenu;
        }
        
        @Override
        public 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() {
                        @Override
                        public void onResize(ResizeEvent event) {
                                gererDimensionsEtPositionnerBoutons();
                        }
                });
        }
        
        @Override
        public HasKeyDownHandlers getConteneurGlobal() {
                return overlayContenu;
        }

        @Override
        public HasVisibility getOverlayVisibility() {
                return overlay;
        }

        @Override
        public HasVisibility getOverlayContenuVisibility() {
                return overlayContenu;
        }

        @Override
        public HasWidgets getOverlayContenuHasWidgets() {
                return overlayContenu;
        }

        @Override
        public void setStyleOverlay(String style) {
                overlay.setStyleName(style);
        }

        @Override
        public void setStyleOverlayContenu(String style) {
                overlayContenu.setStyleName(style);
        }

        @Override
        public void setOverlayContenu(IsWidget w) {
                overlayContenu.clear();
                overlayContenu.add(w);
        }

        @Override
        public void viderOverlay() {
                overlay.clear();
        }

        @Override
        public 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;
        }

        @Override
        public void surOuvertureFenetre() {
                // enregistrement des coordonnées des scrool
                topFenetre = Window.getScrollTop();
                gaucheFenetre = Window.getScrollLeft();
                
                // scroll désactivé pour ne pas fausser le positionnement des boutons
                Window.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 fenetre
                timerPlacement = new Timer() {
                        @Override
                        public void run() {
                                if(tailleDuContenuEstModifiee()) {
                                        // On repositionne les boutons
                                        gererDimensionsEtPositionnerBoutons();
                                }
                        }
                };
                timerPlacement.scheduleRepeating(30);
        }
        
        private boolean tailleDuContenuEstModifiee() {
                UIObject overlayContenuUi = overlayContenu.getWidget();
                return overlayContenuUi != null 
                                && (overlayContenuUi.getOffsetHeight() != hauteurContenu 
                                || overlayContenuUi.getOffsetWidth() != largeurContenu);
        }

        @Override
        public void surFermetureFenetre() {
                Window.enableScrolling(true);
                // replacement de la fenêtre à la position de scroll d'origine
                Window.scrollTo(gaucheFenetre, topFenetre);
                timerPlacement.cancel();
        }
        
        @Override
        public void surSetContenuFenetre() {
                // nécessaire pour le défilement avec les touches du clavier
                overlayContenu.setFocus(true);
        }

        @Override
        public void afficherBoutonsSuivantsPrecedents(boolean afficher) {
                boutonPrecedent.setVisible(afficher);
                boutonSuivant.setVisible(afficher);
        }

        @Override
        public boolean testerFermetureClicExterieur(ClickEvent event) {
                Element e = DOM.eventGetTarget(Event.as(event.getNativeEvent()));
                return event.getRelativeElement() != null && (e == overlayContenu.getElement());
        }
}