package eu.etaxonomy.taxeditor.view.derivateSearch;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.handlers.IHandlerService;
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
-import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;
-import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorImpl;
+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;
/**
public class DerivateSearchCompositeController implements Listener{
private final DerivateSearchComposite derivateSearchComposite;
- private IIdentifiableEntityServiceConfigurator<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>> configurator;
- private EnumTermComboController<SpecimenOrObservationType> enumTermComboController;
+ private EnumTermComboController<SpecimenOrObservationType> comboSpecimenTypeController;
private final DerivateSearchView derivateSearchView;
+ private DerivateLabelProvider labelProvider;
+ private Taxon selectedTaxon;
/**
* @param parent
}
private void init(){
- LinkedHashMap<SpecimenOrObservationType, String> orderedTerms = AbstractUtility.orderTerms(Arrays.asList(SpecimenOrObservationType.values()));
- String[] comboItems = new String[orderedTerms.size()];
- int count = 0;
- for(String termMessage:orderedTerms.values()){
- comboItems[count] = termMessage;
- count++;
- }
-
- enumTermComboController = new EnumTermComboController<SpecimenOrObservationType>(derivateSearchComposite.getComboDerivateType(), null, null, SpecimenOrObservationType.class, 0);
- enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
+ //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());
- resultViewer.setLabelProvider(new DerivateLabelProvider());
+ labelProvider = new DerivateLabelProvider();
+ resultViewer.setLabelProvider(labelProvider);
resultViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
try {
handlerService.executeCommand(commandId, null);
} catch (ExecutionException e) {
- AbstractUtility.error(DerivateSearchCompositeController.class, e);
+ MessagingUtils.error(DerivateSearchCompositeController.class, e);
} catch (NotDefinedException e) {
- AbstractUtility.error(DerivateSearchCompositeController.class, e);
+ MessagingUtils.error(DerivateSearchCompositeController.class, e);
} catch (NotEnabledException e) {
- AbstractUtility.error(DerivateSearchCompositeController.class, e);
+ MessagingUtils.error(DerivateSearchCompositeController.class, e);
} catch (NotHandledException e) {
- AbstractUtility.error(DerivateSearchCompositeController.class, e);
+ MessagingUtils.error(DerivateSearchCompositeController.class, e);
}
}
});
- configurator = new IdentifiableServiceConfiguratorImpl<SpecimenOrObservationBase<DerivedUnitFacadeCacheStrategy>>();
}
derivateSearchView.setFocus(); //rebind the conversation
}
- configurator.setTitleSearchString(derivateSearchComposite.getSearchField().getText());
- SpecimenOrObservationType type = enumTermComboController.getSelection();
- //filter by specimen type
- List<SpecimenOrObservationBase> results = CdmStore.getSearchManager().findOccurrencesByType(configurator, type);
+ String queryString = derivateSearchComposite.getSearchField().getText();
+ SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection();
+
+ FindOccurrencesConfigurator config = new FindOccurrencesConfigurator();
+ config.setAssociatedTaxonUuid(selectedTaxon!=null?selectedTaxon.getUuid():null);
+ config.setSpecimenType(specimenType==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);
+
+ //filter out specimens of wrong type (only if an associated taxon was selected)
+ if(selectedTaxon!=null){
+ List<SpecimenOrObservationBase> specimensOfCorrectType = new ArrayList<SpecimenOrObservationBase>();
+ for(SpecimenOrObservationBase<?> occurrence:occurrences){
+ if(occurrence.getRecordBasis().equals(comboSpecimenTypeController.getSelection())
+ || occurrence.getRecordBasis().isKindOf(comboSpecimenTypeController.getSelection())){
+ specimensOfCorrectType.add(occurrence);
+ }
+ }
+ occurrences = specimensOfCorrectType;
+ }
+
//filter out assigned specimens
if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){
List<SpecimenOrObservationBase> specimensWithNoDetermination = new ArrayList<SpecimenOrObservationBase>();
- for(SpecimenOrObservationBase<?> result:results){
+ for(SpecimenOrObservationBase<?> result:occurrences){
if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){
specimensWithNoDetermination.add(result);
}
}
- results = specimensWithNoDetermination;
+ occurrences = specimensWithNoDetermination;
}
- derivateSearchComposite.getResultViewer().setInput(results);
+ derivateSearchComposite.getResultViewer().setInput(occurrences);
}
/* (non-Javadoc)
|| (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("");
+ }
}
/**
* Resets all input fields
*/
public void reset(){
- derivateSearchComposite.getResultViewer().setInput(null);
- derivateSearchComposite.getSearchField().setText("");
- enumTermComboController.setSelection(SpecimenOrObservationType.Unknown);
- derivateSearchComposite.getComboDerivateType().deselectAll();
+ if(!derivateSearchComposite.isDisposed()){
+ derivateSearchComposite.getResultViewer().setInput(null);
+ derivateSearchComposite.getSearchField().setText("");
+ derivateSearchComposite.getComboDerivateType().deselectAll();
+ comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown);
+ }
+ selectedTaxon = null;
}
public TableViewer getResultViewer() {
derivateSearchComposite.getResultViewer().getControl().setFocus();
}
+ /**
+ * @param conversationHolder
+ */
+ public void setConversation(ConversationHolder conversationHolder) {
+ labelProvider.setConversation(conversationHolder);
+ }
+
}