package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage.backup; import java.util.ArrayList; import java.util.Date; import org.gwtbootstrap3.client.ui.Alert; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.OriginType; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.profiles.CpuProfile; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.ui.common.CommonApplicationTemplates; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.uicommon.model.DetailModelProvider; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelObjectCellTable; import org.ovirt.engine.ui.common.widget.renderer.EnumRenderer; import org.ovirt.engine.ui.common.widget.renderer.NameRenderer; import org.ovirt.engine.ui.common.widget.renderer.StorageDomainFreeSpaceRenderer; import org.ovirt.engine.ui.common.widget.table.column.AbstractCheckboxColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractDiskSizeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractEnumColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractFullDateTimeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractImageResourceColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractSafeHtmlColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; import org.ovirt.engine.ui.common.widget.table.header.ImageResourceHeader; import org.ovirt.engine.ui.common.widget.uicommon.disks.DisksViewColumns; import org.ovirt.engine.ui.uicommonweb.models.HasEntity; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportDiskData; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportEntityData; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportSource; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmData; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmFromExportDomainModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportVmModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmAppListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.VmImportGeneralModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.external.StringUtils; 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.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.backup.ImportVmFromExportDomainPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.widget.table.cell.CustomSelectionCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VmTypeColumn; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; 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.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.gwt.user.client.ui.TabLayoutPanel; import com.google.gwt.view.client.NoSelectionModel; import com.google.gwt.view.client.SingleSelectionModel; import com.google.inject.Inject; public class ImportVmFromExportDomainPopupView extends AbstractModelBoundPopupView<ImportVmFromExportDomainModel> implements ImportVmFromExportDomainPopupPresenterWidget.ViewDef { private static final String EMPTY_STYLE = ""; interface Driver extends UiCommonEditorDriver<ImportVmFromExportDomainModel, ImportVmFromExportDomainPopupView> { } interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ImportVmFromExportDomainPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField(provided = true) @Path(value = "cluster.selectedItem") ListModelListBoxEditor<Cluster> destClusterEditor; @UiField(provided = true) @Path(value = "cpuProfiles.selectedItem") ListModelListBoxEditor<CpuProfile> cpuProfileEditor; @UiField(provided = true) @Path(value = "clusterQuota.selectedItem") ListModelListBoxEditor<Quota> destClusterQuotaEditor; @UiField SplitLayoutPanel splitLayoutPanel; @UiField @Ignore Alert message; @Ignore ListModelObjectCellTable<Object, ImportVmFromExportDomainModel> table; @Ignore ListModelObjectCellTable<DiskImage, SearchableListModel> diskTable; @Ignore ListModelObjectCellTable<VmNetworkInterface, SearchableListModel> nicTable; @Ignore ListModelObjectCellTable<String, VmAppListModel> appTable; @Ignore protected TabLayoutPanel subTabLayoutPanel = null; protected ImportVmFromExportDomainModel importModel; private ImportVmGeneralSubTabView generalView; boolean firstSelection = false; private CustomSelectionCell customSelectionCellFormatType; private Column<DiskImage, String> quotaColumn; protected AbstractImageResourceColumn<Object> isObjectInSystemColumn; private final Driver driver = GWT.create(Driver.class); private static final ApplicationResources resources = AssetProvider.getResources(); private static final ApplicationConstants constants = AssetProvider.getConstants(); private static final ApplicationMessages messages = AssetProvider.getMessages(); @Inject public ImportVmFromExportDomainPopupView(EventBus eventBus) { super(eventBus); initListBoxEditors(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); localize(); driver.initialize(this); initTables(); } private void initSubTabLayoutPanel() { if (subTabLayoutPanel == null) { subTabLayoutPanel = new TabLayoutPanel(CommonApplicationTemplates.TAB_BAR_HEIGHT, Unit.PX); subTabLayoutPanel.addSelectionHandler(event -> subTabLayoutPanelSelectionChanged(event.getSelectedItem())); initGeneralSubTabView(); ScrollPanel nicPanel = new ScrollPanel(); nicPanel.add(nicTable); subTabLayoutPanel.add(nicPanel, constants.importVmNetworkIntefacesSubTabLabel()); ScrollPanel diskPanel = new ScrollPanel(); diskPanel.add(diskTable); subTabLayoutPanel.add(diskPanel, constants.importVmDisksSubTabLabel()); initAppTable(); } } protected void subTabLayoutPanelSelectionChanged(Integer selectedItem) { if (importModel != null) { importModel.setActiveDetailModel((HasEntity<?>) importModel.getDetailModels().get(selectedItem)); } } protected void initGeneralSubTabView() { ScrollPanel generalPanel = new ScrollPanel(); DetailModelProvider<ImportVmModel, VmImportGeneralModel> modelProvider = new DetailModelProvider<ImportVmModel, VmImportGeneralModel>() { @Override public VmImportGeneralModel getModel() { VmImportGeneralModel model = (VmImportGeneralModel) importModel.getDetailModels().get(0); model.setSource(ImportSource.EXPORT_DOMAIN); return model; } @Override public void onSubTabSelected() { } @Override public void onSubTabDeselected() { } }; generalView = new ImportVmGeneralSubTabView(modelProvider); generalPanel.add(generalView); subTabLayoutPanel.add(generalPanel, constants.importVmGeneralSubTabLabel()); } private void initTables() { initMainTable(); initNicsTable(); initDiskTable(); } protected void initAppTable() { appTable = new ListModelObjectCellTable<>(); appTable.addColumn(new AbstractTextColumn<String>() { @Override public String getValue(String object) { return object; } }, constants.installedApp()); appTable.getElement().getStyle().setPosition(Position.RELATIVE); ScrollPanel appPanel = new ScrollPanel(); appPanel.add(appTable); subTabLayoutPanel.add(appPanel, constants.importVmApplicationslSubTabLabel()); } protected void initMainTable() { this.table = new ListModelObjectCellTable<>(); AbstractImageResourceColumn<Object> isProblematicImportVmColumn = new AbstractImageResourceColumn<Object>() { @Override public ImageResource getValue(Object object) { ImportVmData importVmData = (ImportVmData) object; if (importVmData.getError() != null || importVmData.isNameExistsInTheSystem()) { return resources.errorImage(); } if (importVmData.getWarning() != null) { return resources.alertImage(); } return null; } @Override public SafeHtml getTooltip(Object object) { ImportVmData importVmData = (ImportVmData) object; String problem = null; if (importVmData.getError() != null) { problem = importVmData.getError(); } else { problem = importVmData.isNameExistsInTheSystem() ? ConstantsManager.getInstance().getConstants().nameMustBeUniqueInvalidReason() : importVmData.getWarning(); } return problem != null ? SafeHtmlUtils.fromSafeConstant(problem) : null; } }; table.addColumn(isProblematicImportVmColumn, constants.empty(), "20px"); //$NON-NLS-1$ AbstractTextColumn<Object> nameColumn = new AbstractTextColumn<Object>() { @Override public String getValue(Object object) { String originalName = ((ImportVmData) object).getName(); String givenName = ((ImportVmData) object).getVm().getName(); return originalName.equals(givenName) ? givenName : givenName + " (" + originalName + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }; table.addColumn(nameColumn, constants.nameVm(), "150px"); //$NON-NLS-1$ AbstractCheckboxColumn<Object> collapseSnapshotsColumn = new AbstractCheckboxColumn<Object>((index, model, value) -> { ((ImportVmData) model).getCollapseSnapshots().setEntity(value); customSelectionCellFormatType.setEnabled(value); diskTable.asEditor().edit(importModel.getImportDiskListModel()); }) { @Override public Boolean getValue(Object model) { return ((ImportVmData) model).getCollapseSnapshots().getEntity(); } @Override protected boolean canEdit(Object model) { return ((ImportVmData) model).getCollapseSnapshots().getIsChangable(); } @Override protected String getDisabledMessage(Object model) { return ((ImportVmData) model).getCollapseSnapshots().getChangeProhibitionReason(); } @Override public SafeHtml getTooltip(Object object) { SafeHtml superTooltip = super.getTooltip(object); if (superTooltip == null) { return SafeHtmlUtils.fromSafeConstant(constants.importAllocationModifiedCollapse()); } return superTooltip; } }; table.addColumn(collapseSnapshotsColumn, constants.collapseSnapshots(), "10px"); //$NON-NLS-1$ AbstractCheckboxColumn<Object> cloneVMColumn = new AbstractCheckboxColumn<Object>((index, model, value) -> { ((ImportVmData) model).getClone().setEntity(value); table.asEditor().edit(importModel); }) { @Override public Boolean getValue(Object model) { return ((ImportVmData) model).getClone().getEntity(); } @Override protected boolean canEdit(Object model) { return ((ImportVmData) model).getClone().getIsChangable(); } @Override protected String getDisabledMessage(Object model) { return ((ImportVmData) model).getClone().getChangeProhibitionReason(); } }; table.addColumn(cloneVMColumn, constants.cloneVM(), "50px"); //$NON-NLS-1$ AbstractTextColumn<Object> originColumn = new AbstractEnumColumn<Object, OriginType>() { @Override protected OriginType getRawValue(Object object) { return ((ImportVmData) object).getVm().getOrigin(); } }; table.addColumn(originColumn, constants.originVm(), "100px"); //$NON-NLS-1$ table.addColumn( new AbstractSafeHtmlColumn<Object>() { @Override public SafeHtml getValue(Object object) { return VmTypeColumn.getRenderedValue(((ImportVmData) object).getVm()); } }, constants.empty(), "30px"); //$NON-NLS-1$ AbstractTextColumn<Object> memoryColumn = new AbstractTextColumn<Object>() { @Override public String getValue(Object object) { return messages.megabytes(String.valueOf(((ImportVmData) object).getVm().getVmMemSizeMb())); } }; table.addColumn(memoryColumn, constants.memoryVm(), "100px"); //$NON-NLS-1$ AbstractTextColumn<Object> cpuColumn = new AbstractTextColumn<Object>() { @Override public String getValue(Object object) { return String.valueOf(((ImportVmData) object).getVm().getNumOfCpus()); } }; table.addColumn(cpuColumn, constants.cpusVm(), "50px"); //$NON-NLS-1$ AbstractTextColumn<Object> archColumn = new AbstractTextColumn<Object>() { @Override public String getValue(Object object) { return String.valueOf(((ImportVmData) object).getVm().getClusterArch()); } }; table.addColumn(archColumn, constants.architectureVm(), "50px"); //$NON-NLS-1$ AbstractTextColumn<Object> diskColumn = new AbstractTextColumn<Object>() { @Override public String getValue(Object object) { return String.valueOf(((ImportVmData) object).getVm().getDiskMap().size()); } }; table.addColumn(diskColumn, constants.disksVm(), "50px"); //$NON-NLS-1$ isObjectInSystemColumn = new AbstractImageResourceColumn<Object>() { @Override public ImageResource getValue(Object object) { return ((ImportVmData) object).isExistsInSystem() ? resources.logNormalImage() : null; } }; table.addColumn(isObjectInSystemColumn, constants.vmInSetup(), "60px"); //$NON-NLS-1$ table.getSelectionModel().addSelectionChangeHandler(event -> { ImportVmData selectedObject = ((SingleSelectionModel<ImportVmData>) event.getSource()).getSelectedObject(); customSelectionCellFormatType.setEnabled(selectedObject.getCollapseSnapshots().getEntity()); }); ScrollPanel sp = new ScrollPanel(); sp.add(table); splitLayoutPanel.add(sp); table.getElement().getStyle().setPosition(Position.RELATIVE); } private void initNicsTable() { nicTable = new ListModelObjectCellTable<>(); nicTable.enableColumnResizing(); AbstractTextColumn<VmNetworkInterface> nameColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getName(); } }; nicTable.addColumn(nameColumn, constants.nameInterface(), "150px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> networkColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getNetworkName(); } }; nicTable.addColumn(networkColumn, constants.networkNameInterface(), "150px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> profileColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getVnicProfileName(); } }; nicTable.addColumn(profileColumn, constants.profileNameInterface(), "150px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> typeColumn = new AbstractEnumColumn<VmNetworkInterface, VmInterfaceType>() { @Override protected VmInterfaceType getRawValue(VmNetworkInterface object) { return VmInterfaceType.forValue(object.getType()); } }; nicTable.addColumn(typeColumn, constants.typeInterface(), "150px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> macColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getMacAddress(); } }; nicTable.addColumn(macColumn, constants.macInterface(), "150px"); //$NON-NLS-1$ nicTable.getElement().getStyle().setPosition(Position.RELATIVE); } private void initDiskTable() { diskTable = new ListModelObjectCellTable<>(); diskTable.enableColumnResizing(); AbstractTextColumn<DiskImage> aliasColumn = new AbstractTextColumn<DiskImage>() { @Override public String getValue(DiskImage object) { return object.getDiskAlias(); } }; diskTable.addColumn(aliasColumn, constants.aliasDisk(), "100px"); //$NON-NLS-1$ AbstractImageResourceColumn<DiskImage> bootableDiskColumn = new AbstractImageResourceColumn<DiskImage>() { @Override public ImageResource getValue(DiskImage object) { return object.getDiskVmElements().iterator().next().isBoot() ? getDefaultImage() : null; } @Override public ImageResource getDefaultImage() { return resources.bootableDiskIcon(); } @Override public SafeHtml getTooltip(DiskImage object) { if (object.getDiskVmElements().iterator().next().isBoot()) { return SafeHtmlUtils.fromSafeConstant(constants.bootableDisk()); } return null; } }; diskTable.addColumn(bootableDiskColumn, new ImageResourceHeader(DisksViewColumns.bootableDiskColumn.getDefaultImage(), SafeHtmlUtils.fromSafeConstant(constants.bootableDisk())), "30px"); //$NON-NLS-1$ AbstractDiskSizeColumn<DiskImage> sizeColumn = new AbstractDiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getSize(); } }; diskTable.addColumn(sizeColumn, constants.provisionedSizeDisk(), "130px"); //$NON-NLS-1$ AbstractDiskSizeColumn<DiskImage> actualSizeColumn = new AbstractDiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getActualSizeInBytes(); } }; diskTable.addColumn(actualSizeColumn, constants.sizeDisk(), "130px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> dateCreatedColumn = new AbstractFullDateTimeColumn<DiskImage>() { @Override protected Date getRawValue(DiskImage object) { return object.getCreationDate(); } }; diskTable.addColumn(dateCreatedColumn, constants.dateCreatedInterface(), "120px"); //$NON-NLS-1$ diskTable.setSelectionModel(new NoSelectionModel<DiskImage>()); addAllocationColumn(); diskTable.getElement().getStyle().setPosition(Position.RELATIVE); } protected void addAllocationColumn() { ArrayList<String> allocationTypes = new ArrayList<>(); allocationTypes.add(constants.thinAllocation()); allocationTypes.add(constants.preallocatedAllocation()); customSelectionCellFormatType = new CustomSelectionCell(allocationTypes); customSelectionCellFormatType.setStyle(EMPTY_STYLE); AbstractColumn<DiskImage, String> allocationColumn = new AbstractColumn<DiskImage, String>( customSelectionCellFormatType) { @Override public String getValue(DiskImage disk) { ImportDiskData importData = importModel.getDiskImportData(disk.getId()); if (importData == null) { return ""; } return new EnumRenderer<VolumeType>().render(VolumeType.forValue(importData.getSelectedVolumeType() .getValue())); } @Override public SafeHtml getTooltip(DiskImage object) { return SafeHtmlUtils.fromSafeConstant(constants.importAllocationModifiedCollapse()); } }; allocationColumn.setFieldUpdater((index, disk, value) -> { VolumeType tempVolumeType = VolumeType.Sparse; if (value.equals(constants.thinAllocation())) { tempVolumeType = VolumeType.Sparse; } else if (value.equals(constants.preallocatedAllocation())) { tempVolumeType = VolumeType.Preallocated; } ImportDiskData importData = importModel.getDiskImportData(disk.getId()); if (importData != null) { importData.setSelectedVolumeType(tempVolumeType); } }); diskTable.addColumn(allocationColumn, constants.allocationDisk(), "150px"); //$NON-NLS-1$ } private void addStorageDomainsColumn() { CustomSelectionCell customSelectionCellStorageDomain = new CustomSelectionCell(new ArrayList<String>()); customSelectionCellStorageDomain.setStyle(EMPTY_STYLE); Column<DiskImage, String> storageDomainsColumn = new Column<DiskImage, String>(customSelectionCellStorageDomain) { @Override public String getValue(DiskImage disk) { ImportDiskData importData = importModel.getDiskImportData(disk.getId()); ArrayList<String> storageDomainsNameList = new ArrayList<>(); StorageDomain selectedStorageDomain = null; if (importData != null && importData.getStorageDomains() != null) { for (StorageDomain storageDomain : importData.getStorageDomains()) { storageDomainsNameList.add( new StorageDomainFreeSpaceRenderer<>().render(storageDomain)); if (importData.getSelectedStorageDomain() != null) { if (storageDomain.getId().equals(importData.getSelectedStorageDomain().getId())) { selectedStorageDomain = storageDomain; } } } } ((CustomSelectionCell) getCell()).setOptions(storageDomainsNameList); if (!storageDomainsNameList.isEmpty()) { if (selectedStorageDomain != null) { return new StorageDomainFreeSpaceRenderer<>().render(selectedStorageDomain); } else { return storageDomainsNameList.get(0); } } return ""; } }; storageDomainsColumn.setFieldUpdater((index, disk, value) -> { String storageDomainName = value.substring(0, value.lastIndexOf(" (")); //$NON-NLS-1$ importModel.getDiskImportData(disk.getId()).setSelectedStorageDomainString(storageDomainName); diskTable.asEditor().edit(importModel.getImportDiskListModel()); }); diskTable.addColumn(storageDomainsColumn, constants.storageDomainDisk(), "180px"); //$NON-NLS-1$ } private void addStorageQuotaColumn() { if (!importModel.isQuotaEnabled()) { return; } if (quotaColumn != null) { return; } CustomSelectionCell customSelectionCellQuota = new CustomSelectionCell(new ArrayList<String>()); customSelectionCellQuota.setStyle(EMPTY_STYLE); quotaColumn = new Column<DiskImage, String>(customSelectionCellQuota) { @Override public String getValue(DiskImage disk) { ImportDiskData importData = importModel.getDiskImportData(disk.getId()); ArrayList<String> storageQuotaList = new ArrayList<>(); Quota selectedQuota = null; if (importData != null && importData.getQuotaList() != null) { for (Quota quota : importData.getQuotaList()) { storageQuotaList.add(quota.getQuotaName()); if (importData.getSelectedQuota() != null) { if (quota.getId().equals(importData.getSelectedQuota().getId())) { selectedQuota = quota; } } } } ((CustomSelectionCell) getCell()).setOptions(storageQuotaList); if (!storageQuotaList.isEmpty()) { if (selectedQuota != null) { return selectedQuota.getQuotaName(); } else { return storageQuotaList.get(0); } } return ""; } }; quotaColumn.setFieldUpdater((index, disk, value) -> importModel.getDiskImportData(disk.getId()).setSelectedQuotaString(value)); diskTable.addColumn(quotaColumn, constants.quota(), "100px"); //$NON-NLS-1$ } private void initListBoxEditors() { destClusterEditor = new ListModelListBoxEditor<>(new NameRenderer<Cluster>()); destClusterQuotaEditor = new ListModelListBoxEditor<>(new NameRenderer<Quota>()); cpuProfileEditor = new ListModelListBoxEditor<>(new NameRenderer<CpuProfile>()); } private void localize() { destClusterEditor.setLabel(constants.importVm_destCluster()); destClusterQuotaEditor.setLabel(constants.importVm_destClusterQuota()); cpuProfileEditor.setLabel(constants.cpuProfileLabel()); } @SuppressWarnings("unchecked") @Override public void edit(final ImportVmFromExportDomainModel object) { this.importModel = object; table.asEditor().edit(object); addStorageDomainsColumn(); object.getPropertyChangedEvent().addListener((ev, sender, args) -> { if (ImportVmFromExportDomainModel.ON_DISK_LOAD.equals(args.propertyName)) { addStorageQuotaColumn(); table.redraw(); diskTable.asEditor().edit(object.getImportDiskListModel()); } else if (args.propertyName.equals("Message")) { //$NON-NLS-1$ message.setText(object.getMessage()); message.setVisible(StringUtils.isNotEmpty(object.getMessage())); } else if (args.propertyName.equals("InvalidVm")) { //$NON-NLS-1$ table.redraw(); } }); SingleSelectionModel<Object> selectionModel = (SingleSelectionModel<Object>) table.getSelectionModel(); selectionModel.addSelectionChangeHandler(event -> { if (!firstSelection) { object.setActiveDetailModel((HasEntity<?>) object.getDetailModels().get(0)); setGeneralViewSelection(((ImportEntityData<?>) object.getSelectedItem()).getEntity()); firstSelection = true; } splitLayoutPanel.clear(); splitLayoutPanel.addSouth(subTabLayoutPanel, 230); ScrollPanel sp = new ScrollPanel(); sp.add(table); splitLayoutPanel.add(sp); table.getElement().getStyle().setPosition(Position.RELATIVE); }); initSubTabLayoutPanel(); nicTable.asEditor().edit((SearchableListModel) object.getDetailModels().get(1)); diskTable.asEditor().edit((SearchableListModel) object.getDetailModels().get(2)); if (object.getDetailModels().size() > 3) { appTable.asEditor().edit((VmAppListModel) object.getDetailModels().get(3)); } driver.edit(object); } protected void setGeneralViewSelection(Object selectedItem) { generalView.setMainTabSelectedItem((VM) selectedItem); } @Override public ImportVmFromExportDomainModel flush() { table.flush(); nicTable.flush(); diskTable.flush(); if (appTable != null) { appTable.flush(); } return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } }