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
.Arrays
;
14 import java
.util
.LinkedHashMap
;
15 import java
.util
.List
;
17 import org
.eclipse
.core
.commands
.ExecutionException
;
18 import org
.eclipse
.core
.commands
.NotEnabledException
;
19 import org
.eclipse
.core
.commands
.NotHandledException
;
20 import org
.eclipse
.core
.commands
.common
.NotDefinedException
;
21 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
22 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
23 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
24 import org
.eclipse
.jface
.viewers
.TableViewer
;
25 import org
.eclipse
.swt
.SWT
;
26 import org
.eclipse
.swt
.widgets
.Composite
;
27 import org
.eclipse
.swt
.widgets
.Event
;
28 import org
.eclipse
.swt
.widgets
.Listener
;
29 import org
.eclipse
.swt
.widgets
.Widget
;
30 import org
.eclipse
.ui
.handlers
.IHandlerService
;
32 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
33 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacadeCacheStrategy
;
34 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
35 import eu
.etaxonomy
.cdm
.api
.service
.config
.IIdentifiableEntityServiceConfigurator
;
36 import eu
.etaxonomy
.cdm
.api
.service
.config
.IdentifiableServiceConfiguratorImpl
;
37 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
38 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
39 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
40 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
41 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
42 import eu
.etaxonomy
.taxeditor
.ui
.mvc
.combo
.EnumTermComboController
;
45 * Controller class for the {@link DerivateSearchComposite}.<br>
46 * This controller contains the logic to search the data base for {@link SpecimenOrObservationBase}s
47 * and handles GUI events.
50 public class DerivateSearchCompositeController
implements Listener
{
52 private final DerivateSearchComposite derivateSearchComposite
;
53 private IIdentifiableEntityServiceConfigurator
<SpecimenOrObservationBase
<DerivedUnitFacadeCacheStrategy
>> configurator
;
54 private EnumTermComboController
<SpecimenOrObservationType
> enumTermComboController
;
55 private DerivateLabelProvider labelProvider
;
56 private final DerivateSearchView derivateSearchView
;
57 private DerivateLabelProvider labelProvider
;
60 * @param derivateSearchView
62 public DerivateSearchCompositeController(Composite parent
, DerivateSearchView derivateSearchView
) {
63 this.derivateSearchComposite
= new DerivateSearchComposite(parent
, SWT
.NONE
);
64 this.derivateSearchView
= derivateSearchView
;
69 LinkedHashMap
<SpecimenOrObservationType
, String
> orderedTerms
= AbstractUtility
.orderTerms(Arrays
.asList(SpecimenOrObservationType
.values()));
70 String
[] comboItems
= new String
[orderedTerms
.size()];
72 for(String termMessage
:orderedTerms
.values()){
73 comboItems
[count
] = termMessage
;
77 enumTermComboController
= new EnumTermComboController
<SpecimenOrObservationType
>(derivateSearchComposite
.getComboDerivateType(), null, null, SpecimenOrObservationType
.class, 0);
78 enumTermComboController
.setSelection(SpecimenOrObservationType
.Unknown
);
80 derivateSearchComposite
.getSearchField().addListener(SWT
.KeyDown
, this);
81 derivateSearchComposite
.getButtonSearch().addListener(SWT
.Selection
, this);
83 TableViewer resultViewer
= derivateSearchComposite
.getResultViewer();
84 resultViewer
.setContentProvider(new ArrayContentProvider());
85 labelProvider
= new DerivateLabelProvider();
86 resultViewer
.setLabelProvider(labelProvider
);
87 resultViewer
.addDoubleClickListener(new IDoubleClickListener() {
89 public void doubleClick(DoubleClickEvent event
) {
90 String commandId
= "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
92 IHandlerService handlerService
= (IHandlerService
) AbstractUtility
.getService(IHandlerService
.class);
94 handlerService
.executeCommand(commandId
, null);
95 } catch (ExecutionException e
) {
96 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
97 } catch (NotDefinedException e
) {
98 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
99 } catch (NotEnabledException e
) {
100 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
101 } catch (NotHandledException e
) {
102 MessagingUtils
.error(DerivateSearchCompositeController
.class, e
);
107 configurator
= new IdentifiableServiceConfiguratorImpl
<SpecimenOrObservationBase
<DerivedUnitFacadeCacheStrategy
>>();
111 private void searchDerivates(){
112 if(!derivateSearchView
.getConversationHolder().isBound()){
113 derivateSearchView
.setFocus(); //rebind the conversation
116 configurator
.setTitleSearchString(derivateSearchComposite
.getSearchField().getText());
117 SpecimenOrObservationType type
= enumTermComboController
.getSelection();
118 //filter by specimen type
119 List
<SpecimenOrObservationBase
> results
= CdmStore
.getSearchManager().findOccurrencesByType(configurator
, type
);
120 //filter out assigned specimens
121 if(derivateSearchComposite
.getBtnFilterUndeterminedSpecimen().getSelection()){
122 List
<SpecimenOrObservationBase
> specimensWithNoDetermination
= new ArrayList
<SpecimenOrObservationBase
>();
123 for(SpecimenOrObservationBase
<?
> result
:results
){
124 if(CdmStore
.getService(IOccurrenceService
.class).countDeterminations(result
, null)==0){
125 specimensWithNoDetermination
.add(result
);
128 results
= specimensWithNoDetermination
;
130 derivateSearchComposite
.getResultViewer().setInput(results
);
134 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
137 public void handleEvent(Event event
) {
138 Widget eventSource
= event
.widget
;
139 if(eventSource
== derivateSearchComposite
.getButtonSearch()
140 || (eventSource
== derivateSearchComposite
.getSearchField() && event
.keyCode
== SWT
.CR
)){
146 * Sets enable status of all input fields
149 public void setEnabled(boolean enabled
) {
150 if(!derivateSearchComposite
.isDisposed()){
151 derivateSearchComposite
.setEnabled(enabled
);
156 * Resets all input fields
159 derivateSearchComposite
.getResultViewer().setInput(null);
160 derivateSearchComposite
.getSearchField().setText("");
161 enumTermComboController
.setSelection(SpecimenOrObservationType
.Unknown
);
162 derivateSearchComposite
.getComboDerivateType().deselectAll();
165 public TableViewer
getResultViewer() {
166 return derivateSearchComposite
.getResultViewer();
169 public void setFocus() {
170 derivateSearchComposite
.getResultViewer().getControl().setFocus();
174 * @param conversationHolder
176 public void setConversation(ConversationHolder conversationHolder
) {
177 labelProvider
.setConversation(conversationHolder
);