package org.ovirt.engine.ui.common.widget.editor;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.ui.common.widget.HasEditorDriver;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import com.google.gwt.user.cellview.client.AbstractHasData;
/**
* Adapts {@link HasEditorDriver} functionality to {@link AbstractHasData} widgets acting as {@link ListModel} Editors.
*
* @param <M>
* List model type.
* @param <T>
* HasData widget's row data type.
*/
public class HasDataListModelEditorAdapter<M extends ListModel, T> implements HasEditorDriver<M> {
private final AbstractHasData<T> hasDataWidget;
private M listModel;
public HasDataListModelEditorAdapter(AbstractHasData<T> hasDataWidget) {
this.hasDataWidget = hasDataWidget;
}
@SuppressWarnings("unchecked")
@Override
public void edit(M object) {
this.listModel = object;
// Update row data when ListModel items change
object.getItemsChangedEvent().addListener((ev, sender, args) -> {
M list = (M) sender;
List<T> items = (List<T>) list.getItems();
hasDataWidget.setRowData(items == null ? new ArrayList<T>() : items);
});
// Update selection model when ListModel selection changes
object.getSelectedItemChangedEvent().addListener((ev, sender, args) -> {
M list = (M) sender;
hasDataWidget.getSelectionModel().setSelected((T) list.getSelectedItem(), true);
});
object.getSelectedItemsChangedEvent().addListener((ev, sender, args) -> {
M list = (M) sender;
if (list.getSelectedItems() != null) {
for (Object item : list.getSelectedItems()) {
T entityModel = (T) item;
hasDataWidget.getSelectionModel().setSelected(entityModel, true);
}
}
});
// Get items from ListModel and update row data
List<T> items = (List<T>) object.getItems();
hasDataWidget.setRowData(items == null ? new ArrayList<T>() : items);
}
@Override
public M flush() {
return listModel;
}
@Override
public void cleanup() {
if (listModel != null) {
listModel.cleanup();
}
}
}