package org.ovirt.engine.ui.webadmin.uicommon.model; import java.util.Arrays; import java.util.Iterator; 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.UICommand; import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.tags.TagListModel; import org.ovirt.engine.ui.uicommonweb.models.tags.TagModel; 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.section.main.presenter.popup.AbstractModelBoundPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.RemoveConfirmationPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.tag.TagPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.widget.tags.TagItemCell; import com.google.gwt.user.cellview.client.CellTree; import com.google.gwt.user.cellview.client.TreeNode; 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; import com.google.inject.Provider; public class TagModelProvider extends DataBoundTabModelProvider<TagModel, TagListModel> implements SearchableTreeModelProvider<TagModel, TagListModel> { private final DefaultSelectionEventManager<TagModel> selectionManager = DefaultSelectionEventManager.createDefaultManager(); private final SingleSelectionModel<TagModel> selectionModel; private final Provider<TagPopupPresenterWidget> popupProvider; private final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider; private final ApplicationResources resources; private final ApplicationTemplates templates; private CellTree display; @Inject public TagModelProvider(ClientGinjector ginjector) { super(ginjector); this.resources = ginjector.getApplicationResources(); this.templates = ginjector.getApplicationTemplates(); this.popupProvider = ginjector.getTagPopupPresenterWidgetProvider(); this.removeConfirmPopupProvider = ginjector.getRemoveConfirmPopupProvider(); // Create selection model selectionModel = new SingleSelectionModel<TagModel>(); selectionModel.addSelectionChangeHandler(new Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { TagModelProvider.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) { Iterator<TagModel> iterator = getModel().getItems().iterator(); if (iterator.hasNext()) { TagModel root = getModel().CloneTagModel(iterator.next()); updateDataProvider(Arrays.asList(root)); } } }); } @Override protected void updateDataProvider(List<TagModel> items) { // Update data provider only for non-empty data if (!items.isEmpty()) { super.updateDataProvider(items); expandTree(); } } private void expandTree() { if (display != null) { expandTree(display.getRootTreeNode()); } } private void expandTree(TreeNode node) { if (node == null) { return; } if (node.getChildCount() > 0) { for (int i = 0; i < node.getChildCount(); i++) { expandTree(node.setChildOpen(i, true)); } } } public void setDisplay(CellTree display) { this.display = display; expandTree(); } @Override public TagListModel getModel() { return getCommonModel().getTagList(); } @Override public void setSelectedItems(List<TagModel> items) { getModel().setSelectedItem(items.size() > 0 ? items.get(0) : null); } @Override public <T> NodeInfo<?> getNodeInfo(T parent) { TagItemCell cell = new TagItemCell(resources, templates); if (parent != null) { // Not a root node TagModel parentModel = (TagModel) parent; List<TagModel> children = parentModel.getChildren(); return new DefaultNodeInfo<TagModel>(new ListDataProvider<TagModel>(children), cell, selectionModel, selectionManager, null); } else { // This is the root node return new DefaultNodeInfo<TagModel>(getDataProvider(), cell, selectionModel, selectionManager, null); } } @Override public boolean isLeaf(Object value) { if (value != null) { TagModel itemModel = (TagModel) value; List<TagModel> children = itemModel.getChildren(); if (children != null) { return children.isEmpty(); } } return false; } public SingleSelectionModel<TagModel> getSelectionModel() { return selectionModel; } @Override protected AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(UICommand lastExecutedCommand) { if (lastExecutedCommand == getModel().getNewCommand() || lastExecutedCommand == getModel().getEditCommand()) { return popupProvider.get(); } else { return super.getModelPopup(lastExecutedCommand); } } @Override protected AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(UICommand lastExecutedCommand) { if (lastExecutedCommand == getModel().getRemoveCommand()) { return removeConfirmPopupProvider.get(); } else { return super.getConfirmModelPopup(lastExecutedCommand); } } }