package org.ovirt.engine.ui.webadmin.uicommon.model;
import java.util.ArrayList;
import java.util.Arrays;
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.SystemTreeItemModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeModel;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.gin.ClientGinjector;
import org.ovirt.engine.ui.webadmin.widget.tree.SystemTreeItemCell;
import com.google.gwt.view.client.DefaultSelectionEventManager;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.inject.Inject;
public class SystemTreeModelProvider extends DataBoundTabModelProvider<SystemTreeItemModel, SystemTreeModel> implements SearchableTreeModelProvider<SystemTreeItemModel, SystemTreeModel> {
private final DefaultSelectionEventManager<SystemTreeItemModel> selectionManager =
DefaultSelectionEventManager.createDefaultManager();
private final SingleSelectionModel<SystemTreeItemModel> selectionModel;
private final ApplicationResources resources;
private final ApplicationTemplates templates;
@Inject
public SystemTreeModelProvider(ClientGinjector ginjector) {
super(ginjector);
this.resources = ginjector.getApplicationResources();
this.templates = ginjector.getApplicationTemplates();
// Create selection model
selectionModel = new SingleSelectionModel<SystemTreeItemModel>();
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
SystemTreeModelProvider.this.setSelectedItems(Arrays.asList(selectionModel.getSelectedObject()));
}
});
}
@Override
protected void onCommonModelChange() {
super.onCommonModelChange();
// Add model reset handler
getModel().getResetRequestedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
ArrayList<SystemTreeItemModel> items = getModel().getItems();
if (items != null && !items.isEmpty()) {
// Select first (root) tree item
selectionModel.setSelected(items.get(0), true);
}
}
});
}
@Override
protected void updateDataProvider(List<SystemTreeItemModel> items) {
// Update data provider only for non-empty data
if (!items.isEmpty()) {
super.updateDataProvider(items);
selectionModel.setSelected(items.get(0), true);
}
}
@Override
public SystemTreeModel getModel() {
return getCommonModel().getSystemTree();
}
@Override
public void setSelectedItems(List<SystemTreeItemModel> items) {
getModel().setSelectedItem(items.size() > 0 ? items.get(0) : null);
}
@Override
public <T> NodeInfo<?> getNodeInfo(T parent) {
SystemTreeItemCell cell = new SystemTreeItemCell(resources, templates);
if (parent != null) {
// Not a root node
SystemTreeItemModel parentModel = (SystemTreeItemModel) parent;
List<SystemTreeItemModel> children = parentModel.getChildren();
return new DefaultNodeInfo<SystemTreeItemModel>(new ListDataProvider<SystemTreeItemModel>(children),
cell, selectionModel, selectionManager, null);
} else {
// This is the root node
return new DefaultNodeInfo<SystemTreeItemModel>(getDataProvider(),
cell, selectionModel, selectionManager, null);
}
}
@Override
public boolean isLeaf(Object value) {
if (value != null) {
SystemTreeItemModel itemModel = (SystemTreeItemModel) value;
List<SystemTreeItemModel> children = itemModel.getChildren();
if (children != null) {
return children.isEmpty();
}
}
return false;
}
}