package org.ovirt.engine.ui.webadmin.widget.host; import java.util.List; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.constants.IconType; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.ui.common.css.OvirtCss; import org.ovirt.engine.ui.common.widget.AddRemoveRowWidget; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.FenceAgentListModel; import org.ovirt.engine.ui.uicommonweb.models.hosts.FenceAgentModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.uicommon.model.FenceAgentModelProvider; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class FenceAgentsEditor extends AddRemoveRowWidget<FenceAgentListModel, FenceAgentModel, FenceAgentWidget> { interface WidgetUiBinder extends UiBinder<Widget, FenceAgentsEditor> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } private static final ApplicationConstants constants = AssetProvider.getConstants(); @UiField @Ignore Label header; @UiField @Ignore Label newAgentLabel; @UiField Button newAgentButton; private HandlerRegistration addClickHandlerRegistration; private FenceAgentListModel listModel; //Need this to 'initialize' the model which attaches the appropriate handlers. final FenceAgentModelProvider modelProvider; private boolean isEnabled; @Inject public FenceAgentsEditor(FenceAgentModelProvider modelProvider) { showGhost = false; showAddButton = false; this.modelProvider = modelProvider; initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); newAgentButton.setIcon(IconType.PLUS); addHandlers(); } private void addHandlers() { if (addClickHandlerRegistration != null) { addClickHandlerRegistration.removeHandler(); } addClickHandlerRegistration = newAgentButton.addClickHandler(event -> { if (!items.isEmpty()) { Pair<FenceAgentModel, FenceAgentWidget> modelWidgetPair = items.get(items.size() - 1); getEntry(modelWidgetPair.getSecond()).removeLastButton(); } Pair<FenceAgentModel, FenceAgentWidget> item = addGhostEntry(); onAdd(item.getFirst(), item.getSecond()); item.getFirst().edit(); }); } @Override protected void init(FenceAgentListModel listModel) { this.listModel = listModel; super.init(listModel); header.setText(constants.agentsBySequentialOrder()); newAgentLabel.setText(constants.addNewFenceAgent()); setEnabled(listModel.getIsChangable()); } @Override protected FenceAgentWidget createWidget(final FenceAgentModel model) { modelProvider.initializeModel(model); FenceAgentWidget widget = new FenceAgentWidget(); widget.addUpClickHandler(event -> { listModel.moveUp(model); updateButtonState(); }); widget.addDownClickHandler(event -> { listModel.moveDown(model); updateButtonState(); }); widget.addRemoveConcurrentGroupClickHandler(model, event -> { listModel.removeConcurrent(model); listModel.updateConcurrentList(); }); for (final FenceAgentModel concurrentModel: model.getConcurrentList()) { modelProvider.initializeModel(concurrentModel); widget.addRemoveConcurrentGroupClickHandler(concurrentModel, event -> { listModel.removeConcurrent(concurrentModel); listModel.updateConcurrentList(); }); } widget.edit(model); model.getManagementIp().getEntityChangedEvent().addListener((ev, sender, args) -> { listModel.updateConcurrentList(); for (Pair<FenceAgentModel, FenceAgentWidget> modelWidgetPair: items) { modelWidgetPair.getSecond().refresh(); } }); model.getConcurrentSelectList().getSelectedItemChangedEvent().addListener((ev, sender, args) -> { if (sender instanceof ListModel) { @SuppressWarnings("unchecked") ListModel<String> sourceListModel = (ListModel<String>) sender; if(sourceListModel.getItems() != null && !sourceListModel.getItems().isEmpty() && sourceListModel.getItems() instanceof List) { List<String> options = (List<String>) sourceListModel.getItems(); if (!options.get(0).equals(sourceListModel.getSelectedItem())) { //Another option selected. listModel.makeConcurrent(model, sourceListModel.getSelectedItem()); } } } }); return widget; } private void updateButtonState() { if (!items.isEmpty()) { for (Pair<FenceAgentModel, FenceAgentWidget> modelWidgetPair: items) { modelWidgetPair.getSecond().enableUpButton(!modelWidgetPair.equals(items.get(0)) && isEnabled); modelWidgetPair.getSecond().enableDownButton( !modelWidgetPair.equals(items.get(items.size() - 1)) && isEnabled); } } } @Override protected FenceAgentModel createGhostValue() { final FenceAgentModel ghostModel = new FenceAgentModel(); ghostModel.getPmType().setItems(listModel.getPmTypes()); ghostModel.setHost(listModel.getHostModel()); ghostModel.setOrder(listModel.getItems().size() + 1); return ghostModel; } @Override protected boolean isGhost(FenceAgentModel model) { //If there is no management ip, this is a ghost model. return !model.hasAddress(); } @Override protected void cleanupModelItems() { //Don't clean up items on refresh, when the host dialog closes this gets cleaned up. } @Override public void cleanup() { super.cleanup(); super.cleanupModelItems(); } public void setValue(FenceAgentListModel model) { listModel = model; } @Override protected void onAdd(final FenceAgentModel value, FenceAgentWidget widget) { listModel.getItems().add(value); listModel.updateConcurrentList(); } @Override public void setEnabled(boolean enabled) { this.isEnabled = enabled; super.setEnabled(enabled); newAgentButton.setEnabled(enabled); if (enabled) { newAgentLabel.removeStyleName(OvirtCss.LABEL_DISABLED); header.removeStyleName(OvirtCss.LABEL_DISABLED); } else { newAgentLabel.addStyleName(OvirtCss.LABEL_DISABLED); header.addStyleName(OvirtCss.LABEL_DISABLED); } updateButtonState(); } @Override protected boolean vetoRemoveWidget(Pair<FenceAgentModel, FenceAgentWidget> item, FenceAgentModel value, FenceAgentWidget widget) { value.confirmRemove(); //Always veto, the confirm handler will remove if needed. return true; } }