package org.ovirt.engine.ui.webadmin.uicommon.model; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.webadmin.gin.ClientGinjector; import com.google.gwt.view.client.AsyncDataProvider; import com.google.gwt.view.client.HasData; import com.google.gwt.view.client.ProvidesKey; /** * A {@link SearchableModelProvider} implementation that provides data to {@link HasData} widgets. * * @param <T> * List model item type. * @param <M> * List model type. */ public abstract class DataBoundTabModelProvider<T, M extends SearchableListModel> extends TabModelProvider<M> implements SearchableModelProvider<T, M> { private final AsyncDataProvider<T> dataProvider; public DataBoundTabModelProvider(ClientGinjector ginjector) { this(ginjector, null); } public DataBoundTabModelProvider(ClientGinjector ginjector, ProvidesKey<T> keyProvider) { super(ginjector); dataProvider = new AsyncDataProvider<T>(keyProvider) { @Override protected void onRangeChanged(HasData<T> display) { // We might get here after the ItemsChangedEvent has been triggered updateData(); } }; } @Override protected void onCommonModelChange() { super.onCommonModelChange(); // Add model items change handler getModel().getItemsChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { updateData(); } }); } /** * Retrieves current data from model and updates the data provider. */ @SuppressWarnings("unchecked") protected void updateData() { List<T> items = (List<T>) getModel().getItems(); if (items == null && handleNullDataAsEmpty()) { items = new ArrayList<T>(); } if (items != null) { updateDataProvider(items); } } /** * Updates the data provider with new data received from model. */ protected void updateDataProvider(List<T> items) { dataProvider.updateRowCount(items.size(), true); dataProvider.updateRowData(0, items); } /** * @return {@code true} to handle {@code null} data as empty data passed to data provider, {@code false} to avoid * handling {@code null} data at all. */ protected boolean handleNullDataAsEmpty() { return false; } protected AsyncDataProvider<T> getDataProvider() { return dataProvider; } /** * Adds a {@link HasData} widget to the data provider. */ public void addDataDisplay(HasData<T> display) { dataProvider.addDataDisplay(display); } }