package org.ovirt.engine.ui.common.view.popup.numa; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.presenter.popup.numa.UpdatedVnumaEvent; import org.ovirt.engine.ui.uicompat.external.StringUtils; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.DragLeaveEvent; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HasHandlers; 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.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class DragTargetScrollPanel extends Composite implements HasHandlers { interface WidgetUiBinder extends UiBinder<Widget, DragTargetScrollPanel> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } interface Style extends CssResource { String dragOver(); } private final EventBus eventBus; @UiField FocusPanel container; @UiField FlowPanel dragTargetPanel; @UiField Style style; private int pNumaNodeIndex; @Inject public DragTargetScrollPanel(EventBus gwtEventBus) { this.eventBus = gwtEventBus; initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); } public void clear() { dragTargetPanel.clear(); } public void add(IsWidget widget) { dragTargetPanel.add(widget); } @Override public void fireEvent(GwtEvent<?> event) { eventBus.fireEvent(event); } @UiHandler("container") void onPanelDragOver(DragOverEvent event) { container.addStyleName(style.dragOver()); } @UiHandler("container") void onPanelDragLeave(DragLeaveEvent event) { container.removeStyleName(style.dragOver()); } @UiHandler("container") void onPanelDragDrop(DropEvent event) { String vmGid = event.getData("VM_GID"); //$NON-NLS-1$ if (StringUtils.isNotEmpty(vmGid)) { Guid vmGuid = Guid.createGuidFromString(vmGid); boolean pinned = Boolean.valueOf(event.getData("PINNED")); //$NON-NLS-1$ int vNumaNodeIndex = Integer.parseInt(event.getData("INDEX")); //$NON-NLS-1$ container.removeStyleName(style.dragOver()); event.preventDefault(); UpdatedVnumaEvent.fire(this, vmGuid, pinned, vNumaNodeIndex, pNumaNodeIndex); } else { container.removeStyleName(style.dragOver()); } } private Pair<Guid, Pair<Boolean, Integer>> parseDropString(String dropString) { Pair<Boolean, Integer> pinnedIndexPair = new Pair<>(); String[] splitString = dropString.split("_"); //$NON-NLS-1$ pinnedIndexPair.setFirst(Boolean.valueOf(splitString[1])); pinnedIndexPair.setSecond(Integer.valueOf(splitString[2])); return new Pair<>(Guid.createGuidFromString(splitString[0]), pinnedIndexPair); } public void setIndex(int numaNodeIndex) { this.pNumaNodeIndex = numaNodeIndex; } }