package org.ovirt.engine.ui.webadmin.section.main.view.popup; import java.util.ArrayList; import org.gwtbootstrap3.client.ui.Container; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.network.HostNetworkQos; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.ui.common.idhandler.WithElementId; import org.ovirt.engine.ui.common.view.popup.AbstractTabbedModelBoundPopupView; import org.ovirt.engine.ui.common.widget.Align; import org.ovirt.engine.ui.common.widget.UiCommandButton; import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel; import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab; import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable.SelectionMode; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelRadioGroupEditor; import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor; import org.ovirt.engine.ui.common.widget.editor.generic.IntegerEntityModelTextBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.editor.generic.ListModelSuggestBoxEditor; import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor; 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.AbstractTextColumn; import org.ovirt.engine.ui.common.widget.table.header.AbstractCheckboxHeader; import org.ovirt.engine.ui.uicommonweb.models.ApplicationModeHelper; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.TabName; import org.ovirt.engine.ui.uicommonweb.models.datacenters.NetworkClusterModel; import org.ovirt.engine.ui.uicommonweb.models.datacenters.NetworkModel; import org.ovirt.engine.ui.uicommonweb.models.datacenters.NetworkModel.MtuSelector; import org.ovirt.engine.ui.webadmin.ApplicationConstants; 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.AbstractNetworkPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.widget.provider.ExternalSubnetWidget; import org.ovirt.engine.ui.webadmin.widget.vnicProfile.VnicProfilesEditor; 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.SafeHtmlBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.inject.Inject; public abstract class AbstractNetworkPopupView<T extends NetworkModel> extends AbstractTabbedModelBoundPopupView<T> implements AbstractNetworkPopupPresenterWidget.ViewDef<T> { interface ViewUiBinder extends UiBinder<SimpleDialogPanel, AbstractNetworkPopupView<?>> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField public SimpleDialogPanel mainPanel; @UiField @Ignore public Label mainLabel; @UiField @Ignore public Label exportLabel; @UiField @Ignore public Label assignLabel; @UiField(provided = true) @Path(value = "dataCenters.selectedItem") @WithElementId("dataCenter") public ListModelListBoxEditor<StoragePool> dataCenterEditor; @UiField @Path(value = "name.entity") public StringEntityModelTextBoxEditor nameEditor; @UiField @Path(value = "description.entity") public StringEntityModelTextBoxEditor descriptionEditor; @UiField @Path(value = "comment.entity") public StringEntityModelTextBoxEditor commentEditor; @UiField(provided = true) @Path(value = "export.entity") @WithElementId("export") public EntityModelCheckBoxEditor exportEditor; @UiField(provided = true) @Path(value = "externalProviders.selectedItem") @WithElementId("externalProviders") public ListModelListBoxEditor<Provider> externalProviderEditor; @UiField @Path(value = "neutronPhysicalNetwork.entity") @WithElementId("neutronPhysicalNetwork") public StringEntityModelTextBoxEditor neutronPhysicalNetwork; @UiField(provided = true) @Path(value = "isVmNetwork.entity") public final EntityModelCheckBoxEditor isVmNetworkEditor; @UiField(provided = true) @Path(value = "hasVLanTag.entity") public final EntityModelCheckBoxEditor vlanTagging; @UiField @Path(value = "VLanTag.entity") public IntegerEntityModelTextBoxOnlyEditor vlanTag; @UiField @Path(value = "mtuSelector.selectedItem") public ListModelRadioGroupEditor<MtuSelector> mtuSelectorEditor; @Path(value = "mtu.entity") public IntegerEntityModelTextBoxOnlyEditor mtuEditor; @UiField @Path(value = "networkLabel.selectedItem") public ListModelSuggestBoxEditor networkLabel; @UiField(provided = true) @Path(value = "qos.selectedItem") public ListModelListBoxEditor<HostNetworkQos> qosEditor; @UiField public UiCommandButton addQosButton; @UiField(provided = true) @Ignore public final EntityModelCellTable<ListModel<NetworkClusterModel>> clustersTable; @UiField public Container attachContainer; @UiField @Ignore public HTML messageLabel; @UiField(provided = true) @Path(value = "createSubnet.entity") @WithElementId("createSubnet") public EntityModelCheckBoxEditor createSubnetEditor; @UiField @Ignore public ExternalSubnetWidget subnetWidget; @UiField @Ignore public VnicProfilesEditor profilesEditor; @UiField @Ignore protected DialogTab generalTab; @UiField @Ignore protected DialogTab clusterTab; @UiField @Ignore protected DialogTab profilesTab; @UiField @Ignore protected DialogTab subnetTab; @UiField DialogTabPanel tabPanel; @UiField @Ignore public Label profilesLabel; private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationConstants constants = AssetProvider.getConstants(); @Inject public AbstractNetworkPopupView(EventBus eventBus) { super(eventBus); // Initialize Editors dataCenterEditor = new ListModelListBoxEditor<>(new NameRenderer<StoragePool>()); externalProviderEditor = new ListModelListBoxEditor<>(new NameRenderer<Provider>()); qosEditor = new ListModelListBoxEditor<>(new NameRenderer<HostNetworkQos>()); exportEditor = new EntityModelCheckBoxEditor(Align.RIGHT); exportEditor.asCheckBox().addValueChangeHandler(event -> refreshClustersTable()); isVmNetworkEditor = new EntityModelCheckBoxEditor(Align.RIGHT); vlanTagging = new EntityModelCheckBoxEditor(Align.RIGHT); mtuEditor = new IntegerEntityModelTextBoxOnlyEditor(); mtuEditor.setUsePatternFly(true); createSubnetEditor = new EntityModelCheckBoxEditor(Align.RIGHT); this.clustersTable = new EntityModelCellTable<>(SelectionMode.NONE, true); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); initEntityModelCellTable(); localize(); } protected void localize() { generalTab.setLabel(constants.generalTabNetworkPopup()); clusterTab.setLabel(constants.clusterTabNetworkPopup()); profilesTab.setLabel(constants.profilesTabNetworkPopup()); subnetTab.setLabel(constants.subnetTabNetworkPopup()); dataCenterEditor.setLabel(constants.networkPopupDataCenterLabel()); assignLabel.setText(constants.networkPopupAssignLabel()); nameEditor.setLabel(constants.nameLabel()); descriptionEditor.setLabel(constants.descriptionLabel()); exportLabel.setText(constants.exportLabel()); exportEditor.setLabel(constants.exportCheckboxLabel()); externalProviderEditor.setLabel(constants.externalProviderLabel()); neutronPhysicalNetwork.setLabel(constants.neutronPhysicalNetwork()); networkLabel.setLabel(constants.networkLabel()); commentEditor.setLabel(constants.commentLabel()); isVmNetworkEditor.setLabel(constants.vmNetworkLabel()); vlanTagging.setLabel(constants.enableVlanTagLabel()); qosEditor.setLabel(constants.hostNetworkQos()); createSubnetEditor.setLabel(constants.createSubnetLabel()); profilesLabel.setText(constants.profilesLabel()); } @Override public void focusInput() { nameEditor.setFocus(true); } @Override public void setMessageLabel(String label) { messageLabel.setHTML(label); } Iterable<NetworkClusterModel> getClustersTableItems() { ListModel<NetworkClusterModel> tableModel = clustersTable.asEditor().flush(); return tableModel != null && tableModel.getItems() != null ? tableModel.getItems() : new ArrayList<NetworkClusterModel>(); } void refreshClustersTable() { clustersTable.asEditor().edit(clustersTable.asEditor().flush()); } void initEntityModelCellTable() { AbstractCheckboxHeader assignAllHeader = new AbstractCheckboxHeader() { @Override protected void selectionChanged(Boolean value) { for (NetworkClusterModel networkClusterModel : getClustersTableItems()) { if (networkClusterModel.getIsChangable()) { networkClusterModel.setAttached(value); } } refreshClustersTable(); } @Override public Boolean getValue() { for (NetworkClusterModel networkClusterModel : getClustersTableItems()) { if (networkClusterModel.getIsChangable() && !networkClusterModel.isAttached()) { return false; } } return true; } @Override public boolean isEnabled() { for (NetworkClusterModel networkClusterModel : getClustersTableItems()) { if (networkClusterModel.getIsChangable()) { return true; } } return false; } @Override public String getLabel() { return constants.attachAll(); } }; AbstractCheckboxHeader requiredAllHeader = new AbstractCheckboxHeader() { @Override protected void selectionChanged(Boolean value) { for (NetworkClusterModel networkClusterModel : getClustersTableItems()) { networkClusterModel.setRequired(value); } refreshClustersTable(); } @Override public Boolean getValue() { for (NetworkClusterModel networkClusterModel : getClustersTableItems()) { if (!networkClusterModel.isRequired()) { return false; } } return true; } @Override public boolean isEnabled() { return isRequiredChangeable(); } @Override public String getLabel() { return constants.requiredAll(); } }; clustersTable.addColumn(new AbstractTextColumn<NetworkClusterModel>() { @Override public String getValue(NetworkClusterModel model) { return model.getName(); } }, constants.nameClusterHeader()); clustersTable.addColumn(new AbstractCheckboxColumn<NetworkClusterModel>((index, model, value) -> { model.setAttached(value); refreshClustersTable(); }) { @Override public Boolean getValue(NetworkClusterModel model) { return model.isAttached(); } @Override protected boolean canEdit(NetworkClusterModel model) { return model.getIsChangable(); } @Override public void render(Context context, NetworkClusterModel object, SafeHtmlBuilder sb) { super.render(context, object, sb); sb.append(templates.textForCheckBox(constants.attach())); } }, assignAllHeader, "80px"); //$NON-NLS-1$ clustersTable.addColumn(new AbstractCheckboxColumn<NetworkClusterModel>((index, model, value) -> { model.setRequired(value); refreshClustersTable(); }) { @Override public Boolean getValue(NetworkClusterModel model) { return model.isRequired(); } @Override protected boolean canEdit(NetworkClusterModel model) { return isRequiredChangeable(); } @Override public void render(Context context, NetworkClusterModel object, SafeHtmlBuilder sb) { super.render(context, object, sb); sb.append(templates.textForCheckBox(constants.required())); } }, requiredAllHeader, "80px"); //$NON-NLS-1$ } private boolean isRequiredChangeable() { return !exportEditor.asCheckBox().getValue(); } @Override public void edit(T model) { profilesEditor.edit(model.getProfiles()); subnetWidget.edit(model.getSubnetModel()); } @Override public T flush() { profilesEditor.flush(); subnetWidget.flush(); return null; } @Override public void toggleSubnetVisibility(boolean visible) { subnetTab.setVisible(visible); } @Override public void updateVisibility() { messageLabel.setVisible(false); exportLabel.setVisible(ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly)); } @Override public void toggleProfilesVisibility(boolean visible) { profilesTab.setVisible(visible); } @Override public UiCommandButton getQosButton() { return addQosButton; } @Override public void addMtuEditor() { FlowPanel panel = mtuSelectorEditor.asRadioGroup().getPanel(MtuSelector.customMtu); panel.add(mtuEditor); } @Override protected void populateTabMap() { getTabNameMapping().put(TabName.GENERAL_TAB, this.generalTab.getTabListItem()); getTabNameMapping().put(TabName.CLUSTERS_TAB, this.clusterTab.getTabListItem()); getTabNameMapping().put(TabName.PROFILES_TAB, this.profilesTab.getTabListItem()); getTabNameMapping().put(TabName.SUBNET_TAB, this.subnetTab.getTabListItem()); } @Override public DialogTabPanel getTabPanel() { return tabPanel; } }