Double click on taxon search opens Name Editor #5689
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / search / SearchResultView.java
index fb4ea0dec587f93d4926e79d3e8b5d47d3a20976..18760f5c0c227ac33c33ddcfe034e6ef77d86ddd 100644 (file)
@@ -1,8 +1,8 @@
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* 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.
 */
@@ -21,6 +21,8 @@ import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -37,10 +39,12 @@ 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.UuidAndTitleCache;
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.cdm.persistence.query.MatchMode;
+import eu.etaxonomy.taxeditor.model.AbstractUtility;
 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
 import eu.etaxonomy.taxeditor.model.IContextListener;
 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
@@ -56,7 +60,9 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @version 1.0
  */
 public class SearchResultView extends ViewPart implements IConversationEnabled{
-       
+
+       private static Object[] EMPTY = new Object[0];
+
        private class ContextListener extends ContextListenerAdapter{
                /* (non-Javadoc)
                 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
@@ -64,12 +70,12 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                @Override
                public void contextStop(IMemento memento, IProgressMonitor monitor) {
                        monitor.subTask("Getting rid of search results");
-                       NavigationUtil.hideView(SearchResultView.this);
+                       AbstractUtility.hideView(SearchResultView.this);
                }
        }
-       
+
        /** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.searc"{trunked}</code> */
-       public static final String ID = 
+       public static final String ID =
                        "eu.etaxonomy.taxeditor.navigation.search.searchResultView"; //$NON-NLS-1$
 
        private TableViewer resultViewer;
@@ -83,42 +89,49 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
        private Text status;
 
        private SearchJob searchJob;
-       
+
        private IContextListener contextListener;
-       
+
        /* (non-Javadoc)
         * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
         */
        /** {@inheritDoc} */
        @Override
        public void createPartControl(Composite parent) {
-               
+
                conversation = CdmStore.createConversation();
                contextListener = new ContextListener();
                CdmStore.getContextManager().addContextListener(contextListener);
-               
+
                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));
-               
+
                resultViewer = new TableViewer(parent, SWT.NONE);
                resultViewer.setContentProvider(new ArrayContentProvider());
                resultViewer.setLabelProvider(new SearchResultLabelProvider());
                resultViewer.addDoubleClickListener(new IDoubleClickListener() {
-                       public void doubleClick(DoubleClickEvent event) {
-                               NavigationUtil.executeEditHandler();
+                       @Override
+            public void doubleClick(DoubleClickEvent event) {
+                           ISelection selection = event.getSelection();
+                           if(selection instanceof IStructuredSelection){
+                               Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+                               if(firstElement instanceof UuidAndTitleCache){
+                                   NavigationUtil.openEditor((UuidAndTitleCache) firstElement);
+                               }
+                           }
                        }
                });
-               
+
                resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               
+
                getSite().setSelectionProvider(resultViewer);
-               
+
                // register context menu
                MenuManager menuMgr = new MenuManager();
                menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
@@ -126,60 +139,64 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
 
                Control control = resultViewer.getControl();
                Menu menu = menuMgr.createContextMenu(control);
-               control.setMenu(menu);  
+               control.setMenu(menu);
        }
-       
+
        private Composite createInfoComposite(Composite parent){
                Composite composite = new Composite(parent, SWT.NULL);
-               
+
                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;
        }
-       
+
        /**
         * <p>performSearch</p>
         *
         * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
         */
-       public void performSearch(ITaxonServiceConfigurator configurator){
+       public void performSearch(IFindTaxaAndNamesConfigurator configurator){
                setPartName("Search: '" + configurator.getTitleSearchString() + "'");
-               
+
                searchString.setText(configurator.getTitleSearchString());
-               
+
                List<String> includedEntities = new ArrayList<String>();
-               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.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());
                }
-               
+               configurator.setMatchMode(MatchMode.LIKE);
+
                String includedEntitiesString = "";
                for (int i = 0; i < includedEntities.size(); i++){
                        includedEntitiesString += includedEntities.get(i);
@@ -187,26 +204,27 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                                includedEntitiesString += ", ";
                        }
                }
-               
+
                configurationLabel.setText(includedEntitiesString);
-               
+
                status.setText("Searching...");
-               
+
                searchJob = new SearchJob(Display.getCurrent(), configurator);
                searchJob.schedule();
-               
+
        }
-       
+
        /**
         * <p>displaySearchResult</p>
         *
         * @param result a {@link java.util.List} object.
         */
-       protected void displaySearchResult(List<UuidAndTitleCache<TaxonBase>> result) {
+       protected void displaySearchResult(List<UuidAndTitleCache<IdentifiableEntity>> result) {
                if(result.size() > 0){
-                       resultViewer.setInput(result); 
+                       resultViewer.setInput(result);
                        status.setText(result.size() + " entities found");
                }else{
+                       resultViewer.setInput(EMPTY);
                        status.setText("Search returned no results");
                }
        }
@@ -231,7 +249,8 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
         *
         * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
         */
-       public ConversationHolder getConversationHolder() {
+       @Override
+    public ConversationHolder getConversationHolder() {
                return this.conversation;
        }
 
@@ -239,11 +258,12 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
         * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
         */
        /** {@inheritDoc} */
-       public void update(CdmDataChangeMap changeEvents) {
+       @Override
+    public void update(CdmDataChangeMap changeEvents) {
                // TODO Auto-generated method stub
-               
+
        }
-       
+
        /* (non-Javadoc)
         * @see org.eclipse.ui.part.WorkbenchPart#dispose()
         */
@@ -252,27 +272,28 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
        public void dispose() {
                super.dispose();
                conversation.close();
-               if(searchJob != null)
-                       searchJob.cancel();
+               if(searchJob != null) {
+            searchJob.cancel();
+        }
                CdmStore.getContextManager().removeContextListener(contextListener);
        }
-       
+
        /**
-        * 
+        *
         * @author n.hoffmann
         * @created Feb 2, 2010
         * @version 1.0
         */
        class SearchJob extends Job{
 
-               private ITaxonServiceConfigurator configurator;
-               
-               private Display display;
-               
+               private final IFindTaxaAndNamesConfigurator configurator;
+
+               private final Display display;
+
                /**
                 * @param name
                 */
-               public SearchJob(Display display, ITaxonServiceConfigurator configurator) {
+               public SearchJob(Display display, IFindTaxaAndNamesConfigurator configurator) {
                        super("Performing Search");
                        this.display = display;
                        this.configurator = configurator;
@@ -285,19 +306,21 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                protected IStatus run(IProgressMonitor monitor) {
                        monitor.beginTask("", 100);
                        monitor.worked(20);
-                       
-                       final List<UuidAndTitleCache<TaxonBase>> searchResult = CdmStore.getSearchManager().findTaxaAndNames(configurator);
+
+                       final List<UuidAndTitleCache<IdentifiableEntity>> searchResult = CdmStore.getSearchManager().findTaxaAndNames(configurator);
                        monitor.worked(40);
-                       
+
                        if(! monitor.isCanceled()){
                                display.asyncExec(new Runnable() {
-                                       public void run() {
+                                       @Override
+                    public void run() {
                                                displaySearchResult(searchResult);
                                        }
                                });
                        }else{
                                display.asyncExec(new Runnable() {
-                                       public void run() {
+                                       @Override
+                    public void run() {
                                                status.setText("Cancelled");
                                        }
                                });
@@ -305,6 +328,6 @@ public class SearchResultView extends ViewPart implements IConversationEnabled{
                        monitor.done();
                        return Status.OK_STATUS;
                }
-               
-       }       
+
+       }
 }