package org.ovirt.engine.ui.userportal.section.main.presenter.tab.basic;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.common.idhandler.ProvidesElementId;
import org.ovirt.engine.ui.common.utils.ElementIdUtils;
import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalBasicListModel;
import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalItemModel;
import org.ovirt.engine.ui.userportal.uicommon.model.UserPortalDataBoundModelProvider.DataChangeListener;
import org.ovirt.engine.ui.userportal.uicommon.model.basic.UserPortalBasicListProvider;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.GwtEvent.Type;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gwtplatform.mvp.client.PresenterWidget;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.annotations.ContentSlot;
import com.gwtplatform.mvp.client.proxy.RevealContentHandler;
public class MainTabBasicListPresenterWidget extends PresenterWidget<MainTabBasicListPresenterWidget.ViewDef> implements DataChangeListener<UserPortalItemModel> {
public interface ViewDef extends View, ProvidesElementId {
}
@ContentSlot
public static final Type<RevealContentHandler<?>> TYPE_VmListContent = new Type<>();
private final Provider<MainTabBasicListItemPresenterWidget> itemPresenterWidgetProvider;
private final UserPortalBasicListProvider modelProvider;
private final Map<Guid, MainTabBasicListItemPresenterWidget> currentItemPresenterWidgets = new HashMap<>();
@Inject
public MainTabBasicListPresenterWidget(EventBus eventBus, ViewDef view,
Provider<MainTabBasicListItemPresenterWidget> itemPresenterWidgetProvider,
UserPortalBasicListProvider modelProvider) {
super(eventBus, view);
this.itemPresenterWidgetProvider = itemPresenterWidgetProvider;
this.modelProvider = modelProvider;
modelProvider.setDataChangeListener(this);
}
@Override
public void onDataChange(List<UserPortalItemModel> items) {
int itemIndex = 0;
Set<Guid> itemsToRemove = new HashSet<>(currentItemPresenterWidgets.keySet());
// Clear the list view, detaching any existing item views
clearSlot(TYPE_VmListContent);
// Process newly received data
for (UserPortalItemModel newItem : items) {
Guid newItemId = newItem.getId();
MainTabBasicListItemPresenterWidget itemPresenterWidget = currentItemPresenterWidgets.get(newItemId);
// Create new item presenter widget, if necessary
if (itemPresenterWidget == null) {
itemPresenterWidget = itemPresenterWidgetProvider.get();
currentItemPresenterWidgets.put(newItemId, itemPresenterWidget);
}
// Initialize item presenter widget with new data
itemPresenterWidget.getView().setElementId(ElementIdUtils.createElementId(
getView().getElementId(), "vm" + itemIndex)); //$NON-NLS-1$
itemPresenterWidget.setModel(newItem);
// Update the list view, attaching current item view
addToSlot(TYPE_VmListContent, itemPresenterWidget);
itemsToRemove.remove(newItemId);
itemIndex++;
}
// Cleanup old data
for (Guid oldItemId : itemsToRemove) {
MainTabBasicListItemPresenterWidget itemPresenterWidget = currentItemPresenterWidgets.get(oldItemId);
itemPresenterWidget.unbind();
currentItemPresenterWidgets.remove(oldItemId);
}
selectDefault(modelProvider.getModel(), items);
}
/**
* When there is nothing selected, selects the first. When there is something selected, does nothing.
*/
private void selectDefault(UserPortalBasicListModel model, List<UserPortalItemModel> items) {
if (model.getSelectedItem() != null) {
return;
}
if (items == null || items.size() == 0) {
return;
}
UserPortalItemModel item = items.iterator().next();
if (item == null) {
return;
}
model.setSelectedItem(item);
}
}