package org.ovirt.engine.ui.common.presenter; import org.ovirt.engine.ui.common.widget.Align; import org.ovirt.engine.ui.common.widget.tab.DynamicTabData; import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.GwtEvent.Type; import com.google.inject.Provider; import com.gwtplatform.common.client.StandardProvider; import com.gwtplatform.mvp.client.ChangeTabHandler; import com.gwtplatform.mvp.client.RequestTabsHandler; import com.gwtplatform.mvp.client.proxy.Gatekeeper; import com.gwtplatform.mvp.client.proxy.NonLeafTabContentProxyImpl; import com.gwtplatform.mvp.client.proxy.PlaceManager; import com.gwtplatform.mvp.client.proxy.PlaceWithGatekeeper; import com.gwtplatform.mvp.client.proxy.TabContentProxyPlaceImpl; /** * Presenter proxy implementation for {@link DynamicTabPresenter} subclasses. * <p> * Code for wrapped proxy implementation should match GWTP-generated {@code TabContentProxyPlaceImpl} subclasses for * presenters acting as tab content (presenters revealed within a {@code TabContainerPresenter}). * * @param <T> * Presenter type. */ public abstract class DynamicTabProxy<T extends DynamicTabPresenter<?, ?>> extends TabContentProxyPlaceImpl<T> implements Provider<T> { public static class WrappedProxy<T extends DynamicTabPresenter<?, ?>> extends NonLeafTabContentProxyImpl<T> { public WrappedProxy(PlaceManager placeManager, EventBus eventBus, Provider<T> presenterProvider, Type<RequestTabsHandler> requestTabsEventType, Type<ChangeTabHandler> changeTabEventType, String label, float priority, String historyToken, Align align) { bind(placeManager, eventBus); this.tabData = new DynamicTabData(label, priority, historyToken, align); this.targetHistoryToken = historyToken; this.requestTabsEventType = requestTabsEventType; this.changeTabEventType = changeTabEventType; this.presenter = new StandardProvider<>(presenterProvider); addRequestTabsHandler(); } } private T presenter; public DynamicTabProxy(PlaceManager placeManager, EventBus eventBus, Gatekeeper gatekeeper, Type<RequestTabsHandler> requestTabsEventType, Type<ChangeTabHandler> changeTabEventType, String label, float priority, String historyToken, Align align) { bind(placeManager, eventBus); setProxy(new WrappedProxy<>(placeManager, eventBus, this, requestTabsEventType, changeTabEventType, label, priority, historyToken, align)); setPlace(new PlaceWithGatekeeper(historyToken, gatekeeper)); // Create and bind presenter eagerly (don't wait for reveal request) Scheduler.get().scheduleDeferred(() -> get()); } @Override public void manualRevealFailed() { super.manualRevealFailed(); getPlaceManager().revealDefaultPlace(); } @Override public final T get() { if (presenter == null) { presenter = createPresenter(); presenter.bind(); } return presenter; } /** * Instantiates the associated presenter. * <p> * This method is called when the presenter is requested for the first time (subsequent requests reuse the existing * presenter instance). */ protected abstract T createPresenter(); }