package org.ovirt.engine.ui.webadmin.section.main.view.popup.host;
import org.ovirt.engine.core.common.businessentities.ServerCpu;
import org.ovirt.engine.core.compat.Version;
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.AbstractTabbedModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.Align;
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.dialog.tab.DialogTab;
import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTabPanel;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelRadioButtonEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxEditor;
import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
import org.ovirt.engine.ui.common.widget.tooltip.TooltipWidth;
import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.hosts.ConfigureLocalStorageModel;
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.ConfigureLocalStoragePopupPresenterWidget;
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.Anchor;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.inject.Inject;
public class HostConfigureLocalStoragePopupView extends AbstractTabbedModelBoundPopupView<ConfigureLocalStorageModel>
implements ConfigureLocalStoragePopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<ConfigureLocalStorageModel, HostConfigureLocalStoragePopupView> {
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, HostConfigureLocalStoragePopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<HostConfigureLocalStoragePopupView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private final Driver driver = GWT.create(Driver.class);
@UiField
DialogTabPanel tabPanel;
@UiField
WidgetStyle style;
@UiField
DialogTab generalTab;
@UiField
VerticalPanel dataCenterPanel;
@UiField
Anchor dataCenterButton;
@UiField
@Path(value = "dataCenter.name.entity")
StringEntityModelTextBoxEditor dataCenterNameEditor;
@UiField
@Path(value = "dataCenter.description.entity")
StringEntityModelTextBoxEditor dataCenterDescriptionEditor;
@UiField(provided = true)
@Path(value = "dataCenter.version.selectedItem")
@WithElementId
ListModelListBoxEditor<Version> dataCenterVersionEditor;
@UiField
VerticalPanel clusterPanel;
@UiField
Anchor clusterButton;
@UiField
@Path(value = "cluster.name.entity")
StringEntityModelTextBoxEditor clusterNameEditor;
@UiField
@Path(value = "cluster.description.entity")
StringEntityModelTextBoxEditor clusterDescriptionEditor;
@UiField(provided = true)
@Path(value = "cluster.CPU.selectedItem")
@WithElementId
ListModelListBoxEditor<ServerCpu> clusterCpuTypeEditor;
@UiField
Anchor storageButton;
@UiField
@Path(value = "formattedStorageName.entity")
StringEntityModelTextBoxEditor storageNameEditor;
@UiField
@Path(value = "storage.path.entity")
StringEntityModelTextBoxEditor pathEditor;
@UiField
@WithElementId
DialogTab optimizationTab;
@UiField
@Ignore
Label memoryOptimizationPanelTitle;
@UiField(provided = true)
InfoIcon memoryOptimizationInfo;
@UiField(provided = true)
@Path(value = "cluster.optimizationNone_IsSelected.entity")
@WithElementId
EntityModelRadioButtonEditor optimizationNoneEditor;
@UiField(provided = true)
@Path(value = "cluster.optimizationForServer_IsSelected.entity")
@WithElementId
EntityModelRadioButtonEditor optimizationForServerEditor;
@UiField(provided = true)
@Path(value = "cluster.optimizationForDesktop_IsSelected.entity")
@WithElementId
EntityModelRadioButtonEditor optimizationForDesktopEditor;
@UiField(provided = true)
@Path(value = "cluster.optimizationCustom_IsSelected.entity")
@WithElementId
EntityModelRadioButtonEditor optimizationCustomEditor;
@UiField
FlowPanel cpuThreadsPanel;
@UiField
@Ignore
Label cpuThreadsPanelTitle;
@UiField(provided = true)
InfoIcon cpuThreadsInfo;
@UiField(provided = true)
@Path(value = "cluster.countThreadsAsCores.entity")
@WithElementId
EntityModelCheckBoxEditor countThreadsAsCoresEditor;
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final ApplicationMessages messages = AssetProvider.getMessages();
@Inject
public HostConfigureLocalStoragePopupView(EventBus eventBus) {
super(eventBus);
initialize();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
ViewIdHandler.idHandler.generateAndSetIds(this);
addStyles();
localize();
driver.initialize(this);
// Data center edit button.
dataCenterPanel.setVisible(false);
dataCenterButton.addClickHandler(clickEvent -> {
dataCenterPanel.setVisible(!dataCenterPanel.isVisible());
dataCenterButton.setText(dataCenterPanel.isVisible() ? constants.closeText() : constants.editText());
dataCenterNameEditor.setEnabled(dataCenterPanel.isVisible());
});
// Cluster edit button.
clusterPanel.setVisible(false);
clusterButton.addClickHandler(clickEvent -> {
clusterPanel.setVisible(!clusterPanel.isVisible());
clusterButton.setText(clusterPanel.isVisible() ? constants.closeText() : constants.editText());
clusterNameEditor.setEnabled(clusterPanel.isVisible());
});
// Storage edit button.
storageButton.addClickHandler(clickEvent -> {
storageNameEditor.setEnabled(!storageNameEditor.isEnabled());
storageButton.setText(storageNameEditor.isEnabled() ? constants.closeText() : constants.editText());
});
}
private void initialize() {
dataCenterVersionEditor = new ListModelListBoxEditor<>(new NullSafeRenderer<Version>() {
@Override
public String renderNullSafe(Version object) {
return object.getValue();
}
});
clusterCpuTypeEditor = new ListModelListBoxEditor<>(new NullSafeRenderer<ServerCpu>() {
@Override
public String renderNullSafe(ServerCpu object) {
return object.getCpuName();
}
});
// Optimization options.
optimizationNoneEditor = new EntityModelRadioButtonEditor("1"); //$NON-NLS-1$
optimizationForServerEditor = new EntityModelRadioButtonEditor("1"); //$NON-NLS-1$
optimizationForDesktopEditor = new EntityModelRadioButtonEditor("1"); //$NON-NLS-1$
optimizationCustomEditor = new EntityModelRadioButtonEditor("1"); //$NON-NLS-1$
optimizationCustomEditor.setVisible(false);
countThreadsAsCoresEditor = new EntityModelCheckBoxEditor(Align.RIGHT);
memoryOptimizationInfo = new InfoIcon(templates.italicText(constants.clusterPopupMemoryOptimizationInfo()));
memoryOptimizationInfo.setTooltipMaxWidth(TooltipWidth.W520);
cpuThreadsInfo = new InfoIcon(templates.italicText(constants.clusterPopupCpuThreadsInfo()));
cpuThreadsInfo.setTooltipMaxWidth(TooltipWidth.W620);
}
private void addStyles() {
optimizationNoneEditor.setContentWidgetContainerStyleName(style.fullWidth());
optimizationForServerEditor.setContentWidgetContainerStyleName(style.fullWidth());
optimizationForDesktopEditor.setContentWidgetContainerStyleName(style.fullWidth());
optimizationCustomEditor.setContentWidgetContainerStyleName(style.fullWidth());
countThreadsAsCoresEditor.setContentWidgetContainerStyleName(style.fullWidth());
}
void localize() {
generalTab.setLabel(constants.hostPopupGeneralTabLabel());
dataCenterButton.setText(constants.editText());
dataCenterNameEditor.setLabel(constants.nameLabel());
dataCenterDescriptionEditor.setLabel(constants.descriptionLabel());
dataCenterVersionEditor.setLabel(constants.dataCenterPopupVersionLabel());
clusterButton.setText(constants.editText());
clusterNameEditor.setLabel(constants.clusterPopupNameLabel());
clusterDescriptionEditor.setLabel(constants.clusterPopupDescriptionLabel());
clusterCpuTypeEditor.setLabel(constants.clusterPopupCPUTypeLabel());
storageButton.setText(constants.editText());
storageNameEditor.setLabel(constants.storagePopupNameLabel());
pathEditor.setLabel(constants.configureLocalStoragePopupPathLabel());
optimizationTab.setLabel(constants.clusterPopupOptimizationTabLabel());
memoryOptimizationPanelTitle.setText(constants.clusterPopupMemoryOptimizationPanelTitle());
optimizationNoneEditor.setLabel(constants.clusterPopupOptimizationNoneLabel());
cpuThreadsPanelTitle.setText(constants.clusterPopupCpuThreadsPanelTitle());
countThreadsAsCoresEditor.setLabel(constants.clusterPopupCountThreadsAsCoresLabel());
}
@Override
public void edit(final ConfigureLocalStorageModel model) {
driver.edit(model);
dataCenterNameEditor.setEnabled(false);
clusterNameEditor.setEnabled(false);
storageNameEditor.setEnabled(false);
optimizationForServerFormatter(model);
optimizationForDesktopFormatter(model);
optimizationCustomFormatter(model);
model.getCluster().getOptimizationForServer().getEntityChangedEvent().addListener((ev, sender, args) -> optimizationForServerFormatter(model));
model.getCluster().getOptimizationForDesktop().getEntityChangedEvent().addListener((ev, sender, args) -> optimizationForDesktopFormatter(model));
model.getCluster().getOptimizationCustom_IsSelected().getEntityChangedEvent().addListener((ev, sender, args) -> {
if (model.getCluster().getOptimizationCustom_IsSelected().getEntity()) {
optimizationCustomFormatter(model);
optimizationCustomEditor.setVisible(true);
}
});
model.getCluster().getVersionSupportsCpuThreads().getEntityChangedEvent().addListener((ev, sender, args) ->
cpuThreadsPanel.setVisible(model.getCluster().getVersionSupportsCpuThreads().getEntity()));
}
private void optimizationForDesktopFormatter(ConfigureLocalStorageModel model) {
if (model.getCluster() != null && model.getCluster().getOptimizationForDesktop() != null
&& model.getCluster().getOptimizationForDesktop().getEntity() != null) {
optimizationForDesktopEditor.setLabel(messages.clusterPopupMemoryOptimizationForDesktopLabel(
model.getCluster().getOptimizationForDesktop().getEntity().toString()));
}
}
private void optimizationForServerFormatter(ConfigureLocalStorageModel model) {
if (model.getCluster() != null && model.getCluster().getOptimizationForServer() != null
&& model.getCluster().getOptimizationForServer().getEntity() != null) {
optimizationForServerEditor.setLabel(messages.clusterPopupMemoryOptimizationForServerLabel(
model.getCluster().getOptimizationForServer().getEntity().toString()));
}
}
private void optimizationCustomFormatter(ConfigureLocalStorageModel model) {
if (model.getCluster() != null && model.getCluster().getOptimizationCustom() != null
&& model.getCluster().getOptimizationCustom().getEntity() != null) {
// Use current value because object.getOptimizationCustom.getEntity() can be null
optimizationCustomEditor.setLabel(messages.clusterPopupMemoryOptimizationCustomLabel(
String.valueOf(model.getCluster().getMemoryOverCommit())));
}
}
@Override
public ConfigureLocalStorageModel flush() {
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
@Override
public void focusInput() {
}
interface WidgetStyle extends CssResource {
String fullWidth();
}
@Override
public DialogTabPanel getTabPanel() {
return tabPanel;
}
@Override
protected void populateTabMap() {
getTabNameMapping().put(TabName.GENERAL_TAB, generalTab.getTabListItem());
getTabNameMapping().put(TabName.OPTIMIZATION_TAB,
optimizationTab.getTabListItem());
}
}