had to rename the packages to make them compliant with buckminster
[taxeditor.git] / eu.etaxonomy.taxeditor.navigation / src / main / java / eu / etaxonomy / taxeditor / navigation / search / SearchResultView.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.taxeditor.navigation.search;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
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.TableViewer;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.layout.GridData;
27 import org.eclipse.swt.layout.GridLayout;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Control;
30 import org.eclipse.swt.widgets.Display;
31 import org.eclipse.swt.widgets.Label;
32 import org.eclipse.swt.widgets.Menu;
33 import org.eclipse.swt.widgets.Text;
34 import org.eclipse.ui.IMemento;
35 import org.eclipse.ui.IWorkbenchActionConstants;
36 import org.eclipse.ui.part.ViewPart;
37
38 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
39 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
40 import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;
41 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
42 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
43 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
44 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
45 import eu.etaxonomy.taxeditor.model.IContextListener;
46 import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
47 import eu.etaxonomy.taxeditor.navigation.search.SearchBar.SearchOption;
48 import eu.etaxonomy.taxeditor.store.CdmStore;
49
50 /**
51 * <p>SearchResultView class.</p>
52 *
53 * @author p.ciardelli
54 * @author n.hoffmann
55 * @created 19.01.2009
56 * @version 1.0
57 */
58 public class SearchResultView extends ViewPart implements IConversationEnabled{
59
60 private class ContextListener extends ContextListenerAdapter{
61 /* (non-Javadoc)
62 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
63 */
64 @Override
65 public void contextStop(IMemento memento, IProgressMonitor monitor) {
66 monitor.subTask("Getting rid of search results");
67 NavigationUtil.hideView(SearchResultView.this);
68 }
69 }
70
71 /** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.searc"{trunked}</code> */
72 public static final String ID =
73 "eu.etaxonomy.taxeditor.navigation.search.searchResultView"; //$NON-NLS-1$
74
75 private TableViewer resultViewer;
76
77 private ConversationHolder conversation;
78
79 private Text searchString;
80
81 private Text configurationLabel;
82
83 private Text status;
84
85 private SearchJob searchJob;
86
87 private IContextListener contextListener;
88
89 /* (non-Javadoc)
90 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
91 */
92 /** {@inheritDoc} */
93 @Override
94 public void createPartControl(Composite parent) {
95
96 conversation = CdmStore.createConversation();
97 contextListener = new ContextListener();
98 CdmStore.getContextManager().addContextListener(contextListener);
99
100 GridLayout layout = new GridLayout();
101 layout.marginWidth = 0;
102 layout.marginHeight = 0;
103
104 parent.setLayout(layout);
105
106 Composite infoComposite = createInfoComposite(parent);
107 infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
108
109 resultViewer = new TableViewer(parent, SWT.NONE);
110 resultViewer.setContentProvider(new ArrayContentProvider());
111 resultViewer.setLabelProvider(new SearchResultLabelProvider());
112 resultViewer.addDoubleClickListener(new IDoubleClickListener() {
113 public void doubleClick(DoubleClickEvent event) {
114 NavigationUtil.executeEditHandler();
115 }
116 });
117
118 resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
119
120 getSite().setSelectionProvider(resultViewer);
121
122 // register context menu
123 MenuManager menuMgr = new MenuManager();
124 menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
125 getSite().registerContextMenu(menuMgr, resultViewer);
126
127 Control control = resultViewer.getControl();
128 Menu menu = menuMgr.createContextMenu(control);
129 control.setMenu(menu);
130 }
131
132 private Composite createInfoComposite(Composite parent){
133 Composite composite = new Composite(parent, SWT.NULL);
134
135 composite.setLayout(new GridLayout(2, false));
136
137 Label searchStringLabel = new Label(composite, SWT.NULL);
138 searchStringLabel.setText("Search String:");
139
140 searchString = new Text(composite, SWT.NULL);
141 searchString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
142 searchString.setEditable(false);
143 // searchString.setText(" ");
144
145 Label configurationDescriptionLabel = new Label(composite, SWT.NULL);
146 configurationDescriptionLabel.setText("Search for:");
147
148 configurationLabel = new Text(composite, SWT.WRAP);
149 configurationLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
150 configurationLabel.setEditable(false);
151
152 Label statusLabel = new Label(composite, SWT.NULL);
153 statusLabel.setText("Status:");
154
155 status = new Text(composite, SWT.NULL);
156 status.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
157 status.setEditable(false);
158
159 return composite;
160 }
161
162 /**
163 * <p>performSearch</p>
164 *
165 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
166 */
167 public void performSearch(ITaxonServiceConfigurator configurator){
168 setPartName("Search: '" + configurator.getSearchString() + "'");
169
170 searchString.setText(configurator.getSearchString());
171
172 List<String> includedEntities = new ArrayList<String>();
173 if(configurator.isDoTaxa())
174 includedEntities.add(SearchOption.TAXON.getLabel());
175 if(configurator.isDoSynonyms())
176 includedEntities.add(SearchOption.SYNONYM.getLabel());
177 if(configurator.isDoNamesWithoutTaxa())
178 includedEntities.add(SearchOption.NAME.getLabel());
179 if(configurator.isDoTaxaByCommonNames()){
180 includedEntities.add(SearchOption.COMMON_NAME.getLabel());
181 }
182
183 String includedEntitiesString = "";
184 for (int i = 0; i < includedEntities.size(); i++){
185 includedEntitiesString += includedEntities.get(i);
186 if(i < includedEntities.size() -1){
187 includedEntitiesString += ", ";
188 }
189 }
190
191 configurationLabel.setText(includedEntitiesString);
192
193 status.setText("Searching...");
194
195 searchJob = new SearchJob(Display.getCurrent(), configurator);
196 searchJob.schedule();
197
198 }
199
200 /**
201 * <p>displaySearchResult</p>
202 *
203 * @param result a {@link java.util.List} object.
204 */
205 protected void displaySearchResult(List<UuidAndTitleCache<TaxonBase>> result) {
206 if(result.size() > 0){
207 resultViewer.setInput(result);
208 status.setText(result.size() + " entities found");
209 }else{
210 status.setText("Search returned no results");
211 }
212 }
213
214 /* (non-Javadoc)
215 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
216 */
217 /** {@inheritDoc} */
218 @Override
219 public void setFocus() {
220 //logger.warn("Setting focus to search result viewer");
221 conversation.bind();
222 // pass focus to resultViewer
223 resultViewer.getControl().setFocus();
224 }
225
226 /* (non-Javadoc)
227 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
228 */
229 /**
230 * <p>getConversationHolder</p>
231 *
232 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
233 */
234 public ConversationHolder getConversationHolder() {
235 return this.conversation;
236 }
237
238 /* (non-Javadoc)
239 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
240 */
241 /** {@inheritDoc} */
242 public void update(CdmDataChangeMap changeEvents) {
243 // TODO Auto-generated method stub
244
245 }
246
247 /* (non-Javadoc)
248 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
249 */
250 /** {@inheritDoc} */
251 @Override
252 public void dispose() {
253 super.dispose();
254 conversation.close();
255 if(searchJob != null)
256 searchJob.cancel();
257 CdmStore.getContextManager().removeContextListener(contextListener);
258 }
259
260 /**
261 *
262 * @author n.hoffmann
263 * @created Feb 2, 2010
264 * @version 1.0
265 */
266 class SearchJob extends Job{
267
268 private ITaxonServiceConfigurator configurator;
269
270 private Display display;
271
272 /**
273 * @param name
274 */
275 public SearchJob(Display display, ITaxonServiceConfigurator configurator) {
276 super("Performing Search");
277 this.display = display;
278 this.configurator = configurator;
279 }
280
281 /* (non-Javadoc)
282 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
283 */
284 @Override
285 protected IStatus run(IProgressMonitor monitor) {
286 monitor.beginTask("", 100);
287 monitor.worked(20);
288
289 final List<UuidAndTitleCache<TaxonBase>> searchResult = CdmStore.getSearchManager().findTaxaAndNames(configurator);
290 monitor.worked(40);
291
292 if(! monitor.isCanceled()){
293 display.asyncExec(new Runnable() {
294 public void run() {
295 displaySearchResult(searchResult);
296 }
297 });
298 }else{
299 display.asyncExec(new Runnable() {
300 public void run() {
301 status.setText("Cancelled");
302 }
303 });
304 }
305 monitor.done();
306 return Status.OK_STATUS;
307 }
308
309 }
310 }