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.

Tagués avec : ,
Publié dans GWT, Java

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*