/*******************************************************************************
* Copyright (c) 2012 Martin Reiterer.
* 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:
* Martin Reiterer - initial API and implementation
* Christian Behon - Refactor
******************************************************************************/
package org.eclipselabs.e4.tapiji.translator.ui.widget.dnd;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipselabs.e4.tapiji.logger.Log;
import org.eclipselabs.e4.tapiji.translator.model.Glossary;
import org.eclipselabs.e4.tapiji.translator.model.Term;
import org.eclipselabs.e4.tapiji.translator.ui.treeviewer.provider.TreeViewerContentProvider;
public final class GlossaryDropTarget extends DropTargetAdapter {
private static final String TAG = GlossaryDropTarget.class.getSimpleName();
private final TreeViewer target;
public boolean sameNode = false;
public GlossaryDropTarget(final TreeViewer viewer) {
super();
this.target = viewer;
}
@Override
public void dragEnter(final DropTargetEvent dropTargetEvent) {
if ((dropTargetEvent.detail == DND.DROP_MOVE) || (dropTargetEvent.detail == DND.DROP_DEFAULT)) {
if ((dropTargetEvent.operations & DND.DROP_MOVE) != 0) {
dropTargetEvent.detail = DND.DROP_MOVE;
} else {
dropTargetEvent.detail = DND.DROP_NONE;
}
}
super.dragEnter(dropTargetEvent);
}
@Override
public void drop(final DropTargetEvent dropTargetEvent) {
if (TermTransfer.getInstance().isSupportedType(dropTargetEvent.currentDataType)) {
Term parentTerm = null;
dropTargetEvent.detail = DND.DROP_MOVE;
dropTargetEvent.feedback = DND.FEEDBACK_INSERT_AFTER;
if ((dropTargetEvent.item instanceof TreeItem) && (((TreeItem) dropTargetEvent.item).getData() instanceof Term)) {
parentTerm = ((Term) ((TreeItem) dropTargetEvent.item).getData());
}
final Term[] moveTerm = (Term[]) dropTargetEvent.data;
final Glossary glossary = ((TreeViewerContentProvider) target.getContentProvider()).getGlossary();
if (moveTerm == null) {
Log.w(TAG, "Move Term is null!!");
} else {
if (parentTerm == null) {
if (!glossary.containsTerm(moveTerm[0])) {
removeTerms(moveTerm, glossary);
for (final Term t : moveTerm) {
glossary.terms.add(t);
}
}
} else {
this.sameNode = false;
if (moveTerm.length == 1 && moveTerm[0].getAllSubTerms().length == 0) {
sameNode = parentTerm.equals(moveTerm[0]);
} else {
onSameNode(parentTerm, moveTerm);
}
if (!sameNode) {
removeTerms(moveTerm, glossary);
for (final Term t : moveTerm) {
parentTerm.subTerms.add(t);
}
} else {
dropTargetEvent.feedback = DND.FEEDBACK_NONE;
dropTargetEvent.detail = DND.DROP_NONE;
}
}
}
} else {
dropTargetEvent.detail = DND.DROP_NONE;
}
super.drop(dropTargetEvent);
}
private void removeTerms(Term[] termsToRemove, Glossary glossary) {
for (final Term selectionObject : termsToRemove) {
glossary.removeTerm(selectionObject);
}
}
private void onSameNode(Term parentTerm, Term[] moveTerm) {
if (!sameNode) {
for (final Term t : moveTerm) {
if (sameNode) {
break;
}
if (t.equals(parentTerm)) {
sameNode = true;
break;
} else {
onSameNode(parentTerm, t.getAllSubTerms());
}
}
}
}
public static GlossaryDropTarget create(final TreeViewer viewer) {
return new GlossaryDropTarget(viewer);
}
}