package org.ovirt.engine.ui.userportal.uicommon.model; import java.util.List; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmPool; import org.ovirt.engine.ui.common.auth.CurrentUser; import org.ovirt.engine.ui.common.presenter.popup.DefaultConfirmationPopupPresenterWidget; import org.ovirt.engine.ui.common.uicommon.model.DataBoundTabModelProvider; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalItemModel; import com.google.gwt.event.shared.EventBus; import com.google.inject.Inject; import com.google.inject.Provider; /** * A {@link DataBoundTabModelProvider} that creates the UiCommon model instance directly, instead of accessing this * instance through CommonModel. * * @param <T> * List model item type. * @param <M> * List model type. */ public class UserPortalDataBoundModelProvider<T, M extends SearchableListModel> extends DataBoundTabModelProvider<T, M> { public interface DataChangeListener<T> { void onDataChange(List<T> items); } private DataChangeListener<T> dataChangeListener; private List<T> selectedItems; private final CurrentUser user; @Inject public UserPortalDataBoundModelProvider(EventBus eventBus, Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, CurrentUser user) { super(eventBus, defaultConfirmPopupProvider); this.user = user; } @Override public Object getKey(T item) { if (item instanceof UserPortalItemModel) { UserPortalItemModel itemModel = (UserPortalItemModel) item; return itemModel.isPool() ? ((VmPool) itemModel.getEntity()).getVmPoolId() : ((VM) itemModel.getEntity()).getId(); } return super.getKey(item); } public void setDataChangeListener(DataChangeListener<T> changeListener) { this.dataChangeListener = changeListener; } @Override protected void updateDataProvider(List<T> items) { super.updateDataProvider(items); retainSelectedItems(); if (dataChangeListener != null) { dataChangeListener.onDataChange(items); } } /** * Retains the item selection of the model. */ protected void retainSelectedItems() { if (selectedItems != null) { super.setSelectedItems(selectedItems); } } @Override public void setSelectedItems(List<T> items) { super.setSelectedItems(items); // Remember current item selection if (rememberModelItemSelection()) { this.selectedItems = items; } } /** * @return {@code true} to remember item selection of the model and retain it upon data updates, {@code false} * otherwise. */ protected boolean rememberModelItemSelection() { return true; } }