package org.ovirt.engine.ui.webadmin.section.main.view.popup.provider;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
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.InfoIcon;
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.AbstractCheckboxColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractEditTextColumn;
import org.ovirt.engine.ui.common.widget.table.column.AbstractListModelListBoxColumn;
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.networks.BaseImportNetworksModel;
import org.ovirt.engine.ui.uicommonweb.models.providers.ExternalNetwork;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
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.provider.ImportNetworksPopupPresenterWidget;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
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.inject.Inject;
public class ImportNetworksPopupView extends AbstractModelBoundPopupView<BaseImportNetworksModel> implements ImportNetworksPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<BaseImportNetworksModel, ImportNetworksPopupView> { }
private final Driver driver = GWT.create(Driver.class);
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ImportNetworksPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
@UiField(provided = true)
@Path(value = "providers.selectedItem")
@WithElementId
ListModelListBoxEditor<Provider<?>> providersEditor;
@UiField(provided = true)
HorizontalSplitTable<ListModel<ExternalNetwork>, ExternalNetwork> splitTable;
@Ignore
EntityModelCellTable<ListModel<ExternalNetwork>> providerNetworks;
@Ignore
EntityModelCellTable<ListModel<ExternalNetwork>> importedNetworks;
private AbstractListModelListBoxColumn<ExternalNetwork, StoragePool> dcColumn;
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public ImportNetworksPopupView(EventBus eventBus) {
super(eventBus);
// Initialize Editors
providersEditor = new ListModelListBoxEditor<>(new NameRenderer<Provider<?>>());
providerNetworks = new EntityModelCellTable<>(true, false, true);
importedNetworks = new EntityModelCellTable<>(true, false, true);
splitTable =
new HorizontalSplitTable<>(providerNetworks,
importedNetworks,
constants.providerNetworks(),
constants.importedNetworks());
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
initEntityModelCellTables();
providersEditor.setLabel(constants.networkProvider());
driver.initialize(this);
}
Iterable<ExternalNetwork> getAllImportedNetworks() {
ListModel<ExternalNetwork> tableModel = importedNetworks.asEditor().flush();
return tableModel != null && tableModel.getItems() != null ? tableModel.getItems()
: new ArrayList<ExternalNetwork>();
}
public void refreshImportedNetworks() {
importedNetworks.asEditor().edit(importedNetworks.asEditor().flush());
}
void initEntityModelCellTables() {
providerNetworks.addColumn(new AbstractTextColumn<ExternalNetwork>() {
@Override
public String getValue(ExternalNetwork model) {
return model.getDisplayName();
}
}, constants.nameNetworkHeader());
importedNetworks.addColumn(new AbstractEditTextColumn<ExternalNetwork>((index, model, value) -> model.setDisplayName(value)) {
@Override
public String getValue(ExternalNetwork model) {
return model.getDisplayName();
}
}, constants.nameNetworkHeader());
Column<ExternalNetwork, String> idColumn = new AbstractTextColumn<ExternalNetwork>() {
@Override
public String getValue(ExternalNetwork model) {
return model.getNetwork().getProvidedBy().getExternalId();
}
};
providerNetworks.addColumn(idColumn, constants.idNetworkHeader());
importedNetworks.addColumn(idColumn, constants.idNetworkHeader());
dcColumn = new AbstractListModelListBoxColumn<ExternalNetwork, StoragePool>(new NameRenderer<StoragePool>()) {
@Override
public ListModel<StoragePool> getValue(ExternalNetwork network) {
return network.getDataCenters();
}
};
importedNetworks.addColumn(dcColumn, constants.dcNetworkHeader());
AbstractCheckboxHeader publicAllHeader =
new AbstractCheckboxHeader() {
@Override
protected void selectionChanged(Boolean value) {
for (ExternalNetwork model : getAllImportedNetworks()) {
model.setPublicUse(value);
}
refreshImportedNetworks();
}
@Override
public Boolean getValue() {
for (ExternalNetwork model : getAllImportedNetworks()) {
if (!model.isPublicUse()) {
return false;
}
}
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public void render(Context context, SafeHtmlBuilder sb) {
super.render(context, sb);
sb.append(ImportNetworksPopupView.templates.tableHeaderInlineImage(
SafeHtmlUtils.fromTrustedString(new InfoIcon(
SafeHtmlUtils.EMPTY_SAFE_HTML).toString())));
}
@Override
public SafeHtml getTooltip() {
return ImportNetworksPopupView.templates.textForCheckBoxHeader(constants.publicNetworkTooltip());
}
@Override
public String getLabel() {
return constants.publicNetwork();
}
};
importedNetworks.addColumn(new AbstractCheckboxColumn<ExternalNetwork>((index, model, value) -> {
model.setPublicUse(value);
refreshImportedNetworks();
}) {
@Override
public Boolean getValue(ExternalNetwork model) {
return model.isPublicUse();
}
@Override
protected boolean canEdit(ExternalNetwork model) {
return true;
}
@Override
public void render(Context context, ExternalNetwork object, SafeHtmlBuilder sb) {
super.render(context, object, sb);
sb.append(templates.textForCheckBox("")); //$NON-NLS-1$
}
}, publicAllHeader, "80px"); //$NON-NLS-1$
}
@Override
public void edit(BaseImportNetworksModel model) {
splitTable.edit(model.getProviderNetworks(),
model.getImportedNetworks(),
model.getAddImportCommand(),
model.getCancelImportCommand());
driver.edit(model);
}
@Override
public BaseImportNetworksModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
@Override
public void validateImportedNetworks(List<String> errors) {
importedNetworks.validate(errors);
}
}