merge from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / derivateSearch / DerivateSearchCompositeController.java
1 // $Id$
2 /**
3 * Copyright (C) 2013 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.view.derivateSearch;
11
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.LinkedHashMap;
15 import java.util.List;
16
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;
31
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;
43
44 /**
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.
48 *
49 */
50 public class DerivateSearchCompositeController implements Listener{
51
52 private final DerivateSearchComposite derivateSearchComposite;
53 private IIdentifiableEntityServiceConfigurator<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>> configurator;
54 private EnumTermComboController<SpecimenOrObservationType> enumTermComboController;
55 private final DerivateSearchView derivateSearchView;
56 private DerivateLabelProvider labelProvider;
57 /**
58 * @param parent
59 * @param derivateSearchView
60 */
61 public DerivateSearchCompositeController(Composite parent, DerivateSearchView derivateSearchView) {
62 this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE);
63 this.derivateSearchView = derivateSearchView;
64 init();
65 }
66
67 private void init(){
68 LinkedHashMap<SpecimenOrObservationType, String> orderedTerms = AbstractUtility.orderTerms(Arrays.asList(SpecimenOrObservationType.values()));
69 String[] comboItems = new String[orderedTerms.size()];
70 int count = 0;
71 for(String termMessage:orderedTerms.values()){
72 comboItems[count] = termMessage;
73 count++;
74 }
75
76 enumTermComboController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
77 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
78
79 derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
80 derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
81
82 TableViewer resultViewer = derivateSearchComposite.getResultViewer();
83 resultViewer.setContentProvider(new ArrayContentProvider());
84 labelProvider = new DerivateLabelProvider();
85 resultViewer.setLabelProvider(labelProvider);
86 resultViewer.addDoubleClickListener(new IDoubleClickListener() {
87 @Override
88 public void doubleClick(DoubleClickEvent event) {
89 String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
90
91 IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
92 try {
93 handlerService.executeCommand(commandId, null);
94 } catch (ExecutionException e) {
95 MessagingUtils.error(DerivateSearchCompositeController.class, e);
96 } catch (NotDefinedException e) {
97 MessagingUtils.error(DerivateSearchCompositeController.class, e);
98 } catch (NotEnabledException e) {
99 MessagingUtils.error(DerivateSearchCompositeController.class, e);
100 } catch (NotHandledException e) {
101 MessagingUtils.error(DerivateSearchCompositeController.class, e);
102 }
103
104 }
105 });
106 configurator = new IdentifiableServiceConfiguratorImpl<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>>();
107
108 }
109
110 private void searchDerivates(){
111 if(!derivateSearchView.getConversationHolder().isBound()){
112 derivateSearchView.setFocus(); //rebind the conversation
113 }
114
115 configurator.setTitleSearchString(derivateSearchComposite.getSearchField().getText());
116 SpecimenOrObservationType type = enumTermComboController.getSelection();
117 //filter by specimen type
118 List<SpecimenOrObservationBase> results = CdmStore.getSearchManager().findOccurrencesByType(configurator, type);
119 //filter out assigned specimens
120 if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){
121 List<SpecimenOrObservationBase> specimensWithNoDetermination = new ArrayList<SpecimenOrObservationBase>();
122 for(SpecimenOrObservationBase<?> result:results){
123 if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){
124 specimensWithNoDetermination.add(result);
125 }
126 }
127 results = specimensWithNoDetermination;
128 }
129 derivateSearchComposite.getResultViewer().setInput(results);
130 }
131
132 /* (non-Javadoc)
133 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
134 */
135 @Override
136 public void handleEvent(Event event) {
137 Widget eventSource = event.widget;
138 if(eventSource == derivateSearchComposite.getButtonSearch()
139 || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
140 searchDerivates();
141 }
142 }
143
144 /**
145 * Sets enable status of all input fields
146 * @param enabled
147 */
148 public void setEnabled(boolean enabled) {
149 if(!derivateSearchComposite.isDisposed()){
150 derivateSearchComposite.setEnabled(enabled);
151 }
152 }
153
154 /**
155 * Resets all input fields
156 */
157 public void reset(){
158 derivateSearchComposite.getResultViewer().setInput(null);
159 derivateSearchComposite.getSearchField().setText("");
160 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
161 derivateSearchComposite.getComboDerivateType().deselectAll();
162 }
163
164 public TableViewer getResultViewer() {
165 return derivateSearchComposite.getResultViewer();
166 }
167
168 public void setFocus() {
169 derivateSearchComposite.getResultViewer().getControl().setFocus();
170 }
171
172 /**
173 * @param conversationHolder
174 */
175 public void setConversation(ConversationHolder conversationHolder) {
176 labelProvider.setConversation(conversationHolder);
177 }
178
179 }