package org.ovirt.engine.ui.common.widget.uicommon.storage; import java.util.ArrayList; import java.util.List; import org.gwtbootstrap3.client.ui.constants.Placement; import org.ovirt.engine.core.common.businessentities.storage.LUNs; 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.utils.ElementTooltipUtils; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; 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 com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.dom.client.Style.Visibility; import com.google.gwt.dom.client.TableRowElement; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.Widget; public abstract class AbstractSanStorageList<M extends EntityModel, L extends ListModel> extends Composite { @SuppressWarnings("rawtypes") interface WidgetUiBinder extends UiBinder<Widget, AbstractSanStorageList> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } @UiField SimplePanel treeHeader; @UiField ScrollPanel treeContainer; SanStorageModelBase model; Tree tree; boolean hideLeaf; boolean multiSelection; private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private static final CommonApplicationMessages messages = AssetProvider.getMessages(); public AbstractSanStorageList(SanStorageModelBase model) { this(model, false, false); } public AbstractSanStorageList(SanStorageModelBase model, boolean hideLeaf, boolean multiSelection) { this.model = model; this.hideLeaf = hideLeaf; this.multiSelection = multiSelection; model.setMultiSelection(multiSelection); initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); createHeaderWidget(); createSanStorageListWidget(); } public void activateItemsUpdate() { disableItemsUpdate(); model.getItemsChangedEvent().addListener((ev, sender, args) -> updateItems()); updateItems(); } public void disableItemsUpdate() { model.getItemsChangedEvent().getListeners().clear(); } @SuppressWarnings("unchecked") protected void updateItems() { List<M> items = (List<M>) model.getItems(); tree.clear(); if (items != null) { for (M rootModel : items) { addRootNode(createRootNode(rootModel), createLeafNode(getLeafModel(rootModel))); } } } protected void addRootNode(final TreeItem rootItem, final TreeItem leafItem) { rootItem.getElement().getStyle().setBackgroundColor("#eff3ff"); //$NON-NLS-1$ rootItem.getElement().getStyle().setMarginBottom(1, Unit.PX); rootItem.getElement().getStyle().setPadding(0, Unit.PX); if (leafItem != null) { rootItem.addItem(leafItem); // Defer styling in order to override padding done in: // com.google.gwt.user.client.ui.Tree -> showLeafImage Scheduler.get().scheduleDeferred(() -> { leafItem.getElement().getStyle().setBackgroundColor("#ffffff"); //$NON-NLS-1$ leafItem.getElement().getStyle().setMarginLeft(20, Unit.PX); leafItem.getElement().getStyle().setPadding(0, Unit.PX); Boolean isLeafEmpty = (Boolean) leafItem.getUserObject(); if (isLeafEmpty != null && isLeafEmpty.equals(Boolean.TRUE)) { rootItem.getElement().getElementsByTagName("td").getItem(0).getStyle().setVisibility(Visibility.HIDDEN); //$NON-NLS-1$ } rootItem.getElement().getElementsByTagName("td").getItem(1).getStyle().setWidth(100, Unit.PCT); //$NON-NLS-1$ }); } tree.addItem(rootItem); } protected void grayOutItem(ArrayList<String> grayOutReasons, LunModel model, EntityModelCellTable<ListModel<LunModel>> table) { for (int row = 0; row < table.getRowCount(); row++) { TableRowElement tableRowElement = table.getRowElement(row); if (table.getVisibleItem(row).equals(model)) { tableRowElement.setPropertyBoolean("disabled", true); //$NON-NLS-1$ updateInputTitle(grayOutReasons, tableRowElement); } else { ElementTooltipUtils.destroyTooltip(tableRowElement); } } } protected void updateInputTitle(ArrayList<String> grayOutReasons, Element input) { StringBuilder title = new StringBuilder(constants.empty()); for (String reason : grayOutReasons) { title.append(reason).append(constants.space()); } ElementTooltipUtils.setTooltipOnElement(input, SafeHtmlUtils.fromString(title.toString()), Placement.LEFT); } protected void updateSelectedLunWarning(LunModel lunModel) { LUNs lun = lunModel.getEntity(); String warning = constants.empty(); // Adding 'GrayedOutReasons' if (lun.getStorageDomainId() != null) { warning = messages.lunAlreadyPartOfStorageDomainWarning(lun.getStorageDomainName()); } else if (lun.getDiskId() != null) { warning = messages.lunUsedByDiskWarning(lun.getDiskAlias()); } model.setSelectedLunWarning(warning); } protected void createSanStorageListWidget() { tree = new Tree(); treeContainer.add(tree); } public void setTreeContainerStyleName(String styleName) { treeContainer.setStyleName(styleName); } public void setTreeContainerHeight(double height) { treeContainer.getElement().getStyle().setHeight(height, Unit.PX); } public ScrollPanel getTreeContainer() { return treeContainer; } protected abstract void createHeaderWidget(); protected abstract L getLeafModel(M rootModel); protected abstract TreeItem createRootNode(M rootModel); protected abstract TreeItem createLeafNode(L leafModel); public interface SanStorageListHeaderResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/common/css/SanStorageListHeader.css" }) TableStyle cellTableStyle(); } public interface SanStorageListTargetRootResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/common/css/SanStorageListTargetRoot.css" }) TableStyle cellTableStyle(); } public interface SanStorageListLunTableResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/common/css/SanStorageListLunTable.css" }) TableStyle cellTableStyle(); } public interface SanStorageListLunRootResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/common/css/SanStorageListLunRoot.css" }) TableStyle cellTableStyle(); } public interface SanStorageListTargetTableResources extends CellTable.Resources { interface TableStyle extends CellTable.Style { } @Override @Source({ CellTable.Style.DEFAULT_CSS, "org/ovirt/engine/ui/common/css/SanStorageListTargetTable.css" }) TableStyle cellTableStyle(); } }