From b0f493d86bc96b23f1e6c2065e4514cc225857d7 Mon Sep 17 00:00:00 2001 From: "n.hoffmann" Date: Tue, 2 Feb 2010 16:50:41 +0000 Subject: [PATCH] Search in Taxonomic Editor runs in it's own thread now. --- .../navigation/search/SearchBar.java | 125 ++++++++------ .../navigation/search/SearchResultView.java | 152 +++++++++++++++++- .../taxeditor/preference/PreferencesUtil.java | 12 +- 3 files changed, 226 insertions(+), 63 deletions(-) diff --git a/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java b/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java index 5a83aaf9e..17ac7fcb4 100644 --- a/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java +++ b/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java @@ -46,7 +46,7 @@ import eu.etaxonomy.taxeditor.preference.PreferencesUtil; * @created 15.04.2009 * @version 1.0 */ -public class SearchBar extends WorkbenchWindowControlContribution { +public class SearchBar extends WorkbenchWindowControlContribution{ private static final Logger logger = Logger.getLogger(SearchBar.class); private Text text_search; private String srv; @@ -91,11 +91,9 @@ public class SearchBar extends WorkbenchWindowControlContribution { DropdownSelectionListener dropdownListener = new DropdownSelectionListener( toolItem); - dropdownListener.add(SearchOption.TAXON); - dropdownListener.add(SearchOption.SYNONYM); - dropdownListener.add(SearchOption.NAME); - dropdownListener.add(SearchOption.COMMON_NAME); - dropdownListener.add(SearchOption.ORPHANED_TAXON); + for(SearchOption searchOption : SearchOption.values()){ + dropdownListener.add(searchOption); + } toolItem.addSelectionListener(dropdownListener); } @@ -148,7 +146,7 @@ public class SearchBar extends WorkbenchWindowControlContribution { @Override public void keyReleased(KeyEvent e) { if (e.keyCode == SWT.CR) { - openSearchResultsView(); + search(); } } }); @@ -172,31 +170,50 @@ public class SearchBar extends WorkbenchWindowControlContribution { composite.setLayout(layout); } - /* - * Shows the results of the search. - */ - private void openSearchResultsView() { - if (!text_search.getText().trim().equals(defaultText) && text_search.getText().trim().length() > 0) { - + private void search(){ + final String searchString = getSearchString(); + if(searchString != null){ ITaxonServiceConfigurator configurator = configurationListener.getConfigurator(); - configurator.setSearchString(text_search.getText().trim()); - - srv += "1"; - logger.info("Opening search results window " + srv); - try { - IViewPart resultsView = TaxeditorNavigationPlugin.getDefault() - .getWorkbench().getActiveWorkbenchWindow() - .getActivePage().showView(SearchResultView.ID, srv, - IWorkbenchPage.VIEW_ACTIVATE); - ((SearchResultView) resultsView).performSearch(configurator); - } catch (PartInitException e) { - logger.error("Error opening search result.", e); - } + configurator.setSearchString(searchString); + openSearchResultsView(configurator); + } + + } + + private String getSearchString(){ + String searchString = text_search.getText().trim(); + if (searchString.equals(defaultText) || searchString.length() == 0) + return null; + return searchString; + } + + /** + * Opens a new instance of the search result view to display the result to the user. + * + * @param searchResult + */ + private void openSearchResultsView(ITaxonServiceConfigurator configurator) { + // This variable is needed to address new instances of the view. + srv += "1"; + logger.info("Opening search results window " + srv); + try { + IViewPart resultsView = TaxeditorNavigationPlugin.getDefault() + .getWorkbench().getActiveWorkbenchWindow() + .getActivePage().showView(SearchResultView.ID, srv, + IWorkbenchPage.VIEW_ACTIVATE); + ((SearchResultView) resultsView).performSearch(configurator); + } catch (PartInitException e) { + logger.error("Error opening search result.", e); + throw new RuntimeException(e); } } - /* + /** * Handles drop down menu selection. Available items are defined in the enumeration SearchOption. + * + * @author n.hoffmann + * @created Feb 2, 2010 + * @version 1.0 */ class DropdownSelectionListener extends SelectionAdapter { @@ -222,18 +239,22 @@ public class SearchBar extends WorkbenchWindowControlContribution { menu.setLocation(pt.x, pt.y + rect.height); menu.setVisible(true); } else { - openSearchResultsView(); + search(); } } } - /* - * Handles search configuration selection. Available items are hardcoded. + /** + * Handles search configuration selection. + * + * @author n.hoffmann + * @created Feb 2, 2010 + * @version 1.0 */ class ConfigurationSelectionListener extends SelectionAdapter { - private ITaxonServiceConfigurator configurator; - + private ITaxonServiceConfigurator configurator = PreferencesUtil.getSearchConfigurator(); + /* * (non-Javadoc) * @@ -245,24 +266,25 @@ public class SearchBar extends WorkbenchWindowControlContribution { logger.warn("configuration menu clicked"); SearchOption option = (SearchOption) e.widget.getData(); - if (option == SearchOption.TAXON) { - getConfigurator().setDoTaxa(getConfigurator().isDoTaxa() ? false : true); - } else if (option == SearchOption.SYNONYM) { - getConfigurator().setDoSynonyms(getConfigurator().isDoSynonyms() ? false : true); - } else if (option == SearchOption.NAME) { - getConfigurator().setDoNamesWithoutTaxa(getConfigurator().isDoNamesWithoutTaxa() ? false : true); - } else if (option == SearchOption.COMMON_NAME) { - getConfigurator().setDoTaxaByCommonNames(getConfigurator().isDoTaxaByCommonNames() ? false : true); - } else if (option == SearchOption.ORPHANED_TAXON) { - getConfigurator().setDoTaxaByOrphanedTaxa(getConfigurator().isDoTaxaByOrphanedTaxa() ? false : true); + switch (option){ + case TAXON: + configurator.setDoTaxa(configurator.isDoTaxa() ? false : true); + break; + case SYNONYM: + configurator.setDoSynonyms(configurator.isDoSynonyms() ? false : true); + break; + case NAME: + configurator.setDoNamesWithoutTaxa(configurator.isDoNamesWithoutTaxa() ? false : true); + break; + case COMMON_NAME: + configurator.setDoTaxaByCommonNames(getConfigurator().isDoTaxaByCommonNames() ? false : true); + break; } + saveConfigurator(); } public ITaxonServiceConfigurator getConfigurator() { - if (configurator == null) { - configurator = PreferencesUtil.getSearchConfigurator(); - } return configurator; } @@ -272,12 +294,16 @@ public class SearchBar extends WorkbenchWindowControlContribution { } } - /* - * Enumerations + /** + * Available search options. + * + * @author n.hoffmann + * @created Feb 2, 2010 + * @version 1.0 */ enum SearchOption { TAXON("Taxa"), SYNONYM("Synonyms"), NAME("Names (without taxa)"), - COMMON_NAME("Common Names"), ORPHANED_TAXON("Orphaned Taxa"); + COMMON_NAME("Common Names"); private String label; @@ -310,9 +336,6 @@ public class SearchBar extends WorkbenchWindowControlContribution { case COMMON_NAME: return PreferencesUtil.getPreferenceStore().getBoolean( PreferencesUtil.TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES); - case ORPHANED_TAXON: - return PreferencesUtil.getPreferenceStore().getBoolean( - PreferencesUtil.TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA); } return true; diff --git a/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java b/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java index e4b228565..9a4635d27 100644 --- a/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java +++ b/taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java @@ -9,9 +9,14 @@ package eu.etaxonomy.taxeditor.navigation.search; +import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ArrayContentProvider; @@ -20,17 +25,24 @@ import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.ViewPart; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator; +import eu.etaxonomy.cdm.model.common.IdentifiableEntity; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; import eu.etaxonomy.taxeditor.navigation.NavigationUtil; +import eu.etaxonomy.taxeditor.navigation.search.SearchBar.SearchOption; import eu.etaxonomy.taxeditor.store.CdmStore; /** @@ -51,6 +63,14 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{ private ConversationHolder conversation; private ITaxonServiceConfigurator configurator; + + private Text searchString; + + private Text configurationLabel; + + private Text status; + + private SearchJob searchJob; /* (non-Javadoc) @@ -60,7 +80,17 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{ public void createPartControl(Composite parent) { conversation = CdmStore.NewTransactionalConversation(); - resultViewer = new TableViewer(parent, SWT.BORDER); + GridLayout layout = new GridLayout(); + layout.marginWidth = 0; + layout.marginHeight = 0; + + parent.setLayout(layout); + + Composite infoComposite = createInfoComposite(parent); + infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); +// infoComposite.setBackground(Resources.getColor(Resources.PROP_SHEET_RED)); + + resultViewer = new TableViewer(parent, SWT.NONE); resultViewer.setContentProvider(new ArrayContentProvider()); resultViewer.setLabelProvider(new SearchResultLabelProvider()); resultViewer.addDoubleClickListener(new IDoubleClickListener() { @@ -71,6 +101,8 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{ } }); + resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + // register context menu MenuManager menuMgr = new MenuManager(); menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); @@ -81,13 +113,76 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{ control.setMenu(menu); } - protected void performSearch(ITaxonServiceConfigurator configurator) { - List searchResult = CdmStore.findTaxaAndNames(configurator); + private Composite createInfoComposite(Composite parent){ + Composite composite = new Composite(parent, SWT.NULL); - resultViewer.setInput(searchResult); - setPartName("Search: '" + configurator.getSearchString() + "'"); - + composite.setLayout(new GridLayout(2, false)); + + Label searchStringLabel = new Label(composite, SWT.NULL); + searchStringLabel.setText("Search String:"); + + searchString = new Text(composite, SWT.NULL); + searchString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + searchString.setEditable(false); +// searchString.setText(" "); + + Label configurationDescriptionLabel = new Label(composite, SWT.NULL); + configurationDescriptionLabel.setText("Search for:"); + + configurationLabel = new Text(composite, SWT.WRAP); + configurationLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + configurationLabel.setEditable(false); + + Label statusLabel = new Label(composite, SWT.NULL); + statusLabel.setText("Status:"); + + status = new Text(composite, SWT.NULL); + status.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + status.setEditable(false); + + return composite; + } + + public void performSearch(ITaxonServiceConfigurator configurator){ this.configurator = configurator; + setPartName("Search: '" + configurator.getSearchString() + "'"); + + searchString.setText(configurator.getSearchString()); + + List includedEntities = new ArrayList(); + if(configurator.isDoTaxa()) + includedEntities.add(SearchOption.TAXON.getLabel()); + if(configurator.isDoSynonyms()) + includedEntities.add(SearchOption.SYNONYM.getLabel()); + if(configurator.isDoNamesWithoutTaxa()) + includedEntities.add(SearchOption.NAME.getLabel()); + if(configurator.isDoTaxaByCommonNames()){ + includedEntities.add(SearchOption.COMMON_NAME.getLabel()); + } + + String includedEntitiesString = ""; + for (int i = 0; i < includedEntities.size(); i++){ + includedEntitiesString += includedEntities.get(i); + if(i < includedEntities.size() -1){ + includedEntitiesString += ", "; + } + } + + configurationLabel.setText(includedEntitiesString); + + status.setText("Searching..."); + + searchJob = new SearchJob(Display.getCurrent(), configurator); + searchJob.schedule(); + } + + protected void displaySearchResult(List result) { + if(result.size() > 0){ + resultViewer.setInput(result); + status.setText(result.size() + " entities found"); + }else{ + status.setText("Search returned no results"); + } } /* (non-Javadoc) @@ -122,6 +217,51 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{ public void dispose() { super.dispose(); conversation.close(); + if(searchJob != null) + searchJob.cancel(); + } + + /** + * + * @author n.hoffmann + * @created Feb 2, 2010 + * @version 1.0 + */ + class SearchJob extends Job{ + + private ITaxonServiceConfigurator configurator; + + private Display display; + + /** + * @param name + */ + public SearchJob(Display display, ITaxonServiceConfigurator configurator) { + super("searchJob"); + this.display = display; + this.configurator = configurator; + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { +// monitor.beginTask("Performing Search", 100); +// monitor.worked(20); + + final List searchResult = CdmStore.findTaxaAndNames(configurator); +// monitor.worked(40); + display.asyncExec(new Runnable() { + + public void run() { + displaySearchResult(searchResult); + } + }); +// monitor.done(); + return Status.OK_STATUS; + } + } } diff --git a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/PreferencesUtil.java b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/PreferencesUtil.java index 30a0e4b9e..4bc460f27 100644 --- a/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/PreferencesUtil.java +++ b/taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/PreferencesUtil.java @@ -10,6 +10,7 @@ package eu.etaxonomy.taxeditor.preference; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; @@ -60,7 +61,6 @@ public class PreferencesUtil { public static final String TAXON_SERVICE_CONFIGURATOR_SYNONYMS = "taxonServiceConfigurator.doSynonyms"; public static final String TAXON_SERVICE_CONFIGURATOR_NAMES = "taxonServiceConfigurator.doNamesWithoutTaxa"; public static final String TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES = "taxonServiceConfigurator.doTaxaByCommonNames"; - public static final String TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA = "taxonServiceConfigurator.doTaxaByOrphanedTaxa"; public static final String SHOW_DATASOURCE_CHOOSER = "dataSourceChooser.show"; @@ -305,7 +305,7 @@ public class PreferencesUtil { . concat(".") . concat(definedTerm.getUuid().toString()); if (key.contains("javassist")) { - logger.info("proxy"); + logger.warn("Trying to persist a preference based on a proxy class."); } return key; } @@ -321,8 +321,7 @@ public class PreferencesUtil { configurator.setDoTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_TAXA)); configurator.setDoSynonyms(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_SYNONYMS)); configurator.setDoNamesWithoutTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_NAMES)); - configurator.setDoTaxaByCommonNames(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES)); - configurator.setDoTaxaByOrphanedTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA)); + configurator.setDoTaxaByCommonNames(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES)); return configurator; } @@ -338,7 +337,9 @@ public class PreferencesUtil { configurator.setDoSynonyms(true); configurator.setDoNamesWithoutTaxa(true); configurator.setDoTaxaByCommonNames(true); - configurator.setDoTaxaByOrphanedTaxa(true); + + configurator.setTaxonPropertyPath(Arrays.asList("$", + "titleCache", "name", "name.$")); // DEFAULT VALUES // match mode default only @@ -363,7 +364,6 @@ public class PreferencesUtil { getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_SYNONYMS, configurator.isDoSynonyms()); getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_NAMES, configurator.isDoNamesWithoutTaxa()); getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES, configurator.isDoTaxaByCommonNames()); - getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA, configurator.isDoTaxaByOrphanedTaxa()); } /** -- 2.34.1