package com.gwt.mvp.client.presenter; import java.util.ArrayList; import java.util.List; import com.gwt.mvp.client.EventBus; import com.gwt.mvp.client.Presenter; /** * <code>MultiPresenter</code> manage a dynamic list of presenter. Each child can be revealed/disposed on demand. * * @param <D> */ public class MultiPresenter<D extends MultiDisplay> extends ContainerPresenter<D, Presenter> { private final List<Presenter> currents; /** * Build a new instance of <code>MultiPresenter</code>. * * @param display display instance * @param eventBus event bus instance * @param presenters presenters to add */ public MultiPresenter(final D display, final EventBus eventBus, final Presenter... presenters) { super(display, eventBus, presenters); currents = new ArrayList<Presenter>(); } @Override protected void onChildPresenterRevealed(final Presenter presenter) { revealDisplay(); firePresenterRevealedEvent(false); } /** * Adds presenter on current selection. * * @param presenter The presenter to Add. * @return true if the presenter has been added. */ public boolean addCurrentPresenter(final Presenter presenter) { if (!contains(presenter)) { if (!currents.contains(presenter)) { currents.add(presenter); if (isRevealed()) { presenter.revealDisplay(); display.add(presenter.getDisplay()); } } return true; } return false; } /** * Remove the presenter from current selected presenters. * @param presenter * @return true if the presenter has been removed. */ public boolean removeCurrentPresenter(final Presenter presenter) { if (!contains(presenter)) { if (currents.contains(presenter)) { currents.remove(presenter); if (isRevealed() && presenter.isRevealed()) { display.remove(presenter.getDisplay()); presenter.disposeDisplay(); } return true; } } return false; } /** * Reveal all child and add them on display. */ @Override protected void onRevealDisplay() { for (Presenter p : currents) { p.revealDisplay(); display.add(p.getDisplay()); } } /** * Adds the presenter. * If container is revealed, the presenter will be revealed to. * * @param presenter * The presenter to add. * @return If added, returns <code>true</code>. */ public boolean addPresenter(Presenter presenter) { if (!contains(presenter)) { children.add(presenter); /** bind if neccessary */ if (isBound()) { presenter.bind(); } } return true; } /** * Removes the presenter. * * @param presenter The presenter to remove. * @return If removed, returns <code>true</code>. */ public boolean removePresenter(Presenter presenter) { if (contains(presenter)) { children.remove(presenter); if (isBound()) { presenter.unbind(); } return true; } return false; } }