import org.primefaces.event.DragDropEvent; import javax.el.ValueExpression; import java.util.Iterator; import java.util.Map; import java.util.HashMap; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import javax.faces.component.UIComponent; import javax.faces.component.UIData; import javax.faces.event.FacesEvent; import javax.faces.event.AjaxBehaviorEvent; import javax.faces.FacesException; import org.primefaces.util.Constants; import org.primefaces.expression.SearchExpressionFacade; private final static String DEFAULT_EVENT = "drop"; private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList(DEFAULT_EVENT)); @Override public void queueEvent(FacesEvent event) { FacesContext context = getFacesContext(); if(isRequestSource(context)) { Map<String,String> params = context.getExternalContext().getRequestParameterMap(); String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM); String clientId = getClientId(context); AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event; if(eventName.equals("drop")) { String dragId = params.get(clientId + "_dragId"); String dropId = params.get(clientId + "_dropId"); DragDropEvent dndEvent = null; String datasourceId = getDatasource(); if(datasourceId != null) { UIData datasource = findDatasource(context, this, datasourceId); String[] idTokens = dragId.split(String.valueOf(UINamingContainer.getSeparatorChar(context))); int rowIndex = Integer.parseInt(idTokens[idTokens.length - 2]); datasource.setRowIndex(rowIndex); Object data = datasource.getRowData(); datasource.setRowIndex(-1); dndEvent = new DragDropEvent(this, behaviorEvent.getBehavior(), dragId, dropId, data); } else { dndEvent = new DragDropEvent(this, behaviorEvent.getBehavior(), dragId, dropId); } super.queueEvent(dndEvent); } } else { super.queueEvent(event); } } private boolean isRequestSource(FacesContext context) { return this.getClientId(context).equals(context.getExternalContext().getRequestParameterMap().get(Constants.RequestParams.PARTIAL_SOURCE_PARAM)); } @Override public Collection<String> getEventNames() { return EVENT_NAMES; } @Override public String getDefaultEventName() { return DEFAULT_EVENT; } protected UIData findDatasource(FacesContext context, Droppable droppable, String datasourceId) { UIComponent datasource = SearchExpressionFacade.resolveComponent(context, droppable, datasourceId); if(datasource == null) throw new FacesException("Cannot find component \"" + datasourceId + "\" in view."); else return (UIData) datasource; }