package org.ovirt.engine.ui.webadmin.widget.editor; import java.util.ArrayList; 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.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.webadmin.widget.HasEditorDriver; import org.ovirt.engine.ui.webadmin.widget.table.column.RadioboxCell; import com.google.gwt.cell.client.CheckboxCell; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; 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.user.cellview.client.Header; import com.google.gwt.view.client.DefaultSelectionEventManager; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionModel; import com.google.gwt.view.client.SingleSelectionModel; /** * A CellTable of a {@link ListModel} of {@link EntityModel}s * * @param <M> */ public class EntityModelCellTable<M extends ListModel> extends CellTable<EntityModel> implements HasEditorDriver<M> { /** * The ListModel */ private M listModel; /** * Whether to allow multi/single selection */ private final boolean multiSelection; private static final int DEFAULT_PAGESIZE = 1000; private static Resources DEFAULT_RESOURCES = GWT.create(CellTable.Resources.class); private static final int CHECK_COLUMN_WIDTH = 27; /** * Create a new {@link EntityModelCellTable} with Single Selection */ public EntityModelCellTable() { this(false, (Resources) GWT.create(EntityModelCellTableResources.class)); } /** * Create a new {@link EntityModelCellTable} with Single Selection * * @param resources * table's resources */ public EntityModelCellTable(Resources resources) { this(false, resources); } /** * Create a new {@link EntityModelCellTable} * * @param multiSelection * Whether to allow multi/single selection */ public EntityModelCellTable(boolean multiSelection) { this(multiSelection, (Resources) GWT.create(EntityModelCellTableResources.class)); } /** * Create a new {@link EntityModelCellTable} * * @param multiSelection * Whether to allow multi/single selection * * @param resources * table's resources */ public EntityModelCellTable(boolean multiSelection, Resources resources) { this(multiSelection, resources, false); } public EntityModelCellTable(boolean multiSelection, Resources resources, boolean hideCheckbox) { super(DEFAULT_PAGESIZE, resources); this.multiSelection = multiSelection; if (!multiSelection) { setSelectionModel(new SingleSelectionModel<EntityModel>()); } else { setSelectionModel(new MultiSelectionModel<EntityModel>(), DefaultSelectionEventManager.<EntityModel> createCheckboxManager()); } // Handle Selection getSelectionModel().addSelectionChangeHandler(new Handler() { @SuppressWarnings("unchecked") @Override public void onSelectionChange(SelectionChangeEvent event) { if ((EntityModelCellTable.this.listModel == null) || (EntityModelCellTable.this.listModel.getItems() == null)) { return; } // Clear "IsSelected" for (EntityModel entity : (List<EntityModel>) EntityModelCellTable.this.listModel.getItems()) { entity.setIsSelected(false); } EntityModelCellTable.this.listModel.setSelectedItems(null); // Set "IsSelected" SelectionModel<? super EntityModel> selectionModel = EntityModelCellTable.this.getSelectionModel(); if (selectionModel instanceof SingleSelectionModel) { ((SingleSelectionModel<EntityModel>) selectionModel).getSelectedObject().setIsSelected(true); EntityModelCellTable.this.listModel.setSelectedItem(((SingleSelectionModel<EntityModel>) selectionModel).getSelectedObject()); } else if (selectionModel instanceof MultiSelectionModel) { List<EntityModel> selectedItems = new ArrayList<EntityModel>(); for (EntityModel entity : ((MultiSelectionModel<EntityModel>) selectionModel).getSelectedSet()) { entity.setIsSelected(true); selectedItems.add(entity); } EntityModelCellTable.this.listModel.setSelectedItems(selectedItems); } } }); if (!hideCheckbox) { // add selection columns Column<EntityModel, Boolean> checkColumn; if (multiSelection) { checkColumn = new Column<EntityModel, Boolean>( new CheckboxCell(true, false)) { @Override public Boolean getValue(EntityModel object) { return object.getIsSelected(); //return getSelectionModel().isSelected(object); } }; } else { checkColumn = new Column<EntityModel, Boolean>( new RadioboxCell(true, false)) { @Override public Boolean getValue(EntityModel object) { return getSelectionModel().isSelected(object); } }; } addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("<br/>")); setColumnWidth(checkColumn, CHECK_COLUMN_WIDTH, Unit.PX); } } /** * Ad an EntityModelColumn to the Grid * * @param column * @param headerString */ public void addEntityModelColumn(Column<EntityModel, ?> column, String headerString) { super.addColumn(column, headerString); } public void setCustomSelectionColumn(Column customSelectionColumn, String width) { removeColumn(0); insertColumn(0, customSelectionColumn, SafeHtmlUtils.fromSafeConstant("<br/>")); setColumnWidth(customSelectionColumn, width); } @Override public void addColumn(Column column, String headerString) { super.addColumn(column, headerString); } @Override public void addColumn(Column column, String headerString, String width) { super.addColumn(column, headerString); super.setColumnWidth(column, width); } public void addColumn(Column column, Header header, String width) { super.addColumn(column, header); super.setColumnWidth(column, width); } @Override public void insertColumn(int beforeIndex, Column column, String headerString, String width) { super.insertColumn(beforeIndex, column, headerString); super.setColumnWidth(column, width); } @SuppressWarnings("unchecked") @Override public void edit(M object) { this.listModel = object; // Add ItemsChangedEvent Listener object.getItemsChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { M list = (M) sender; List<EntityModel> items = (List<EntityModel>) list.getItems(); setRowData(items == null ? new ArrayList<EntityModel>() : items); } }); object.getSelectedItemChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { M list = (M) sender; getSelectionModel().setSelected((EntityModel) list.getSelectedItem(), true); } }); object.getSelectedItemsChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { M list = (M) sender; if (list.getSelectedItems() != null) { for (Object item : list.getSelectedItems()) { EntityModel entityModel = (EntityModel) item; getSelectionModel().setSelected(entityModel, true); } } } }); } @Override public M flush() { return listModel; } public interface EntityModelCellTableResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/webadmin/css/PopupCellTable.css" }) TableStyle cellTableStyle(); } }