Java tutorial
/* * This file is a part of Square, Customer Relationship Management Software for insurance's companies * Copyright (C) 2010-2012 SCUB <square@scub.net> - Mutuelle SMATIS FRANCE <square@smatis.fr > * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package com.square.composant.envoi.email.square.client.view; import org.scub.foundation.framework.gwt.module.client.dto.IdentifiantLibelleGwt; import org.scub.foundation.framework.gwt.module.client.util.composants.decorated.DecoratedButton; import org.scub.foundation.framework.gwt.module.client.util.composants.decorated.DecoratedTextBox; import org.scub.foundation.framework.gwt.module.client.util.composants.suggestbox.SuggestListBoxSingle.SuggestListBoxSingleProperties; import org.scub.foundation.framework.gwt.module.client.util.popup.Popup.PopupCallback; import org.scub.foundation.framework.gwt.module.client.util.popup.confirm.ConfirmPopup; import org.scub.foundation.framework.gwt.module.client.util.popup.error.ErrorPopup; import org.scub.foundation.framework.gwt.module.client.util.popup.loading.LoadingPopup; import org.scub.foundation.framework.gwt.module.client.util.popup.util.ErrorPopupConfiguration; import org.scub.foundation.framework.gwt.module.client.util.popup.util.PopupConfiguration; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasAllKeyHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.HasAlignment; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.square.composant.envoi.email.square.client.composant.RichTextPanel; import com.square.composant.envoi.email.square.client.composant.RichTextToolbar; import com.square.composant.envoi.email.square.client.constantes.ComposantEnvoiEmailConstants; import com.square.composant.envoi.email.square.client.event.SuppressionPieceJointeEvent; import com.square.composant.envoi.email.square.client.model.PieceJointeModel; import com.square.composant.envoi.email.square.client.presenter.ComposantEnvoiEmailPresenter.ComposantEnvoiEmailView; import com.square.composants.graphiques.lib.client.composants.DecoratedSuggestListBoxSingle; import com.square.composants.graphiques.lib.client.composants.IconeErreurChamp; import com.square.composants.graphiques.lib.client.event.IconeErreurChampManager; /** * Implmentation de la vue ComposantEnvoiEmailView. * @author Nicolas NADEAU (nicolas.nadeau@scub.net) - SCUB */ public class ComposantEnvoiEmailViewImpl extends Composite implements ComposantEnvoiEmailView { /** DecoratedTextBox pour l'adresse mail de l'expditeur. */ private DecoratedTextBox tbExpediteur; /** DecoratedTextBox pour le nom de l'expditeur. */ private DecoratedTextBox tbNomExpediteur; /** DecoratedTextBox pour l'adresse mail du destinataire. */ private DecoratedTextBox tbDestinataire; /** DecoratedTextBox pour l'objet du mail. */ private DecoratedTextBox tbObjet; /** SuggestListBox pour le modele d'email. */ private DecoratedSuggestListBoxSingle<IdentifiantLibelleGwt> slbModeleEmail; /** Zone de texte du message du mail. */ private RichTextArea rtaMessage; /** Toolbar associe la RichTextArea. */ private RichTextToolbar toolbar; /** Bouton pour envoyer l'email. */ private DecoratedButton btnEnvoyerEmail; private DecoratedButton btnReduire; /** Bouton pour ajouter une pice jointe. */ private DecoratedButton btnJoindreFichier; /** Bouton d'annulation. */ private DecoratedButton btnAnnuler; /** Tableau des fichiers joints. */ private FlexTable panelFichiersJoints; /** Label "Aucun fichier joint". */ private Label labelAucunFichierJoint; /** Bus d'vnements. */ private HandlerManager eventBus; /** Constantes de la vue. */ private ComposantEnvoiEmailViewImplConstants viewConstants; /** Messages de la vue. */ private ComposantEnvoiEmailViewImplMessages viewMessage; private FocusPanel focusPopupPanel; /** Icone manager. */ private IconeErreurChampManager iconeErreurChampManager; private boolean minimisable; /** * Constructeur. * @param eventBus le bus d'vnement. * @param minimisable flag pour savoir si on ajoute le bouton reduire */ public ComposantEnvoiEmailViewImpl(HandlerManager eventBus, boolean minimisable) { this.viewConstants = GWT.create(ComposantEnvoiEmailViewImplConstants.class); this.viewMessage = GWT.create(ComposantEnvoiEmailViewImplMessages.class); this.eventBus = eventBus; iconeErreurChampManager = new IconeErreurChampManager(); this.minimisable = minimisable; initContenuView(); } /** Initialisation du contenu de la vue. */ private void initContenuView() { focusPopupPanel = new FocusPanel(); focusPopupPanel.setWidth(ComposantEnvoiEmailConstants.CENT_POURCENT); // Panel reprsentant le contenu du composant final VerticalPanel contenu = new VerticalPanel(); contenu.setWidth(ComposantEnvoiEmailConstants.CENT_POURCENT); contenu.setSpacing(5); // Email final CaptionPanel fieldSetPanel = new CaptionPanel(viewConstants.titreBlocComposant()); final VerticalPanel panelContenuEmail = new VerticalPanel(); panelContenuEmail.setWidth(ComposantEnvoiEmailConstants.CENT_POURCENT); int row = 0; // Table contenant les informations du mail final FlexTable tableInfos = new FlexTable(); final Label lExpediteur = new Label(viewConstants.expediteur()); tableInfos.setWidget(row, 0, lExpediteur); tbExpediteur = new DecoratedTextBox(); tableInfos.setWidget(row++, 1, construireBlocIcone(tbExpediteur, "EmailDto.expediteur")); final Label lNomExpediteur = new Label(viewConstants.nomExpediteur()); tableInfos.setWidget(row, 0, lNomExpediteur); tbNomExpediteur = new DecoratedTextBox(); tableInfos.setWidget(row++, 1, tbNomExpediteur); final Label lDestinataire = new Label(viewConstants.destinataire()); tableInfos.setWidget(row, 0, lDestinataire); tbDestinataire = new DecoratedTextBox(); tableInfos.setWidget(row++, 1, construireBlocIcone(tbDestinataire, "EmailDto.listeDestinataires")); final Label lObjet = new Label(viewConstants.objet()); tableInfos.setWidget(row, 0, lObjet); tbObjet = new DecoratedTextBox(); tableInfos.setWidget(row++, 1, construireBlocIcone(tbObjet, "EmailDto.titre")); // Panneau des fichiers joints final Label lPieceJointe = new Label(viewConstants.pieceJointe()); tableInfos.setWidget(row, 0, lPieceJointe); tableInfos.getCellFormatter().setVerticalAlignment(row, 0, HasAlignment.ALIGN_TOP); panelFichiersJoints = new FlexTable(); labelAucunFichierJoint = new Label(viewConstants.aucunFichierJoint()); panelFichiersJoints.setWidget(0, 0, labelAucunFichierJoint); tableInfos.setWidget(row++, 1, panelFichiersJoints); final Label lMessage = new Label(viewConstants.message()); tableInfos.setWidget(row++, 0, lMessage); // Colonne vide (espace) tableInfos.getColumnFormatter().setWidth(2, ComposantEnvoiEmailViewImplConstants.LARGEUR_COLONNE_VIDE); final SuggestListBoxSingleProperties<IdentifiantLibelleGwt> slbIdentifiantLibelleProperties = new SuggestListBoxSingleProperties<IdentifiantLibelleGwt>() { @Override public String getSelectSuggestRenderer(IdentifiantLibelleGwt row) { return row == null ? "" : row.getLibelle(); } @Override public String[] getResultColumnsRenderer() { return new String[] {}; } @Override public String[] getResultRowsRenderer(IdentifiantLibelleGwt row) { return new String[] { row == null ? "" : row.getLibelle() }; } }; final Label lModeleEmail = new Label(viewConstants.modeleEmail()); tableInfos.setWidget(0, 3, lModeleEmail); slbModeleEmail = new DecoratedSuggestListBoxSingle<IdentifiantLibelleGwt>(slbIdentifiantLibelleProperties); tableInfos.setWidget(0, 4, slbModeleEmail); panelContenuEmail.add(tableInfos); // cration de la zone de texte (RichTextArea) rtaMessage = new RichTextArea(); rtaMessage.setSize(ComposantEnvoiEmailConstants.CENT_POURCENT, ComposantEnvoiEmailViewImplConstants.HAUTEUR_RICH_TEXT_AREA); toolbar = new RichTextToolbar(rtaMessage); final RichTextPanel rtpMessage = new RichTextPanel(toolbar, rtaMessage); rtpMessage.setWidth(ComposantEnvoiEmailConstants.CENT_POURCENT); toolbar.setWidth(ComposantEnvoiEmailConstants.CENT_POURCENT); panelContenuEmail.add(rtpMessage); fieldSetPanel.add(panelContenuEmail); contenu.add(fieldSetPanel); // Ajout de la barre de boutons final HorizontalPanel pBoutons = construireBarreBoutons(); contenu.add(pBoutons); contenu.setCellHorizontalAlignment(pBoutons, HasAlignment.ALIGN_CENTER); focusPopupPanel.setWidget(contenu); this.initWidget(focusPopupPanel); } /** * Construit la barre de boutons. * @return le panel contenant les boutons. */ private HorizontalPanel construireBarreBoutons() { btnEnvoyerEmail = new DecoratedButton(viewConstants.btnEnvoyerEmail()); btnJoindreFichier = new DecoratedButton(viewConstants.btnJoindreFichier()); if (minimisable) { btnReduire = new DecoratedButton(viewConstants.reduire()); } btnAnnuler = new DecoratedButton(viewConstants.btnAnnuler()); final HorizontalPanel barreBoutons = new HorizontalPanel(); barreBoutons.setSpacing(5); barreBoutons.add(btnEnvoyerEmail); barreBoutons.add(btnJoindreFichier); if (minimisable) { barreBoutons.add(btnReduire); } barreBoutons.add(btnAnnuler); return barreBoutons; } @Override public Widget asWidget() { return this; } @Override public void afficherFichierJoint(final PieceJointeModel fichierJoint, boolean supprimable) { // Rcupration de l'index de la ligne du panel laquelle on ajoute le fichier final int ligneCourante = panelFichiersJoints.getRowCount(); // Ajout du fichier au panel des fichiers joints final Label labelNomFichierJoint = new Label(fichierJoint.getNom()); panelFichiersJoints.setWidget(ligneCourante, 0, labelNomFichierJoint); // Affichage du bouton supprimer si le fichier est supprimable if (supprimable) { // Lien de suppression du fichier joint final DecoratedButton btnSuppression = new DecoratedButton(viewConstants.btnSupprimer()); btnSuppression.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final PopupCallback callback = new PopupCallback() { public void onResult(boolean result) { if (result) { eventBus.fireEvent( new SuppressionPieceJointeEvent(fichierJoint, labelNomFichierJoint)); } } }; final PopupConfiguration config = new PopupConfiguration( viewMessage.messageSuppressionPieceJointe(fichierJoint.getNom())); config.setTitle(viewConstants.titrePopupConfirmationSuppressionPieceJointe()); config.setCallback(callback); ConfirmPopup.afficher(config); } }); panelFichiersJoints.setWidget(ligneCourante, 1, btnSuppression); } // On cache "Aucun fichier joint" labelAucunFichierJoint.setVisible(false); } @Override public void afficherAucunePieceJointe() { labelAucunFichierJoint.setVisible(true); } @Override public void nettoyerPiecesJointes() { panelFichiersJoints.clear(); } @Override public void supprimerPieceJointe(Label labelPieceJointe) { final int idxLigneNomFichierJoint = trouverLigneFichierJoint(labelPieceJointe); if (idxLigneNomFichierJoint < 0) { LoadingPopup.stopAll(); final ErrorPopupConfiguration errorPopupConfiguration = new ErrorPopupConfiguration( viewConstants.erreurSuppresionPieceJointe()); ErrorPopup.afficher(errorPopupConfiguration); } else { panelFichiersJoints.removeRow(idxLigneNomFichierJoint); } } /** * Recherche du Label du fichier dans le tableau des fichiers joints. * @param labelNomFichier le widget rechercher * @return l'index de la ligne o se trouve le widget */ private int trouverLigneFichierJoint(Label labelNomFichier) { if (labelNomFichier != null) { // Parcours du tableau des fichiers joints pour retrouver le widget for (int i = 0; i < panelFichiersJoints.getRowCount(); i++) { // Si le label correspond : on retourne l'index de la ligne if (labelNomFichier.equals(panelFichiersJoints.getWidget(i, 0))) { return i; } } } return -1; } /** * Construit un bloc avec un label et un champ pour l'affichage. */ private HorizontalPanel construireBlocIcone(final Widget composant, final String nomChamp) { final IconeErreurChamp icone = iconeErreurChampManager.createInstance(nomChamp, composant); final HorizontalPanel panel = new HorizontalPanel(); panel.add(composant); panel.add(icone); panel.setCellVerticalAlignment(icone, HasVerticalAlignment.ALIGN_MIDDLE); return panel; } @Override public HasClickHandlers getBtnAnnuler() { return btnAnnuler; } @Override public HasClickHandlers getBtnEnvoyerEmail() { return btnEnvoyerEmail; } @Override public HasClickHandlers getBtnJoindreFichier() { return btnJoindreFichier; } @Override public HasValue<String> getTbDestinataire() { return tbDestinataire; } @Override public HasValue<String> getTbExpediteur() { return tbExpediteur; } @Override public HasValue<String> getTbNomExpediteur() { return tbNomExpediteur; } @Override public HasValue<String> getTbObjet() { return tbObjet; } @Override public String getMessage() { return rtaMessage.getHTML(); } @Override public void setMessage(String message) { rtaMessage.setHTML(message); } @Override public void setFocusMessage() { rtaMessage.setFocus(true); } @Override public IconeErreurChampManager getIconeErreurChampManager() { return iconeErreurChampManager; } @Override public void masquerLoadingPopup() { LoadingPopup.stopAll(); } @Override public void onRpcServiceFailure(ErrorPopupConfiguration errorPopupConfiguration) { LoadingPopup.stopAll(); ErrorPopup.afficher(errorPopupConfiguration); } /** * {@inheritDoc} */ @Override public HasAllKeyHandlers getAllKeyHandlersFocusPanel() { return focusPopupPanel; } /** * {@inheritDoc} */ @Override public void initFocus() { btnAnnuler.setFocus(true); } @Override public void activerBoutonReduire(boolean actif) { if (minimisable) { btnReduire.setEnabled(actif); } } @Override public HasClickHandlers getBtnReduireHandler() { return btnReduire; } @Override public HasAllKeyHandlers getAllKeyHandlersMessage() { return rtaMessage; } @Override public DecoratedSuggestListBoxSingle<IdentifiantLibelleGwt> getSlbModeleEmail() { return slbModeleEmail; } }