merge-update 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 DerivateLabelProvider labelProvider;
56 private final DerivateSearchView derivateSearchView;
57 private DerivateLabelProvider labelProvider;
58 /**
59 * @param parent
60 * @param derivateSearchView
61 */
62 public DerivateSearchCompositeController(Composite parent, DerivateSearchView derivateSearchView) {
63 this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE);
64 this.derivateSearchView = derivateSearchView;
65 init();
66 }
67
68 private void init(){
69 LinkedHashMap<SpecimenOrObservationType, String> orderedTerms = AbstractUtility.orderTerms(Arrays.asList(SpecimenOrObservationType.values()));
70 String[] comboItems = new String[orderedTerms.size()];
71 int count = 0;
72 for(String termMessage:orderedTerms.values()){
73 comboItems[count] = termMessage;
74 count++;
75 }
76
77 enumTermComboController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
78 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
79
80 derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
81 derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
82
83 TableViewer resultViewer = derivateSearchComposite.getResultViewer();
84 resultViewer.setContentProvider(new ArrayContentProvider());
85 labelProvider = new DerivateLabelProvider();
86 resultViewer.setLabelProvider(labelProvider);
87 resultViewer.addDoubleClickListener(new IDoubleClickListener() {
88 @Override
89 public void doubleClick(DoubleClickEvent event) {
90 String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
91
92 IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
93 try {
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);
103 }
104
105 }
106 });
107 configurator = new IdentifiableServiceConfiguratorImpl<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>>();
108
109 }
110
111 private void searchDerivates(){
112 if(!derivateSearchView.getConversationHolder().isBound()){
113 derivateSearchView.setFocus(); //rebind the conversation
114 }
115
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);
126 }
127 }
128 results = specimensWithNoDetermination;
129 }
130 derivateSearchComposite.getResultViewer().setInput(results);
131 }
132
133 /* (non-Javadoc)
134 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
135 */
136 @Override
137 public void handleEvent(Event event) {
138 Widget eventSource = event.widget;
139 if(eventSource == derivateSearchComposite.getButtonSearch()
140 || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
141 searchDerivates();
142 }
143 }
144
145 /**
146 * Sets enable status of all input fields
147 * @param enabled
148 */
149 public void setEnabled(boolean enabled) {
150 if(!derivateSearchComposite.isDisposed()){
151 derivateSearchComposite.setEnabled(enabled);
152 }
153 }
154
155 /**
156 * Resets all input fields
157 */
158 public void reset(){
159 derivateSearchComposite.getResultViewer().setInput(null);
160 derivateSearchComposite.getSearchField().setText("");
161 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
162 derivateSearchComposite.getComboDerivateType().deselectAll();
163 }
164
165 public TableViewer getResultViewer() {
166 return derivateSearchComposite.getResultViewer();
167 }
168
169 public void setFocus() {
170 derivateSearchComposite.getResultViewer().getControl().setFocus();
171 }
172
173 /**
174 * @param conversationHolder
175 */
176 public void setConversation(ConversationHolder conversationHolder) {
177 labelProvider.setConversation(conversationHolder);
178 }
179
180 }