2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.navigation
.search
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
15 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
16 import org
.eclipse
.core
.runtime
.IStatus
;
17 import org
.eclipse
.core
.runtime
.Status
;
18 import org
.eclipse
.core
.runtime
.jobs
.Job
;
19 import org
.eclipse
.jface
.action
.GroupMarker
;
20 import org
.eclipse
.jface
.action
.MenuManager
;
21 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
22 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
23 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
24 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
25 import org
.eclipse
.jface
.viewers
.TableViewer
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.layout
.GridData
;
28 import org
.eclipse
.swt
.layout
.GridLayout
;
29 import org
.eclipse
.swt
.widgets
.Composite
;
30 import org
.eclipse
.swt
.widgets
.Control
;
31 import org
.eclipse
.swt
.widgets
.Display
;
32 import org
.eclipse
.swt
.widgets
.Label
;
33 import org
.eclipse
.swt
.widgets
.Menu
;
34 import org
.eclipse
.swt
.widgets
.Text
;
35 import org
.eclipse
.ui
.IMemento
;
36 import org
.eclipse
.ui
.IWorkbenchActionConstants
;
37 import org
.eclipse
.ui
.part
.ViewPart
;
39 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
40 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
41 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
42 import eu
.etaxonomy
.cdm
.api
.service
.config
.IFindTaxaAndNamesConfigurator
;
43 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
45 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
46 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
47 import eu
.etaxonomy
.cdm
.persistence
.dto
.UuidAndTitleCache
;
48 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
49 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
50 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
51 import eu
.etaxonomy
.taxeditor
.model
.ContextListenerAdapter
;
52 import eu
.etaxonomy
.taxeditor
.model
.IContextListener
;
53 import eu
.etaxonomy
.taxeditor
.navigation
.search
.SearchBar
.SearchOption
;
54 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
55 import eu
.etaxonomy
.taxeditor
.view
.CdmViewerChooser
;
58 * <p>SearchResultView class.</p>
65 public class SearchResultView
extends ViewPart
implements IConversationEnabled
{
67 private static Object
[] EMPTY
= new Object
[0];
69 private class ContextListener
extends ContextListenerAdapter
{
71 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
74 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
75 monitor
.subTask("Getting rid of search results");
76 AbstractUtility
.hideView(SearchResultView
.this);
80 /** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.searc"{trunked}</code> */
81 public static final String ID
=
82 "eu.etaxonomy.taxeditor.navigation.search.searchResultView"; //$NON-NLS-1$
84 private TableViewer resultViewer
;
86 private ConversationHolder conversation
;
88 private Text searchString
;
90 private Text configurationLabel
;
94 private SearchJob searchJob
;
96 private IContextListener contextListener
;
99 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
103 public void createPartControl(Composite parent
) {
105 conversation
= CdmStore
.createConversation();
106 contextListener
= new ContextListener();
107 CdmStore
.getContextManager().addContextListener(contextListener
);
109 GridLayout layout
= new GridLayout();
110 layout
.marginWidth
= 0;
111 layout
.marginHeight
= 0;
113 parent
.setLayout(layout
);
115 Composite infoComposite
= createInfoComposite(parent
);
116 infoComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false));
118 resultViewer
= new TableViewer(parent
, SWT
.NONE
);
119 resultViewer
.setContentProvider(new ArrayContentProvider());
120 resultViewer
.setLabelProvider(new SearchResultLabelProvider());
121 resultViewer
.addDoubleClickListener(new IDoubleClickListener() {
123 public void doubleClick(DoubleClickEvent event
) {
124 if(event
.getSelection() instanceof IStructuredSelection
){
125 Object selectedObject
= ((IStructuredSelection
) event
.getSelection()).getFirstElement();
126 if (selectedObject
instanceof UuidAndTitleCache
){
127 Class type
= ((UuidAndTitleCache
) selectedObject
).getType();
128 if(type
== Taxon
.class || type
== Synonym
.class){
129 TaxonBase taxonBase
= CdmStore
.getService(ITaxonService
.class).load(((UuidAndTitleCache
) selectedObject
).getUuid());
130 CdmViewerChooser chooser
= new CdmViewerChooser(getSite().getShell());
131 chooser
.chooseViewer(taxonBase
);
138 resultViewer
.getControl().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
140 getSite().setSelectionProvider(resultViewer
);
142 // register context menu
143 MenuManager menuMgr
= new MenuManager();
144 menuMgr
.add(new GroupMarker(IWorkbenchActionConstants
.MB_ADDITIONS
));
145 getSite().registerContextMenu(menuMgr
, resultViewer
);
147 Control control
= resultViewer
.getControl();
148 Menu menu
= menuMgr
.createContextMenu(control
);
149 control
.setMenu(menu
);
152 private Composite
createInfoComposite(Composite parent
){
153 Composite composite
= new Composite(parent
, SWT
.NULL
);
155 composite
.setLayout(new GridLayout(2, false));
157 Label searchStringLabel
= new Label(composite
, SWT
.NULL
);
158 searchStringLabel
.setText("Search String:");
160 searchString
= new Text(composite
, SWT
.NULL
);
161 searchString
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
162 searchString
.setEditable(false);
163 // searchString.setText(" ");
165 Label configurationDescriptionLabel
= new Label(composite
, SWT
.NULL
);
166 configurationDescriptionLabel
.setText("Search for:");
168 configurationLabel
= new Text(composite
, SWT
.WRAP
);
169 configurationLabel
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
170 configurationLabel
.setEditable(false);
172 Label statusLabel
= new Label(composite
, SWT
.NULL
);
173 statusLabel
.setText("Status:");
175 status
= new Text(composite
, SWT
.NULL
);
176 status
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
177 status
.setEditable(false);
183 * <p>performSearch</p>
185 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
187 public void performSearch(IFindTaxaAndNamesConfigurator configurator
){
188 setPartName("Search: '" + configurator
.getTitleSearchString() + "'");
190 searchString
.setText(configurator
.getTitleSearchString());
192 List
<String
> includedEntities
= new ArrayList
<String
>();
193 if(configurator
.isDoTaxa()) {
194 includedEntities
.add(SearchOption
.TAXON
.getLabel());
196 if(configurator
.isDoSynonyms()) {
197 includedEntities
.add(SearchOption
.SYNONYM
.getLabel());
199 if(configurator
.isDoNamesWithoutTaxa()) {
200 includedEntities
.add(SearchOption
.NAME
.getLabel());
202 if(configurator
.isDoTaxaByCommonNames()){
203 includedEntities
.add(SearchOption
.COMMON_NAME
.getLabel());
205 configurator
.setMatchMode(MatchMode
.LIKE
);
207 String includedEntitiesString
= "";
208 for (int i
= 0; i
< includedEntities
.size(); i
++){
209 includedEntitiesString
+= includedEntities
.get(i
);
210 if(i
< includedEntities
.size() -1){
211 includedEntitiesString
+= ", ";
215 configurationLabel
.setText(includedEntitiesString
);
217 status
.setText("Searching...");
219 searchJob
= new SearchJob(Display
.getCurrent(), configurator
);
220 searchJob
.schedule();
225 * <p>displaySearchResult</p>
227 * @param result a {@link java.util.List} object.
229 protected void displaySearchResult(List
<UuidAndTitleCache
<IdentifiableEntity
>> result
) {
230 if(result
.size() > 0){
231 resultViewer
.setInput(result
);
232 status
.setText(result
.size() + " entities found");
234 resultViewer
.setInput(EMPTY
);
235 status
.setText("Search returned no results");
240 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
244 public void setFocus() {
245 //logger.warn("Setting focus to search result viewer");
247 // pass focus to resultViewer
248 resultViewer
.getControl().setFocus();
252 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
255 * <p>getConversationHolder</p>
257 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
260 public ConversationHolder
getConversationHolder() {
261 return this.conversation
;
265 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
269 public void update(CdmDataChangeMap changeEvents
) {
270 // TODO Auto-generated method stub
275 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
279 public void dispose() {
281 conversation
.close();
282 if(searchJob
!= null) {
285 CdmStore
.getContextManager().removeContextListener(contextListener
);
291 * @created Feb 2, 2010
294 class SearchJob
extends Job
{
296 private final IFindTaxaAndNamesConfigurator configurator
;
298 private final Display display
;
303 public SearchJob(Display display
, IFindTaxaAndNamesConfigurator configurator
) {
304 super("Performing Search");
305 this.display
= display
;
306 this.configurator
= configurator
;
310 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
313 protected IStatus
run(IProgressMonitor monitor
) {
314 monitor
.beginTask("", 100);
317 final List
<UuidAndTitleCache
<IdentifiableEntity
>> searchResult
= CdmStore
.getSearchManager().findTaxaAndNames(configurator
);
320 if(! monitor
.isCanceled()){
321 display
.asyncExec(new Runnable() {
324 displaySearchResult(searchResult
);
328 display
.asyncExec(new Runnable() {
331 status
.setText("Cancelled");
336 return Status
.OK_STATUS
;