Gestion des ClickHandlers dans un environnement MVP
Gestion des ClickHandlers dans l’environnement MVP proposé par Google pour GWT 2.1
Afin d’éviter des problèmes de redondance du même évènement affecté à un bouton ou un lien, je vais exposer ici une réflexion. Reste à voir si cette manière de procéder est en adéquation avec le principe du MVP exposé par Google dans ce tutoriel : http://code.google.com/webtoolkit/doc/trunk/DevGuideMvpActivitiesAndPlaces.html.
Le principe est de déclarer dans la vue le ClickHandler, l’action dans l’Activity, et de passer par une interface elle même déclaré dans l’interface de la vue.
Je vous voie d’ici faire des gros yeux o0 .
L’explication par l’exemple sera plus parlante. Cet exemple s’implémente dans le code fournie par Google dans son tutoriel.
Soient, une interface « LogOnView », son implémentation « LogOnViewImpl » et une classe « LogOnActivity ».
Commençons par l’interface de la vue « LogOnView ».
package com.hellomvp.client.ui; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.ui.IsWidget; public interface LogOnView extends IsWidget { // Va permettre le lien entre la View et l'Activity void setPresenter(Presenter listener); // Actions que peu réaliser la vue public interface Presenter { // Action sur le click d'un bouton void doActionOnClickLonOnButton(); } }
Voyons son implémentation.
package com.hellomvp.client.ui; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DecoratorPanel; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.TextBox; public class LogOnViewImpl extends Composite implements LogOnView { // Notre pont entre la view et l'activity private Presenter listener; // Le bouton sur lequel nous allons mettre une action private Button logInButton; public LogOnViewImpl(){ // Création du bouton logInButton = new Button("Valider", new ClickHandler() { @Override public void onClick(ClickEvent event) { // Appel de l'action définie dans l'Activity listener.doActionOnClickLonOnButton(); } }); // Une interface graphique basique (sans grand intérêt ici) // Create a table to layout the form options FlexTable layout = new FlexTable(); layout.setCellSpacing(6); FlexCellFormatter cellFormatter = layout.getFlexCellFormatter(); // Add a title to the form layout.setHTML(0, 0, "Pour accéder à l'application, merci de bien vouloir vous identifier"); cellFormatter.setColSpan(0, 0, 2); cellFormatter.setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER); // Add some standard form options layout.setHTML(1, 0, "Login"); layout.setWidget(1, 1, new TextBox()); layout.setHTML(2, 0, "Mot de passe"); layout.setWidget(2, 1, new TextBox()); layout.setWidget(3, 0, logInButton); // Wrap the content in a DecoratorPanel DecoratorPanel decPanel = new DecoratorPanel(); decPanel.setWidget(layout); decPanel.addStyleName("loginDecorPanel"); initWidget(decPanel); } @Override public void setPresenter(Presenter listener) { this.listener = listener; } }
package com.hellomvp.client.activity; import com.google.gwt.activity.shared.AbstractActivity; import com.google.gwt.event.shared.EventBus; import com.google.gwt.place.shared.Place; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.hellomvp.client.ClientFactory; import com.hellomvp.client.place.HelloPlace; import com.hellomvp.client.ui.LogOnView; public class LogOnActivity extends AbstractActivity implements LogOnView.Presenter { private ClientFactory clientFactory; private LogOnView logOnView; public LogOnActivity(Place place, ClientFactory clientFactory) { this.clientFactory = clientFactory; } @Override public void start(AcceptsOneWidget panel, EventBus eventBus) { this.logOnView = clientFactory.getLogOnView(); logOnView.setPresenter(this); panel.setWidget(logOnView); } @Override public void doActionOnClickLonOnButton() { System.out.println("Bouton Cliqué !"); } }
Avec cette façon de procéder on évite la redondance de l’action.
Laisser un commentaire