package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget; 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.EntityModelCellTable; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.RegisterEntityModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportEntityData; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.widget.table.cell.CustomSelectionCell; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; 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.SimplePanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.inject.Inject; public abstract class RegisterEntityPopupView<E, D extends ImportEntityData<E>, M extends RegisterEntityModel<E, D>> extends AbstractModelBoundPopupView<M> implements AbstractModelBoundPopupPresenterWidget.ViewDef<M> { interface ViewUiBinder extends UiBinder<SimpleDialogPanel, RegisterEntityPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } interface ViewIdHandler extends ElementIdHandler<RegisterEntityPopupView> { ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); } protected final UiCommonEditorDriver<M, RegisterEntityPopupView<E, D, M>> driver; protected RegisterEntityInfoPanel<E, D, M> registerEntityInfoPanel; private M registerEntityModel; @UiField SplitLayoutPanel splitLayoutPanel; @UiField SimplePanel entityInfoContainer; @UiField(provided = true) @Ignore EntityModelCellTable<ListModel<D>> entityTable; private static final ApplicationConstants constants = AssetProvider.getConstants(); @Inject public RegisterEntityPopupView(EventBus eventBus, UiCommonEditorDriver<M, RegisterEntityPopupView<E, D, M>> driver) { super(eventBus); this.driver = driver; initTables(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); ViewIdHandler.idHandler.generateAndSetIds(this); this.driver.initialize(this); } protected abstract void createEntityTable(M model); protected abstract void createInfoPanel(M model); private void initTables() { // Create the entities main table entityTable = new EntityModelCellTable<>(false, true); entityTable.enableColumnResizing(); // Create split layout panel splitLayoutPanel = new SplitLayoutPanel(4); } private void createTables(M model) { createEntityTable(model); createInfoPanel(model); entityTable.asEditor().edit(model.getEntities()); model.getEntities().setSelectedItem(Linq.firstOrNull(model.getEntities().getItems())); } protected void refreshEntityTable() { entityTable.asEditor().edit(entityTable.asEditor().flush()); entityTable.redraw(); } @Override public void edit(final M model) { registerEntityModel = model; driver.edit(model); model.getEntities().getSelectedItemChangedEvent().addListener((ev, sender, args) -> { ListModel<D> entities = (ListModel<D>) sender; D importEntityData = entities.getSelectedItem(); if (importEntityData != null) { registerEntityInfoPanel.updateTabsData(importEntityData); } }); model.getCluster().getItemsChangedEvent().addListener((ev, sender, args) -> createTables(model)); model.getCluster().getSelectedItemChangedEvent().addListener((ev, sender, args) -> refreshEntityTable()); model.getClusterQuotasMap().getEntityChangedEvent().addListener((ev, sender, args) -> refreshEntityTable()); model.getStorageQuota().getItemsChangedEvent().addListener((ev, sender, args) -> refreshEntityTable()); } @Override public M flush() { return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } protected Column<D, String> getClusterColumn() { CustomSelectionCell customSelectionCell = new CustomSelectionCell(new ArrayList<String>()); customSelectionCell.setStyle("input-group col-xs-11 gwt-ListBox"); //$NON-NLS-1$ Column<D, String> column = new Column<D, String>(customSelectionCell) { @Override public String getValue(D object) { ((CustomSelectionCell) getCell()).setOptions(object.getClusterNames()); return object.getCluster().getSelectedItem() != null ? object.getCluster().getSelectedItem().getName() : constants.empty(); } }; column.setFieldUpdater((index, object, value) -> { object.selectClusterByName(value); refreshEntityTable(); }); return column; } protected Column<D, String> getClusterQuotaColumn() { CustomSelectionCell customSelectionCell = new CustomSelectionCell(new ArrayList<String>()); customSelectionCell.setStyle("input-group col-xs-11 gwt-ListBox"); //$NON-NLS-1$ Column<D, String> column = new Column<D, String>(customSelectionCell) { @Override public String getValue(D object) { Guid clusterId = object.getCluster().getSelectedItem() != null ? object.getCluster().getSelectedItem().getId() : null; List<Quota> quotas = registerEntityModel.getClusterQuotasMap().getEntity().get(clusterId); object.getClusterQuota().setItems(quotas); ((CustomSelectionCell) getCell()).setOptions(registerEntityModel.getQuotaNames(quotas)); return object.getClusterQuota().getSelectedItem() != null ? object.getClusterQuota().getSelectedItem().getQuotaName() : constants.empty(); } }; column.setFieldUpdater((index, object, value) -> registerEntityModel.selectQuotaByName(value, object.getClusterQuota())); return column; } }