*/
package eu.etaxonomy.taxeditor.editor.view.derivate;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
*/
public class DerivateDropListener extends ViewerDropAdapter {
-// private final Map<Class<? extends ICdmBase>, List<Class<? extends ICdmBase>>> dragTargetClassMap;
-// private final Map<SpecimenOrObservationType, List<SpecimenOrObservationType>> dragTargetSpecimenTypeMap;
+ private final DerivateView derivateView;
/**
- * @param viewer
+ * @param derivateView
*/
- protected DerivateDropListener(Viewer viewer) {
- super(viewer);
-// dragTargetClassMap = new HashMap<Class<? extends ICdmBase>, List<Class<? extends ICdmBase>>>();
-// dragTargetSpecimenTypeMap = new HashMap<SpecimenOrObservationType, List<SpecimenOrObservationType>>();
-//
-// // possible targets for FieldUnit
-// addToTargetClasses(FieldUnit.class, new Class[]{DerivedUnit.class, Sequence.class, Amplification.class, SingleRead.class});
-// addToTargetTypes(SpecimenOrObservationType.FieldUnit, new SpecimenOrObservationType[]{SpecimenOrObservationType.DerivedUnit});
-//
-// //possible Targets for specimen
-// addToTargetClasses(DerivedUnit.class, new Class[]{DerivedUnit.class, Sequence.class, Amplification.class, SingleRead.class});
-// addToTargetTypes(SpecimenOrObservationType.PreservedSpecimen, new SpecimenOrObservationType[]{SpecimenOrObservationType.DnaSample, SpecimenOrObservationType.StillImage});
+ protected DerivateDropListener(DerivateView derivateView) {
+ super(derivateView.viewer);
+ this.derivateView = derivateView;
}
-// private void addToTargetClasses(Class<? extends ICdmBase> sourceClass, Class<? extends ICdmBase>[] targetClasses){
-// List<Class<? extends ICdmBase>> targetClassList = new ArrayList<Class<? extends ICdmBase>>();
-// for(Class<? extends ICdmBase> targetClass:targetClasses){
-// targetClassList.add(targetClass);
-// }
-// dragTargetClassMap.put(sourceClass, targetClassList);
-// }
-//
-// private void addToTargetTypes(SpecimenOrObservationType sourceType, SpecimenOrObservationType[] targetTypes){
-// List<SpecimenOrObservationType> targetTypesList = new ArrayList<SpecimenOrObservationType>();
-// for(SpecimenOrObservationType targetType:targetTypes){
-// targetTypesList.add(targetType);
-// }
-// dragTargetSpecimenTypeMap.put(sourceType, targetTypesList);
-// }
-
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
*/
@Override
public boolean performDrop(Object data) {
-
-// TermBase target = (TermBase) getCurrentTarget();//can be vocab
-// //DefinedTermBase[] droppedElements = (DefinedTermBase[]) data;
-// Object[] droppedTerms = (Object[]) data;
-// Collection<DefinedTermBase> sourceTerms = new ArrayList<DefinedTermBase>(); //Arrays.asList(droppedElements)
-//
-// for (Object droppedTerm : droppedTerms) {
-//
-// DefinedTermBase term = (DefinedTermBase) droppedTerm;
-// sourceTerms.add(term);
-//
-// }
-//
-// AbstractPostOperation operation = new MoveDefinedTermOperation("Move Descriptions", StoreUtil.getUndoContext(), target, sourceTerms, editor);
-// //TODO: implement execute
-// AbstractUtility.executeOperation(operation);
Object target = getCurrentTarget();
- if(target instanceof TreeNode){
- Object targetDerivate = ((TreeNode) target).getValue();
- if(data instanceof Object[]){
- Object[] draggedElements = (Object[])data;
- for (Object draggedElement:draggedElements) {
- if(checkDropTarget(draggedElement, targetDerivate)){
- //performDrop(draggedElement, targetDerivate);
- SpecimenOrObservationBase<?> originSpecimen = (SpecimenOrObservationBase<?>)targetDerivate;
- DerivedUnit derivedSpecimen = (DerivedUnit)draggedElement;
- originSpecimen.addDerivationEvent(DerivationEvent.NewSimpleInstance(originSpecimen, derivedSpecimen, DerivationEventType.GATHERING_IN_SITU()));
- System.out.println("Add Derivate: " + draggedElement.getClass().getSimpleName() + " to " + targetDerivate.getClass().getSimpleName());
- }
- System.out.println("Drop: " + draggedElement.getClass().getSimpleName() + " to " + targetDerivate.getClass().getSimpleName());
- }
+ if(target instanceof TreeNode && data instanceof IStructuredSelection && ((IStructuredSelection) data).size()==1 && ((IStructuredSelection) data).getFirstElement() instanceof TreeNode){
+ TreeNode targetNode = (TreeNode) target;
+ TreeNode draggednode = (TreeNode) ((IStructuredSelection) data).getFirstElement();
+ if(moveDropTarget(draggednode, targetNode)){
+ derivateView.changed(null);
+ return true;
}
- return true;
}
return false;
}
*/
@Override
public boolean validateDrop(Object target, int operation, TransferData transferType) {
- return SpecimenOrObservationTransfer.getInstance().isSupportedType(transferType) && target instanceof TreeNode;
- }
-
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
- */
- @Override
- public void dragOver(DropTargetEvent event) {
-// Object draggedDerivate = getCurrentTarget();
-// Object targetItem = event.item;
-// if(targetItem instanceof TreeItem
-// && ((TreeItem) targetItem).getData() instanceof TreeNode
-// && draggedDerivate instanceof TreeNode){
-//
-// TreeItem node = (TreeItem)targetItem;
-// Object target = ((TreeNode) node.getData()).getValue();
-// Object draggedObject = ((TreeNode) draggedDerivate).getValue();
-// System.out.println(draggedObject + " -> " + target);
-// if(!checkDropTarget(draggedObject, target)){
-// event.detail = DND.DROP_NONE;
-// }
-//// System.out.println("Drag over: " + draggedObject.getClass().getSimpleName() + " to " + target.getClass().getSimpleName());
-// }
-// else{
-// event.detail = DND.DROP_NONE;
-// }
- super.dragOver(event);
+ return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof TreeNode;
}
-
-
/**
* @param value
* @return
*/
- private boolean checkDropTarget(Object draggedObject, Object target) {
- if(draggedObject instanceof SpecimenOrObservationBase<?> && target instanceof SpecimenOrObservationBase<?>){
- SpecimenOrObservationType dragType = ((SpecimenOrObservationBase<?>) draggedObject).getRecordBasis();
- SpecimenOrObservationType targetType = ((SpecimenOrObservationBase<?>) target).getRecordBasis();
-// System.out.println("drag: " + dragType + " drop: " + targetType);
- if(targetType.isKindOf(dragType) && !(targetType != dragType)){
+ private boolean moveDropTarget(TreeNode draggedObject, TreeNode target) {
+ if(draggedObject.getValue() instanceof DerivedUnit && target.getValue() instanceof SpecimenOrObservationBase<?>){
+ DerivedUnit draggedSpecimen = (DerivedUnit) draggedObject.getValue();
+ SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) target.getValue();
+ SpecimenOrObservationType dragType = draggedSpecimen.getRecordBasis();
+ SpecimenOrObservationType targetType = targetSpecimen.getRecordBasis();
+ //check if type is a sub derivate type
+ TreeNode parentNode = draggedObject.getParent();
+ if(parentNode!=null && !parentNode.equals(target) //don't drag on direct parent node
+ && (targetType==SpecimenOrObservationType.FieldUnit //dragging on FieldUnit always works (except when direct parent)
+ || (dragType.isKindOf(targetType) && targetType!=dragType))){ //dragging only on parent derivate type
+ //remove derivation event from parent specimen of dragged object
+ DerivationEvent eventToRemove = null;
+ if(parentNode.getValue() instanceof SpecimenOrObservationBase<?>){
+ SpecimenOrObservationBase<?> parentDragSpecimen = (SpecimenOrObservationBase<?>) parentNode.getValue();
+ for(DerivationEvent event:parentDragSpecimen.getDerivationEvents()){
+ if(event.getDerivatives().contains(draggedSpecimen)){
+ eventToRemove = event;
+ break;
+ }
+ }
+ parentDragSpecimen.removeDerivationEvent(eventToRemove);
+ }
+ //add new derivation event to target
+ targetSpecimen.addDerivationEvent(DerivationEvent.NewSimpleInstance(targetSpecimen, draggedSpecimen, eventToRemove==null?null:eventToRemove.getType()));
return true;
}
}
return false;
}
+
}
+++ /dev/null
-// $Id$
-/**
-* Copyright (C) 2014 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.taxeditor.editor.view.derivate;
-
-import java.util.UUID;
-
-import eu.etaxonomy.cdm.api.service.IAnnotatableService;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-
-/**
- * @author pplitzner
- * @date 18.03.2014
- *
- */
-public class SingleReadTransfer extends CdmObjectTransfer<SingleRead> {
-
- private static SingleReadTransfer instance = new SingleReadTransfer();
- private static final String TYPE_NAME = "singleRead-transfer-format";
- private static final int TYPEID = registerType(TYPE_NAME);
-
- public static synchronized SingleReadTransfer getInstance(){
- return instance;
- }
-
- private SingleReadTransfer(){}
-
- /* (non-Javadoc)
- * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
- */
- @Override
- protected int[] getTypeIds() {
- return new int[] { TYPEID };
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
- */
- @Override
- protected String[] getTypeNames() {
- return new String[] { TYPE_NAME };
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID)
- */
- @Override
- public SingleRead loadElement(UUID uuid) {
- IAnnotatableService service = CdmStore.getService(IAnnotatableService.class);
- System.out.println(service);
- return (SingleRead) service.load(uuid);
- }
-}