package org.ovirt.engine.ui.common.widget.editor; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.PopupTableResources; import org.ovirt.engine.ui.common.gin.AssetProvider; import org.ovirt.engine.ui.common.widget.HasEditorDriver; import org.ovirt.engine.ui.common.widget.IsEditorDriver; import org.ovirt.engine.ui.common.widget.table.ColumnResizeCellTable; import org.ovirt.engine.ui.common.widget.table.cell.CheckboxCell; import org.ovirt.engine.ui.common.widget.table.cell.RadioboxCell; import org.ovirt.engine.ui.common.widget.table.header.AbstractSelectAllCheckBoxHeader; import org.ovirt.engine.ui.common.widget.table.header.SafeHtmlHeader; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.view.client.DefaultSelectionEventManager; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.SelectionModel; import com.google.gwt.view.client.SingleSelectionModel; /** * A {@code CellTable} acting as Editor of {@link ListModel} objects containing arbitrary items. * * @param <T> * Table row data type. * @param <M> * List model type. */ public class ListModelObjectCellTable<T, M extends ListModel> extends ColumnResizeCellTable<T> implements IsEditorDriver<M> { private static final int DEFAULT_PAGESIZE = 1000; private static final int CHECK_COLUMN_WIDTH = 27; private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private final HasDataListModelEditorAdapter<M, T> editorAdapter; public ListModelObjectCellTable() { super(DEFAULT_PAGESIZE, (CellTable.Resources) GWT.create(PopupTableResources.class)); this.editorAdapter = new HasDataListModelEditorAdapter<>(this); SingleSelectionModel<T> selectionModel = new SingleSelectionModel<>(); setSelectionModel(selectionModel); getSelectionModel().addSelectionChangeHandler(event -> getListModel().setSelectedItem(((SingleSelectionModel<?>) getSelectionModel()).getSelectedObject())); } public ListModelObjectCellTable(boolean multiSelection) { this(multiSelection, false); } @SuppressWarnings("unchecked") public ListModelObjectCellTable(boolean multiSelection, boolean showSelectAllCheckbox) { this(); if (!multiSelection) { setSelectionModel(new SingleSelectionModel<T>()); } else { setSelectionModel(new MultiSelectionModel<T>(), DefaultSelectionEventManager.<T> createCheckboxManager()); } // Handle Selection getSelectionModel().addSelectionChangeHandler(event -> { if (getListModel() == null || getListModel().getItems() == null) { return; } // Clear "IsSelected" getListModel().setSelectedItems(null); // Set "IsSelected" SelectionModel<? super T> selectionModel = ListModelObjectCellTable.this.getSelectionModel(); if (selectionModel instanceof SingleSelectionModel) { getListModel().setSelectedItem(((SingleSelectionModel<T>) selectionModel).getSelectedObject()); } else if (selectionModel instanceof MultiSelectionModel) { List<T> selectedItems = new ArrayList<>(); for (T entity : ((MultiSelectionModel<T>) selectionModel).getSelectedSet()) { selectedItems.add(entity); } getListModel().setSelectedItems(selectedItems); } }); // add selection columns Column<T, Boolean> checkColumn; if (multiSelection) { checkColumn = new Column<T, Boolean>( new CheckboxCell(true, false)) { @Override public Boolean getValue(T object) { return getSelectionModel().isSelected(object); } }; if (showSelectAllCheckbox) { final AbstractSelectAllCheckBoxHeader<T> selectAllHeader = new AbstractSelectAllCheckBoxHeader<T>() { @Override protected void selectionChanged(Boolean value) { if (getListModel() == null || getListModel().getItems() == null) { return; } handleSelection(value, getListModel(), getSelectionModel()); } @Override public Boolean getValue() { if (getListModel() == null || getListModel().getItems() == null) { return false; } return getCheckValue(getListModel().getItems(), getSelectionModel()); } }; addColumn(checkColumn, selectAllHeader); } else { addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant(constants.htmlNonBreakingSpace())); } } else { checkColumn = new Column<T, Boolean>( new RadioboxCell(true, false)) { @Override public Boolean getValue(T object) { return getSelectionModel().isSelected(object); } }; addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant(constants.htmlNonBreakingSpace())); } setColumnWidth(checkColumn, CHECK_COLUMN_WIDTH, Unit.PX); } public void selectAll() { for (T item : getVisibleItems()) { getSelectionModel().setSelected(item, true); } } M getListModel() { return asEditor().flush(); } @Override public HasEditorDriver<M> asEditor() { return editorAdapter; } @Override public void addColumn(Column<T, ?> column, String headerText, String width) { addColumn(column, headerText); setColumnWidth(column, width); } public void addColumn(Column column, SafeHtml headerHtml, String width) { addColumnWithHtmlHeader(column, headerHtml, width); } public void addColumn(Column column, SafeHtmlHeader header, String width) { super.addColumnAndSetWidth(column, header, width); } public void addColumnAt(Column<T, ?> column, String headerText, String width, int position) { insertColumn(position, column, headerText); setColumnWidth(column, width); } }