package org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster; import java.util.ArrayList; import java.util.Collections; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView; 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.table.column.AbstractCheckboxColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractSafeHtmlColumn; 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.common.widget.table.header.SafeHtmlHeader; import org.ovirt.engine.ui.uicommonweb.models.clusters.ClusterNetworkManageModel; import org.ovirt.engine.ui.uicommonweb.models.clusters.ClusterNetworkModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; 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.cluster.ClusterManageNetworkPopupPresenterWidget; import org.ovirt.engine.ui.webadmin.widget.table.column.MultiImageColumnHelper; import com.google.gwt.cell.client.Cell.Context; 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.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.inject.Inject; public class ClusterManageNetworkPopupView extends AbstractModelBoundPopupView<ClusterNetworkManageModel> implements ClusterManageNetworkPopupPresenterWidget.ViewDef { interface ViewUiBinder extends UiBinder<SimpleDialogPanel, ClusterManageNetworkPopupView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } @UiField(provided = true) EntityModelCellTable<ClusterNetworkManageModel> networks; private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationResources resources = AssetProvider.getResources(); private static final ApplicationConstants constants = AssetProvider.getConstants(); private final SafeHtml vmImage; private final SafeHtml emptyImage; @Inject public ClusterManageNetworkPopupView(EventBus eventBus) { super(eventBus); this.networks = new EntityModelCellTable<>(SelectionMode.NONE, true); vmImage = SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(resources.networkVm()).getHTML()); emptyImage = SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(resources.networkEmpty()).getHTML()); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); } private Iterable<ClusterNetworkModel> getNetworksTableItems() { ClusterNetworkManageModel tableModel = networks.asEditor().flush(); return tableModel != null ? tableModel.getItems() : new ArrayList<ClusterNetworkModel>(); } private void refreshNetworksTable() { networks.asEditor().edit(networks.asEditor().flush()); } private void initEntityModelCellTable() { networks.enableColumnResizing(); boolean multiCluster = networks.asEditor().flush().isMultiCluster(); networks.addColumn(new NetworkNameTextColumnWithTooltip(), constants.nameNetwork(), "85px"); //$NON-NLS-1$ networks.addColumn( new AttachedIndicatorCheckboxColumn(new AttachedIndicatorFieldUpdater()), new AttachedIndicatorCheckboxHeader(), "90px"); //$NON-NLS-1$ networks.addColumn( new RequiredIndicatorCheckboxColumn(new RequiredIndicatorFieldUpdater()), new RequiredAllCheckboxHeader(), "110px"); //$NON-NLS-1$ networks.addColumn( new VmNetworkImageSafeHtmlWithSafeHtmlTooltipColumn(), constants.vmNetwork(), "80px"); //$NON-NLS-1$ networks.addColumn( new ManagementNetworkIndicatorCheckboxColumn(multiCluster, new ManagementNetworkIndicatorFieldUpdater()), constants.managementItemInfo(), "80px"); //$NON-NLS-1$ networks.addColumn( new DisplayNetworkIndicatorCheckboxColumn(multiCluster, new DisplayNetworkIndicatorFieldUpdater()), new SafeHtmlHeader(SafeHtmlUtils.fromSafeConstant(constants.displayNetwork()), SafeHtmlUtils.fromSafeConstant(constants.changeDisplayNetworkWarning())), "100px"); //$NON-NLS-1$ networks.addColumn( new MigrationNetworkIndicatorCheckboxColumn(multiCluster, new MigrationNetworkIndicatorFieldUpdater()), constants.migrationNetwork(), "105px"); //$NON-NLS-1$ networks.addColumn( new GlusterNetworkIndicatorCheckboxColumn(multiCluster, new GlusterNetworkIndicatorFieldUpdater()), constants.glusterNetwork(), "100px"); //$NON-NLS-1$ networks.addColumn( new DefaultRouteNetworkIndicatorCheckboxColumn( multiCluster, new DefaultRouteNetworkIndicatorFieldUpdater()), constants.defaultRouteNetwork(), "100px"); //$NON-NLS-1$ } @Override public void edit(ClusterNetworkManageModel clusterNetworkManageModel) { networks.asEditor().edit(clusterNetworkManageModel); initEntityModelCellTable(); } @Override public ClusterNetworkManageModel flush() { return networks.asEditor().flush(); } @Override public void cleanup() { // TODO clean up stuff if needed } private void changeIsAttached(ClusterNetworkModel clusterNetworkModel, Boolean value) { clusterNetworkModel.setAttached(value); if (!value) { if (clusterNetworkModel.isDisplayNetwork()) { updateDisplayNetwork(clusterNetworkModel, false); } if (clusterNetworkModel.isMigrationNetwork()) { updateMigrationNetwork(clusterNetworkModel, false); } if (clusterNetworkModel.isGlusterNetwork()) { updateGlusterNetwork(clusterNetworkModel, false); } if (clusterNetworkModel.isRequired()) { clusterNetworkModel.setRequired(false); } if (clusterNetworkModel.isDefaultRouteNetwork()) { updateDefaultRouteNetwork(clusterNetworkModel, false); } } } private boolean canEditAssign(ClusterNetworkModel clusterNetworkModel) { return !clusterNetworkModel.isManagement(); } private boolean canEditRequired(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && !clusterNetworkModel.isManagement() && !clusterNetworkModel.isExternal(); } private static final class NetworkNameTextColumnWithTooltip extends AbstractTextColumn<ClusterNetworkModel> { @Override public String getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.getDisplayedName(); } } private final class VmNetworkImageSafeHtmlWithSafeHtmlTooltipColumn extends AbstractSafeHtmlColumn<ClusterNetworkModel> { private final ApplicationConstants constants = AssetProvider.getConstants(); private VmNetworkImageSafeHtmlWithSafeHtmlTooltipColumn() { } @Override public SafeHtml getValue(ClusterNetworkModel clusterNetworkModel) { return MultiImageColumnHelper.getValue(Collections.singletonList(clusterNetworkModel.isVmNetwork() ? vmImage : emptyImage)); } @Override public SafeHtml getTooltip(ClusterNetworkModel clusterNetworkModel) { return MultiImageColumnHelper.getTooltip(clusterNetworkModel.isVmNetwork() ? Collections.singletonMap(vmImage, constants.vmItemInfo()) : Collections.<SafeHtml, String>emptyMap()); } } private final class RequiredIndicatorCheckboxColumn extends AbstractCheckboxColumn<ClusterNetworkModel> { private RequiredIndicatorCheckboxColumn(RequiredIndicatorFieldUpdater requiredIndicatorFieldUpdater) { super(requiredIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isRequired(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return canEditRequired(clusterNetworkModel); } @Override public void render(Context context, ClusterNetworkModel object, SafeHtmlBuilder sb) { super.render(context, object, sb); sb.append(templates.textForCheckBox(constants.required())); } } private final class RequiredIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { clusterNetworkModel.setRequired(value); refreshNetworksTable(); } } private final class RequiredAllCheckboxHeader extends AbstractCheckboxHeader { @Override protected void selectionChanged(Boolean value) { for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (canEditRequired(clusterNetworkModel)) { clusterNetworkModel.setRequired(value); } refreshNetworksTable(); } } @Override public Boolean getValue() { boolean allEntriesDisabled = !isEnabled(); for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (allEntriesDisabled || canEditRequired(clusterNetworkModel)) { if (!clusterNetworkModel.isRequired()) { return false; } } } return true; } @Override public boolean isEnabled() { for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (canEditRequired(clusterNetworkModel)) { return true; } } return false; } @Override public String getLabel() { return constants.requiredAll(); } } private final class AttachedIndicatorCheckboxColumn extends AbstractCheckboxColumn<ClusterNetworkModel> { private AttachedIndicatorCheckboxColumn(AttachedIndicatorFieldUpdater attachedIndicatorFieldUpdater) { super(attachedIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return canEditAssign(clusterNetworkModel); } @Override public void render(Context context, ClusterNetworkModel object, SafeHtmlBuilder sb) { super.render(context, object, sb); sb.append(templates.textForCheckBox(constants.assign())); } } private final class AttachedIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { changeIsAttached(clusterNetworkModel, value); refreshNetworksTable(); } } private final class AttachedIndicatorCheckboxHeader extends AbstractCheckboxHeader { @Override protected void selectionChanged(Boolean value) { for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (canEditAssign(clusterNetworkModel)) { changeIsAttached(clusterNetworkModel, value); } } refreshNetworksTable(); } @Override public Boolean getValue() { boolean allEntriesDisabled = !isEnabled(); for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (allEntriesDisabled || canEditAssign(clusterNetworkModel)) { if (!clusterNetworkModel.isAttached()) { return false; } } } return true; } @Override public boolean isEnabled() { for (ClusterNetworkModel clusterNetworkModel : getNetworksTableItems()) { if (canEditAssign(clusterNetworkModel)) { return true; } } return false; } @Override public String getLabel() { return constants.assignAll(); } } private static final class MigrationNetworkIndicatorCheckboxColumn extends InitiallySetNetworkRoleIndicatorCheckboxColumn { private MigrationNetworkIndicatorCheckboxColumn(boolean multipleSelectionAllowed, MigrationNetworkIndicatorFieldUpdater migrationNetworkIndicatorFieldUpdater) { super(multipleSelectionAllowed, migrationNetworkIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isMigrationNetwork(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && !clusterNetworkModel.isExternal() && !isUnsetRoleProhibited(clusterNetworkModel); } @Override protected boolean isRoleSet(NetworkCluster originalNetworkCluster) { return originalNetworkCluster.isMigration(); } } private final class MigrationNetworkIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { updateMigrationNetwork(clusterNetworkModel, value); refreshNetworksTable(); } } private void updateMigrationNetwork(ClusterNetworkModel clusterNetworkModel, boolean value) { networks.asEditor().flush().setMigrationNetwork(clusterNetworkModel, value); } private static final class ManagementNetworkIndicatorCheckboxColumn extends InitiallySetNetworkRoleIndicatorCheckboxColumn { private ManagementNetworkIndicatorCheckboxColumn(boolean multiCluster, ManagementNetworkIndicatorFieldUpdater managementNetworkIndicatorFieldUpdater) { super(multiCluster, managementNetworkIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isManagement(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && clusterNetworkModel.isRequired() && !clusterNetworkModel.isExternal() && !isUnsetRoleProhibited(clusterNetworkModel); } @Override protected boolean isRoleSet(NetworkCluster originalNetworkCluster) { return originalNetworkCluster.isManagement(); } } private final class ManagementNetworkIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { updateManagementNetwork(clusterNetworkModel, value); refreshNetworksTable(); } } private void updateManagementNetwork(ClusterNetworkModel clusterNetworkModel, boolean value) { networks.asEditor().flush().setManagementNetwork(clusterNetworkModel, value); } private static final class GlusterNetworkIndicatorCheckboxColumn extends InitiallySetNetworkRoleIndicatorCheckboxColumn { private GlusterNetworkIndicatorCheckboxColumn(boolean multipleSelectionAllowed, GlusterNetworkIndicatorFieldUpdater glusterNetworkIndicatorFieldUpdater) { super(multipleSelectionAllowed, glusterNetworkIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isGlusterNetwork(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && !clusterNetworkModel.isExternal() && !isUnsetRoleProhibited(clusterNetworkModel); } @Override protected boolean isRoleSet(NetworkCluster originalNetworkCluster) { return originalNetworkCluster.isGluster(); } } private final class GlusterNetworkIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { updateGlusterNetwork(clusterNetworkModel, value); refreshNetworksTable(); } } private void updateGlusterNetwork(ClusterNetworkModel clusterNetworkModel, boolean value) { networks.asEditor().flush().setGlusterNetwork(clusterNetworkModel, value); } private static final class DefaultRouteNetworkIndicatorCheckboxColumn extends AbstractCheckboxColumn<ClusterNetworkModel> { private DefaultRouteNetworkIndicatorCheckboxColumn(boolean multipleSelectionAllowed, DefaultRouteNetworkIndicatorFieldUpdater defaultRouteNetworkIndicatorFieldUpdater) { super(multipleSelectionAllowed, defaultRouteNetworkIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isDefaultRouteNetwork(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && !clusterNetworkModel.isExternal(); } } private final class DefaultRouteNetworkIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { updateDefaultRouteNetwork(clusterNetworkModel, value); refreshNetworksTable(); } } private void updateDefaultRouteNetwork(ClusterNetworkModel clusterNetworkModel, boolean value) { networks.asEditor().flush().setDefaultRouteNetwork(clusterNetworkModel, value); } private final class DisplayNetworkIndicatorFieldUpdater implements FieldUpdater<ClusterNetworkModel, Boolean> { @Override public void update(int index, ClusterNetworkModel clusterNetworkModel, Boolean value) { updateDisplayNetwork(clusterNetworkModel, value); refreshNetworksTable(); } } private void updateDisplayNetwork(ClusterNetworkModel clusterNetworkModel, boolean value) { networks.asEditor().flush().setDisplayNetwork(clusterNetworkModel, value); } private static final class DisplayNetworkIndicatorCheckboxColumn extends InitiallySetNetworkRoleIndicatorCheckboxColumn { private DisplayNetworkIndicatorCheckboxColumn(boolean multipleSelectionAllowed, DisplayNetworkIndicatorFieldUpdater displayNetworkIndicatorFieldUpdater) { super(multipleSelectionAllowed, displayNetworkIndicatorFieldUpdater); } @Override public Boolean getValue(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isDisplayNetwork(); } @Override protected boolean canEdit(ClusterNetworkModel clusterNetworkModel) { return clusterNetworkModel.isAttached() && !clusterNetworkModel.isExternal() && !isUnsetRoleProhibited(clusterNetworkModel); } @Override protected boolean isRoleSet(NetworkCluster originalNetworkCluster) { return originalNetworkCluster.isDisplay(); } } private abstract static class InitiallySetNetworkRoleIndicatorCheckboxColumn extends AbstractCheckboxColumn<ClusterNetworkModel> { private InitiallySetNetworkRoleIndicatorCheckboxColumn(boolean multipleSelectionAllowed, FieldUpdater<ClusterNetworkModel, Boolean> fieldUpdater) { super(multipleSelectionAllowed, fieldUpdater); } protected boolean isUnsetRoleProhibited(ClusterNetworkModel clusterNetworkModel) { return isMultipleSelectionAllowed() && isRoleSet(clusterNetworkModel); } @Override protected String getDisabledMessage(ClusterNetworkModel clusterNetworkModel) { if (isUnsetRoleProhibited(clusterNetworkModel)) { return constants.unsetInitiallySetNetworkRoleIsNotAllowed(); } return super.getDisabledMessage(clusterNetworkModel); } private boolean isRoleSet(ClusterNetworkModel clusterNetworkModel) { final NetworkCluster originalNetworkCluster = clusterNetworkModel.getOriginalNetworkCluster(); return originalNetworkCluster != null && isRoleSet(originalNetworkCluster); } protected abstract boolean isRoleSet(NetworkCluster originalNetworkCluster); } }