From: Cherian Mathew Date: Fri, 29 May 2015 14:16:34 +0000 (+0200) Subject: DefinedTermDropAdapter : added selection of source objects after drop and disabled... X-Git-Tag: 3.6.0~23 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/872d732824cde915c71abc968cf351c39d3e0713 DefinedTermDropAdapter : added selection of source objects after drop and disabled insert feedback for non OrderedTermBase objects DefinedTermEditor : added custom sorter for OrderedTermBase (descending) MoveDefinedTermOperation : added possibility to move term when cursor is in the insert part of the list --- diff --git a/eu.etaxonomy.taxeditor.application/.classpath b/eu.etaxonomy.taxeditor.application/.classpath index bfb7a7aeb..4c7e96f59 100644 --- a/eu.etaxonomy.taxeditor.application/.classpath +++ b/eu.etaxonomy.taxeditor.application/.classpath @@ -1,9 +1,8 @@ - - - - - - - - - + + + + + + + + diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermDropAdapter.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermDropAdapter.java index 874441015..7ea235d19 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermDropAdapter.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermDropAdapter.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2009 EDIT -* European Distributed Institute of Taxonomy +* 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. */ @@ -12,10 +12,14 @@ package eu.etaxonomy.taxeditor.editor.definedterm; import java.util.ArrayList; import java.util.Collection; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerDropAdapter; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TransferData; import eu.etaxonomy.cdm.model.common.DefinedTermBase; +import eu.etaxonomy.cdm.model.common.OrderedTermBase; import eu.etaxonomy.cdm.model.common.TermBase; import eu.etaxonomy.taxeditor.editor.definedterm.operation.MoveDefinedTermOperation; import eu.etaxonomy.taxeditor.operation.AbstractPostOperation; @@ -28,7 +32,7 @@ import eu.etaxonomy.taxeditor.store.StoreUtil; */ public class DefinedTermDropAdapter extends ViewerDropAdapter { - private DefinedTermEditor editor; + private final DefinedTermEditor editor; /** * @param viewer */ @@ -42,23 +46,32 @@ public class DefinedTermDropAdapter extends ViewerDropAdapter { */ @Override public boolean performDrop(Object data) { - + TermBase target = (TermBase) getCurrentTarget();//can be vocab + int currentLocation = getCurrentLocation(); + System.out.println("current location : " + currentLocation + " , target : " + target.getTitleCache()); //DefinedTermBase[] droppedElements = (DefinedTermBase[]) data; Object[] droppedTerms = (Object[]) data; Collection sourceTerms = new ArrayList(); //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); + + AbstractPostOperation operation = new MoveDefinedTermOperation("Move Descriptions", + StoreUtil.getUndoContext(), + target, + sourceTerms, + editor, + currentLocation); //TODO: implement execute StoreUtil.executeOperation(operation); - + // select the newly moved objects + editor.getViewer().setSelection(new StructuredSelection(sourceTerms.toArray(new TermBase[sourceTerms.size()]))); + return true; } @@ -69,9 +82,23 @@ public class DefinedTermDropAdapter extends ViewerDropAdapter { public boolean validateDrop(Object target, int operation, TransferData transferType) { boolean transferDataIsSupported = TermTransfer.getInstance().isSupportedType(transferType); - System.out.println(target); // maybe don't need this - they will be all TermBase anyway - return target instanceof TermBase && transferDataIsSupported; + return target instanceof TermBase && transferDataIsSupported; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent) + */ + @Override + public void dragOver(DropTargetEvent event) { + super.dragOver(event); + TermBase target = (TermBase) getCurrentTarget(); + if(!(target instanceof OrderedTermBase)) { + // this is to only disable insert between items + event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL; + } + + } } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermEditor.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermEditor.java index c58e631de..8cae931e9 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermEditor.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/DefinedTermEditor.java @@ -15,6 +15,7 @@ import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; @@ -35,6 +36,7 @@ import org.eclipse.ui.part.EditorPart; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.common.OrderedTermBase; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput; import eu.etaxonomy.taxeditor.model.IDirtyMarkable; @@ -84,7 +86,7 @@ public class DefinedTermEditor extends EditorPart implements IConversationEnable viewer.getControl().setLayoutData(LayoutConstants.FILL()); viewer.setContentProvider(new TermContentProvider()); viewer.setLabelProvider(new TermLabelProvider()); - viewer.setSorter(new ViewerSorter()); + viewer.setSorter(new DefinedTermSorter()); Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() }; viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListener(viewer)); @@ -231,6 +233,28 @@ public class DefinedTermEditor extends EditorPart implements IConversationEnable return viewer; } + private class DefinedTermSorter extends ViewerSorter { + + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + // the comparison value in this method determines the + // location <-> add term method used in the MoveDefinedTermOperation + // execute call + if(e1 instanceof OrderedTermBase && e2 instanceof OrderedTermBase) { + OrderedTermBase otbe1 = (OrderedTermBase)e1; + OrderedTermBase otbe2 = (OrderedTermBase)e2; + if(otbe1.getOrderIndex() == otbe2.getOrderIndex()) { + return 0; + } else if(otbe1.isHigher(otbe2)) { + return 1; + } else { + return -1; + } + } else { + return super.compare(viewer, e1, e2); + } + } + } } \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/MoveDefinedTermOperation.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/MoveDefinedTermOperation.java index 5096f49ac..e6513b9a6 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/MoveDefinedTermOperation.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/editor/definedterm/operation/MoveDefinedTermOperation.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2009 EDIT -* European Distributed Institute of Taxonomy +* 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. */ @@ -17,8 +17,11 @@ import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.jface.viewers.ViewerDropAdapter; import eu.etaxonomy.cdm.model.common.DefinedTermBase; +import eu.etaxonomy.cdm.model.common.OrderedTermBase; +import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary; import eu.etaxonomy.cdm.model.common.TermBase; import eu.etaxonomy.cdm.model.common.TermVocabulary; import eu.etaxonomy.taxeditor.model.MessagingUtils; @@ -32,21 +35,27 @@ import eu.etaxonomy.taxeditor.store.StoreUtil; * */ public class MoveDefinedTermOperation extends AbstractPostTaxonOperation { - - private Collection sourceTerms;// the actual DefinedTermBase(s) we are moving - private TermBase targetTermOrVocabulary;// the target VOCABULARY or DefinedTerm we are moving these to + + private final Collection sourceTerms;// the actual DefinedTermBase(s) we are moving + private final TermBase targetTermOrVocabulary;// the target VOCABULARY or DefinedTerm we are moving these to + private final int currentLocation; /** * @param label * @param undoContext * @param postOperationEnabled */ - public MoveDefinedTermOperation(String label, IUndoContext undoContext, TermBase target, Collection sourceTerms, - IPostOperationEnabled postOperationEnabled) { + public MoveDefinedTermOperation(String label, + IUndoContext undoContext, + TermBase target, + Collection sourceTerms, + IPostOperationEnabled postOperationEnabled, + int currentLocation) { super(label, undoContext, postOperationEnabled); - + this.targetTermOrVocabulary = target; this.sourceTerms = sourceTerms; + this.currentLocation = currentLocation; } /* (non-Javadoc) @@ -55,61 +64,80 @@ public class MoveDefinedTermOperation extends AbstractPostTaxonOperation { @Override public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { - + // need to make the moved DefinedTerm part of another DefinedTerm or Vocabulary (target) // and remove it from old associations - + //TODO move to ITermService - - for (DefinedTermBase term : sourceTerms){ + + for (DefinedTermBase term : sourceTerms) { // do nothing when moving it on itself if(targetTermOrVocabulary.equals(term)){ Status status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), "Term can not be added to itself"); MessagingUtils.informationDialog("", status); return status; } - + if (targetTermOrVocabulary instanceof TermVocabulary) { TermVocabulary termVocabulary = (TermVocabulary)targetTermOrVocabulary; - + // do nothing when term is top level and gets added to the same vocabulary if(term.getPartOf() == null && termVocabulary.equals(term.getVocabulary())){ Status status = new Status(IStatus.CANCEL, StoreUtil.getPluginId(), "Term is already in this vocabulary"); MessagingUtils.informationDialog("", status); return status; } - + cleanTerm(term); termVocabulary.addTerm(term); - + } else if (targetTermOrVocabulary instanceof DefinedTermBase) { cleanTerm(term); DefinedTermBase targetDefinedTerm = (DefinedTermBase) targetTermOrVocabulary; - targetDefinedTerm.addIncludes(term); - targetDefinedTerm.getVocabulary().addTerm(term); + + if(targetTermOrVocabulary instanceof OrderedTermBase && term instanceof OrderedTermBase) { + TermVocabulary tVoc = ((DefinedTermBase) targetTermOrVocabulary).getVocabulary(); + if(tVoc instanceof OrderedTermVocabulary) { + OrderedTermVocabulary otVoc = (OrderedTermVocabulary)tVoc; + // the link between the location and the add term (below / above) + // method is determined by the compare method in the + // DefinedTermEditor's ViewerSorter (DefinedTermSorter) class + if(currentLocation == ViewerDropAdapter.LOCATION_BEFORE) { + otVoc.addTermBelow((OrderedTermBase)term, (OrderedTermBase)targetTermOrVocabulary); + } + + if(currentLocation == ViewerDropAdapter.LOCATION_AFTER) { + otVoc.addTermAbove((OrderedTermBase)term, (OrderedTermBase)targetTermOrVocabulary); + } + } + } + if(currentLocation == ViewerDropAdapter.LOCATION_ON) { + targetDefinedTerm.addIncludes(term); + targetDefinedTerm.getVocabulary().addTerm(term); + } } } //return null; - return postExecute(targetTermOrVocabulary); + return postExecute(targetTermOrVocabulary); } - + private DefinedTermBase cleanTerm(DefinedTermBase term){ DefinedTermBase partOf = term.getPartOf(); if(partOf != null){ partOf.removeIncludes(term); } - - + + TermVocabulary vocabulary = term.getVocabulary(); if(vocabulary != null){ vocabulary.removeTerm(term); } - + return term; } - + /* (non-Javadoc) * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)