package org.ovirt.engine.ui.webadmin.section.main.view.popup.vm; import java.util.Objects; import org.ovirt.engine.core.common.businessentities.HostDeviceView; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.idhandler.WithElementId; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.common.widget.HorizontalSplitTable; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; import org.ovirt.engine.ui.common.widget.renderer.NameRenderer; import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.SortedListModel; import org.ovirt.engine.ui.uicommonweb.models.vms.hostdev.AddVmHostDevicesModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.hostdev.AddVmHostDevicePopupPresenterWidget; import com.google.gwt.event.shared.EventBus; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.inject.Inject; public class AddVmHostDevicePopupView extends AbstractModelBoundPopupView<AddVmHostDevicesModel> implements AddVmHostDevicePopupPresenterWidget.ViewDef { interface Driver extends UiCommonEditorDriver<AddVmHostDevicesModel, AddVmHostDevicePopupView> { } interface ViewUiBinder extends UiBinder<SimpleDialogPanel, AddVmHostDevicePopupView> { } interface ViewIdHandler extends ElementIdHandler<AddVmHostDevicePopupView> { } private final Driver driver; @UiField(provided = true) @Path("pinnedHost.selectedItem") @WithElementId ListModelListBoxEditor<VDS> pinnedHostEditor; @UiField @Path("capability.selectedItem") @WithElementId ListModelListBoxEditor<String> capabilityEditor; @UiField(provided = true) HorizontalSplitTable<SortedListModel<EntityModel<HostDeviceView>>, EntityModel<HostDeviceView>> splitTable; @Ignore EntityModelCellTable<SortedListModel<EntityModel<HostDeviceView>>> availableHostDevices; @Ignore EntityModelCellTable<SortedListModel<EntityModel<HostDeviceView>>> selectedHostDevices; private static final ApplicationConstants constants = AssetProvider.getConstants(); @Inject public AddVmHostDevicePopupView(EventBus eventBus, Driver driver, ViewUiBinder uiBinder, ViewIdHandler idHandler) { super(eventBus); initEditors(); initWidget(uiBinder.createAndBindUi(this)); idHandler.generateAndSetIds(this); this.driver = driver; driver.initialize(this); } private void initEditors() { pinnedHostEditor = new ListModelListBoxEditor<>(new NameRenderer<VDS>()); pinnedHostEditor.setLabel(constants.pinnedHost()); availableHostDevices = new EntityModelCellTable<>(true, false, true); selectedHostDevices = new EntityModelCellTable<>(true, false, true); splitTable = new HorizontalSplitTable<>(availableHostDevices, selectedHostDevices, constants.availableHostDevices(), constants.selectedHostDevices()); initHostDeviceCellTable(availableHostDevices); initHostDeviceCellTable(selectedHostDevices); splitTable.enableDoubleClickItemMoving(); } private void initHostDeviceCellTable(EntityModelCellTable<SortedListModel<EntityModel<HostDeviceView>>> hostDeviceTable) { hostDeviceTable.enableColumnResizing(); addHostDeviceColumn(hostDeviceTable, constants.deviceName(), "200px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return hostDevice.getEntity().getDeviceName(); } }); addHostDeviceColumn(hostDeviceTable, constants.vendor(), "200px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return HostDeviceColumnHelper.renderNameId( hostDevice.getEntity().getVendorName(), hostDevice.getEntity().getVendorId()); } }); addHostDeviceColumn(hostDeviceTable, constants.product(), "350px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return HostDeviceColumnHelper.renderNameId( hostDevice.getEntity().getProductName(), hostDevice.getEntity().getProductId()); } }); addHostDeviceColumn(hostDeviceTable, constants.driver(), "100px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return Objects.toString(hostDevice.getEntity().getDriver(), ""); } }); addHostDeviceColumn(hostDeviceTable, constants.currentlyUsedByVm(), "150px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return hostDevice.getEntity().getRunningVmName(); } }); addHostDeviceColumn(hostDeviceTable, constants.attachedToVms(), "150px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return HostDeviceColumnHelper.renderVmNamesList(hostDevice.getEntity().getAttachedVmNames()); } }); addHostDeviceColumn(hostDeviceTable, constants.iommuGroup(), "150px", new AbstractTextColumn<EntityModel<HostDeviceView>>() { //$NON-NLS-1$ @Override public String getValue(EntityModel<HostDeviceView> hostDevice) { return HostDeviceColumnHelper.renderIommuGroup(hostDevice.getEntity().getIommuGroup()); } }); } private void addHostDeviceColumn(EntityModelCellTable<SortedListModel<EntityModel<HostDeviceView>>> hostDeviceTable, String header, String width, AbstractTextColumn<EntityModel<HostDeviceView>> column) { column.makeSortable(); hostDeviceTable.addColumn(column, header, width); } @Override public void edit(AddVmHostDevicesModel model) { splitTable.edit( model.getAvailableHostDevices(), model.getSelectedHostDevices(), model.getAddDeviceCommand(), model.getRemoveDeviceCommand()); driver.edit(model); } @Override public AddVmHostDevicesModel flush() { return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } @Override public void init(AddVmHostDevicesModel model) { availableHostDevices.initModelSortHandler((SortedListModel) model.getAvailableHostDevices()); selectedHostDevices.initModelSortHandler((SortedListModel) model.getSelectedHostDevices()); } }