package org.ovirt.engine.ui.common.widget.uicommon.storage; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.CommonApplicationMessages; import org.ovirt.engine.ui.common.gin.AssetProvider; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.table.cell.CheckboxCell; import org.ovirt.engine.ui.common.widget.table.column.AbstractLunAvailableSizeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractLunSelectionColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractLunTextColumn; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.LunModel; import org.ovirt.engine.ui.uicommonweb.models.storage.SanStorageModelBase; import org.ovirt.engine.ui.uicommonweb.models.storage.SanTargetModel; import org.ovirt.engine.ui.uicompat.IEventListener; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Style.TableLayout; import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.view.client.SingleSelectionModel; public class SanStorageLunToTargetList extends AbstractSanStorageList<LunModel, ListModel> { private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private static final CommonApplicationMessages messages = AssetProvider.getMessages(); public SanStorageLunToTargetList(SanStorageModelBase model) { super(model); } public SanStorageLunToTargetList(SanStorageModelBase model, boolean hideLeaf) { super(model, hideLeaf, false); } public SanStorageLunToTargetList(SanStorageModelBase model, boolean hideLeaf, boolean multiSelection) { super(model, hideLeaf, multiSelection); } @Override protected void createSanStorageListWidget() { super.createSanStorageListWidget(); } @Override protected ListModel getLeafModel(LunModel rootModel) { return rootModel.getTargetsList(); } @Override protected void createHeaderWidget() { EntityModelCellTable<ListModel<LunModel>> table = new EntityModelCellTable<>(false, (Resources) GWT.create(SanStorageListHeaderResources.class), true); // Create select all button addSelectAllButton(table); // Create header table initRootNodeTable(table); // Add first blank column table.insertColumn(0, new TextColumn<LunModel>() { @Override public String getValue(LunModel model) { return ""; //$NON-NLS-1$ } }, "", "15px"); //$NON-NLS-1$ //$NON-NLS-2$ // Add last blank column table.addColumn(new TextColumn<LunModel>() { @Override public String getValue(LunModel model) { return ""; //$NON-NLS-1$ } }, "", "22px"); //$NON-NLS-1$ //$NON-NLS-2$ // Add blank item list table.setRowData(new ArrayList<EntityModel>()); // Style table table.setWidth("100%", true); //$NON-NLS-1$ // Add table as header widget treeHeader.add(table); } private void addSelectAllButton(EntityModelCellTable<ListModel<LunModel>> table) { // Create 'Select All' check-box Header<Boolean> selectAllHeader = new Header<Boolean>(new CheckboxCell(true, false) { @Override public Set<String> getConsumedEvents() { Set<String> consumedEvents = super.getConsumedEvents(); consumedEvents.addAll(getParentConsumedEvents()); return consumedEvents; } }) { @Override public Boolean getValue() { return model.getIsAllLunsSelected(); } }; selectAllHeader.setUpdater(value -> model.setIsAllLunsSelected(value)); table.addColumn(new TextColumn<LunModel>() { @Override public String getValue(LunModel model) { return ""; //$NON-NLS-1$ } }, multiSelection ? selectAllHeader : null, "20px"); //$NON-NLS-1$ } final IEventListener<PropertyChangedEventArgs> lunModelSelectedItemListener = (ev, sender, args) -> { String propName = args.propertyName; final EntityModelCellTable<ListModel> table = (EntityModelCellTable<ListModel>) ev.getContext(); if (propName.equals("IsSelected")) { //$NON-NLS-1$ final LunModel lunModel = (LunModel) sender; Scheduler.get().scheduleDeferred(() -> { table.getSelectionModel().setSelected(lunModel, lunModel.getIsSelected()); table.redraw(); }); } }; @Override protected TreeItem createRootNode(LunModel rootModel) { final EntityModelCellTable<ListModel<LunModel>> table = new EntityModelCellTable<>(multiSelection, (Resources) GWT.create(SanStorageListLunRootResources.class)); // Create table initRootNodeTable(table); // Set custom selection column AbstractLunSelectionColumn lunSelectionColumn = new AbstractLunSelectionColumn(multiSelection) { @Override public LunModel getValue(LunModel object) { return object; } }; table.setCustomSelectionColumn(lunSelectionColumn, "20px"); //$NON-NLS-1$ // Add items List<LunModel> items = new ArrayList<>(); items.add(rootModel); ListModel<LunModel> listModel = new ListModel<>(); listModel.setItems(items); // Update table table.setRowData(items); table.asEditor().edit(listModel); table.setWidth("100%", true); //$NON-NLS-1$ rootModel.getPropertyChangedEvent().removeListener(lunModelSelectedItemListener); rootModel.getPropertyChangedEvent().addListener(lunModelSelectedItemListener, table); if (!multiSelection) { table.getSelectionModel().addSelectionChangeHandler(event -> { SingleSelectionModel SingleSelectionModel = (SingleSelectionModel) event.getSource(); LunModel selectedLunModel = (LunModel) SingleSelectionModel.getSelectedObject(); if (selectedLunModel != null) { updateSelectedLunWarning(selectedLunModel); } }); } else { table.getSelectionModel().setSelected(rootModel, rootModel.getIsSelected()); table.getSelectionModel().addSelectionChangeHandler(event -> model.updateLunWarningForDiscardAfterDelete()); } // Create tree item HorizontalPanel panel = new HorizontalPanel(); panel.add(table); panel.setWidth("100%"); //$NON-NLS-1$ panel.getElement().getStyle().setTableLayout(TableLayout.FIXED); TreeItem item = new TreeItem(panel); // Display LUNs as grayed-out if needed if (rootModel.getIsGrayedOut()) { grayOutItem(rootModel.getGrayedOutReasons(), rootModel, table); } return item; } private void initRootNodeTable(EntityModelCellTable<ListModel<LunModel>> table) { table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return model.getLunId(); } }, constants.lunIdSanStorage()); table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return messages.gigabytes(String.valueOf(model.getSize())); } }, constants.devSizeSanStorage(), "70px"); //$NON-NLS-1$ table.addColumn(new AbstractLunAvailableSizeColumn() { @Override public LunModel getValue(LunModel object) { return object; } }, constants.devAdditionalSizeSanStorage(), "100px"); //$NON-NLS-1$ table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return String.valueOf(model.getMultipathing()); } }, constants.pathSanStorage(), "55px"); //$NON-NLS-1$ table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return model.getVendorId(); } }, constants.vendorIdSanStorage(), "100px"); //$NON-NLS-1$ table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return model.getProductId(); } }, constants.productIdSanStorage(), "100px"); //$NON-NLS-1$ table.addColumn(new AbstractLunTextColumn() { @Override public String getRawValue(LunModel model) { return model.getSerial(); } }, constants.serialSanStorage(), "120px"); //$NON-NLS-1$ } @SuppressWarnings("unchecked") @Override protected TreeItem createLeafNode(ListModel leafModel) { if (hideLeaf) { return null; } EntityModelCellTable<ListModel> table = new EntityModelCellTable<>(false, (Resources) GWT.create(SanStorageListTargetTableResources.class), true); table.addColumn(new TextColumn<SanTargetModel>() { @Override public String getValue(SanTargetModel model) { return model.getName(); } }, constants.targetNameSanStorage()); table.addColumn(new TextColumn<SanTargetModel>() { @Override public String getValue(SanTargetModel model) { return model.getAddress(); } }, constants.addressSanStorage(), "100px"); //$NON-NLS-1$ table.addColumn(new TextColumn<SanTargetModel>() { @Override public String getValue(SanTargetModel model) { return model.getPort(); } }, constants.portSanStorage(), "80px"); //$NON-NLS-1$ List<SanTargetModel> items = (List<SanTargetModel>) leafModel.getItems(); if (items.isEmpty()) { return null; } table.setRowData(items); Object selectedItem = leafModel.getSelectedItem(); leafModel.setSelectedItem(null); table.asEditor().edit(leafModel); leafModel.setSelectedItem(selectedItem); table.setWidth("100%", true); //$NON-NLS-1$ ScrollPanel panel = new ScrollPanel(); panel.add(table); TreeItem item = new TreeItem(panel); return item; } }