-// $Id$
-/**
-* Copyright (C) 2013 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-package eu.etaxonomy.taxeditor.view.derivateSearch;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.handlers.IHandlerService;
-
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
-import eu.etaxonomy.cdm.model.taxon.Taxon;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.SearchManager;
-import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory;
-import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController;
-
-/**
- * Controller class for the {@link DerivateSearchComposite}.<br>
- * This controller contains the logic to search the data base for {@link SpecimenOrObservationBase}s
- * and handles GUI events.
- *
- */
-public class DerivateSearchCompositeController implements Listener{
-
- private final DerivateSearchComposite derivateSearchComposite;
- private EnumTermComboController<SpecimenOrObservationType> comboSpecimenTypeController;
- private final DerivateSearchView derivateSearchView;
- private DerivateLabelProvider labelProvider;
- private Taxon selectedTaxon;
-
- /**
- * @param parent
- * @param derivateSearchView
- */
- public DerivateSearchCompositeController(Composite parent, DerivateSearchView derivateSearchView) {
- this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE);
- this.derivateSearchView = derivateSearchView;
- init();
- }
-
- private void init(){
- //derivate type combo
- comboSpecimenTypeController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
- comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
-
- //add listeners
- derivateSearchComposite.getSearchField().addListener(SWT.KeyDown, this);
- derivateSearchComposite.getButtonSearch().addListener(SWT.Selection, this);
- derivateSearchComposite.getBtnBrowseTaxa().addListener(SWT.Selection, this);
- derivateSearchComposite.getBtnClearTaxon().addListener(SWT.Selection, this);
-
-
- //result table
- TableViewer resultViewer = derivateSearchComposite.getResultViewer();
- resultViewer.setContentProvider(new ArrayContentProvider());
- labelProvider = new DerivateLabelProvider();
- resultViewer.setLabelProvider(labelProvider);
- resultViewer.addDoubleClickListener(new IDoubleClickListener() {
- @Override
- public void doubleClick(DoubleClickEvent event) {
- String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView";
-
- IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
- try {
- handlerService.executeCommand(commandId, null);
- } catch (ExecutionException e) {
- MessagingUtils.error(DerivateSearchCompositeController.class, e);
- } catch (NotDefinedException e) {
- MessagingUtils.error(DerivateSearchCompositeController.class, e);
- } catch (NotEnabledException e) {
- MessagingUtils.error(DerivateSearchCompositeController.class, e);
- } catch (NotHandledException e) {
- MessagingUtils.error(DerivateSearchCompositeController.class, e);
- }
-
- }
- });
-
- }
-
- private void searchDerivates(){
- if(!derivateSearchView.getConversationHolder().isBound()){
- derivateSearchView.setFocus(); //rebind the conversation
- }
-
- String queryString = derivateSearchComposite.getSearchField().getText();
- SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection();
-
- FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
- config.setAssociatedTaxonUuid(selectedTaxon!=null?selectedTaxon.getUuid():null);
- config.setSpecimenType(specimenType.equals(SpecimenOrObservationType.Unknown)?null:specimenType);//unknown := all types
- config.setTitleSearchString(queryString);
- if(selectedTaxon!=null){
- config.setRetrieveIndirectlyAssociatedSpecimens(true);
- config.setSpecimenType(null);
- }
-
- SearchManager searchManager = new SearchManager();
- List<SpecimenOrObservationBase> occurrences = searchManager.findOccurrences(config, true);
-
- //filter out specimens of wrong type (only if an associated taxon was selected)
- if(selectedTaxon!=null && !specimenType.equals(SpecimenOrObservationType.Unknown)){
- List<SpecimenOrObservationBase> specimensOfCorrectType = new ArrayList<SpecimenOrObservationBase>();
- for(SpecimenOrObservationBase<?> occurrence:occurrences){
- if(occurrence.getRecordBasis().equals(specimenType)
- || occurrence.getRecordBasis().isKindOf(specimenType)){
- specimensOfCorrectType.add(occurrence);
- }
- }
- occurrences = specimensOfCorrectType;
- }
-
- //filter out assigned specimens
- if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){
- List<SpecimenOrObservationBase> specimensWithNoDetermination = new ArrayList<SpecimenOrObservationBase>();
- for(SpecimenOrObservationBase<?> result:occurrences){
- if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){
- specimensWithNoDetermination.add(result);
- }
- }
- occurrences = specimensWithNoDetermination;
- }
- derivateSearchComposite.getResultViewer().setInput(occurrences);
- }
-
- @Override
- public void handleEvent(Event event) {
- Widget eventSource = event.widget;
- if(eventSource == derivateSearchComposite.getButtonSearch()
- || (eventSource == derivateSearchComposite.getSearchField() && event.keyCode == SWT.CR)){
- searchDerivates();
- }
- else if(eventSource==derivateSearchComposite.getBtnBrowseTaxa()){
- selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, derivateSearchView.getSite().getShell(), derivateSearchView.getConversationHolder(), null);
- if(selectedTaxon!=null){
- derivateSearchComposite.getTextTaxonName().setText(selectedTaxon.getTitleCache());
- }
- }
- else if(eventSource==derivateSearchComposite.getBtnClearTaxon()){
- selectedTaxon = null;
- derivateSearchComposite.getTextTaxonName().setText("");
- }
- }
-
- /**
- * Sets enable status of all input fields
- * @param enabled
- */
- public void setEnabled(boolean enabled) {
- if(!derivateSearchComposite.isDisposed()){
- derivateSearchComposite.setEnabled(enabled);
- }
- }
-
- /**
- * Resets all input fields
- */
- public void reset(){
- if(!derivateSearchComposite.isDisposed()){
- derivateSearchComposite.getResultViewer().setInput(null);
- derivateSearchComposite.getSearchField().setText("");
- derivateSearchComposite.getComboDerivateType().deselectAll();
- comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
- }
- selectedTaxon = null;
- }
-
- public TableViewer getResultViewer() {
- return derivateSearchComposite.getResultViewer();
- }
-
- public void setFocus() {
- derivateSearchComposite.getResultViewer().getControl().setFocus();
- }
-
- /**
- * @param conversationHolder
- */
- public void setConversation(ConversationHolder conversationHolder) {
- labelProvider.setConversation(conversationHolder);
- }
-
-}