3 * Copyright (C) 2013 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
.searchFilter
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collection
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import org
.eclipse
.swt
.SWT
;
18 import org
.eclipse
.swt
.layout
.GridData
;
19 import org
.eclipse
.swt
.widgets
.Composite
;
20 import org
.eclipse
.swt
.widgets
.Event
;
21 import org
.eclipse
.swt
.widgets
.Listener
;
22 import org
.eclipse
.swt
.widgets
.Widget
;
24 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
25 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
26 import eu
.etaxonomy
.cdm
.api
.service
.config
.FindOccurrencesConfigurator
;
27 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
28 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
30 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
31 import eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
.DerivateView
;
32 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
33 import eu
.etaxonomy
.taxeditor
.store
.SearchManager
;
34 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.SelectionDialogFactory
;
35 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.combo
.EnumTermComboController
;
36 import eu
.etaxonomy
.taxeditor
.view
.derivateSearch
.DerivateLabelProvider
;
39 * Controller class for the {@link DerivateSearchComposite}.<br>
40 * This controller contains the logic to search the data base for {@link SpecimenOrObservationBase}s
41 * and handles GUI events.
44 public class DerivateSearchCompositeController
implements Listener
{
46 private final DerivateSearchComposite derivateSearchComposite
;
47 private EnumTermComboController
<SpecimenOrObservationType
> comboSpecimenTypeController
;
48 private DerivateLabelProvider labelProvider
;
49 private Taxon selectedTaxon
;
50 private DerivateView derivativeEditor
;
52 public DerivateSearchCompositeController(Composite parent
, DerivateView derivativeEditor
) {
53 this.derivateSearchComposite
= new DerivateSearchComposite(parent
, SWT
.NONE
);
54 this.derivativeEditor
= derivativeEditor
;
60 comboSpecimenTypeController
= new EnumTermComboController
<SpecimenOrObservationType
>(derivateSearchComposite
.getComboDerivateType(), null, null, SpecimenOrObservationType
.class, 0);
61 comboSpecimenTypeController
.setSelection(SpecimenOrObservationType
.Unknown
);
64 derivateSearchComposite
.getSearchField().addListener(SWT
.KeyDown
, this);
65 derivateSearchComposite
.getButtonSearch().addListener(SWT
.Selection
, this);
66 derivateSearchComposite
.getBtnBrowseTaxa().addListener(SWT
.Selection
, this);
67 derivateSearchComposite
.getBtnClearTaxon().addListener(SWT
.Selection
, this);
71 private void searchDerivates(){
72 String queryString
= derivateSearchComposite
.getSearchField().getText();
73 SpecimenOrObservationType specimenType
= comboSpecimenTypeController
.getSelection();
75 FindOccurrencesConfigurator config
= new FindOccurrencesConfigurator();
76 config
.setAssociatedTaxonUuid(selectedTaxon
!=null?selectedTaxon
.getUuid():null);
77 config
.setSpecimenType(specimenType
.equals(SpecimenOrObservationType
.Unknown
)?
null:specimenType
);//unknown := all types
78 config
.setTitleSearchString(queryString
);
79 if(selectedTaxon
!=null){
80 config
.setSpecimenType(null);
83 SearchManager searchManager
= new SearchManager();
84 List
<SpecimenOrObservationBase
> occurrences
= searchManager
.findOccurrences(config
, true);
86 //filter out specimens of wrong type (only if an associated taxon was selected)
87 if(selectedTaxon
!=null && !specimenType
.equals(SpecimenOrObservationType
.Unknown
)){
88 List
<SpecimenOrObservationBase
> specimensOfCorrectType
= new ArrayList
<SpecimenOrObservationBase
>();
89 for(SpecimenOrObservationBase
<?
> occurrence
:occurrences
){
90 if(occurrence
.getRecordBasis().equals(specimenType
)
91 || occurrence
.getRecordBasis().isKindOf(specimenType
)){
92 specimensOfCorrectType
.add(occurrence
);
95 occurrences
= specimensOfCorrectType
;
98 //filter out (un-)assigned specimens
99 if(selectedTaxon
==null){
100 int selectionIndex
= derivateSearchComposite
.getComboTaxonAssignment().getSelectionIndex();
101 List
<SpecimenOrObservationBase
<?
>> specimenWithAssociations
= new ArrayList
<SpecimenOrObservationBase
<?
>>();
102 if(selectionIndex
!=DerivateSearchComposite
.ALL_SPECIMENS
){
103 for (SpecimenOrObservationBase specimenOrObservationBase
: occurrences
) {
104 Collection
<TaxonBase
<?
>> associatedTaxa
= CdmStore
.getService(IOccurrenceService
.class).listAssociatedTaxa(specimenOrObservationBase
, null, null, null, null);
105 if(!associatedTaxa
.isEmpty()){
106 specimenWithAssociations
.add(specimenOrObservationBase
);
107 specimenWithAssociations
.addAll(CdmStore
.getService(IOccurrenceService
.class).getFieldUnits(specimenOrObservationBase
.getUuid()));
111 if(selectionIndex
==DerivateSearchComposite
.UNASSIGNED_SPECIMENS
){
112 occurrences
.removeAll(specimenWithAssociations
);
114 else if(selectionIndex
==DerivateSearchComposite
.ASSIGNED_SPECIMENS
){
115 occurrences
= new ArrayList
<SpecimenOrObservationBase
>(specimenWithAssociations
);
118 List
<UUID
> derivateUuids
= new ArrayList
<UUID
>();
119 for (SpecimenOrObservationBase specimenOrObservationBase
: occurrences
) {
120 derivateUuids
.add(specimenOrObservationBase
.getUuid());
122 derivativeEditor
.updateRootEntities(derivateUuids
);
126 public void handleEvent(Event event
) {
127 Widget eventSource
= event
.widget
;
128 if(eventSource
== derivateSearchComposite
.getButtonSearch()
129 || (eventSource
== derivateSearchComposite
.getSearchField() && event
.keyCode
== SWT
.CR
)){
132 else if(eventSource
==derivateSearchComposite
.getBtnBrowseTaxa()){
133 selectedTaxon
= SelectionDialogFactory
.getSelectionFromDialog(Taxon
.class, this.derivateSearchComposite
.getShell(), derivativeEditor
.getConversationHolder(), null);
134 if(selectedTaxon
!=null){
135 derivateSearchComposite
.getTextTaxonName().setText(selectedTaxon
.getTitleCache());
137 derivateSearchComposite
.getComboTaxonAssignment().select(DerivateSearchComposite
.ASSIGNED_SPECIMENS
);
138 derivateSearchComposite
.getComboTaxonAssignment().setEnabled(false);
139 derivateSearchComposite
.getLbltaxonAssignment().setEnabled(false);
141 else if(eventSource
==derivateSearchComposite
.getBtnClearTaxon()){
142 selectedTaxon
= null;
143 derivateSearchComposite
.getTextTaxonName().setText("");
144 derivateSearchComposite
.getComboTaxonAssignment().select(DerivateSearchComposite
.ALL_SPECIMENS
);
145 derivateSearchComposite
.getComboTaxonAssignment().setEnabled(true);
146 derivateSearchComposite
.getLbltaxonAssignment().setEnabled(true);
151 * Sets enable status of all input fields
154 public void setEnabled(boolean enabled
) {
155 if(!derivateSearchComposite
.isDisposed()){
156 GridData layoutData
= (GridData
) derivateSearchComposite
.getLayoutData();
157 layoutData
.exclude
= !enabled
;
158 derivateSearchComposite
.setVisible(enabled
);
159 derivateSearchComposite
.getParent().layout(true);
163 public void setLayoutData(Object layoutData
){
164 derivateSearchComposite
.setLayoutData(layoutData
);
168 * Resets all input fields
171 if(!derivateSearchComposite
.isDisposed()){
172 derivateSearchComposite
.getSearchField().setText("");
173 derivateSearchComposite
.getComboDerivateType().deselectAll();
174 comboSpecimenTypeController
.setSelection(SpecimenOrObservationType
.Unknown
);
176 selectedTaxon
= null;
179 public void setConversation(ConversationHolder conversationHolder
) {
180 labelProvider
.setConversation(conversationHolder
);