package org.ovirt.engine.ui.userportal.section.main.presenter;
import java.util.List;
import org.ovirt.engine.ui.common.place.PlaceRequestFactory;
import org.ovirt.engine.ui.common.widget.table.HasActionTable;
import org.ovirt.engine.ui.uicommonweb.models.ListWithDetailsModel;
import org.ovirt.engine.ui.uicommonweb.place.UserPortalApplicationPlaces;
import org.ovirt.engine.ui.userportal.section.main.presenter.tab.MainTabExtendedPresenter;
import org.ovirt.engine.ui.userportal.uicommon.model.UserPortalSearchableTableModelProvider;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.proxy.PlaceManager;
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.shared.proxy.PlaceRequest;
/**
* Base class for side tab presenters that work with {@link ListWithDetailsModel}.
*
* @param <T>
* Table row data type.
* @param <M>
* Model type.
* @param <V>
* View type.
* @param <P>
* Proxy type.
*/
public abstract class AbstractSideTabWithDetailsPresenter<T, M extends ListWithDetailsModel,
V extends AbstractSideTabWithDetailsPresenter.ViewDef<T>, P extends Proxy<?>>
extends AbstractModelActivationPresenter<T, M, V, P> {
public interface ViewDef<T> extends View, HasActionTable<T> {
/**
* Controls the sub tab panel visibility.
*/
void setSubTabPanelVisible(boolean subTabPanelVisible);
}
private final PlaceManager placeManager;
protected final UserPortalSearchableTableModelProvider<T, M> modelProvider;
public AbstractSideTabWithDetailsPresenter(EventBus eventBus, V view, P proxy,
PlaceManager placeManager, UserPortalSearchableTableModelProvider<T, M> modelProvider) {
super(eventBus, view, proxy, modelProvider, MainTabExtendedPresenter.TYPE_SetTabContent);
this.modelProvider = modelProvider;
this.placeManager = placeManager;
}
@Override
protected void onBind() {
super.onBind();
registerHandler(getView().getTable().getSelectionModel()
.addSelectionChangeHandler(event -> {
// Update model selection
modelProvider.setSelectedItems(getSelectedItems());
// Let others know that the table selection has changed
fireTableSelectionChangeEvent();
// Update the layout
updateLayout();
// Reveal the appropriate place based on selection
if (hasSelection()) {
placeManager.revealPlace(getSubTabRequest());
} else {
placeManager.revealPlace(getSideTabRequest());
}
}));
}
@Override
protected void onReveal() {
super.onReveal();
getView().getTable().setLoadingState(LoadingState.LOADING);
// Clear table selection and update sub tab panel visibility
if (hasSelection()) {
clearSelection();
} else {
updateLayout();
}
getView().getTable().resetScrollPosition();
}
@Override
public void onHide() {
super.onHide();
modelProvider.clearCurrentItems();
}
/**
* Subclasses should fire an event to indicate that the table selection has changed.
*/
protected abstract void fireTableSelectionChangeEvent();
void updateLayout() {
getView().setSubTabPanelVisible(hasSelection());
}
/**
* Returns the place request associated with this side tab presenter.
*/
protected abstract PlaceRequest getSideTabRequest();
private PlaceRequest getSubTabRequest() {
return PlaceRequestFactory.get(createRequestToken());
}
protected String createRequestToken() {
String subTabName = modelProvider.getModel().getActiveDetailModel().getHashName();
String requestToken = getSideTabRequest().getNameToken() + UserPortalApplicationPlaces.SUB_TAB_PREFIX + subTabName;
return requestToken;
}
/**
* Returns items currently selected in the table.
*/
protected List<T> getSelectedItems() {
return getView().getTable().getSelectionModel().getSelectedList();
}
/**
* Returns {@code true} when there is at least one item selected in the table, {@code false} otherwise.
*/
protected boolean hasSelection() {
return !getSelectedItems().isEmpty();
}
/**
* Deselects any selected values in the table.
*/
protected void clearSelection() {
getView().getTable().getSelectionModel().clear();
}
}