Search in Taxonomic Editor runs in it's own thread now.
authorn.hoffmann <n.hoffmann@localhost>
Tue, 2 Feb 2010 16:50:41 +0000 (16:50 +0000)
committern.hoffmann <n.hoffmann@localhost>
Tue, 2 Feb 2010 16:50:41 +0000 (16:50 +0000)
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchBar.java
taxeditor-navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/search/SearchResultView.java
taxeditor-store/src/main/java/eu/etaxonomy/taxeditor/preference/PreferencesUtil.java

index 5a83aaf9ee3eaa944ce7177eda09965d5411383a..17ac7fcb47efde0ef97d07364913b874ab599705 100644 (file)
@@ -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;
index e4b22856599f4bc683efa2e90ae18745cca15352..9a4635d27a463bdf4da8c5a25adb4e8565341849 100644 (file)
@@ -9,9 +9,14 @@
 \r
 package eu.etaxonomy.taxeditor.navigation.search;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
+import org.eclipse.core.runtime.jobs.Job;\r
 import org.eclipse.jface.action.GroupMarker;\r
 import org.eclipse.jface.action.MenuManager;\r
 import org.eclipse.jface.viewers.ArrayContentProvider;\r
@@ -20,17 +25,24 @@ import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.StructuredSelection;\r
 import org.eclipse.jface.viewers.TableViewer;\r
 import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Label;\r
 import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.swt.widgets.Text;\r
 import org.eclipse.ui.IWorkbenchActionConstants;\r
 import org.eclipse.ui.part.ViewPart;\r
 \r
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;\r
 import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;\r
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;\r
+import eu.etaxonomy.taxeditor.navigation.search.SearchBar.SearchOption;\r
 import eu.etaxonomy.taxeditor.store.CdmStore;\r
 \r
 /**\r
@@ -51,6 +63,14 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
        private ConversationHolder conversation;\r
 \r
        private ITaxonServiceConfigurator configurator;\r
+\r
+       private Text searchString;\r
+\r
+       private Text configurationLabel;\r
+\r
+       private Text status;\r
+\r
+       private SearchJob searchJob;\r
        \r
        \r
        /* (non-Javadoc)\r
@@ -60,7 +80,17 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
        public void createPartControl(Composite parent) {\r
                conversation = CdmStore.NewTransactionalConversation();\r
                \r
-               resultViewer = new TableViewer(parent, SWT.BORDER);\r
+               GridLayout layout = new GridLayout();\r
+               layout.marginWidth = 0;\r
+               layout.marginHeight = 0;\r
+               \r
+               parent.setLayout(layout);\r
+               \r
+               Composite infoComposite = createInfoComposite(parent);\r
+               infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));\r
+//             infoComposite.setBackground(Resources.getColor(Resources.PROP_SHEET_RED));\r
+               \r
+               resultViewer = new TableViewer(parent, SWT.NONE);\r
                resultViewer.setContentProvider(new ArrayContentProvider());\r
                resultViewer.setLabelProvider(new SearchResultLabelProvider());\r
                resultViewer.addDoubleClickListener(new IDoubleClickListener() {\r
@@ -71,6 +101,8 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                        }\r
                });\r
                \r
+               resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+               \r
                // register context menu\r
                MenuManager menuMgr = new MenuManager();\r
                menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));\r
@@ -81,13 +113,76 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                control.setMenu(menu);  \r
        }\r
        \r
-       protected void performSearch(ITaxonServiceConfigurator configurator) {\r
-               List searchResult = CdmStore.findTaxaAndNames(configurator);\r
+       private Composite createInfoComposite(Composite parent){\r
+               Composite composite = new Composite(parent, SWT.NULL);\r
                \r
-               resultViewer.setInput(searchResult); \r
-               setPartName("Search: '" + configurator.getSearchString() + "'");\r
-\r
+               composite.setLayout(new GridLayout(2, false));\r
+               \r
+               Label searchStringLabel = new Label(composite, SWT.NULL);\r
+               searchStringLabel.setText("Search String:");\r
+               \r
+               searchString = new Text(composite, SWT.NULL);\r
+               searchString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+               searchString.setEditable(false);\r
+//             searchString.setText("                                               ");\r
+               \r
+               Label configurationDescriptionLabel = new Label(composite, SWT.NULL);\r
+               configurationDescriptionLabel.setText("Search for:");\r
+               \r
+               configurationLabel = new Text(composite, SWT.WRAP);\r
+               configurationLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+               configurationLabel.setEditable(false);\r
+               \r
+               Label statusLabel = new Label(composite, SWT.NULL);\r
+               statusLabel.setText("Status:");\r
+               \r
+               status = new Text(composite, SWT.NULL);\r
+               status.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+               status.setEditable(false);\r
+               \r
+               return composite;\r
+       }\r
+       \r
+       public void performSearch(ITaxonServiceConfigurator configurator){\r
                this.configurator = configurator;\r
+               setPartName("Search: '" + configurator.getSearchString() + "'");\r
+               \r
+               searchString.setText(configurator.getSearchString());\r
+               \r
+               List<String> includedEntities = new ArrayList<String>();\r
+               if(configurator.isDoTaxa())\r
+                       includedEntities.add(SearchOption.TAXON.getLabel());\r
+               if(configurator.isDoSynonyms())\r
+                       includedEntities.add(SearchOption.SYNONYM.getLabel());\r
+               if(configurator.isDoNamesWithoutTaxa())\r
+                       includedEntities.add(SearchOption.NAME.getLabel());\r
+               if(configurator.isDoTaxaByCommonNames()){\r
+                       includedEntities.add(SearchOption.COMMON_NAME.getLabel());\r
+               }\r
+               \r
+               String includedEntitiesString = "";\r
+               for (int i = 0; i < includedEntities.size(); i++){\r
+                       includedEntitiesString += includedEntities.get(i);\r
+                       if(i < includedEntities.size() -1){\r
+                               includedEntitiesString += ", ";\r
+                       }\r
+               }\r
+               \r
+               configurationLabel.setText(includedEntitiesString);\r
+               \r
+               status.setText("Searching...");\r
+               \r
+               searchJob = new SearchJob(Display.getCurrent(), configurator);\r
+               searchJob.schedule();\r
+       }\r
+       \r
+       protected void displaySearchResult(List<IdentifiableEntity> result) {\r
+               if(result.size() > 0){\r
+                       resultViewer.setInput(result); \r
+                       status.setText(result.size() + " entities found");\r
+               }else{\r
+                       status.setText("Search returned no results");\r
+               }\r
        }\r
 \r
        /* (non-Javadoc)\r
@@ -122,6 +217,51 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
        public void dispose() {\r
                super.dispose();\r
                conversation.close();\r
+               if(searchJob != null)\r
+                       searchJob.cancel();\r
+       }\r
+       \r
+       /**\r
+        * \r
+        * @author n.hoffmann\r
+        * @created Feb 2, 2010\r
+        * @version 1.0\r
+        */\r
+       class SearchJob extends Job{\r
+\r
+               private ITaxonServiceConfigurator configurator;\r
+               \r
+               private Display display;\r
+               \r
+               /**\r
+                * @param name\r
+                */\r
+               public SearchJob(Display display, ITaxonServiceConfigurator configurator) {\r
+                       super("searchJob");\r
+                       this.display = display;\r
+                       this.configurator = configurator;\r
+               }\r
+\r
+               /* (non-Javadoc)\r
+                * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)\r
+                */\r
+               @Override\r
+               protected IStatus run(IProgressMonitor monitor) {\r
+//                     monitor.beginTask("Performing Search", 100);\r
+//                     monitor.worked(20);\r
+                       \r
+                       final List<IdentifiableEntity> searchResult = CdmStore.findTaxaAndNames(configurator);\r
+//                     monitor.worked(40);\r
+                       display.asyncExec(new Runnable() {\r
+                               \r
+                               public void run() {\r
+                                       displaySearchResult(searchResult);\r
+                               }\r
+                       });\r
+//                     monitor.done();\r
+                       return Status.OK_STATUS;\r
+               }\r
+               \r
        }\r
 \r
 }\r
