/*=============================================================================#
# Copyright (c) 2005-2016 Stephan Wahlbrink (WalWare.de) and others.
# 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.statet.nico.ui.console;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import de.walware.statet.nico.core.runtime.ToolController;
import de.walware.statet.nico.core.runtime.ToolProcess;
import de.walware.statet.nico.internal.ui.LocalTaskTransfer;
import de.walware.statet.nico.internal.ui.LocalTaskTransfer.Data;
import de.walware.statet.nico.ui.NicoUITools;
public class SubmitDropAdapter implements DropTargetListener {
public static class TaskSet {
public ToolProcess process;
}
private final NIConsolePage fPage;
public SubmitDropAdapter(final NIConsolePage page) {
fPage = page;
}
@Override
public void dragEnter(final DropTargetEvent event) {
validate(event);
}
@Override
public void dragLeave(final DropTargetEvent event) {
}
@Override
public void dragOperationChanged(final DropTargetEvent event) {
validate(event);
}
@Override
public void dragOver(final DropTargetEvent event) {
event.feedback = DND.FEEDBACK_NONE;
}
@Override
public void dropAccept(final DropTargetEvent event) {
validate(event);
}
@Override
public void drop(final DropTargetEvent event) {
if (LocalTaskTransfer.getTransfer().isSupportedType(event.currentDataType)) {
final LocalTaskTransfer.Data data = (Data) event.data;
final ToolProcess process = fPage.getConsole().getProcess();
if (data == null || process.isTerminated()) {
return;
}
data.process.getQueue().move(data.runnables, process.getQueue());
return;
}
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
final String text = (String) event.data;
final ToolController controller = fPage.getConsole().getProcess().getController();
if (text == null || controller == null) {
return;
}
final IRunnableWithProgress runnable = SubmitPasteAction.createRunnable(controller, text);
NicoUITools.runSubmitInBackground(controller.getTool(), runnable, fPage.getSite().getShell());
return;
}
}
private void validate(final DropTargetEvent event) {
final ToolProcess process = fPage.getConsole().getProcess();
if (LocalTaskTransfer.getTransfer().isSupportedType(event.currentDataType)) {
if (( (event.operations & DND.DROP_MOVE) == DND.DROP_MOVE)
&& process.getMainType().equals(LocalTaskTransfer.getTransfer().getMainType())
&& !process.isTerminated() ) {
event.detail = DND.DROP_MOVE;
return;
}
}
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
if (( (event.operations & DND.DROP_COPY) == DND.DROP_COPY)
&& !fPage.getConsole().getProcess().isTerminated() ) {
event.detail = DND.DROP_COPY;
return;
}
}
event.detail = DND.DROP_NONE;
}
}