Merge branch 'release/4.7.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / searchFilter / DerivateSearchCompositeController.java
1 /**
2 * Copyright (C) 2013 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter;
10
11 import java.util.List;
12 import java.util.UUID;
13
14 import org.eclipse.swt.SWT;
15 import org.eclipse.swt.layout.GridData;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Event;
18 import org.eclipse.swt.widgets.Listener;
19 import org.eclipse.swt.widgets.Widget;
20
21 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
22 import eu.etaxonomy.cdm.api.service.ITaxonService;
23 import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
24 import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator.AssignmentStatus;
25 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
26 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
27 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
28 import eu.etaxonomy.cdm.model.taxon.Taxon;
29 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
30 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
31 import eu.etaxonomy.taxeditor.store.CdmStore;
32 import eu.etaxonomy.taxeditor.store.SearchManager;
33 import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;
34 import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController;
35 import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
36
37 /**
38 * Controller class for the {@link DerivateSearchComposite}.<br>
39 * This controller contains the logic to search the data base for {@link SpecimenOrObservationBase}s
40 * and handles GUI events.
41 *
42 */
43 public class DerivateSearchCompositeController implements Listener{
44
45 private final DerivateSearchComposite derivateSearchComposite;
46 private EnumTermComboController<SpecimenOrObservationType> comboSpecimenTypeController;
47 private DerivateLabelProvider labelProvider;
48 private Taxon selectedTaxon;
49 private DerivateView derivativeEditor;
50
51 public DerivateSearchCompositeController(Composite parent, DerivateView derivativeEditor) {
52 this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE);
53 this.derivativeEditor = derivativeEditor;
54 init();
55 }
56
57 private void init(){
58 //derivate type combo
59 comboSpecimenTypeController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
60 comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
61
62 //add listeners
63 derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
64 derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
65 derivateSearchComposite.getBtnBrowseTaxa().addListener(SWT.Selection, this);
66 derivateSearchComposite.getBtnClearTaxon().addListener(SWT.Selection, this);
67
68 }
69
70 private void searchDerivates(){
71 String queryString = derivateSearchComposite.getSearchField().getText();
72 SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection();
73
74 FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
75 config.setAssociatedTaxonUuid(selectedTaxon!=null?selectedTaxon.getUuid():null);
76 config.setSpecimenType(specimenType.equals(SpecimenOrObservationType.Unknown)?null:specimenType);//unknown := all types
77 config.setTitleSearchString(queryString);
78 if(selectedTaxon!=null){
79 config.setSpecimenType(null);
80 }
81 switch (derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex()) {
82 case DerivateSearchComposite.ALL_SPECIMENS:
83 config.setAssignmentStatus(AssignmentStatus.ALL_SPECIMENS);
84 break;
85 case DerivateSearchComposite.ASSIGNED_SPECIMENS:
86 config.setAssignmentStatus(AssignmentStatus.ASSIGNED_SPECIMENS);
87 break;
88 case DerivateSearchComposite.UNASSIGNED_SPECIMENS:
89 config.setAssignmentStatus(AssignmentStatus.UNASSIGNED_SPECIMENS);
90 break;
91 default:
92 break;
93 }
94 derivativeEditor.getCdmEntitySession().dispose();
95 derivativeEditor.getCdmEntitySession().bind();
96
97 SearchManager searchManager = new SearchManager();
98 List<SpecimenOrObservationBase> occurrences = searchManager.findOccurrences(config, true);
99 derivativeEditor.updateRootEntities(occurrences);
100 }
101
102 @Override
103 public void handleEvent(Event event) {
104 Widget eventSource = event.widget;
105 if(eventSource == derivateSearchComposite.getButtonSearch()
106 || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
107 searchDerivates();
108 }
109 else if(eventSource==derivateSearchComposite.getBtnBrowseTaxa()){
110 selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, this.derivateSearchComposite.getShell(), derivativeEditor.getConversationHolder(), null);
111 if(selectedTaxon!=null){
112 derivateSearchComposite.getTextTaxonName().setText(selectedTaxon.getTitleCache());
113 }
114 derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ASSIGNED_SPECIMENS);
115 derivateSearchComposite.getComboTaxonAssignment().setEnabled(false);
116 derivateSearchComposite.getLbltaxonAssignment().setEnabled(false);
117 }
118 else if(eventSource==derivateSearchComposite.getBtnClearTaxon()){
119 selectedTaxon = null;
120 derivateSearchComposite.getTextTaxonName().setText(""); //$NON-NLS-1$
121 derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ALL_SPECIMENS);
122 derivateSearchComposite.getComboTaxonAssignment().setEnabled(true);
123 derivateSearchComposite.getLbltaxonAssignment().setEnabled(true);
124 }
125 }
126
127 /**
128 * Sets enable status of all input fields
129 * @param enabled
130 */
131 public void setEnabled(boolean enabled) {
132 if(!derivateSearchComposite.isDisposed()){
133 GridData layoutData = (GridData) derivateSearchComposite.getLayoutData();
134 layoutData.exclude = !enabled;
135 derivateSearchComposite.setVisible(enabled);
136 derivateSearchComposite.getParent().layout(true);
137 }
138 }
139
140 public void setLayoutData(Object layoutData){
141 derivateSearchComposite.setLayoutData(layoutData);
142 }
143
144 /**
145 * Checks whether or not the search criteria are set to their default value.<br>
146 * This does not consider the title search field.
147 * @return <code>true</code> if search criteria are set to default.
148 */
149 public boolean isDefaultSearch(){
150 boolean isDefault = true;
151 isDefault &= comboSpecimenTypeController.getSelection()==SpecimenOrObservationType.Unknown;
152 isDefault &= derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex()==DerivateSearchComposite.ALL_SPECIMENS;
153 isDefault &= selectedTaxon==null;
154 return isDefault;
155 }
156 /**
157 * Resets all input fields
158 */
159 public void reset(){
160 if(!derivateSearchComposite.isDisposed()){
161 derivateSearchComposite.getSearchField().setText(""); //$NON-NLS-1$
162 derivateSearchComposite.getComboDerivateType().deselectAll();
163 comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
164 }
165 selectedTaxon = null;
166 }
167
168 public void setConversation(ConversationHolder conversationHolder) {
169 labelProvider.setConversation(conversationHolder);
170 }
171
172 public void setTaxonFilter(UUID taxonUuid) {
173 TaxonBase taxonBase = CdmStore.getService(ITaxonService.class).load(taxonUuid);
174 if(taxonBase!=null && taxonBase.isInstanceOf(Taxon.class)){
175 selectedTaxon = HibernateProxyHelper.deproxy(taxonBase, Taxon.class);
176 derivateSearchComposite.getTextTaxonName().setText(taxonBase.getTitleCache());
177 derivateSearchComposite.getLbltaxonAssignment().setEnabled(false);
178 derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ASSIGNED_SPECIMENS);
179 derivateSearchComposite.getComboTaxonAssignment().setEnabled(false);
180 }
181 }
182
183 public void setFocusOnSearchField(){
184 derivateSearchComposite.getSearchField().setFocus();
185 }
186
187 }