package org.ovirt.engine.ui.common.presenter; import org.ovirt.engine.ui.common.presenter.SetDynamicTabAccessibleEvent.SetDynamicTabAccessibleHandler; import org.ovirt.engine.ui.common.widget.tab.AbstractCompositeTab; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.GwtEvent.Type; import com.gwtplatform.mvp.client.Presenter; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.PlaceManager; import com.gwtplatform.mvp.client.proxy.RevealContentHandler; import com.gwtplatform.mvp.shared.proxy.PlaceRequest; /** * Base class for dynamic tab presenters. * <p> * Dynamic tab presenters have their proxies created and bound dynamically during runtime, as opposed to using GWTP * {@code ProxyCodeSplit} or {@code ProxyStandard} annotations that generate proxy implementations via deferred binding. * * @param <V> * View type. * @param <P> * Proxy type. */ public abstract class DynamicTabPresenter<V extends View, P extends DynamicTabProxy<?>> extends Presenter<V, P> implements SetDynamicTabAccessibleHandler { private final PlaceManager placeManager; private boolean tabAccessible = AbstractCompositeTab.DEFAULT_ACCESSIBLE; public DynamicTabPresenter(EventBus eventBus, V view, P proxy, PlaceManager placeManager, Type<RevealContentHandler<?>> slot) { super(eventBus, view, proxy, slot); this.placeManager = placeManager; } @Override protected void onBind() { super.onBind(); registerHandler(getEventBus().addHandler(SetDynamicTabAccessibleEvent.getType(), this)); } @Override public void onSetDynamicTabAccessible(SetDynamicTabAccessibleEvent event) { if (getProxy().getTargetHistoryToken().equals(event.getHistoryToken())) { setTabAccessible(event.isTabAccessible()); } } void setTabAccessible(boolean tabAccessible) { this.tabAccessible = tabAccessible; // If the current place matches dynamic tab presenter, reveal // the place again in order to apply presenter reveal process // after tab accessibility change String currentPlaceToken = placeManager.getCurrentPlaceRequest().getNameToken(); if (getProxy().getTargetHistoryToken().equals(currentPlaceToken)) { placeManager.revealCurrentPlace(); } } boolean isTabAccessible() { return tabAccessible; } /** * We use manual reveal since we want to control dynamic tab presenter accessibility. */ @Override public boolean useManualReveal() { return true; } @Override public void prepareFromRequest(PlaceRequest request) { super.prepareFromRequest(request); // Reveal presenter only when the tab is marked as accessible if (isTabAccessible()) { getProxy().manualReveal(this); } else { getProxy().manualRevealFailed(); } } }