package com.gwt.mvp.client.presenter.tab; 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.gwt.mvp.client.Display; import com.gwt.mvp.client.EventBus; import com.gwt.mvp.client.Presenter; import com.gwt.mvp.client.event.TabItemClosedEvent; import com.gwt.mvp.client.presenter.BasePresenter; /** * <code>TabItemPresenter</code> add necessary data on a <code>Presenter</code> added in a tab container. * */ public class TabItemPresenter extends BasePresenter<TabItemPresenter.TabItemDisplay> { /** * <code>TabItemDisplay</code> add method to manage "close" handler. * * @author Jerome Guibert */ public interface TabItemDisplay extends Display { /** * @return an instance of <code>HasClickHandlers</code> if closed event is managed, null if not. */ public HasClickHandlers getClose(); } /** associated presenter. */ private final Presenter presenter; /** * Build a new instance of <code>TabItemPresenter</code>. * * @param tabItemDisplay * @param eventBus * @param presenter */ public TabItemPresenter(final TabItemDisplay tabItemDisplay, final EventBus eventBus, final Presenter presenter) { super(tabItemDisplay, eventBus); this.presenter = presenter; } @Override public String toString() { return "TabItemPresenter [presenter=" + presenter + "]"; } /** * @return Inner presenter instance. */ public Presenter getPresenter() { return presenter; } /** * Handle inner presenter {@link #bind()}. */ @Override protected void onBind() { presenter.bind(); } /** * Handle inner presenter {@link #unbind()}. */ @Override protected void onUnbind() { presenter.unbind(); } /** * Handle inner presenter {@link #disposeDisplay()}. */ @Override protected void onDisposeDisplay() { presenter.disposeDisplay(); } /** * Handle inner presenter {@link #revealDisplay()}, and handle {@link HasClickHandlers} if <code>TabItemDisplay</code> return one. */ @Override protected void onRevealDisplay() { presenter.revealDisplay(); // if display return a ClickHandler for close tab, we add handler if (display.getClose() != null) { display.getClose().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { fireTabItemClosedEvent(); } }); } } /** * Utility method to fire a <code>TabItemClosedEvent</code> event. */ protected void fireTabItemClosedEvent() { eventBus.fireEvent(new TabItemClosedEvent(this)); } /** * @return a display instance of child presenter. */ public Display getChildDisplay() { return presenter.getDisplay(); } @Override public int hashCode() { return presenter.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Presenter)) return false; Presenter other = (Presenter)obj; if (other instanceof TabItemPresenter) { TabItemPresenter tother = (TabItemPresenter) other; return presenter.equals(tother.getPresenter()); } return presenter.equals(other); } }