package org.ovirt.engine.ui.common.widget.uicommon.storage; import java.util.ArrayList; import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum; import org.ovirt.engine.ui.common.CommonApplicationConstants; import org.ovirt.engine.ui.common.PopupSimpleTableResources; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.gin.AssetProvider; import org.ovirt.engine.ui.common.idhandler.HasElementId; import org.ovirt.engine.ui.common.utils.ElementIdUtils; import org.ovirt.engine.ui.common.view.popup.FocusableComponentsContainer; import org.ovirt.engine.ui.common.widget.Align; import org.ovirt.engine.ui.common.widget.HasEditorDriver; import org.ovirt.engine.ui.common.widget.PatternFlyCompatible; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor; import org.ovirt.engine.ui.common.widget.table.column.EmptyColumn; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.DisksAllocationModel; import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Overflow; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; public class DisksAllocationView extends Composite implements HasEditorDriver<DisksAllocationModel>, HasElementId, FocusableComponentsContainer, PatternFlyCompatible { interface Driver extends UiCommonEditorDriver<DisksAllocationModel, DisksAllocationView> { } interface ViewUiBinder extends UiBinder<Widget, DisksAllocationView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } protected interface Style extends CssResource { String diskListPanel(); } @UiField Style style; @UiField FlowPanel diskListPanel; @UiField SimplePanel diskListHeaderPanel; @Ignore @UiField Label diskAllocationLabel; @UiField(provided = true) @Path(value = "diskAllocationTargetEnabled.entity") public EntityModelCheckBoxEditor diskAllocationTargetEnabled; @Ignore EntityModelCellTable<ListModel<DisksAllocationModel>> listHeader; boolean showVolumeType; boolean showSource; boolean showTarget; boolean showQuota; boolean showVolumeFormat; private final Driver driver = GWT.create(Driver.class); private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private String elementId = DOM.createUniqueId(); @Override public int setTabIndexes(int nextTabIndex) { int nbWidgetsInDiskListPanel = diskListPanel.getWidgetCount(); for (int i = 0; i < nbWidgetsInDiskListPanel; ++i) { Widget widget = diskListPanel.getWidget(i); if (widget instanceof FocusableComponentsContainer) { nextTabIndex = ((FocusableComponentsContainer) widget).setTabIndexes(nextTabIndex); } } return nextTabIndex; } public DisksAllocationView() { diskAllocationTargetEnabled = new EntityModelCheckBoxEditor(Align.RIGHT); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); driver.initialize(this); } void updateListHeader() { String width = calculateColumnWidthPercentage() + "%"; //$NON-NLS-1$ listHeader = new EntityModelCellTable<>(false, (Resources) GWT.create( PopupSimpleTableResources.class), true); listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.aliasDisk(), width); listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.provisionedSizeDisk(), width); if (showVolumeType) { listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.allocationDisk(), width); } if (showVolumeFormat) { listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.formatDisk(), width); } if (showSource) { listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.sourceDisk(), width); } if (showTarget) { listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.targetDisk(), width); } listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.diskProfile(), width); if (showQuota) { listHeader.addColumn(new EmptyColumn<DisksAllocationModel>(), constants.quotaDisk(), width); } listHeader.setRowData(new ArrayList<DisksAllocationModel>()); listHeader.setWidth("100%", true); //$NON-NLS-1$ diskListHeaderPanel.setWidget(listHeader); } private String calculateColumnWidthPercentage() { int columnCount = 2; if (showVolumeType) { columnCount++; } if (showVolumeFormat) { columnCount++; } if (showSource) { columnCount++; } if (showTarget) { columnCount++; } columnCount++; if (showQuota) { columnCount++; } // Note the f, forcing this to be a real double instead of an int, is important, eventually this value // is turning into a width of the column percentage, and that allows for fractions of whole percentages // to be used. double columnPercentage = 100f / columnCount; return String.valueOf(columnPercentage); //$NON-NLS-1$ } void updateColumnsAvailability(DisksAllocationModel model) { setShowVolumeType(model.getIsVolumeTypeAvailable()); setShowVolumeFormat(model.getIsVolumeFormatAvailable()); setShowQuota(model.getQuotaEnforcementType() != QuotaEnforcementTypeEnum.DISABLED); setShowSource(model.isSourceAvailable()); setShowTarget(model.isTargetAvailable()); } @Override public void edit(DisksAllocationModel model) { driver.edit(model); initListeners(model); updateColumnsAvailability(model); updateListHeader(); } private void initListeners(final DisksAllocationModel model) { model.getPropertyChangedEvent().addListener((ev, sender, args) -> { if ("Disks".equals(args.propertyName)) { //$NON-NLS-1$ addDiskList(model); } else if ("QuotaEnforcmentType".equals(args.propertyName)) { //$NON-NLS-1$ updateColumnsAvailability(model); updateListHeader(); } }); } void addDiskList(DisksAllocationModel model) { diskListPanel.clear(); diskAllocationLabel.setVisible(!model.getDisks().isEmpty()); int diskIndex = 0; String columnWidth = calculateColumnWidthPercentage(); for (final DiskModel diskModel : model.getDisks()) { DisksAllocationItemView disksAllocationItemView = new DisksAllocationItemView(columnWidth); disksAllocationItemView.edit(diskModel); disksAllocationItemView.setIsAliasChangeable(model.getIsAliasChangable()); disksAllocationItemView.setElementId( ElementIdUtils.createElementId(elementId, "disk" + diskIndex++)); //$NON-NLS-1$ diskListPanel.add(disksAllocationItemView); } } @Override public DisksAllocationModel flush() { return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } public void setListHeight(String listHeight) { diskListPanel.setHeight(listHeight); } public void setListWidth(String listWidth) { diskListPanel.setWidth(listWidth); } public void setListOverflow(Overflow overflow) { diskListPanel.getElement().getStyle().setOverflow(overflow); } public void setShowVolumeType(boolean showVolumeType) { this.showVolumeType = showVolumeType; } public void setShowVolumeFormat(boolean showVolumeFormat) { this.showVolumeFormat = showVolumeFormat; } public void setShowSource(boolean showSource) { this.showSource = showSource; } public void setShowTarget(boolean showTarget) { this.showTarget = showTarget; } public void setShowQuota(boolean showQuota) { this.showQuota = showQuota; } public void addDiskListPanelStyle(String style) { diskListPanel.addStyleName(style); } @Override public void setElementId(String elementId) { this.elementId = elementId; } @Override public void setUsePatternFly(boolean usePatternFly) { diskAllocationTargetEnabled.setUsePatternFly(usePatternFly); if (usePatternFly) { diskListPanel.removeStyleName(style.diskListPanel()); diskAllocationTargetEnabled.setRemoveFormGroup(true); } } }