package org.ovirt.engine.ui.common.widget.uicommon.storage;
import java.util.ArrayList;
import java.util.List;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.ovirt.engine.ui.common.CommonApplicationConstants;
import org.ovirt.engine.ui.common.CommonApplicationMessages;
import org.ovirt.engine.ui.common.CommonApplicationResources;
import org.ovirt.engine.ui.common.gin.AssetProvider;
import org.ovirt.engine.ui.common.widget.UiCommandButton;
import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
import org.ovirt.engine.ui.common.widget.label.StringValueLabel;
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.common.widget.table.column.AbstractScrollableTextColumn;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.SortedListModel;
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 com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.TableLayout;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.cellview.client.CellTable.Resources;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
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.user.client.ui.ValueBoxBase.TextAlignment;
import com.google.gwt.view.client.SingleSelectionModel;
public class SanStorageTargetToLunList extends AbstractSanStorageList<SanTargetModel, ListModel> {
protected int treeScrollPosition;
private static final CommonApplicationResources resources = AssetProvider.getResources();
private static final CommonApplicationConstants constants = AssetProvider.getConstants();
private static final CommonApplicationMessages messages = AssetProvider.getMessages();
private LunModel selectedLunModel;
public SanStorageTargetToLunList(SanStorageModelBase model) {
super(model);
}
public SanStorageTargetToLunList(SanStorageModelBase model, boolean hideLeaf) {
super(model, hideLeaf, false);
}
public SanStorageTargetToLunList(SanStorageModelBase model, boolean hideLeaf, boolean multiSelection) {
super(model, hideLeaf, multiSelection);
}
@Override
protected void createSanStorageListWidget() {
super.createSanStorageListWidget();
}
@Override
protected ListModel getLeafModel(SanTargetModel rootModel) {
return rootModel.getLunsList();
}
@Override
protected void createHeaderWidget() {
EntityModelCellTable<ListModel> table = new EntityModelCellTable<>(false,
(Resources) GWT.create(SanStorageListHeaderResources.class),
true);
// Add first blank column
table.addColumn(new TextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return ""; //$NON-NLS-1$
}
}, constants.empty(), "15px"); //$NON-NLS-1$
table.addColumn(new AbstractScrollableTextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return model.getName();
}
}, constants.targetNameSanStorage(), ""); //$NON-NLS-1$
table.addColumn(new AbstractScrollableTextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return model.getAddress();
}
}, constants.addressSanStorage(), "95px"); //$NON-NLS-1$
table.addColumn(new AbstractScrollableTextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return model.getPort();
}
}, constants.portSanStorage(), "65px"); //$NON-NLS-1$
table.setWidth("100%", true); //$NON-NLS-1$
// Add last blank columns
table.addColumn(new TextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return ""; //$NON-NLS-1$
}
}, constants.empty(), "30px"); //$NON-NLS-1$
table.addColumn(new TextColumn<SanTargetModel>() {
@Override
public String getValue(SanTargetModel model) {
return ""; //$NON-NLS-1$
}
}, constants.empty(), "17px"); //$NON-NLS-1$
// Add blank item list
table.setRowData(new ArrayList<EntityModel>());
table.setWidth("100%", true); //$NON-NLS-1$
// Add table as header widget
treeHeader.add(table);
}
private void addLoginButton(HorizontalPanel panel, SanTargetModel rootModel) {
final UiCommandButton loginButton = new UiCommandButton();
loginButton.setCommand(rootModel.getLoginCommand());
loginButton.setTitle(constants.storageIscsiPopupLoginButtonLabel());
loginButton.setIcon(IconType.ARROW_RIGHT);
loginButton.addClickHandler(event -> {
treeScrollPosition = treeContainer.getVerticalScrollPosition();
loginButton.getCommand().execute();
});
loginButton.getElement().getStyle().setFloat(Float.RIGHT);
loginButton.getElement().getStyle().setMarginRight(6, Unit.PX);
panel.add(loginButton);
panel.setCellVerticalAlignment(loginButton, HasVerticalAlignment.ALIGN_MIDDLE);
panel.setCellWidth(loginButton, "35px"); //$NON-NLS-1$
}
private void additemToRootNodePanel(HorizontalPanel panel,
StringValueLabel item,
String text,
String width,
TextAlignment align) {
item.getElement().getStyle().setBackgroundColor("transparent"); //$NON-NLS-1$
item.getElement().getStyle().setColor("black"); //$NON-NLS-1$
item.setValue(text);
panel.add(item);
panel.setCellWidth(item, width);
}
@Override
protected TreeItem createRootNode(SanTargetModel rootModel) {
HorizontalPanel panel = new HorizontalPanel();
additemToRootNodePanel(panel, new StringValueLabel(), rootModel.getName(), "", TextAlignment.LEFT); //$NON-NLS-1$
additemToRootNodePanel(panel, new StringValueLabel(), rootModel.getAddress(), "95px", TextAlignment.LEFT); //$NON-NLS-1$
additemToRootNodePanel(panel, new StringValueLabel(), rootModel.getPort(), "60px", TextAlignment.LEFT); //$NON-NLS-1$
addLoginButton(panel, rootModel);
panel.setSpacing(1);
panel.setWidth("100%"); //$NON-NLS-1$
panel.getElement().getStyle().setTableLayout(TableLayout.FIXED);
return new TreeItem(panel);
}
@SuppressWarnings("unchecked")
@Override
protected TreeItem createLeafNode(ListModel leafModel) {
TreeItem item = new TreeItem();
List<LunModel> items = (List<LunModel>) leafModel.getItems();
if (hideLeaf || items.isEmpty()) {
item.setUserObject(Boolean.TRUE);
return item;
}
final SortedListModel sortedLeafModel = new SortedListModel();
sortedLeafModel.setItems(items);
final EntityModelCellTable<ListModel<LunModel>> table =
new EntityModelCellTable<>(multiSelection, (Resources) GWT.create(SanStorageListLunTableResources.class));
table.initModelSortHandler(sortedLeafModel);
AbstractLunSelectionColumn lunSelectionColumn = new AbstractLunSelectionColumn(multiSelection) {
@Override
public LunModel getValue(LunModel object) {
return object;
}
};
table.setCustomSelectionColumn(lunSelectionColumn, "30px"); //$NON-NLS-1$
AbstractLunTextColumn lunIdColumn = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return model.getLunId();
}
};
lunIdColumn.makeSortable();
table.addColumn(lunIdColumn, constants.lunIdSanStorage());
AbstractLunTextColumn devSizeColumn = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return messages.gigabytes(String.valueOf(model.getSize()));
}
};
devSizeColumn.makeSortable();
table.addColumn(devSizeColumn, constants.devSizeSanStorage(), "70px"); //$NON-NLS-1$
AbstractLunTextColumn path = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return String.valueOf(model.getMultipathing());
}
};
path.makeSortable();
table.addColumn(path, constants.pathSanStorage(), "55px"); //$NON-NLS-1$
AbstractLunTextColumn vendorIdColumn = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return model.getVendorId();
}
};
vendorIdColumn.makeSortable();
table.addColumn(vendorIdColumn, constants.vendorIdSanStorage(), "100px"); //$NON-NLS-1$
AbstractLunTextColumn productIdColumn = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return model.getProductId();
}
};
productIdColumn.makeSortable();
table.addColumn(productIdColumn, constants.productIdSanStorage(), "100px"); //$NON-NLS-1$
AbstractLunTextColumn serialNumColumn = new AbstractLunTextColumn() {
@Override
public String getRawValue(LunModel model) {
return model.getSerial();
}
};
serialNumColumn.makeSortable();
table.addColumn(serialNumColumn, constants.serialSanStorage(), "120px"); //$NON-NLS-1$
table.setRowData(items);
final Object selectedItem = sortedLeafModel.getSelectedItem();
sortedLeafModel.setSelectedItem(null);
table.asEditor().edit(sortedLeafModel);
sortedLeafModel.setSelectedItem(selectedItem);
table.setWidth("100%", true); //$NON-NLS-1$
if (!multiSelection) {
for (LunModel lunModel : items) {
if (lunModel.getIsSelected()) {
table.getSelectionModel().setSelected(lunModel, true);
}
}
table.getSelectionModel().addSelectionChangeHandler(event -> {
SingleSelectionModel SingleSelectionModel = (SingleSelectionModel) event.getSource();
selectedLunModel = SingleSelectionModel.getSelectedObject() == null ? selectedLunModel :
(LunModel) SingleSelectionModel.getSelectedObject();
if (selectedLunModel != null) {
updateSelectedLunWarning(selectedLunModel);
sortedLeafModel.setSelectedItem(selectedLunModel);
}
});
}
else {
for (LunModel lunModel : items) {
table.getSelectionModel().setSelected(lunModel, lunModel.getIsSelected());
}
table.getSelectionModel().addSelectionChangeHandler(event -> model.updateLunWarningForDiscardAfterDelete());
}
ScrollPanel panel = new ScrollPanel();
panel.add(table);
item.setWidget(panel);
// Display LUNs as grayed-out if needed
for (LunModel lunModel : items) {
if (lunModel.getIsGrayedOut()) {
grayOutItem(lunModel.getGrayedOutReasons(), lunModel, table);
}
}
return item;
}
@Override
protected void updateItems() {
super.updateItems();
Scheduler.get().scheduleDeferred(() -> treeContainer.setVerticalScrollPosition(treeScrollPosition));
}
}