package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage;
import java.util.ArrayList;
import java.util.Collection;
import org.ovirt.engine.core.common.businessentities.ArchitectureType;
import org.ovirt.engine.core.common.businessentities.OriginType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.widget.LeftAlignedUiCommandButton;
import org.ovirt.engine.ui.common.widget.UiCommandButton;
import org.ovirt.engine.ui.common.widget.table.column.AbstractCheckboxColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractEnumColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractImageResourceColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.common.widget.table.header.AbstractCheckboxHeader;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.storage.RegisterVmModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.register.RegisterVmData;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationMessages;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.RegisterVmPopupPresenterWidget;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.inject.Inject;
public class RegisterVmPopupView extends RegisterEntityPopupView<VM, RegisterVmData, RegisterVmModel>
implements RegisterVmPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<RegisterVmModel, RegisterEntityPopupView<VM, RegisterVmData, RegisterVmModel>> {
}
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationMessages messages = AssetProvider.getMessages();
@Inject
public RegisterVmPopupView(EventBus eventBus, Driver driver) {
super(eventBus, driver);
}
@Override
public void edit(final RegisterVmModel model) {
super.edit(model);
model.getEntities().getItemsChangedEvent().addListener((ev, sender, args) -> addBadMacsValidationListener(model));
}
private void addBadMacsValidationListener(RegisterVmModel model) {
for(RegisterVmData vmData : model.getEntities().getItems()) {
vmData.getBadMacsExist().getEntityChangedEvent().addListener((ev, sender, args) -> refreshEntityTable());
}
}
@Override
protected void createEntityTable(RegisterVmModel model) {
entityTable.addColumn(new AbstractImageResourceColumn<RegisterVmData>() {
@Override
public ImageResource getValue(RegisterVmData registerVmData) {
if (registerVmData.getError() != null) {
return resources.errorImage();
}
if (registerVmData.getWarning() != null) {
return resources.alertImage();
}
return null;
}
@Override
public SafeHtml getTooltip(RegisterVmData registerVmData) {
String problem;
if (registerVmData.getError() != null) {
problem = registerVmData.getError();
} else {
problem = registerVmData.getWarning();
}
return problem == null
? null
: new SafeHtmlBuilder().appendEscapedLines(problem).toSafeHtml();
}
}, constants.empty(), "20px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> nameColumn = new AbstractTextColumn<RegisterVmData>() {
@Override
public String getValue(RegisterVmData registerVmData) {
return registerVmData.getVm().getName();
}
};
entityTable.addColumn(nameColumn, constants.nameVm(), "150px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> originColumn = new AbstractEnumColumn<RegisterVmData, OriginType>() {
@Override
protected OriginType getRawValue(RegisterVmData registerVmData) {
return registerVmData.getVm().getOrigin();
}
};
entityTable.addColumn(originColumn, constants.originVm(), "100px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> memoryColumn = new AbstractTextColumn<RegisterVmData>() {
@Override
public String getValue(RegisterVmData registerVmData) {
int size = registerVmData.getVm().getVmMemSizeMb();
return messages.megabytes(String.valueOf(size));
}
};
entityTable.addColumn(memoryColumn, constants.memoryVm(), "100px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> cpuColumn = new AbstractTextColumn<RegisterVmData>() {
@Override
public String getValue(RegisterVmData registerVmData) {
int numOfCpus = registerVmData.getVm().getNumOfCpus();
return String.valueOf(numOfCpus);
}
};
entityTable.addColumn(cpuColumn, constants.cpusVm(), "50px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> archColumn = new AbstractTextColumn<RegisterVmData>() {
@Override
public String getValue(RegisterVmData registerVmData) {
ArchitectureType clusterArch = registerVmData.getVm().getClusterArch();
return String.valueOf(clusterArch);
}
};
entityTable.addColumn(archColumn, constants.architectureVm(), "100px"); //$NON-NLS-1$
AbstractTextColumn<RegisterVmData> diskColumn = new AbstractTextColumn<RegisterVmData>() {
@Override
public String getValue(RegisterVmData registerVmData) {
int numOfDisks = registerVmData.getVm().getDiskMap().size();
return String.valueOf(numOfDisks);
}
};
entityTable.addColumn(diskColumn, constants.disksVm(), "50px"); //$NON-NLS-1$
entityTable.addColumn(creatReassignMacsColumn(), new ReassignBadMacsHeader(), "150px"); //$NON-NLS-1$
entityTable.addColumn(getClusterColumn(), constants.clusterVm(), "150px"); //$NON-NLS-1$
if (model.isQuotaEnabled()) {
entityTable.addColumn(getClusterQuotaColumn(), constants.quotaVm(), "150px"); //$NON-NLS-1$
}
}
private AbstractCheckboxColumn<RegisterVmData> creatReassignMacsColumn() {
final AbstractCheckboxColumn<RegisterVmData> reassignMacsColumn =
new AbstractCheckboxColumn<RegisterVmData>() {
@Override
public Boolean getValue(RegisterVmData registerVmData) {
return registerVmData.getReassignMacs().getEntity();
}
@Override
protected boolean canEdit(RegisterVmData registerVmData) {
return true;
}
@Override
public void render(Context context, RegisterVmData object, SafeHtmlBuilder sb) {
super.render(context, object, sb);
sb.append(templates.textForCheckBox(constants.reassignBadMacs()));
}
};
reassignMacsColumn.setFieldUpdater((index, object, value) -> object.getReassignMacs().setEntity(value));
return reassignMacsColumn;
}
@Override
protected void createInfoPanel(RegisterVmModel model) {
registerEntityInfoPanel = new RegisterVmInfoPanel(model);
entityInfoContainer.add(registerEntityInfoPanel);
}
@Override
protected UiCommandButton createCommandButton(String label, String uniqueId) {
if (RegisterVmModel.VNIC_PROFILE_MAPPING_COMMAND.equals(uniqueId)) {
return new LeftAlignedUiCommandButton(label);
} else {
return super.createCommandButton(label, uniqueId);
}
}
private Collection<RegisterVmData> getTableItems() {
final ListModel<RegisterVmData> tableItems = entityTable.asEditor().flush();
return tableItems == null ? new ArrayList<RegisterVmData>() : tableItems.getItems();
}
private class ReassignBadMacsHeader extends AbstractCheckboxHeader {
@Override
protected void selectionChanged(Boolean value) {
for (RegisterVmData tableEntry : getTableItems()) {
tableEntry.getReassignMacs().setEntity(value);
}
refreshEntityTable();
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public Boolean getValue() {
for (RegisterVmData tableEntry : getTableItems()) {
if (!tableEntry.getReassignMacs().getEntity()) {
return false;
}
}
return true;
}
@Override
public String getLabel() {
return constants.reassignAllBadMacs();
}
}
}