package org.ovirt.engine.ui.webadmin.section.main.view.popup.host; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; import org.ovirt.engine.ui.common.widget.Align; import org.ovirt.engine.ui.common.widget.RadioButtonPanel; 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.generic.EntityModelCheckBoxEditor; import org.ovirt.engine.ui.uicommonweb.models.hosts.HostSetupNetworksModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.network.LogicalNetworkModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.network.NetworkInterfaceModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.network.NetworkItemModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.network.NetworkLabelModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.network.NetworkOperation; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationMessages; 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.host.HostSetupNetworksPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.ExternalNetworkPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.InternalNetworkPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.InternalNetworksPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.NetworkGroup; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.NetworkLabelPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.NetworkLabelPanel.NewNetworkLabelPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.NetworkPanel; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.NetworkPanelsStyle; import org.ovirt.engine.ui.webadmin.section.main.view.popup.host.panels.SimpleNetworkItemsPanel; import org.ovirt.engine.ui.webadmin.widget.editor.AnimatedVerticalPanel; import org.ovirt.engine.ui.webadmin.widget.footer.StatusPanel; 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.client.ui.Panel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.inject.Inject; public class HostSetupNetworksPopupView extends AbstractModelBoundPopupView<HostSetupNetworksModel> implements HostSetupNetworksPopupPresenterWidget.ViewDef { interface Driver extends UiCommonEditorDriver<HostSetupNetworksModel, HostSetupNetworksPopupView> { } interface ViewUiBinder extends UiBinder<SimpleDialogPanel, HostSetupNetworksPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField RadioButtonPanel networksOrLabels; @UiField Panel networksPanel; @UiField Panel labelsPanel; @UiField InternalNetworksPanel internalNetworkList; @UiField SimpleNetworkItemsPanel<NetworkPanel> externalNetworkList; @UiField SimpleNetworkItemsPanel<NetworkLabelPanel> labelsList; @UiField(provided = true) InfoIcon externalNetworksInfo; @UiField AnimatedVerticalPanel nicList; /* if this panel is contained within a scroll panel, we need to add extra handling for drag-and-drop auto-scrolling. */ @UiField @Ignore StatusPanel statusPanel; @UiField NetworkPanelsStyle style; @UiField(provided = true) @Path(value = "checkConnectivity.entity") EntityModelCheckBoxEditor checkConnectivity; @UiField(provided = true) @Path(value = "commitChanges.entity") EntityModelCheckBoxEditor commitChanges; @UiField(provided = true) InfoIcon checkConnInfo; @UiField(provided = true) InfoIcon commitChangesInfo; private final Driver driver = GWT.create(Driver.class); private final EventBus eventBus; private boolean rendered = false; private boolean keepStatusText; private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationConstants constants = AssetProvider.getConstants(); private static final ApplicationMessages messages = AssetProvider.getMessages(); @Inject public HostSetupNetworksPopupView(EventBus eventBus) { super(eventBus); this.eventBus = eventBus; checkConnectivity = new EntityModelCheckBoxEditor(Align.RIGHT); commitChanges = new EntityModelCheckBoxEditor(Align.RIGHT); externalNetworksInfo = new InfoIcon(templates.italicText(constants.externalNetworksInfo())); checkConnInfo = new InfoIcon(templates.italicTwoLines(constants.checkConnectivityInfoPart1(), constants.checkConnectivityInfoPart2())); commitChangesInfo = new InfoIcon(templates.italicTwoLines(constants.commitChangesInfoPart1(), constants.commitChangesInfoPart2())); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); initStatusPanel(); checkConnectivity.setContentWidgetContainerStyleName(style.checkCon()); commitChanges.setContentWidgetContainerStyleName(style.commitChanges()); initUnassignedItemsPanel(); localize(); setupNicListAutoScrolling(); driver.initialize(this); } private void initUnassignedItemsPanel() { internalNetworkList.setStyle(style); externalNetworkList.setStyle(style); labelsList.setStyle(style); networksOrLabels.addRadioButton(constants.networksPanel(), true, true, event -> onRadioButtonSelection(true)); networksOrLabels.addRadioButton(constants.labelsPanel(), false, true, event -> onRadioButtonSelection(false)); } private void onRadioButtonSelection(boolean networksPanelSelected) { networksPanel.setVisible(networksPanelSelected); labelsPanel.setVisible(!networksPanelSelected); } private void localize() { checkConnectivity.setLabel(constants.checkConHostPopup()); commitChanges.setLabel(constants.saveNetConfigHostPopup()); } // Create an auto-scroll adapter for the nicList's parent ScrollPanel private void setupNicListAutoScrolling() { if (nicList.getParent() instanceof ScrollPanel) { ScrollPanel sp = (ScrollPanel)nicList.getParent(); new AutoScrollAdapter(eventBus, sp); } } @Override public void edit(HostSetupNetworksModel uicommonModel) { driver.edit(uicommonModel); uicommonModel.getNicsChangedEvent().addListener((ev, sender, args) -> { // this is called after both networks and nics were retrieved HostSetupNetworksModel model = (HostSetupNetworksModel) sender; if (!keepStatusText) { initStatusPanel(); } keepStatusText = false; updateNetworks(model.getNetworkModels()); updateLabels(model.getNewNetworkLabelModel(), model.getLabelModels()); updateNics(model.getNicModels()); // mark as rendered rendered = true; }); uicommonModel.getOperationCandidateEvent().addListener((ev, sender, args) -> { NetworkOperation candidate = args.getCandidate(); NetworkItemModel<?> op1 = args.getOp1(); NetworkItemModel<?> op2 = args.getOp2(); if (candidate == null) { setErrorStatus(constants.noValidActionSetupNetwork()); } else { if (candidate.isErroneousOperation()) { setErrorStatus(candidate.getMessage(op1, op2)); } else { if (candidate.isDisplayNetworkAffected(op1, op2)) { setWarningStatus(messages.moveDisplayNetworkWarning(candidate.getMessage(op1, op2))); } else { setValidStatus(candidate.getMessage(op1, op2)); } } } }); internalNetworkList.setSetupModel(uicommonModel); externalNetworkList.setSetupModel(uicommonModel); labelsList.setSetupModel(uicommonModel); } @Override public HostSetupNetworksModel flush() { return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } private void updateNetworks(List<LogicalNetworkModel> allNetworks) { internalNetworkList.clear(); externalNetworkList.clear(); Collections.sort(allNetworks); List<NetworkPanel> staticNetworkPanels = new ArrayList<>(); List<NetworkPanel> dynamicNetworkPanels = new ArrayList<>(); for (LogicalNetworkModel network : allNetworks) { if (network.getNetwork().isExternal()) { dynamicNetworkPanels.add(new ExternalNetworkPanel(network, style)); } else if (!network.isAttached()) { staticNetworkPanels.add(new InternalNetworkPanel(network, style)); } } internalNetworkList.addAll(staticNetworkPanels, !rendered); externalNetworkList.addAll(dynamicNetworkPanels, !rendered); } private void updateLabels(NetworkLabelModel newLabelModel, List<NetworkLabelModel> labels) { labelsList.clear(); List<NetworkLabelPanel> labelPanels = new ArrayList<>(); labelPanels.add(new NewNetworkLabelPanel(newLabelModel, style)); Collections.sort(labels); for (NetworkLabelModel label : labels) { if (!label.isAttached()) { labelPanels.add(new NetworkLabelPanel(label, style)); } } labelsList.addAll(labelPanels, !rendered); } private void updateNics(List<NetworkInterfaceModel> nics) { nicList.clear(); Collections.sort(nics); List<NetworkGroup> groups = new ArrayList<>(); for (NetworkInterfaceModel nic : nics) { groups.add(new NetworkGroup(nic, eventBus, style)); } nicList.addAll(groups, !rendered); } private void initStatusPanel() { setValidStatus(constants.dragToMakeChangesSetupNetwork()); } private void setValidStatus(String message) { keepStatusText = false; statusPanel.setTextAndStyle(message, style.statusPanel(), style.statusLabel()); } private void setWarningStatus(String message) { keepStatusText = true; statusPanel.setTextAndStyle(message, style.warningPanel(), style.warningLabel()); } private void setErrorStatus(String message) { keepStatusText = false; statusPanel.setTextAndStyle(message, style.errorPanel(), style.errorLabel()); } }