package org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.scheduling.PolicyUnit;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
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.ListModelListBoxOnlyEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.form.key_value.KeyValueWidget;
import org.ovirt.engine.ui.common.widget.renderer.NameRenderer;
import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.NewClusterPolicyModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.key_value.KeyValueModel;
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.scheduling.ClusterPolicyPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.FunctionPolicyUnitPanel;
import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitListPanel;
import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.resources.client.CssResource;
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.Label;
import com.google.inject.Inject;
public class ClusterPolicyPopupView extends AbstractModelBoundPopupView<NewClusterPolicyModel> implements ClusterPolicyPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<NewClusterPolicyModel, ClusterPolicyPopupView> {
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ClusterPolicyPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<ClusterPolicyPopupView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private final Driver driver = GWT.create(Driver.class);
@UiField
@Path(value = "name.entity")
@WithElementId("name")
StringEntityModelTextBoxEditor nameEditor;
@UiField
@Path(value = "description.entity")
@WithElementId("description")
StringEntityModelTextBoxEditor descriptionEditor;
@UiField(provided = true)
@Path(value = "loadBalanceList.selectedItem")
@WithElementId("loadBalanceList")
public ListModelListBoxOnlyEditor<PolicyUnit> loadBalanceListEditor;
@UiField
@Ignore
protected KeyValueWidget<KeyValueModel> customPropertiesSheetEditor;
@UiField(provided = true)
PolicyUnitListPanel usedFilterPanel;
@UiField(provided = true)
PolicyUnitListPanel unusedFilterPanel;
@UiField(provided = true)
PolicyUnitListPanel usedFunctionPanel;
@UiField(provided = true)
PolicyUnitListPanel unusedFunctionPanel;
@UiField
WidgetStyle style;
@UiField(provided = true)
InfoIcon filterInfoIcon;
@UiField(provided = true)
InfoIcon functionInfoIcon;
@UiField(provided = true)
InfoIcon loadBalancingInfoIcon;
@UiField(provided = true)
InfoIcon propertiesInfoIcon;
@UiField
@Ignore
Label externalLabel;
@UiField
FlowPanel clusterPolicyPropertiesZone;
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public ClusterPolicyPopupView(EventBus eventBus) {
super(eventBus);
initListBoxEditors();
initPanels();
initInfoIcons();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
ViewIdHandler.idHandler.generateAndSetIds(this);
driver.initialize(this);
}
private void initPanels() {
usedFilterPanel = new PolicyUnitListPanel(PolicyUnitPanel.FILTER, true);
unusedFilterPanel = new PolicyUnitListPanel(PolicyUnitPanel.FILTER, false);
usedFunctionPanel = new PolicyUnitListPanel(FunctionPolicyUnitPanel.FUNCTION, true);
unusedFunctionPanel = new PolicyUnitListPanel(FunctionPolicyUnitPanel.FUNCTION, false);
}
private void setPanelModel(NewClusterPolicyModel model) {
usedFilterPanel.setModel(model);
unusedFilterPanel.setModel(model);
usedFunctionPanel.setModel(model);
unusedFunctionPanel.setModel(model);
}
private void initListBoxEditors() {
loadBalanceListEditor = new ListModelListBoxOnlyEditor<>(new NameRenderer<PolicyUnit>());
}
public boolean showClusterPolicyPropertiesZone(final NewClusterPolicyModel model) {
if (!model.getCustomProperties().isEmpty()) {
return true;
}
if (model.getUsedFilters() != null) {
for (PolicyUnit policyUnit: model.getUsedFilters()) {
if (policyUnit.getParameterRegExMap() != null
&& !policyUnit.getParameterRegExMap().isEmpty()) {
return true;
}
}
}
if (model.getUsedFunctions() != null) {
for (Pair<PolicyUnit, Integer> policyUnit: model.getUsedFunctions()) {
if (policyUnit.getFirst().getParameterRegExMap() != null
&& !policyUnit.getFirst().getParameterRegExMap().isEmpty()) {
return true;
}
}
}
if (model.getLoadBalanceList().getSelectedItem() != null) {
PolicyUnit policyUnit = model.getLoadBalanceList().getSelectedItem();
if (policyUnit.getParameterRegExMap() != null
&& !policyUnit.getParameterRegExMap().isEmpty()) {
return true;
}
}
return false;
}
public void edit(final NewClusterPolicyModel model) {
driver.edit(model);
setPanelModel(model);
updateFilters(model);
model.getFiltersChangedEvent().addListener((ev, sender, args) -> {
updateFilters(model);
clusterPolicyPropertiesZone.setVisible(showClusterPolicyPropertiesZone(model));
});
updateFunctions(model);
model.getFunctionsChangedEvent().addListener((ev, sender, args) -> {
updateFunctions(model);
clusterPolicyPropertiesZone.setVisible(showClusterPolicyPropertiesZone(model));
});
customPropertiesSheetEditor.edit(model.getCustomPropertySheet());
clusterPolicyPropertiesZone.setVisible(showClusterPolicyPropertiesZone(model));
updateTooltips(model);
model.getLoadBalanceList().getSelectedItemChangedEvent().addListener((ev, sender, args) -> {
updateTooltips(model);
clusterPolicyPropertiesZone.setVisible(showClusterPolicyPropertiesZone(model));
});
}
private void initInfoIcons() {
filterInfoIcon =
new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyFilterInfo()));
functionInfoIcon =
new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyWeightFunctionInfo()));
loadBalancingInfoIcon =
new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyLoadBalancingInfo()));
propertiesInfoIcon =
new InfoIcon(templates.italicWordWrapMaxWidth(constants.clusterPolicyPropertiesInfo()));
}
private void updateTooltips(NewClusterPolicyModel model) {
PolicyUnit selectedItem = model.getLoadBalanceList().getSelectedItem();
if (selectedItem != null) {
loadBalanceListEditor.getElement().setTitle(selectedItem.getDescription());
String text = ""; //$NON-NLS-1$
if (!selectedItem.isInternal()) {
text = constants.externalPolicyUnitLabel() + " "; //$NON-NLS-1$
}
if (!selectedItem.isEnabled()) {
text += constants.disabledPolicyUnit();
}
externalLabel.setText(text);
}
}
private void updateFunctions(NewClusterPolicyModel model) {
FunctionPolicyUnitPanel functionPolicyUnitPanel;
usedFunctionPanel.clear();
for (Pair<PolicyUnit, Integer> pair : model.getUsedFunctions()) {
functionPolicyUnitPanel =
new FunctionPolicyUnitPanel(pair.getFirst(),
model,
true,
model.getClusterPolicy().isLocked(),
style,
pair.getSecond());
usedFunctionPanel.add(functionPolicyUnitPanel);
functionPolicyUnitPanel.initWidget();
}
unusedFunctionPanel.clear();
for (PolicyUnit policyUnit : model.getUnusedFunctions()) {
functionPolicyUnitPanel =
new FunctionPolicyUnitPanel(policyUnit,
model,
false,
model.getClusterPolicy().isLocked(),
style,
null);
unusedFunctionPanel.add(functionPolicyUnitPanel);
functionPolicyUnitPanel.initWidget();
}
}
private void updateFilters(NewClusterPolicyModel model) {
usedFilterPanel.clear();
PolicyUnitPanel first = null;
PolicyUnitPanel last = null;
List<PolicyUnitPanel> list = new ArrayList<>();
PolicyUnitPanel tempPolicyUnitPanel;
for (PolicyUnit policyUnit : model.getUsedFilters()) {
tempPolicyUnitPanel =
new PolicyUnitPanel(policyUnit, model, true, model.getClusterPolicy().isLocked(), style);
Integer position = model.getFilterPositionMap().get(policyUnit.getId());
if (position == null || position == 0) {
list.add(tempPolicyUnitPanel);
} else {
if (position < 0) {
first = tempPolicyUnitPanel;
} else if (position > 0) {
last = tempPolicyUnitPanel;
}
tempPolicyUnitPanel.setPosition(position);
}
tempPolicyUnitPanel.initWidget();
}
if (first != null) {
usedFilterPanel.add(first);
}
for (PolicyUnitPanel policyUnitPanel : list) {
usedFilterPanel.add(policyUnitPanel);
}
if (last != null) {
usedFilterPanel.add(last);
}
unusedFilterPanel.clear();
for (PolicyUnit policyUnit : model.getUnusedFilters()) {
PolicyUnitPanel policyUnitPanel =
new PolicyUnitPanel(policyUnit, model, false, model.getClusterPolicy().isLocked(), style);
unusedFilterPanel.add(policyUnitPanel);
policyUnitPanel.initWidget();
}
}
@Override
public NewClusterPolicyModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
public interface WidgetStyle extends CssResource {
String unusedPolicyUnitStyle();
String usedFilterPolicyUnitStyle();
String positionLabelStyle();
}
}