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