/*******************************************************************************
* Copyright (c) 2013 SAP AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tobias Pfeifer (SAP AG) - initial implementation
*******************************************************************************/
package org.eclipse.egit.ui.internal.rebase;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.egit.core.internal.rebase.RebaseInteractivePlan;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
final class RebaseInteractiveDropTargetListener extends ViewerDropAdapter {
private final RebaseInteractiveView rebaseInteractiveView;
RebaseInteractiveDropTargetListener(
RebaseInteractiveView rebaseInteractiveView, Viewer viewer) {
super(viewer);
this.rebaseInteractiveView = rebaseInteractiveView;
}
@Override
public boolean performDrop(Object data) {
if (!this.rebaseInteractiveView.isDragAndDropEnabled())
return false;
if (!(data instanceof IStructuredSelection))
return false;
final IStructuredSelection structuredSelection = (IStructuredSelection) data;
List selectionList = structuredSelection.toList();
if (selectionList.contains(getCurrentTarget()))
return false;
List<RebaseInteractivePlan.PlanElement> sourceElements = new ArrayList<>();
for (Object obj : selectionList) {
if (obj instanceof RebaseInteractivePlan.PlanElement)
sourceElements.add((RebaseInteractivePlan.PlanElement) obj);
}
if (sourceElements.isEmpty())
return false;
Object targetObj = getCurrentTarget();
if (!(targetObj instanceof RebaseInteractivePlan.PlanElement))
return false;
RebaseInteractivePlan.PlanElement targetElement = (RebaseInteractivePlan.PlanElement) targetObj;
boolean before = false;
switch (getCurrentLocation()) {
case ViewerDropAdapter.LOCATION_BEFORE:
before = true;
break;
case ViewerDropAdapter.LOCATION_NONE:
return false;
}
if (!before)
Collections.reverse(sourceElements);
if (RebaseInteractivePreferences.isOrderReversed())
before = !before;
for (RebaseInteractivePlan.PlanElement element : sourceElements)
rebaseInteractiveView.getCurrentPlan().moveTodoEntry(element,
targetElement, before);
return true;
}
@Override
public void dragOver(DropTargetEvent event) {
super.dragOver(event);
}
@Override
public boolean validateDrop(Object target, int operation,
TransferData transferType) {
if (!this.rebaseInteractiveView.isDragAndDropEnabled())
return false;
if (getCurrentTarget() instanceof RebaseInteractivePlan.PlanElement) {
switch (getCurrentLocation()) {
case ViewerDropAdapter.LOCATION_AFTER:
return true;
case ViewerDropAdapter.LOCATION_ON:
return false;
case ViewerDropAdapter.LOCATION_BEFORE:
return true;
case ViewerDropAdapter.LOCATION_NONE:
return false;
}
}
return false;
}
}