package org.ovirt.engine.ui.webadmin.section.main.view.popup.host;
import java.util.ArrayList;
import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.dialog.AdvancedParametersExpander;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
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.ListModelRadioGroupEditor;
import org.ovirt.engine.ui.common.widget.editor.generic.IntegerEntityModelTextBoxEditor;
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.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.hosts.VfsConfigModel;
import org.ovirt.engine.ui.uicommonweb.models.hosts.VfsConfigModel.AllNetworksSelector;
import org.ovirt.engine.ui.uicommonweb.models.hosts.VfsConfigNetwork;
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.VfsConfigPopupPresenterWidget;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.text.shared.AbstractRenderer;
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.gwt.user.client.ui.ValueLabel;
import com.google.inject.Inject;
public class VfsConfigPopupView extends AbstractModelBoundPopupView<VfsConfigModel> implements VfsConfigPopupPresenterWidget.ViewDef {
interface Driver extends UiCommonEditorDriver<VfsConfigModel, VfsConfigPopupView> {
}
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, VfsConfigPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface WidgetIdHandler extends ElementIdHandler<VfsConfigPopupView> {
WidgetIdHandler idHandler = GWT.create(WidgetIdHandler.class);
}
private final Driver driver = GWT.create(Driver.class);
@UiField
@Ignore
AdvancedParametersExpander numVfsExpander;
@UiField
@Ignore
FlowPanel numVfsExpanderContent;
@UiField
@Path(value = "numOfVfs.entity")
IntegerEntityModelTextBoxEditor numOfVfs;
@UiField(provided = true)
@Path(value = "maxNumOfVfs.entity")
ValueLabel<Integer> maxVfsLabel;
@UiField
@Ignore
Label allowedNetworksLabel;
@UiField
@Ignore
Label selectNetworksLabel;
@UiField
@Path(value = "allNetworksAllowed.selectedItem")
ListModelRadioGroupEditor<AllNetworksSelector> allNetworksSelectorEditor;
@UiField(provided = true)
@Ignore
EntityModelCellTable<ListModel<VfsConfigNetwork>> networks;
@UiField
FlowPanel allowedNetworksPanel;
@UiField(provided = true)
@Ignore
VfsNicLabelWidget labelsWidget;
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final ApplicationMessages messages = AssetProvider.getMessages();
private static final ApplicationTemplates templates = AssetProvider.getTemplates();
@Inject
public VfsConfigPopupView(EventBus eventBus) {
super(eventBus);
maxVfsLabel = new ValueLabel<>(new AbstractRenderer<Integer>() {
@Override
public String render(Integer object) {
return messages.maxVfs(object);
}
});
networks = new EntityModelCellTable<>(SelectionMode.NONE, true);
labelsWidget = new VfsNicLabelWidget();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
WidgetIdHandler.idHandler.generateAndSetIds(this);
initExpander(constants);
driver.initialize(this);
}
private void initExpander(ApplicationConstants constants) {
numVfsExpander.initWithContent(numVfsExpanderContent.getElement());
numVfsExpander.setTitleWhenExpanded(constants.numOfVfsSetting());
numVfsExpander.setTitleWhenCollapsed(constants.numOfVfsSetting());
}
@Override
public void edit(final VfsConfigModel model) {
driver.edit(model);
labelsWidget.edit(model.getLabelsModel());
networks.asEditor().edit(model.getNetworks());
initNetworksTable();
labelsWidget.addValueChangeHandler(event -> refreshNetworksTable());
updateAllowedNetworksPanelVisibility(model);
model.getAllNetworksAllowed().getSelectedItemChangedEvent().addListener((ev, sender, args) -> updateAllowedNetworksPanelVisibility(model));
}
private void updateAllowedNetworksPanelVisibility(final VfsConfigModel model) {
allowedNetworksPanel.setVisible(AllNetworksSelector.specificNetworks == model.getAllNetworksAllowed()
.getSelectedItem());
}
@Override
public VfsConfigModel flush() {
labelsWidget.flush();
networks.asEditor().flush();
return driver.flush();
}
@Override
public void cleanup() {
driver.cleanup();
}
void initNetworksTable() {
networks.enableColumnResizing();
networks.addColumn(
new AttachedIndicatorCheckboxColumn(),
new AttachedIndicatorCheckboxHeader(), "20px"); //$NON-NLS-1$
networks.addColumn(new AbstractTextColumn<VfsConfigNetwork>() {
@Override
public String getValue(VfsConfigNetwork object) {
return object.getEntity().getName();
}
}, constants.vfsConfigNetworkName(), "120px"); //$NON-NLS-1$
networks.addColumn(new AbstractTextColumn<VfsConfigNetwork>() {
@Override
public String getValue(VfsConfigNetwork object) {
return object.getLabelViaAttached();
}
}, constants.vfsConfigViaLabel(), "120px"); //$NON-NLS-1$
}
private final class AttachedIndicatorCheckboxColumn extends AbstractCheckboxColumn<VfsConfigNetwork> {
private AttachedIndicatorCheckboxColumn() {
super(new AttachedIndicatorFieldUpdater());
}
@Override
public Boolean getValue(VfsConfigNetwork vfsConfigNetwork) {
return shouldNetworkBeDisplayedAsAttached(vfsConfigNetwork);
}
@Override
protected boolean canEdit(VfsConfigNetwork vfsConfigNetwork) {
return canEditAssign(vfsConfigNetwork);
}
}
private final class AttachedIndicatorFieldUpdater implements FieldUpdater<VfsConfigNetwork, Boolean> {
@Override
public void update(int index, VfsConfigNetwork vfsConfigNetwork, Boolean value) {
vfsConfigNetwork.setAttached(value);
refreshNetworksTable();
}
}
private final class AttachedIndicatorCheckboxHeader extends AbstractCheckboxHeader {
@Override
protected void selectionChanged(Boolean value) {
for (VfsConfigNetwork vfsConfigNetwork : getNetworksTableItems()) {
if (!vfsConfigNetwork.isAttachedViaLabel()) {
vfsConfigNetwork.setAttached(value);
}
}
refreshNetworksTable();
}
@Override
public Boolean getValue() {
for (VfsConfigNetwork vfsConfigNetwork : getNetworksTableItems()) {
if (!shouldNetworkBeDisplayedAsAttached(vfsConfigNetwork)) {
return false;
}
}
return true;
}
@Override
public boolean isEnabled() {
for (VfsConfigNetwork vfsConfigNetwork : getNetworksTableItems()) {
if (canEditAssign(vfsConfigNetwork)) {
return true;
}
}
return false;
}
@Override
public SafeHtml getTooltip() {
return VfsConfigPopupView.templates.textForCheckBoxHeader(constants.attachAll());
}
}
private boolean canEditAssign(VfsConfigNetwork vfsConfigNetwork) {
return !vfsConfigNetwork.isAttachedViaLabel();
}
private boolean shouldNetworkBeDisplayedAsAttached(VfsConfigNetwork vfsConfigNetwork) {
return vfsConfigNetwork.isAttached() || vfsConfigNetwork.isAttachedViaLabel();
}
private void refreshNetworksTable() {
networks.asEditor().edit(networks.asEditor().flush());
}
private Iterable<VfsConfigNetwork> getNetworksTableItems() {
ListModel<VfsConfigNetwork> tableModel = networks.asEditor().flush();
return tableModel != null ? tableModel.getItems() : new ArrayList<VfsConfigNetwork>();
}
}