package org.ovirt.engine.ui.webadmin.section.main.view; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; import org.ovirt.engine.ui.common.widget.action.SubTabTreeActionPanel; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.label.NoItemsLabel; import org.ovirt.engine.ui.common.widget.tree.AbstractSubTabTree; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.ListWithDetailsModel; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.IEventListener; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; public abstract class AbstractSubTabTreeView<E extends AbstractSubTabTree, I, T, M extends ListWithDetailsModel, D extends SearchableListModel> extends AbstractSubTabTableView<I, T, M, D> { interface ViewUiBinder extends UiBinder<Widget, AbstractSubTabTreeView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField WidgetStyle style; @UiField protected SimplePanel headerTableContainer; @UiField protected SimplePanel treeContainer; @UiField protected SimplePanel actionPanelContainer; protected SubTabTreeActionPanel actionPanel; public EntityModelCellTable<ListModel> table; protected E tree; boolean isActionTree; public AbstractSubTabTreeView(SearchableDetailModelProvider modelProvider) { super(modelProvider); table = new EntityModelCellTable<>(false, true); tree = getTree(); initHeader(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); headerTableContainer.add(table); treeContainer.add(tree); actionPanel = createActionPanel(modelProvider); if (actionPanel != null) { actionPanelContainer.add(actionPanel); actionPanel.addContextMenuHandler(tree); } updateStyles(); } private void updateStyles() { treeContainer.addStyleName(isActionTree ? style.actionTreeContainer() : style.treeContainer()); } public void setIsActionTree(boolean isActionTree) { this.isActionTree = isActionTree; updateStyles(); } private final IEventListener<EventArgs> itemsChangedListener = new IEventListener<EventArgs>() { @SuppressWarnings("unchecked") @Override public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) { table.setRowData(new ArrayList<EntityModel>()); // Since tree views don't have an 'emptyTreeWidget to display, we will // use the fact that we are using a table to display the 'header' to have // it display the no items to display message. if (sender instanceof ListModel) { ListModel model = (ListModel) sender; Iterable<M> items = model.getItems(); if (model.getItems() == null || (items instanceof List && ((List<M>) items).isEmpty())) { table.setEmptyTableWidget(new NoItemsLabel()); } else { table.setEmptyTableWidget(null); } } } }; @Override public void setMainTabSelectedItem(I selectedItem) { table.setEmptyTableWidget(null); if (getDetailModel().getItems() == null) { table.setLoadingState(LoadingState.LOADING); } if (!getDetailModel().getItemsChangedEvent().getListeners().contains(itemsChangedListener)) { getDetailModel().getItemsChangedEvent().addListener(itemsChangedListener); } tree.clearTree(); tree.updateTree(getDetailModel()); } protected abstract void initHeader(); protected abstract E getTree(); protected SubTabTreeActionPanel createActionPanel(SearchableDetailModelProvider modelProvider) { return null; } @Override protected boolean useTableWidgetForContent() { return false; } @Override protected void generateIds() { //Do nothing, we don't want the tree tables to have ids. } interface WidgetStyle extends CssResource { String treeContainer(); String actionTreeContainer(); } }