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.facade.DerivedUnitFacadeCacheStrategy;
33 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
34 import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
35 import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorImpl;
36 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
37 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
38 import eu.etaxonomy.taxeditor.model.AbstractUtility;
39 import eu.etaxonomy.taxeditor.model.MessagingUtils;
40 import eu.etaxonomy.taxeditor.store.CdmStore;
41 import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController;
42
43 /**
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.
47 *
48 */
49 public class DerivateSearchCompositeController implements Listener{
50
51 private final DerivateSearchComposite derivateSearchComposite;
52 private IIdentifiableEntityServiceConfigurator<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>> configurator;
53 private EnumTermComboController<SpecimenOrObservationType> enumTermComboController;
54 private final DerivateSearchView derivateSearchView;
55
56 /**
57 * @param parent
58 * @param derivateSearchView
59 */
60 public DerivateSearchCompositeController(Composite parent, DerivateSearchView derivateSearchView) {
61 this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE);
62 this.derivateSearchView = derivateSearchView;
63 init();
64 }
65
66 private void init(){
67 LinkedHashMap<SpecimenOrObservationType, String> orderedTerms = AbstractUtility.orderTerms(Arrays.asList(SpecimenOrObservationType.values()));
68 String[] comboItems = new String[orderedTerms.size()];
69 int count = 0;
70 for(String termMessage:orderedTerms.values()){
71 comboItems[count] = termMessage;
72 count++;
73 }
74
75 enumTermComboController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
76 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
77
78 derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
79 derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
80
81 TableViewer resultViewer = derivateSearchComposite.getResultViewer();
82 resultViewer.setContentProvider(new ArrayContentProvider());
83 resultViewer.setLabelProvider(new DerivateLabelProvider());
84 resultViewer.addDoubleClickListener(new IDoubleClickListener() {
85 @Override
86 public void doubleClick(DoubleClickEvent event) {
87 String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
88
89 IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
90 try {
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);
100 }
101
102 }
103 });
104 configurator = new IdentifiableServiceConfiguratorImpl<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>>();
105
106 }
107
108 private void searchDerivates(){
109 if(!derivateSearchView.getConversationHolder().isBound()){
110 derivateSearchView.setFocus(); //rebind the conversation
111 }
112
113 configurator.setTitleSearchString(derivateSearchComposite.getSearchField().getText());
114 SpecimenOrObservationType type = enumTermComboController.getSelection();
115 //filter by specimen type
116 List<SpecimenOrObservationBase> results = CdmStore.getSearchManager().findOccurrencesByType(configurator, type);
117 //filter out assigned specimens
118 if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){
119 List<SpecimenOrObservationBase> specimensWithNoDetermination = new ArrayList<SpecimenOrObservationBase>();
120 for(SpecimenOrObservationBase<?> result:results){
121 if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){
122 specimensWithNoDetermination.add(result);
123 }
124 }
125 results = specimensWithNoDetermination;
126 }
127 derivateSearchComposite.getResultViewer().setInput(results);
128 }
129
130 /* (non-Javadoc)
131 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
132 */
133 @Override
134 public void handleEvent(Event event) {
135 Widget eventSource = event.widget;
136 if(eventSource == derivateSearchComposite.getButtonSearch()
137 || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
138 searchDerivates();
139 }
140 }
141
142 /**
143 * Sets enable status of all input fields
144 * @param enabled
145 */
146 public void setEnabled(boolean enabled) {
147 if(!derivateSearchComposite.isDisposed()){
148 derivateSearchComposite.setEnabled(enabled);
149 }
150 }
151
152 /**
153 * Resets all input fields
154 */
155 public void reset(){
156 derivateSearchComposite.getResultViewer().setInput(null);
157 derivateSearchComposite.getSearchField().setText("");
158 enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
159 derivateSearchComposite.getComboDerivateType().deselectAll();
160 }
161
162 public TableViewer getResultViewer() {
163 return derivateSearchComposite.getResultViewer();
164 }
165
166 public void setFocus() {
167 derivateSearchComposite.getResultViewer().getControl().setFocus();
168 }
169
170 }