- added static method to DerivateLabelProvider to get the derivate text
authorPatric Plitzner <p.plitzner@bgbm.org>
Thu, 20 Nov 2014 09:42:51 +0000 (09:42 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Thu, 20 Nov 2014 09:42:51 +0000 (09:42 +0000)
 - refactored moving of derivates to use the operation framework.
  - immplemented undo/redo

.gitattributes
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java

index a3206c38d166eaa755b9a6e7d6baa79989009a9c..280eb1c927e56c3968630d75d1a6d61623996e8f 100644 (file)
@@ -538,6 +538,7 @@ eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/d
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/SingleReadSequenceContextMenu.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/DeleteDerivateHandler.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDragListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementDropAdapter.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptionElementTransfer.java -text
index d9a10fe892d5c6bd67b694dbbe61e315cde7a395..e5148ff67db0b187cbdd377c87d89f87205265e8 100644 (file)
@@ -9,23 +9,16 @@
 */
 package eu.etaxonomy.taxeditor.editor.view.derivate;
 
+import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.util.LocalSelectionTransfer;
 import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.jface.viewers.ViewerDropAdapter;
 import org.eclipse.swt.dnd.TransferData;
 
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
-import eu.etaxonomy.cdm.model.molecular.DnaSample;
-import eu.etaxonomy.cdm.model.molecular.Sequence;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.derivate.operation.MoveDerivateOperation;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
 
 /**
  * @author pplitzner
@@ -36,9 +29,6 @@ public class DerivateDropListener extends ViewerDropAdapter {
 
     private final DerivateView derivateView;
 
-    /**
-     * @param derivateView
-     */
     protected DerivateDropListener(DerivateView derivateView) {
         super(derivateView.getViewer());
         this.derivateView = derivateView;
@@ -57,30 +47,10 @@ public class DerivateDropListener extends ViewerDropAdapter {
         if(target instanceof TreeNode && data instanceof DerivateViewSelection){
             DerivateViewSelection derivateViewSelection = (DerivateViewSelection)data;
             TreeNode targetNode = (TreeNode) target;
-            TreeNode draggednode = EditorUtil.getTreeNodeOfSelection(derivateViewSelection.getSelection());
-            if(draggednode!=null){
-                if(moveTreeNode(draggednode, targetNode)){
-                    //update DerivateView
-                    derivateView.getConversationHolder().commit();
-                    derivateView.refreshTree();
-
-                    // update source DerivateView if dragging between different views occurred
-                    DerivateView sourceDerivateView = derivateViewSelection.getDerivateView();
-                    if(sourceDerivateView!=derivateView){
-                        sourceDerivateView.getConversationHolder().commit();
-                        sourceDerivateView.refreshTree();
-                    }
-
-                    //FIXME: way too much overhead for just refreshing the other DerivateView
-//                    CdmStore.getContextManager().notifyContextRefresh();
-                    LocalSelectionTransfer.getTransfer().setSelection(null);
-                    return true;
-                }
-                else{
-                    DerivateLabelProvider derivateLabelProvider = new DerivateLabelProvider();
-                    derivateLabelProvider.setConversation(derivateView.getConversationHolder());
-                    MessagingUtils.warningDialog("Moving derivate not possible!", derivateView, "Moving \""+derivateLabelProvider.getDerivateText(draggednode)+"\" to \""+derivateLabelProvider.getDerivateText(targetNode)+"\" is not possible!");
-                }
+            TreeNode draggedNode = EditorUtil.getTreeNodeOfSelection(derivateViewSelection.getSelection());
+            if(draggedNode!=null){
+                MoveDerivateOperation moveDerivateOperation = new MoveDerivateOperation("Moving \""+derivateView.getLabelProvider().getDerivateText(draggedNode)+"\" to \""+derivateView.getLabelProvider().getDerivateText(targetNode)+"\"", EditorUtil.getUndoContext(), derivateView, draggedNode, targetNode);
+                return AbstractUtility.executeOperation(moveDerivateOperation).equals(Status.OK_STATUS)?true:false;
             }
         }
         return false;
@@ -94,48 +64,4 @@ public class DerivateDropListener extends ViewerDropAdapter {
         return LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && target instanceof TreeNode;
     }
 
-    /**
-     * @param value
-     * @return
-     */
-    private boolean moveTreeNode(TreeNode draggedNode, TreeNode targetNode) {
-        Object draggedNodeValue = draggedNode.getValue();
-        Object targetNodeValue = targetNode.getValue();
-        TreeNode fromParentNode = draggedNode.getParent();
-        Object fromParentSpecimen = null;
-        if(fromParentNode!=null){
-            fromParentSpecimen = fromParentNode.getValue();
-        }
-
-        // drag'n'drop for SpecimenOrObservationBase
-        IOccurrenceService occurrenceService = CdmStore.getService(IOccurrenceService.class);
-        if(draggedNodeValue instanceof DerivedUnit && targetNodeValue instanceof SpecimenOrObservationBase<?>){
-            DerivedUnit draggedSpecimen = (DerivedUnit) draggedNodeValue;
-            SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) targetNodeValue;
-            //check if type is a sub derivate type
-            if(fromParentSpecimen instanceof SpecimenOrObservationBase<?>
-            && fromParentNode!=null
-            && !fromParentNode.equals(targetNode)){//don't drag on direct parent node)
-                return occurrenceService.moveDerivate((SpecimenOrObservationBase<?>)fromParentSpecimen, targetSpecimen, draggedSpecimen);
-            }
-        }
-
-        // drag'n'drop for SingleRead
-        else if(draggedNodeValue instanceof SingleRead && targetNodeValue instanceof Sequence){
-            SingleRead singleRead = (SingleRead) draggedNodeValue;
-            if(fromParentSpecimen instanceof Sequence){
-                return CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)targetNodeValue, singleRead);
-            }
-        }
-
-        // drag'n'drop for Sequence
-        else if(draggedNodeValue instanceof Sequence && targetNodeValue instanceof DnaSample && ((SpecimenOrObservationBase<?>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
-            Sequence sequence = (Sequence)draggedNodeValue;
-            if(fromParentSpecimen instanceof DnaSample && ((SpecimenOrObservationBase<?>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
-                return occurrenceService.moveSequence((DnaSample)fromParentSpecimen, (DnaSample)targetNodeValue, sequence);
-            }
-        }
-        return false;
-    }
-
 }
index 141299b613d91e3c4f057506679a60d8e92cb48a..0d677cd096f6738ac89c2d2b26d8428aacd90a06 100644 (file)
@@ -131,17 +131,14 @@ public class DerivateViewEditorInput implements IEditorInput{
 
     private String getEditorName() {
         String name = null;
-        //FIXME consider giving label provider a static method to get the derivate text. Pass the conversation as a method parameter.
-        DerivateLabelProvider labelProvider = new DerivateLabelProvider();
-        labelProvider.setConversation(conversationHolder);
         for(UUID uuid:rootUUIDs){
-            SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(uuid);
+            SpecimenOrObservationBase<?> specimen = CdmStore.getService(IOccurrenceService.class).load(uuid);
             if(specimen!=null){
                 if(name==null){
-                    name = labelProvider.getDerivateText(specimen);
+                    name = DerivateLabelProvider.getDerivateText(specimen, conversationHolder);
                 }
                 else{
-                    name += ", "+labelProvider.getDerivateText(specimen);
+                    name += " + "+DerivateLabelProvider.getDerivateText(specimen, conversationHolder);
                 }
             }
         }
index 7a38d5936199b5310d1aa4a86be70157c1d745cc..1e8e5e87db67b6b8cfb1e9fab5715a6136721df1 100644 (file)
@@ -20,6 +20,8 @@ import org.eclipse.jface.viewers.TreeNode;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.handlers.HandlerUtil;
 
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
@@ -30,6 +32,7 @@ import eu.etaxonomy.taxeditor.editor.view.derivate.operation.DeleteDerivateOpera
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
 
 /**
  *
@@ -59,9 +62,12 @@ public class DeleteDerivateHandler extends AbstractHandler {
                 Object object = selection.iterator().next();
 
                 if(object instanceof TreeNode){
-                    TreeNode treeNode = (TreeNode)object;
                     Object value = ((TreeNode) object).getValue();
                     if(value instanceof SpecimenOrObservationBase<?> || value instanceof Sequence || value instanceof SingleRead){
+                        if(postOperationEnabled instanceof IConversationEnabled){
+                            ConversationHolder conversationHolder = ((IConversationEnabled) postOperationEnabled).getConversationHolder();
+                            label += " "+DerivateLabelProvider.getDerivateText(value, conversationHolder);
+                        }
                         SpecimenDeleteConfigurator config = new SpecimenDeleteConfigurator();
                         config.setDeleteChildren(false);
                         config.setShiftHierarchyUp(false);
index 5032dde4168c692c542897a6675c5be41ed89a75..b480a0f83cd27dd8cd55c462180f8746a03391f6 100644 (file)
@@ -14,11 +14,14 @@ import org.eclipse.core.commands.operations.IUndoContext;
 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.ui.ISaveablePart;
 
 import eu.etaxonomy.cdm.api.service.DeleteResult;
 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.config.SpecimenDeleteConfigurator;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
@@ -56,17 +59,34 @@ public class DeleteDerivateOperation extends AbstractPostOperation<CdmBase> {
     /** {@inheritDoc} */
     @Override
     public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+        if(getPostOperationEnabled() instanceof ISaveablePart){
+            if(!MessagingUtils.confirmDialog("Confirm deletion", "Do you really want to delete the selected element?")){
+                return Status.CANCEL_STATUS;
+            }
+            if(((ISaveablePart) getPostOperationEnabled()).isDirty()){
+                MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+                return Status.CANCEL_STATUS;
+            }
+        }
         DeleteResult deleteResult = CdmStore.getService(IOccurrenceService.class).deleteDerivateHierarchy(element, deleteConfigurator);
-        if(!deleteResult.isOk()){
+        if(deleteResult.isOk()){
+            if(getPostOperationEnabled() instanceof DerivateView){
+                DerivateView derivateView = (DerivateView) getPostOperationEnabled();
+                //update DerivateView
+                derivateView.getConversationHolder().commit();
+                return postExecute(null);
+            }
+        }
+        else{
             String exceptionMessage = "";
             for(Exception exception:deleteResult.getExceptions()){
                 exceptionMessage += exception.getLocalizedMessage();
             }
             //TODO: add method to DeleteResult to sum up exceptions
             MessagingUtils.warningDialog("Deletion failed", this, exceptionMessage);
-            return postExecute(null);
+            return Status.CANCEL_STATUS;
         }
-        return postExecute(element);
+        return Status.OK_STATUS;
     }
 
     /*
@@ -79,7 +99,8 @@ public class DeleteDerivateOperation extends AbstractPostOperation<CdmBase> {
     /** {@inheritDoc} */
     @Override
     public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        return execute(monitor, info);
+        //no redo possible
+        return Status.CANCEL_STATUS ;
     }
 
     /*
@@ -92,6 +113,7 @@ public class DeleteDerivateOperation extends AbstractPostOperation<CdmBase> {
     /** {@inheritDoc} */
     @Override
     public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        return postExecute(element);
+        //no undo possible
+        return Status.CANCEL_STATUS;
     }
 }
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/MoveDerivateOperation.java
new file mode 100644 (file)
index 0000000..9605489
--- /dev/null
@@ -0,0 +1,147 @@
+// $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.operation;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.TreeNode;
+
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.molecular.DnaSample;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
+import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+/**
+ * @author pplitzner
+ * @date Nov 18, 2014
+ *
+ */
+public class MoveDerivateOperation extends AbstractPostOperation<CdmBase>  {
+
+    private final TreeNode draggedNode;
+    private TreeNode fromNode;
+    private TreeNode targetNode;
+
+    public MoveDerivateOperation(String label, IUndoContext undoContext,
+            IPostOperationEnabled postOperationEnabled, TreeNode draggedNode, TreeNode targetNode) {
+            super(label, undoContext, null, postOperationEnabled);
+        this.draggedNode = draggedNode;
+        this.targetNode = targetNode;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+     */
+    @Override
+    public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+        DerivateView derivateView = null;
+        if(getPostOperationEnabled() instanceof DerivateView){
+            derivateView = (DerivateView) getPostOperationEnabled();
+        }
+        if(derivateView==null){
+            MessagingUtils.operationDialog(this, new NullPointerException("DerivateView was null"), TaxeditorEditorPlugin.PLUGIN_ID, this.getLabel(), getLabel());
+            return Status.CANCEL_STATUS;
+        }
+        if(derivateView.isDirty()){
+            MessagingUtils.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+            return Status.CANCEL_STATUS;
+        }
+
+        fromNode = draggedNode.getParent();
+        if(moveTreeNode(draggedNode, fromNode, targetNode)){
+            //update DerivateView
+            derivateView.getConversationHolder().commit();
+            LocalSelectionTransfer.getTransfer().setSelection(null);
+            return postExecute(null);
+        }
+        else{
+            MessagingUtils.warningDialog("Moving derivate not possible!", derivateView, "Moving \""+derivateView.getLabelProvider().getDerivateText(draggedNode)+"\" to \""+derivateView.getLabelProvider().getDerivateText(targetNode)+"\" is not possible!");
+        }
+        return Status.CANCEL_STATUS;
+    }
+
+    private boolean moveTreeNode(TreeNode draggedNode, TreeNode fromNode, TreeNode targetNode) {
+        Object draggedNodeValue = draggedNode.getValue();
+        Object targetNodeValue = targetNode.getValue();
+        Object fromParentSpecimen = null;
+        if(fromNode!=null){
+            fromParentSpecimen = fromNode.getValue();
+        }
+
+        // drag'n'drop for SpecimenOrObservationBase
+        IOccurrenceService occurrenceService = CdmStore.getService(IOccurrenceService.class);
+        if(draggedNodeValue instanceof DerivedUnit && targetNodeValue instanceof SpecimenOrObservationBase<?>){
+            DerivedUnit draggedSpecimen = (DerivedUnit) draggedNodeValue;
+            SpecimenOrObservationBase<?> targetSpecimen = (SpecimenOrObservationBase<?>) targetNodeValue;
+            //check if type is a sub derivate type
+            if(fromParentSpecimen instanceof SpecimenOrObservationBase<?>
+            && fromNode!=null
+            && !fromNode.equals(targetNode)){//don't drag on direct parent node)
+                return occurrenceService.moveDerivate((SpecimenOrObservationBase<?>)fromParentSpecimen, targetSpecimen, draggedSpecimen);
+            }
+        }
+
+        // drag'n'drop for SingleRead
+        else if(draggedNodeValue instanceof SingleRead && targetNodeValue instanceof Sequence){
+            SingleRead singleRead = (SingleRead) draggedNodeValue;
+            if(fromParentSpecimen instanceof Sequence){
+                return CdmStore.getService(ISequenceService.class).moveSingleRead((Sequence)fromParentSpecimen, (Sequence)targetNodeValue, singleRead);
+            }
+        }
+
+        // drag'n'drop for Sequence
+        else if(draggedNodeValue instanceof Sequence && targetNodeValue instanceof DnaSample && ((SpecimenOrObservationBase<?>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
+            Sequence sequence = (Sequence)draggedNodeValue;
+            if(fromParentSpecimen instanceof DnaSample && ((SpecimenOrObservationBase<?>) targetNodeValue).getRecordBasis()==SpecimenOrObservationType.DnaSample){
+                return occurrenceService.moveSequence((DnaSample)fromParentSpecimen, (DnaSample)targetNodeValue, sequence);
+            }
+        }
+        return false;
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+     */
+    @Override
+    public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+        //swap fromNode and targetNode
+        this.targetNode = this.fromNode;
+        return execute(new NullProgressMonitor(), null);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+     */
+    @Override
+    public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+        //swap fromNode and targetNode
+        this.targetNode = this.fromNode;
+        return execute(new NullProgressMonitor(), null);
+    }
+
+}
index 2d06fd31650d5461ff1bfef90095c9eef95f6da9..b304ca85199a1a73b9793b8f3878309c5663d992 100644 (file)
@@ -58,6 +58,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
     private static DefinedTerm detailImageTerm = null;
     private static DefinedTerm sampleDesignationTerm = null;
 
+    //FIXME: move static term getters to new singleton utility class
     private static void initializeTerms() {
         List<DefinedTerm> preferredTerms = CdmStore.getTermManager().getPreferredTerms(DefinedTerm.class);
         for (DefinedTerm definedTerm : preferredTerms) {
@@ -134,12 +135,11 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
         this.conversation = conversation;
     }
 
-    /**
-     *
-     * @param derivate
-     * @return
-     */
     public String getDerivateText(Object element){
+        return getDerivateText(element, conversation);
+    }
+
+    public static String getDerivateText(Object element, ConversationHolder conversation){
         //TODO: use list of strings to assemble labels to avoid adding the separator every time and to allow null values
         TreeNode parentNode = null;
         TreeNode node = null;