- refactored context menu for DerivateView to be programmatic instead of declarative...
authorPatric Plitzner <p.plitzner@bgbm.org>
Wed, 2 Apr 2014 14:08:30 +0000 (14:08 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Wed, 2 Apr 2014 14:08:30 +0000 (14:08 +0000)
 - fixed icon bug for DerivateSearchView

.gitattributes
eu.etaxonomy.taxeditor.editor/plugin.xml
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/CreateDerivateContextMenu.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewContextMenu.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewPropertyTester.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadSequenceContextMenu.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/CopySingleReadCommand.java [moved from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/CopySingleReadCommand.java with 91% similarity]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/PasteSingleReadCommand.java [moved from eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/PasteDerivateCommand.java with 92% similarity]
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/UnlinkSingleReadCommand.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java

index 4528580f5b06c2db5edf1ff3e46ed3c44473b884..90414ee75dc1cf47cb600431c812bb0c062ad9cd 100644 (file)
@@ -488,15 +488,18 @@ 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/dataimport/transientServices/TransientReferenceService.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTermService.java -text
-eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/CopySingleReadCommand.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/CreateDerivateContextMenu.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDragListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateDropListener.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewContextMenu.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java -text
 eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewPropertyTester.java -text
-eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/PasteDerivateCommand.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadSequenceContextMenu.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/CopySingleReadCommand.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/PasteSingleReadCommand.java -text
+eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/UnlinkSingleReadCommand.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 0c5037c5c0e3611c850f91fecbf5b3cd6b7e83e8..03ad1dd502e654110807d7e3196d87140a1fefdc 100644 (file)
       </menuContribution>
       <menuContribution
             locationURI="popup:eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView">
-         <menu
-               label="Add...">
-            <dynamic
-                  class="eu.etaxonomy.taxeditor.editor.view.derivate.CreateDerivateContextMenu"
-                  id="eu.etaxonomy.taxeditor.editor.view.derivate.CreateDerivateContextMenu">
-            </dynamic>
-         </menu>
+         <dynamic
+               class="eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewContextMenu"
+               id="eu.etaxonomy.taxeditor.editor.view.derivate.DerivateContextMenu">
+         </dynamic>
          <command
-               commandId="eu.etaxonomy.taxeditor.editor.copySingleRead"
-               label="Copy"
+               commandId="eu.etaxonomy.taxeditor.editor.view.derivate.copySingleRead"
+               label="Reuse for other Sequence"
                style="push">
             <visibleWhen
                   checkEnabled="true">
             </visibleWhen>
          </command>
          <command
-               commandId="eu.etaxonomy.taxeditor.editor.pasteDerivate"
-               label="Paste"
+               commandId="eu.etaxonomy.taxeditor.editor.view.derivate.pasteSingleRead"
+               label="Reuse Single Read here"
                style="push">
             <visibleWhen
                   checkEnabled="true">
                </reference>
             </visibleWhen>
          </command>
+         <command
+               commandId="eu.etaxonomy.taxeditor.editor.view.derivate.unlinkSingleRead"
+               label="Remove SingleRead from Sequence"
+               style="push">
+            <visibleWhen
+                  checkEnabled="true">
+               <reference
+                     definitionId="isMultiLinkedSingleRead">
+               </reference>
+            </visibleWhen>
+         </command>
       </menuContribution>
       <menuContribution
             locationURI="popup:eu.etaxonomy.taxeditor.editor.view.dataimport.SpecimenImportEditor">
             name="Save Specimen">
       </command>
        <command
-             defaultHandler="eu.etaxonomy.taxeditor.editor.view.derivate.CopySingleReadCommand"
-             id="eu.etaxonomy.taxeditor.editor.copySingleRead"
+             defaultHandler="eu.etaxonomy.taxeditor.editor.view.derivate.command.CopySingleReadCommand"
+             id="eu.etaxonomy.taxeditor.editor.view.derivate.copySingleRead"
              name="Copy SingleRead">
        </command>
        <command
-             defaultHandler="eu.etaxonomy.taxeditor.editor.view.derivate.PasteDerivateCommand"
-             id="eu.etaxonomy.taxeditor.editor.pasteDerivate"
-             name="Paste">
+             defaultHandler="eu.etaxonomy.taxeditor.editor.view.derivate.command.PasteSingleReadCommand"
+             id="eu.etaxonomy.taxeditor.editor.view.derivate.pasteSingleRead"
+             name="Paste SingleRead">
+       </command>
+       <command
+             defaultHandler="eu.etaxonomy.taxeditor.editor.view.derivate.command.UnlinkSingleReadCommand"
+             id="eu.etaxonomy.taxeditor.editor.view.derivate.unlinkSingleRead"
+             name="Unlink SingleRead">
        </command>
+
    </extension>
    <extension
          point="org.eclipse.core.expressions.definitions">
             </test>
          </with>
       </definition>
+      <definition
+            id="isMultiLinkedSingleRead">
+         <with
+               variable="selection">
+            <test
+                  property="eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewPropertyTester.isMultiLinkedSingleRead">
+            </test>
+         </with>
+      </definition>
    </extension>
    <extension
          point="org.eclipse.core.expressions.propertyTesters">
index 1d1d7ff62f3cd3867441f610a99094857ddac4df..76cd856bf991dfb4c1dac574c8e006228b86bcfd 100644 (file)
@@ -3,9 +3,7 @@ package eu.etaxonomy.taxeditor.editor.view.derivate;
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -28,6 +26,7 @@ import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 
 /**
@@ -45,61 +44,66 @@ public class CreateDerivateContextMenu extends CompoundContributionItem {
                 new ContributionItem() {
                     @Override
                     public void fill(Menu menu, int index) {
+                        MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
+                        addItem.setText("Add...");
+                        Menu addMenu = new Menu(menu);
+                        addItem.setMenu(addMenu);
                         final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                         final ISelection selection = window.getActivePage().getSelection();
-                        if(selection instanceof TreeSelection && ((TreeSelection) selection).getFirstElement() instanceof TreeNode){
-                            TreeNode selectedTreeNode = (TreeNode) ((StructuredSelection) selection).getFirstElement();
+                        TreeNode selectedTreeNode = EditorUtil.getTreeNodeValueOfSelection(selection);
+                        if(selectedTreeNode!=null){
                             //context menu for FieldUnit
                             if(selectedTreeNode.getValue() instanceof FieldUnit){
-                                createMenuItem(menu, "Specimen", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen);
-                                new MenuItem(menu, SWT.SEPARATOR);
-                                createMenuItem(menu, "Tissue Sample", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
-                                createMenuItem(menu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample);
-                                createMenuItem(menu, "Specimen Scan", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
-                                createMenuItem(menu, "Artwork", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
-                                createMenuItem(menu, "Living Plant Photo", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Specimen", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.PreservedSpecimen);
+                                new MenuItem(addMenu, SWT.SEPARATOR);
+                                createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
+                                createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample);
+                                createMenuItem(addMenu, "Specimen Scan", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Artwork", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Living Plant Photo", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
                             }
                             //context menu for Specimen
                             else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
 
-                                createMenuItem(menu, "Tissue Sample", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
-                                createMenuItem(menu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample);
-                                createMenuItem(menu, "Specimen Scan", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
-                                createMenuItem(menu, "Artwork", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
-                                createMenuItem(menu, "Living Plant Photo", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Tissue Sample", selectedTreeNode, DerivedUnit.class, SpecimenOrObservationType.TissueSample);
+                                createMenuItem(addMenu, "DNA Sample", selectedTreeNode, DnaSample.class, SpecimenOrObservationType.DnaSample);
+                                createMenuItem(addMenu, "Specimen Scan", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Artwork", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
+                                createMenuItem(addMenu, "Living Plant Photo", selectedTreeNode, MediaSpecimen.class, SpecimenOrObservationType.StillImage);
                             }
                             //context menu for TissueSample
                             else if(selectedTreeNode.getValue() instanceof DerivedUnit && ((DerivedUnit)selectedTreeNode.getValue()).getRecordBasis()==SpecimenOrObservationType.TissueSample){
-                               createMenuItem(menu, "DnaSample", selectedTreeNode, DnaSample.class, null);
+                               createMenuItem(addMenu, "DnaSample", selectedTreeNode, DnaSample.class, null);
                             }
                             //context menu for DnaSample
                             else if(selectedTreeNode.getValue() instanceof DnaSample){
-                                createMenuItem(menu, "Consensus Sequence", selectedTreeNode, Sequence.class, null);
+                                createMenuItem(addMenu, "Consensus Sequence", selectedTreeNode, Sequence.class, null);
                             }
                             //context menu for Sequence
                             else if(selectedTreeNode.getValue() instanceof Sequence){
-                                createMenuItem(menu, "Single Read", selectedTreeNode, SingleRead.class, null);
+                                createMenuItem(addMenu, "Single Read", selectedTreeNode, SingleRead.class, null);
                             }
                             //default
                             else{
-                                MenuItem menuItem = new MenuItem(menu, SWT.NONE);
+                                MenuItem menuItem = new MenuItem(addMenu, SWT.NONE);
                                 menuItem.setText("No child derivates");
                                 menuItem.setEnabled(false);
                             }
                         }
                     }
 
-                    private void createMenuItem(Menu menu, String menuLabel, TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType) {
-                        MenuItem menuItem = new MenuItem(menu, SWT.NONE);
-                        menuItem.setText(menuLabel);
-                        menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType));
-                    }
 
                 }
         };
         return contributionItems;
     }
 
+    private void createMenuItem(Menu menu, String menuLabel, TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType) {
+        MenuItem menuItem = new MenuItem(menu, SWT.NONE);
+        menuItem.setText(menuLabel);
+        menuItem.addSelectionListener(new WidgetSelectionListener(selectedNode, childClass, specimenType));
+    }
+
     private class WidgetSelectionListener implements SelectionListener{
 
         private final TreeNode selectedNode;
index 5db82aa8444b6623fe949f62ae1a95daa94bed60..b1bfc482438c352e2c7470f6fe21590ee1589ed1 100644 (file)
@@ -58,6 +58,8 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
 
     private DerivateLabelProvider labelProvider;
 
+    private Set<SingleRead> multiLinkSingleReads;
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
      */
@@ -78,7 +80,8 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         Menu menu = menuManager.createContextMenu(control);
         control.setMenu(menu);
 
-        labelProvider.setMultiLinkSingleReads(getMultiLinkSingleReads());
+        generateMultiLinkSingleReads();
+        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
         IEditorInput editorInput = getEditorInput();
         viewer.setInput(editorInput);
         if(editorInput instanceof DerivateViewEditorInput){
@@ -218,21 +221,26 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
      * Updates the derivate hierarchy tree
      */
     public void update(){
-        labelProvider.setMultiLinkSingleReads(getMultiLinkSingleReads());
+        generateMultiLinkSingleReads();
+        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
         viewer.setInput(getEditorInput());
     }
 
-    /**
-     * @return
-     */
-    private Set<SingleRead> getMultiLinkSingleReads() {
+    private void generateMultiLinkSingleReads() {
         Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
         for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
             if(entry.getValue().size()>1){
                 multiLinkSingleReads.add(entry.getKey());
             }
         }
-        return multiLinkSingleReads;
+        this.multiLinkSingleReads = multiLinkSingleReads;
+    }
+
+    /**
+     * @return
+     */
+    public Set<SingleRead> getMultiLinkSingleReads() {
+        return this.multiLinkSingleReads;
     }
 
 }
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewContextMenu.java
new file mode 100644 (file)
index 0000000..8bab2c0
--- /dev/null
@@ -0,0 +1,58 @@
+package eu.etaxonomy.taxeditor.editor.view.derivate;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.menus.IWorkbenchContribution;
+import org.eclipse.ui.services.IServiceLocator;
+
+public class DerivateViewContextMenu extends CompoundContributionItem implements IWorkbenchContribution {
+
+    private IServiceLocator serviceLocator;
+
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+     */
+    @Override
+    protected IContributionItem[] getContributionItems() {
+        IContributionItem[] contributionItems = new IContributionItem[] {
+                new CreateDerivateContextMenu(),
+                new SingleReadSequenceContextMenu()
+        };
+        return contributionItems;
+//        Collection<IContributionItem> contributionItems = new ArrayList<IContributionItem>();
+//        // build a couple of command-based contribution parameters
+//        CommandContributionItemParameter pAA = new CommandContributionItemParameter(
+//                serviceLocator,
+//                null,
+//                "eu.etaxonomy.taxeditor.editor.view.derivate.unlinkSingleRead",
+//                SWT.PUSH);
+//        pAA.label = "Remove from Sequence";
+//
+//        // create actual contribution items and add them to the given additions reference
+//        CommandContributionItem itemAA = new CommandContributionItem(pAA);
+//        itemAA.setVisible(true);
+//        contributionItems.add(itemAA);
+//        IContributionItem[] contributionItemsArray = new IContributionItem[contributionItems.size()];
+//        return contributionItems.toArray(contributionItemsArray);
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.menus.IWorkbenchContribution#initialize(org.eclipse.ui.services.IServiceLocator)
+     */
+    @Override
+    public void initialize(IServiceLocator serviceLocator) {
+        this.serviceLocator = serviceLocator;
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.actions.CompoundContributionItem#dispose()
+     */
+    @Override
+    public void dispose() {
+        super.dispose();
+        this.serviceLocator = null;
+    }
+
+
+}
index 951d8c4172bce91d8efb660453e6bdad2bebcbd3..c9537d6391ff01163fa87539f4e7e8d87f71295b 100644 (file)
@@ -28,6 +28,9 @@ public class DerivateViewPropertyTester extends PropertyTester {
                 else if(property.equals("isSingleRead") && treeNode.getValue() instanceof SingleRead){
                     return true;
                 }
+                else if(property.equals("isMultiLinkedSingleRead") && treeNode.getValue() instanceof SingleRead){
+                    return true;
+                }
             }
         }
         return false;
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadSequenceContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/SingleReadSequenceContextMenu.java
new file mode 100644 (file)
index 0000000..f34d105
--- /dev/null
@@ -0,0 +1,146 @@
+package eu.etaxonomy.taxeditor.editor.view.derivate;
+
+import org.eclipse.jface.action.ContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+
+import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
+import eu.etaxonomy.cdm.model.media.Media;
+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.DerivationEvent;
+import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+
+/**
+ * Context menu for the creation of derivates in the derivate hierarchy.
+ *
+ */
+public class SingleReadSequenceContextMenu extends CompoundContributionItem {
+
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+     */
+    @Override
+    protected IContributionItem[] getContributionItems() {
+        IContributionItem[] contributionItems = new IContributionItem[] {
+                new ContributionItem() {
+                    @Override
+                    public void fill(Menu menu, int index) {
+                        final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+                        final IEditorPart activeEditor = window.getActivePage().getActiveEditor();
+                        final ISelection selection = window.getActivePage().getSelection();
+                        TreeNode selectedTreeNode = EditorUtil.getTreeNodeValueOfSelection(selection);
+                        TreeNode clipboardNode = EditorUtil.getTreeNodeValueOfSelection(LocalSelectionTransfer.getTransfer().getSelection());
+                        if(selectedTreeNode!=null){
+                            //context menu for Sequence
+                            if(selectedTreeNode.getValue() instanceof Sequence
+                                    && clipboardNode!=null && clipboardNode.getValue() instanceof SingleRead){
+                                MenuItem item = new MenuItem(menu, SWT.NONE);
+                                item.setText("Reuse SingleRead here");
+                            }
+                            else if(selectedTreeNode.getValue() instanceof SingleRead){
+                                MenuItem item = new MenuItem(menu, SWT.NONE);
+                                item.setText("Reuse for other Sequence");
+                                if(activeEditor instanceof DerivateView
+                                        && ((DerivateView) activeEditor).getMultiLinkSingleReads().contains(selectedTreeNode.getValue())){
+                                    MenuItem unlinkItem = new MenuItem(menu, SWT.NONE);
+                                    unlinkItem.setText("Remove from this Sequence");
+                                }
+                            }
+                        }
+                    }
+                }
+        };
+        return contributionItems;
+    }
+
+    private class WidgetSelectionListener implements SelectionListener{
+
+        private final TreeNode selectedNode;
+        //TODO: we need a common interface for the generic like e.g. "IDerivateHierarchyNode"
+        private final Class<?> childClass;
+        private final SpecimenOrObservationType specimenType;
+
+        /**
+         * @param selectedNode
+         * @param specimenType
+         */
+        public WidgetSelectionListener(TreeNode selectedNode, Class<?> childClass, SpecimenOrObservationType specimenType) {
+            this.selectedNode = selectedNode;
+            this.childClass = childClass;
+            this.specimenType = specimenType;
+        }
+
+        /* (non-Javadoc)
+         * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+         */
+        @Override
+        public void widgetSelected(SelectionEvent e) {
+            Object selectedDerivate = selectedNode.getValue();
+            if(selectedDerivate instanceof DnaSample){
+                DnaSample dnaSample = (DnaSample)selectedDerivate;
+                if(childClass.equals(Sequence.class)){
+                    dnaSample.addSequence(Sequence.NewInstance(""));//why does this not have DnaSample as constructor parameter?
+                }
+            }
+            else if(selectedDerivate instanceof Sequence){
+                ((Sequence) selectedDerivate).addSingleRead(SingleRead.NewInstance());
+            }
+            else if(selectedDerivate instanceof SpecimenOrObservationBase && DerivedUnit.class.isAssignableFrom(childClass)){
+                SpecimenOrObservationBase<?> specimenOrObservationBase = (SpecimenOrObservationBase<?>)selectedDerivate;
+                DerivedUnit derivedUnit;
+                if(childClass.equals(DnaSample.class)){
+                    derivedUnit = DnaSample.NewInstance();
+                }
+                else if(childClass.equals(MediaSpecimen.class)){
+                    derivedUnit = MediaSpecimen.NewInstance(specimenType);
+                    //a MediaSpecimen with no media attached does not make sense. Hence we add one
+                    ((MediaSpecimen)derivedUnit).setMediaSpecimen(Media.NewInstance());
+                }
+                else{
+                    derivedUnit = DerivedUnit.NewInstance(specimenType);
+                }
+                specimenOrObservationBase.addDerivationEvent(DerivationEvent.NewSimpleInstance(specimenOrObservationBase, derivedUnit, DerivationEventType.GATHERING_IN_SITU()));
+                derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());
+                derivedUnit.getTitleCache(); //update title cache
+            }
+
+            //refresh view
+            IWorkbenchPart activePart = AbstractUtility.getActivePart();
+            if(activePart instanceof DerivateView){
+                DerivateView derivateView = (DerivateView)activePart;
+                derivateView.changed(null);
+                derivateView.getViewer().refresh();
+            }
+        }
+
+        /* (non-Javadoc)
+         * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+         */
+        @Override
+        public void widgetDefaultSelected(SelectionEvent e) {
+            // TODO Auto-generated method stub
+
+        }
+    }
+
+}
@@ -1,4 +1,4 @@
-package eu.etaxonomy.taxeditor.editor.view.derivate;
+package eu.etaxonomy.taxeditor.editor.view.derivate.command;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -13,10 +13,11 @@ import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
 import eu.etaxonomy.cdm.model.molecular.Sequence;
 import eu.etaxonomy.cdm.model.molecular.SingleRead;
 import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
 import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
-public class PasteDerivateCommand extends AbstractHandler {
+public class PasteSingleReadCommand extends AbstractHandler {
 
 
     @Override
diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/UnlinkSingleReadCommand.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/command/UnlinkSingleReadCommand.java
new file mode 100644 (file)
index 0000000..6b9d920
--- /dev/null
@@ -0,0 +1,52 @@
+package eu.etaxonomy.taxeditor.editor.view.derivate.command;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
+import eu.etaxonomy.cdm.model.molecular.Sequence;
+import eu.etaxonomy.cdm.model.molecular.SingleRead;
+import eu.etaxonomy.taxeditor.editor.EditorUtil;
+import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+
+public class UnlinkSingleReadCommand extends AbstractHandler {
+
+    /* (non-Javadoc)
+     * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+     */
+    @Override
+    public Object execute(ExecutionEvent event) throws ExecutionException {
+        IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+        if(activeEditor.isDirty()){
+            AbstractUtility.warningDialog("View has unsaved changes", this, "You need to save before performing this action");
+            return null;
+        }
+        ISelection clipBoardSelection = LocalSelectionTransfer.getTransfer().getSelection();
+        final ISelection pasteSelection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+
+        TreeNode clipBoardTreeNode = EditorUtil.getTreeNodeValueOfSelection(clipBoardSelection);
+        TreeNode pasteTreeNode = EditorUtil.getTreeNodeValueOfSelection(pasteSelection);
+        if(clipBoardTreeNode!=null && clipBoardTreeNode.getValue() instanceof SingleRead
+                && pasteTreeNode!=null && pasteTreeNode.getValue() instanceof Sequence){
+            SingleRead singleRead = (SingleRead)clipBoardTreeNode.getValue();
+            Sequence sequence = (Sequence)pasteTreeNode.getValue();
+            sequence.addSingleRead(singleRead);
+            CdmStore.getService(ISequenceService.class).saveOrUpdate(sequence);
+            if(activeEditor instanceof DerivateView) {
+                DerivateView derivateView = (DerivateView)activeEditor;
+                derivateView.update();
+                LocalSelectionTransfer.getTransfer().setSelection(null);
+            }
+        }
+        return null;
+    }
+
+}
index 48f90614b793c172532498024110d8e44004fa4b..e59473a89934146c594f87a42886c501c999646f 100644 (file)
@@ -9,7 +9,6 @@
 */
 package eu.etaxonomy.taxeditor.view.derivateSearch;
 
-import java.util.HashSet;
 import java.util.Set;
 
 import org.eclipse.jface.viewers.ColumnLabelProvider;
@@ -29,7 +28,7 @@ import eu.etaxonomy.taxeditor.model.ImageResources;
  */
 public class DerivateLabelProvider extends ColumnLabelProvider {
 
-    private Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
+    private Set<SingleRead> multiLinkSingleReads;
 
     /** {@inheritDoc} */
     @Override
@@ -61,46 +60,46 @@ public class DerivateLabelProvider extends ColumnLabelProvider {
     @Override
     public Image getImage(Object element) {
         if(element instanceof TreeNode){
-            TreeNode treeNode = (TreeNode)element;
-            Object nodeValue = treeNode.getValue();
-            if(nodeValue instanceof FieldUnit){
+            element = ((TreeNode) element).getValue();
+        }
+        if(element instanceof FieldUnit){
+            return ImageResources.getImage(ImageResources.FIELD_UNIT);
+        }
+        else if(element instanceof DerivedUnit){
+            DerivedUnit derivedUnit = (DerivedUnit)element;
+            if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.FieldUnit){
                 return ImageResources.getImage(ImageResources.FIELD_UNIT);
             }
-            else if(nodeValue instanceof DerivedUnit){
-                DerivedUnit derivedUnit = (DerivedUnit)nodeValue;
-                if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.FieldUnit){
-                    return ImageResources.getImage(ImageResources.FIELD_UNIT);
-                }
-                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
-                    return ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE);
-                }
-                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
-                    return ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE);
-                }
-                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
-                    return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
-                }
-                else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.StillImage){
-                    return ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
-                }
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.DnaSample){
+                return ImageResources.getImage(ImageResources.DNA_SAMPLE_DERIVATE);
+            }
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){
+                return ImageResources.getImage(ImageResources.TISSUE_SAMPLE_DERIVATE);
+            }
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){
+                return ImageResources.getImage(ImageResources.SPECIMEN_DERIVATE);
             }
-            else if(nodeValue instanceof Sequence){
-                return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
+            else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.StillImage){
+                return ImageResources.getImage(ImageResources.ARTWORK_DERIVATE);
+            }
+        }
+        else if(element instanceof Sequence){
+            return ImageResources.getImage(ImageResources.SEQUENCE_DERIVATE);
+        }
+
+        else if(element instanceof SingleRead){
+            if(multiLinkSingleReads.contains(element)){
+                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
             }
-            else if(nodeValue instanceof SingleRead){
-                if(multiLinkSingleReads.contains(nodeValue)){
-                    return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK);
-                }
-                else{
-                    return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
-                }
+            else{
+                return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE);
             }
         }
         return super.getImage(element);
     }
 
     /**
-     * @param multiLinkSingleReads the multiLinkSingleReads to set
+     * @param multiLinkSingleReads2
      */
     public void setMultiLinkSingleReads(Set<SingleRead> multiLinkSingleReads) {
         this.multiLinkSingleReads = multiLinkSingleReads;