package org.ovirt.engine.ui.webadmin.section.main.presenter;
import org.ovirt.engine.ui.common.presenter.AbstractTabPresenter;
import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.MainModelSelectionChangeEvent;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import com.google.gwt.event.shared.EventBus;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.proxy.PlaceManager;
import com.gwtplatform.mvp.client.proxy.TabContentProxyPlace;
import com.gwtplatform.mvp.shared.proxy.PlaceRequest;
/**
* Base class for main tab presenters.
*
* @param <T>
* Table row data type or {@code Void} if tab view doesn't provide table widget.
* @param <M>
* Main model type.
* @param <V>
* View type.
* @param <P>
* Proxy type.
*/
public abstract class AbstractMainTabPresenter<T, M extends SearchableListModel, V extends View,
P extends TabContentProxyPlace<?>> extends AbstractTabPresenter<V, P> {
protected final PlaceManager placeManager;
protected final MainModelProvider<T, M> modelProvider;
@Inject
private Provider<CommonModel> commonModelProvider;
public AbstractMainTabPresenter(EventBus eventBus, V view, P proxy,
PlaceManager placeManager, MainModelProvider<T, M> modelProvider) {
super(eventBus, view, proxy, MainTabPanelPresenter.TYPE_SetTabContent);
this.placeManager = placeManager;
this.modelProvider = modelProvider;
}
/**
* We use manual reveal since we want to prevent users from accessing this presenter when the corresponding main
* model is not available.
*/
@Override
public boolean useManualReveal() {
return true;
}
@Override
protected void onReveal() {
super.onReveal();
// Notify model provider that the tab has been revealed
modelProvider.onMainTabSelected();
}
@Override
public void prepareFromRequest(PlaceRequest request) {
super.prepareFromRequest(request);
// Reveal presenter only when the main model is available
if (getModel().getIsAvailable()) {
getProxy().manualReveal(this);
} else {
getProxy().manualRevealFailed();
revealActiveMainModelPresenter();
}
}
protected M getModel() {
return modelProvider.getModel();
}
void revealActiveMainModelPresenter() {
MainModelSelectionChangeEvent.fire(this, commonModelProvider.get().getSelectedItem());
}
/**
* Returns the place request associated with this main tab presenter.
*/
protected abstract PlaceRequest getMainTabRequest();
/**
* Controls the sub tab panel visibility.
*/
protected void setSubTabPanelVisible(boolean subTabPanelVisible) {
UpdateMainContentLayoutEvent.fire(this, subTabPanelVisible);
}
}