package org.ovirt.engine.ui.common.widget.uicommon.vm; import java.util.HashSet; import java.util.Set; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; import org.ovirt.engine.ui.common.gin.AssetProvider; import org.ovirt.engine.ui.common.widget.CellClickHandler; import org.ovirt.engine.ui.common.widget.HasCellClickHandlers; import org.ovirt.engine.ui.common.widget.table.cell.AbstractCell; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.vms.VmDeviceFeEntity; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.BrowserEvents; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; public class HotUnplugCell extends AbstractCell<VmDeviceFeEntity> implements HasCellClickHandlers<VmDeviceFeEntity> { interface CellTemplate extends SafeHtmlTemplates { @Template("<button class=\"btn btn-default\" id=\"{0}\">{1}</button>") SafeHtml button(String id, String hotUnplugLabel); @Template("<button class=\"btn btn-default\" id=\"{0}\" disabled title=\"{2}\">{1}</button>") SafeHtml disabledButton(String id, String hotUnplugLabel, String title); } private static CellTemplate cellTemplate = GWT.create(CellTemplate.class); private Set<CellClickHandler<VmDeviceFeEntity>> clickHandlers = new HashSet<>(); @Override public HandlerRegistration addHandler(final CellClickHandler<VmDeviceFeEntity> handler) { clickHandlers.add(handler); return new HandlerRegistration() { @Override public void removeHandler() { clickHandlers.remove(handler); } }; } @Override public void onBrowserEvent(Context context, Element parent, VmDeviceFeEntity device, NativeEvent event, ValueUpdater<VmDeviceFeEntity> valueUpdater) { super.onBrowserEvent(context, parent, device, event, valueUpdater); if (!BrowserEvents.CLICK.equals(event.getType())) { return; } if (parent.getFirstChildElement() == null || !parent.getFirstChildElement().isOrHasChild(Element.as(event.getEventTarget()))) { return; } final boolean isButtonEnabled = device.getVm().getStatus() == VMStatus.Up && !device.isBeingUnplugged(); if (!isButtonEnabled) { return; } for (CellClickHandler<VmDeviceFeEntity> clickHandler : clickHandlers) { clickHandler.onClick(event, device); } } @Override public void render(Context context, VmDeviceFeEntity deviceEntity, SafeHtmlBuilder sb, String id) { if (!isHotUnpluggable(deviceEntity.getVmDevice())) { return; } if (deviceEntity.getVm() == null) { return; } final boolean memoryHotUnplugSupported = AsyncDataProvider.getInstance().isMemoryHotUnplugSupportedByArchitecture( deviceEntity.getVm().getClusterArch(), deviceEntity.getVm().getCompatibilityVersion()); if (!memoryHotUnplugSupported) { sb.append(cellTemplate.disabledButton( id, AssetProvider.getConstants().hotUnplug(), AssetProvider.getMessages().memoryHotUnplugNotSupportedForCompatibilityVersionAndArchitecture( deviceEntity.getVm().getCompatibilityVersion(), deviceEntity.getVm().getClusterArch()))); return; } if (deviceEntity.getVm().getStatus() != VMStatus.Up) { sb.append(cellTemplate.disabledButton( id, AssetProvider.getConstants().hotUnplug(), AssetProvider.getConstants().vmHasToBeUp())); return; } if (deviceEntity.isBeingUnplugged()) { sb.append(cellTemplate.disabledButton(id, AssetProvider.getConstants().unplugging(), "")); return; } sb.append(cellTemplate.button(id, AssetProvider.getConstants().hotUnplug())); } public static boolean isHotUnpluggable(VmDevice vmDevice) { return vmDevice.getType() == VmDeviceGeneralType.MEMORY; } @Override public Set<String> getConsumedEvents() { final Set<String> consumedEvents = new HashSet<>(super.getConsumedEvents()); consumedEvents.add(BrowserEvents.CLICK); return consumedEvents; } }