I have a problem with click handlers that are not called. I use the
MVP design explained in the article "Large scale application
development and MVP". I have a simple view which contains one button.
I also have another view that is just a container for that button.
It's just to simulate the problem. For each view I have a presenter.
In the AppController I have two ways to create the application, "test"
which uses the SimpleButtonPresenter, and "container" which uses the
ContainerPresenter. In the first case the handler is called but in the
second case it's not. The only difference between the two cases if
that in the second case, the button is inside a container. Do you have
an idea where the problem comes from?

AppController

public class AppController implements Presenter,
ValueChangeHandler<String> {
    private final HandlerManager eventBus;
    private HasWidgets container;

    public AppController(HandlerManager eventBus) {
        this.eventBus = eventBus;
        bind();
    }

    private void bind() {
        History.addValueChangeHandler(this);
    }

    public void go(final HasWidgets container) {
        this.container = container;

        if ("".equals(History.getToken())) {
            History.newItem("main");
        } else {
            History.fireCurrentHistoryState();
        }
    }

    public void onValueChange(ValueChangeEvent<String> event) {
        String token = event.getValue();

        if (token != null) {
            Presenter presenter = null;

            if (token.equals("main")) {
            } else if ("test".equals(token)) {
                presenter = new SimpleButtonPresenter(eventBus,
                        new SimpleButtonView());
            } else if ("container".equals(token)) {
                presenter = new ContainerPresenter(eventBus,
                        new ContainerView());
            }

            if (presenter != null) {
                presenter.go(container);
            }
        }
    }
}

The Views

public class SimpleButtonView extends Composite implements
        SimpleButtonPresenter.Display {

    private final Button btnClick;

    public SimpleButtonView() {
        DecoratorPanel container = new DecoratorPanel();
        btnClick = new Button("Click Me");
        container.add(btnClick);
        this.initWidget(container);
    }

    @Override
    public Widget asWidget() {
        return this;
    }

    @Override
    public HasClickHandlers getButton() {
        return btnClick;
    }

}

public class ContainerView extends Composite implements
        ContainerPresenter.Display {

    public ContainerView() {
        DecoratorPanel container = new DecoratorPanel();
        SimpleButtonView sbv = new SimpleButtonView();
        container.add(sbv);
        this.initWidget(container);
    }

    @Override
    public Widget asWidget() {
        return this;
    }

}

The Presenters

public class SimpleButtonPresenter implements Presenter {

    public interface Display {
        HasClickHandlers getButton();

        Widget asWidget();
    }

    private final HandlerManager eventBus;
    private final Display display;

    public SimpleButtonPresenter(HandlerManager eventBus, Display
view) {
        this.eventBus = eventBus;
        this.display = view;
    }

    @Override
    public void go(HasWidgets container) {
        bind();
        container.clear();
        container.add(display.asWidget());
    }

    public void bind() {
        display.getButton().addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                System.out.println("Click");
            }

        });
    }

}

public class ContainerPresenter implements Presenter {

    public interface Display {
        Widget asWidget();
    }

    private final HandlerManager eventBus;
    private final Display display;
    private final SimpleButtonPresenter simpleButtonPresenter;

    public ContainerPresenter(HandlerManager eventBus, Display view) {
        this.eventBus = eventBus;
        this.display = view;
        simpleButtonPresenter = new SimpleButtonPresenter(eventBus,
                new SimpleButtonView());
    }

    @Override
    public void go(HasWidgets container) {
        bind();
        container.clear();
        container.add(display.asWidget());
    }

    public void bind() {
        simpleButtonPresenter.bind();
    }
}

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to google-web-tool...@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to