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
.view
.derivateSearch
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
15 import org
.eclipse
.core
.commands
.ExecutionException
;
16 import org
.eclipse
.core
.commands
.NotEnabledException
;
17 import org
.eclipse
.core
.commands
.NotHandledException
;
18 import org
.eclipse
.core
.commands
.common
.NotDefinedException
;
19 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
20 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
21 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
22 import org
.eclipse
.jface
.viewers
.TableViewer
;
23 import org
.eclipse
.swt
.SWT
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.swt
.widgets
.Event
;
26 import org
.eclipse
.swt
.widgets
.Listener
;
27 import org
.eclipse
.swt
.widgets
.Widget
;
28 import org
.eclipse
.ui
.handlers
.IHandlerService
;
30 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
31 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
32 import eu
.etaxonomy
.cdm
.api
.service
.config
.FindOccurrencesConfigurator
;
33 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
35 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
36 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
37 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
38 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
39 import eu
.etaxonomy
.taxeditor
.store
.SearchManager
;
40 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.SelectionDialogFactory
;
41 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.combo
.EnumTermComboController
;
44 * Controller class for the {@link DerivateSearchComposite}.<br>
45 * This controller contains the logic to search the data base for {@link SpecimenOrObservationBase}s
46 * and handles GUI events.
49 public class DerivateSearchCompositeController
implements Listener
{
51 private final DerivateSearchComposite derivateSearchComposite
;
52 private EnumTermComboController
<SpecimenOrObservationType
> comboSpecimenTypeController
;
53 private final DerivateSearchView derivateSearchView
;
54 private DerivateLabelProvider labelProvider
;
55 private Taxon selectedTaxon
;
59 * @param derivateSearchView
61 public DerivateSearchCompositeController(Composite parent
, DerivateSearchView derivateSearchView
) {
62 this.derivateSearchComposite
= new DerivateSearchComposite(parent
, SWT
.NONE
);
63 this.derivateSearchView
= derivateSearchView
;
69 comboSpecimenTypeController
= new EnumTermComboController
<SpecimenOrObservationType
>(derivateSearchComposite
.getComboDerivateType(), null, null, SpecimenOrObservationType
.class, 0);
70 comboSpecimenTypeController
.setSelection(SpecimenOrObservationType
.Unknown
);
73 derivateSearchComposite
.getSearchField().addListener(SWT
.KeyDown
, this);
74 derivateSearchComposite
.getButtonSearch().addListener(SWT
.Selection
, this);
75 derivateSearchComposite
.getBtnBrowseTaxa().addListener(SWT
.Selection
, this);
76 derivateSearchComposite
.getBtnClearTaxon().addListener(SWT
.Selection
, this);
80 TableViewer resultViewer
= derivateSearchComposite
.getResultViewer();
81 resultViewer
.setContentProvider(new ArrayContentProvider());
82 labelProvider
= new DerivateLabelProvider();
83 resultViewer
.setLabelProvider(labelProvider
);
84 resultViewer
.addDoubleClickListener(new IDoubleClickListener() {
86 public void doubleClick(DoubleClickEvent event
) {
87 String commandId
= "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
89 IHandlerService handlerService
= (IHandlerService
) AbstractUtility
.getService(IHandlerService
.class);
91 handlerService
.executeCommand(commandId
, null);
92 } catch (ExecutionException e
) {
93 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
94 } catch (NotDefinedException e
) {
95 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
96 } catch (NotEnabledException e
) {
97 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
98 } catch (NotHandledException e
) {
99 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
107 private void searchDerivates(){
108 if(!derivateSearchView
.getConversationHolder().isBound()){
109 derivateSearchView
.setFocus(); //rebind the conversation
112 String queryString
= derivateSearchComposite
.getSearchField().getText();
113 SpecimenOrObservationType specimenType
= comboSpecimenTypeController
.getSelection();
115 FindOccurrencesConfigurator config
= new FindOccurrencesConfigurator();
116 config
.setAssociatedTaxonUuid(selectedTaxon
!=null?selectedTaxon
.getUuid():null);
117 config
.setSpecimenType(specimenType
==SpecimenOrObservationType
.Unknown?
null:specimenType
);//unknown := all types
118 config
.setTitleSearchString(queryString
);
119 if(selectedTaxon
!=null){
120 config
.setRetrieveIndirectlyAssociatedSpecimens(true);
121 config
.setSpecimenType(null);
124 SearchManager searchManager
= new SearchManager();
125 List
<SpecimenOrObservationBase
> occurrences
= searchManager
.findOccurrences(config
);
127 //filter out specimens of wrong type (only if an associated taxon was selected)
128 if(selectedTaxon
!=null){
129 List
<SpecimenOrObservationBase
> specimensOfCorrectType
= new ArrayList
<SpecimenOrObservationBase
>();
130 for(SpecimenOrObservationBase
<?
> occurrence
:occurrences
){
131 if(occurrence
.getRecordBasis().equals(comboSpecimenTypeController
.getSelection())
132 || occurrence
.getRecordBasis().isKindOf(comboSpecimenTypeController
.getSelection())){
133 specimensOfCorrectType
.add(occurrence
);
136 occurrences
= specimensOfCorrectType
;
139 //filter out assigned specimens
140 if(derivateSearchComposite
.getBtnFilterUndeterminedSpecimen().getSelection()){
141 List
<SpecimenOrObservationBase
> specimensWithNoDetermination
= new ArrayList
<SpecimenOrObservationBase
>();
142 for(SpecimenOrObservationBase
<?
> result
:occurrences
){
143 if(CdmStore
.getService(IOccurrenceService
.class).countDeterminations(result
, null)==0){
144 specimensWithNoDetermination
.add(result
);
147 occurrences
= specimensWithNoDetermination
;
149 derivateSearchComposite
.getResultViewer().setInput(occurrences
);
153 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
156 public void handleEvent(Event event
) {
157 Widget eventSource
= event
.widget
;
158 if(eventSource
== derivateSearchComposite
.getButtonSearch()
159 || (eventSource
== derivateSearchComposite
.getSearchField() && event
.keyCode
== SWT
.CR
)){
162 else if(eventSource
==derivateSearchComposite
.getBtnBrowseTaxa()){
163 selectedTaxon
= SelectionDialogFactory
.getSelectionFromDialog(Taxon
.class, derivateSearchView
.getSite().getShell(), derivateSearchView
.getConversationHolder(), null);
164 if(selectedTaxon
!=null){
165 derivateSearchComposite
.getTextTaxonName().setText(selectedTaxon
.getTitleCache());
168 else if(eventSource
==derivateSearchComposite
.getBtnClearTaxon()){
169 selectedTaxon
= null;
170 derivateSearchComposite
.getTextTaxonName().setText("");
175 * Sets enable status of all input fields
178 public void setEnabled(boolean enabled
) {
179 if(!derivateSearchComposite
.isDisposed()){
180 derivateSearchComposite
.setEnabled(enabled
);
185 * Resets all input fields
188 if(!derivateSearchComposite
.isDisposed()){
189 derivateSearchComposite
.getResultViewer().setInput(null);
190 derivateSearchComposite
.getSearchField().setText("");
191 derivateSearchComposite
.getComboDerivateType().deselectAll();
192 comboSpecimenTypeController
.setSelection(SpecimenOrObservationType
.Unknown
);
194 selectedTaxon
= null;
197 public TableViewer
getResultViewer() {
198 return derivateSearchComposite
.getResultViewer();
201 public void setFocus() {
202 derivateSearchComposite
.getResultViewer().getControl().setFocus();
206 * @param conversationHolder
208 public void setConversation(ConversationHolder conversationHolder
) {
209 labelProvider
.setConversation(conversationHolder
);