fix #5348 Add "copy" context menu to taxon association details view
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / occurrence / association / TaxonAssociationDetailElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.ui.section.occurrence.association;
11
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Set;
15
16 import org.eclipse.jface.viewers.ArrayContentProvider;
17 import org.eclipse.jface.viewers.DoubleClickEvent;
18 import org.eclipse.jface.viewers.IDoubleClickListener;
19 import org.eclipse.jface.viewers.ISelection;
20 import org.eclipse.jface.viewers.IStructuredSelection;
21 import org.eclipse.jface.viewers.LabelProvider;
22 import org.eclipse.jface.viewers.ListViewer;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.dnd.Clipboard;
25 import org.eclipse.swt.dnd.TextTransfer;
26 import org.eclipse.swt.dnd.Transfer;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.events.SelectionListener;
29 import org.eclipse.swt.widgets.Label;
30 import org.eclipse.swt.widgets.Menu;
31 import org.eclipse.swt.widgets.MenuItem;
32
33 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
34 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
35 import eu.etaxonomy.cdm.model.common.CdmBase;
36 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
37 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
38 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
39 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40 import eu.etaxonomy.taxeditor.model.MessagingUtils;
41 import eu.etaxonomy.taxeditor.store.CdmStore;
42 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
43 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
44 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
45 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
46 import eu.etaxonomy.taxeditor.view.CdmViewerChooser;
47
48 /**
49 * @author pplitzner
50 * @date Dec 1, 2014
51 *
52 */
53 public class TaxonAssociationDetailElement extends AbstractCdmDetailElement<DerivedUnitFacade> implements IDoubleClickListener{
54
55 public TaxonAssociationDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
56 super(formFactory, formElement);
57 }
58
59 /** {@inheritDoc} */
60 @Override
61 protected void createControls(ICdmFormElement formElement, DerivedUnitFacade entity, int style) {
62 Collection<TaxonBase<?>> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listIndividualsAssociationTaxa(entity.innerDerivedUnit(), null, null, null, null);
63 Collection<SpecimenTypeDesignation> typeDesignations = CdmStore.getService(IOccurrenceService.class).listTypeDesignations(entity.innerDerivedUnit(), null, null, null, null);
64 Collection<DeterminationEvent> determinationEvents = CdmStore.getService(IOccurrenceService.class).listDeterminationEvents(entity.innerDerivedUnit(), null, null, null, null);
65
66 Collection<CdmBase> associations = new ArrayList<>();
67 associations.addAll(associatedTaxa);
68 associations.addAll(typeDesignations);
69 associations.addAll(determinationEvents);
70
71 if(associatedTaxa.isEmpty() && typeDesignations.isEmpty() && determinationEvents.isEmpty()){
72 Label label = formFactory.createLabel(getLayoutComposite(), "No associations");
73 label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
74 return;
75 }
76 if(!associations.isEmpty()){
77 final ListViewer viewer = new ListViewer(getLayoutComposite(), SWT.SINGLE);
78 viewer.getList().setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
79 viewer.setContentProvider(new ArrayContentProvider());
80 viewer.setLabelProvider(new LabelProvider(){
81 @Override
82 public String getText(Object element) {
83 if(element instanceof TaxonBase){
84 return "Associated with "+element.toString();
85 }
86 else if(element instanceof DeterminationEvent){
87 DeterminationEvent determinationEvent = (DeterminationEvent)element;
88 if(determinationEvent.getTaxon()!=null){
89 return "Determined as taxon "+determinationEvent.getTaxon();
90 }
91 if(determinationEvent.getTaxonName()!=null){
92 return "Determined as name "+determinationEvent.getTaxonName();
93 }
94 }
95 else if(element instanceof SpecimenTypeDesignation){
96 SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)element;
97 String label = typeDesignation.getTypeStatus()!=null?typeDesignation.getTypeStatus().getLabel()+" of ":"Type of ";
98 Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
99 for (TaxonNameBase taxonNameBase : typifiedNames) {
100 label += taxonNameBase+", ";
101 }
102 if(label.endsWith(", ")){
103 label = label.substring(0, label.length()-2);
104 }
105 return label;
106 }
107 return "";
108 }
109 });
110 viewer.setInput(associations);
111 viewer.addDoubleClickListener(this);
112
113 //TODO add context menu for deleting associations
114 //context menu
115 Menu menu = new Menu(viewer.getControl());
116 MenuItem copyItem = new MenuItem(menu, SWT.PUSH);
117 copyItem.setText("Copy");
118 copyItem.addSelectionListener(new SelectionListener() {
119
120 @Override
121 public void widgetSelected(SelectionEvent e) {
122 ISelection selection = viewer.getSelection();
123 if(!selection.isEmpty() && selection instanceof IStructuredSelection){
124 Object firstElement = ((IStructuredSelection) selection).getFirstElement();
125 Object[] data = new Object[]{firstElement.toString()};
126 Clipboard clipboard = new Clipboard(viewer.getControl().getDisplay());
127 clipboard.setContents(data, new Transfer[]{TextTransfer.getInstance()});
128 }
129 }
130
131 @Override
132 public void widgetDefaultSelected(SelectionEvent e) {
133 }
134 });
135 viewer.getControl().setMenu(menu);
136 }
137 }
138
139 /** {@inheritDoc} */
140 @Override
141 public void handleEvent(Object eventSource) {
142 //empty
143 }
144
145 @Override
146 public void doubleClick(DoubleClickEvent event) {
147 if(event.getSelection() instanceof IStructuredSelection){
148 Object firstElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
149 if(firstElement instanceof SpecimenTypeDesignation){
150 SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)firstElement;
151 Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
152 if(typifiedNames.size()==1){
153 firstElement = typifiedNames.iterator().next();
154 }
155 if(typifiedNames.size()==0 || typifiedNames.size()>=2){
156 MessagingUtils.informationDialog("Could not open name", "Type designation has either 0 or more than 1 names associated");
157 }
158 }
159 else if(firstElement instanceof DeterminationEvent){
160 if(((DeterminationEvent) firstElement).getTaxon()!=null){
161 firstElement = ((DeterminationEvent) firstElement).getTaxon();
162 }
163 else if(((DeterminationEvent) firstElement).getTaxonName()!=null){
164 firstElement = ((DeterminationEvent) firstElement).getTaxonName();
165 }
166 }
167 new CdmViewerChooser(event.getViewer().getControl().getShell()).chooseViewer(firstElement);
168 }
169 }
170 }