Project

General

Profile

Download (7.44 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(3-3/4)