index 30a0e4b9ed02c026a277eac55fac8f90871d6c51..4bc460f27c08f7854000c396983e5ea967e05008 100644 (file)
@@ -10,6 +10,7 @@
 package eu.etaxonomy.taxeditor.preference;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Arrays;\r
 import java.util.List;\r
 import java.util.Set;\r
 \r
@@ -60,7 +61,6 @@ public class PreferencesUtil {
        public static final String TAXON_SERVICE_CONFIGURATOR_SYNONYMS = "taxonServiceConfigurator.doSynonyms";\r
        public static final String TAXON_SERVICE_CONFIGURATOR_NAMES = "taxonServiceConfigurator.doNamesWithoutTaxa";\r
        public static final String TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES = "taxonServiceConfigurator.doTaxaByCommonNames";\r
-       public static final String TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA = "taxonServiceConfigurator.doTaxaByOrphanedTaxa";\r
        \r
        public static final String SHOW_DATASOURCE_CHOOSER = "dataSourceChooser.show";\r
 \r
@@ -305,7 +305,7 @@ public class PreferencesUtil {
                                . concat(".")\r
                                . concat(definedTerm.getUuid().toString());\r
                if (key.contains("javassist")) {\r
-                       logger.info("proxy");\r
+                       logger.warn("Trying to persist a preference based on a proxy class.");\r
                }\r
                return key;\r
        }\r
@@ -321,8 +321,7 @@ public class PreferencesUtil {
                configurator.setDoTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_TAXA));\r
                configurator.setDoSynonyms(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_SYNONYMS));\r
                configurator.setDoNamesWithoutTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_NAMES));\r
-               configurator.setDoTaxaByCommonNames(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES));                  \r
-               configurator.setDoTaxaByOrphanedTaxa(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA));\r
+               configurator.setDoTaxaByCommonNames(getPreferenceStore().getBoolean(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES));\r
 \r
                return configurator;\r
        }\r
@@ -338,7 +337,9 @@ public class PreferencesUtil {
                configurator.setDoSynonyms(true);\r
                configurator.setDoNamesWithoutTaxa(true);\r
                configurator.setDoTaxaByCommonNames(true);\r
-               configurator.setDoTaxaByOrphanedTaxa(true);\r
+               \r
+               configurator.setTaxonPropertyPath(Arrays.asList("$", \r
+                               "titleCache", "name", "name.$"));\r
                \r
                // DEFAULT VALUES               \r
                // match mode default only\r
@@ -363,7 +364,6 @@ public class PreferencesUtil {
                getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_SYNONYMS, configurator.isDoSynonyms());\r
                getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_NAMES, configurator.isDoNamesWithoutTaxa());\r
                getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES, configurator.isDoTaxaByCommonNames());\r
-               getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_ORPHANED_TAXA, configurator.isDoTaxaByOrphanedTaxa());\r
        }\r
 \r
        /**\r