95dc3613ac66ba117a10df5ae58692a96874bb74
[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.DoubleClickEvent;
17 import org.eclipse.jface.viewers.IDoubleClickListener;
18 import org.eclipse.jface.viewers.IStructuredSelection;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.custom.StyledText;
21 import org.eclipse.swt.dnd.Clipboard;
22 import org.eclipse.swt.dnd.TextTransfer;
23 import org.eclipse.swt.dnd.Transfer;
24 import org.eclipse.swt.events.SelectionEvent;
25 import org.eclipse.swt.events.SelectionListener;
26 import org.eclipse.swt.widgets.Label;
27 import org.eclipse.swt.widgets.Menu;
28 import org.eclipse.swt.widgets.MenuItem;
29 import org.eclipse.ui.forms.widgets.TableWrapLayout;
30
31 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
32 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
33 import eu.etaxonomy.cdm.model.common.CdmBase;
34 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
35 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
36 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
37 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38 import eu.etaxonomy.taxeditor.model.MessagingUtils;
39 import eu.etaxonomy.taxeditor.store.CdmStore;
40 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
41 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
42 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
43 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
44 import eu.etaxonomy.taxeditor.view.CdmViewerChooser;
45
46 /**
47 * @author pplitzner
48 * @date Dec 1, 2014
49 *
50 */
51 public class TaxonAssociationDetailElement extends AbstractCdmDetailElement<DerivedUnitFacade> implements IDoubleClickListener{
52
53 public TaxonAssociationDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
54 super(formFactory, formElement);
55 }
56
57 /** {@inheritDoc} */
58 @Override
59 protected void createControls(ICdmFormElement formElement, DerivedUnitFacade entity, int style) {
60 Collection<TaxonBase<?>> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listIndividualsAssociationTaxa(entity.innerDerivedUnit(), null, null, null, null);
61 Collection<SpecimenTypeDesignation> typeDesignations = CdmStore.getService(IOccurrenceService.class).listTypeDesignations(entity.innerDerivedUnit(), null, null, null, null);
62 Collection<DeterminationEvent> determinationEvents = CdmStore.getService(IOccurrenceService.class).listDeterminationEvents(entity.innerDerivedUnit(), null, null, null, null);
63
64 Collection<CdmBase> associations = new ArrayList<>();
65 associations.addAll(associatedTaxa);
66 associations.addAll(typeDesignations);
67 associations.addAll(determinationEvents);
68
69 TableWrapLayout layout = (TableWrapLayout) getLayoutComposite().getLayout();
70 layout.bottomMargin = 0;
71 layout.topMargin = 0;
72
73 if(associatedTaxa.isEmpty() && typeDesignations.isEmpty() && determinationEvents.isEmpty()){
74 Label label = formFactory.createLabel(getLayoutComposite(), "No associations");
75 label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
76 return;
77 }
78 for (CdmBase cdmBase : associations) {
79 final StyledText styledTextWidget = new StyledText(getLayoutComposite(), SWT.WRAP);
80 styledTextWidget.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
81 styledTextWidget.setText(getLabelText(cdmBase));
82 styledTextWidget.setBackground(getLayoutComposite().getBackground());
83 styledTextWidget.setEditable(false);
84 //Set caret null this will hide caret
85 styledTextWidget.setCaret(null);
86
87 //TODO add context menu for deleting associations
88 //context menu
89 Menu menu = new Menu(styledTextWidget);
90 MenuItem copyItem = new MenuItem(menu, SWT.PUSH);
91 copyItem.setText("Copy");
92 copyItem.addSelectionListener(new SelectionListener() {
93
94 @Override
95 public void widgetSelected(SelectionEvent e) {
96 Object[] data = new Object[]{styledTextWidget.getText()};
97 Clipboard clipboard = new Clipboard(styledTextWidget.getDisplay());
98 clipboard.setContents(data, new Transfer[]{TextTransfer.getInstance()});
99 }
100
101 @Override
102 public void widgetDefaultSelected(SelectionEvent e) {
103 }
104 });
105 styledTextWidget.setMenu(menu);
106 }
107 }
108
109 private String getLabelText(Object element) {
110 if(element instanceof TaxonBase){
111 return "Associated with "+element.toString();
112 }
113 else if(element instanceof DeterminationEvent){
114 DeterminationEvent determinationEvent = (DeterminationEvent)element;
115 if(determinationEvent.getTaxon()!=null){
116 return "Determined as taxon "+determinationEvent.getTaxon();
117 }
118 if(determinationEvent.getTaxonName()!=null){
119 return "Determined as name "+determinationEvent.getTaxonName();
120 }
121 }
122 else if(element instanceof SpecimenTypeDesignation){
123 SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)element;
124 String label = typeDesignation.getTypeStatus()!=null?typeDesignation.getTypeStatus().getLabel()+" of ":"Type of ";
125 Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
126 for (TaxonNameBase taxonNameBase : typifiedNames) {
127 label += taxonNameBase+", ";
128 }
129 if(label.endsWith(", ")){
130 label = label.substring(0, label.length()-2);
131 }
132 return label;
133 }
134 return "";
135 }
136
137 /** {@inheritDoc} */
138 @Override
139 public void handleEvent(Object eventSource) {
140 //empty
141 }
142
143 @Override
144 public void doubleClick(DoubleClickEvent event) {
145 if(event.getSelection() instanceof IStructuredSelection){
146 Object firstElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
147 if(firstElement instanceof SpecimenTypeDesignation){
148 SpecimenTypeDesignation typeDesignation = (SpecimenTypeDesignation)firstElement;
149 Set<TaxonNameBase> typifiedNames = typeDesignation.getTypifiedNames();
150 if(typifiedNames.size()==1){
151 firstElement = typifiedNames.iterator().next();
152 }
153 if(typifiedNames.size()==0 || typifiedNames.size()>=2){
154 MessagingUtils.informationDialog("Could not open name", "Type designation has either 0 or more than 1 names associated");
155 }
156 }
157 else if(firstElement instanceof DeterminationEvent){
158 if(((DeterminationEvent) firstElement).getTaxon()!=null){
159 firstElement = ((DeterminationEvent) firstElement).getTaxon();
160 }
161 else if(((DeterminationEvent) firstElement).getTaxonName()!=null){
162 firstElement = ((DeterminationEvent) firstElement).getTaxonName();
163 }
164 }
165 new CdmViewerChooser(event.getViewer().getControl().getShell()).chooseViewer(firstElement);
166 }
167 }
168 }