Project

General

Profile

Download (9.34 KB) Statistics
| Branch: | Tag: | Revision:
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.singlesource.org.eclipse.swt.widgets.DisplayProxy;
49
import eu.etaxonomy.taxeditor.store.CdmStore;
50

    
51
/**
52
 * <p>SearchResultView class.</p>
53
 *
54
 * @author p.ciardelli
55
 * @author n.hoffmann
56
 * @created 19.01.2009
57
 * @version 1.0
58
 */
59
public class SearchResultView extends ViewPart implements IConversationEnabled{
60
	
61
	private class ContextListener extends ContextListenerAdapter{
62
		/* (non-Javadoc)
63
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
64
		 */
65
		@Override
66
		public void contextStop(IMemento memento, IProgressMonitor monitor) {
67
			monitor.subTask("Getting rid of search results");
68
			NavigationUtil.hideView(SearchResultView.this);
69
		}
70
	}
71
	
72
	/** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.searc"{trunked}</code> */
73
	public static final String ID = 
74
			"eu.etaxonomy.taxeditor.navigation.search.searchResultView"; //$NON-NLS-1$
75

    
76
	private TableViewer resultViewer;
77

    
78
	private ConversationHolder conversation;
79

    
80
	private Text searchString;
81

    
82
	private Text configurationLabel;
83

    
84
	private Text status;
85

    
86
	private SearchJob searchJob;
87
	
88
	private IContextListener contextListener;
89
	
90
	/* (non-Javadoc)
91
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
92
	 */
93
	/** {@inheritDoc} */
94
	@Override
95
	public void createPartControl(Composite parent) {
96
		
97
		conversation = CdmStore.createConversation();
98
		contextListener = new ContextListener();
99
		CdmStore.getContextManager().addContextListener(contextListener);
100
		
101
		GridLayout layout = new GridLayout();
102
		layout.marginWidth = 0;
103
		layout.marginHeight = 0;
104
		
105
		parent.setLayout(layout);
106
		
107
		Composite infoComposite = createInfoComposite(parent);
108
		infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
109
		
110
		resultViewer = new TableViewer(parent, SWT.NONE);
111
		resultViewer.setContentProvider(new ArrayContentProvider());
112
		resultViewer.setLabelProvider(new SearchResultLabelProvider());
113
		resultViewer.addDoubleClickListener(new IDoubleClickListener() {
114
			public void doubleClick(DoubleClickEvent event) {
115
				NavigationUtil.executeEditHandler();
116
			}
117
		});
118
		
119
		resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
120
		
121
		getSite().setSelectionProvider(resultViewer);
122
		
123
		// register context menu
124
		MenuManager menuMgr = new MenuManager();
125
		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
126
		getSite().registerContextMenu(menuMgr, resultViewer);
127

    
128
		Control control = resultViewer.getControl();
129
		Menu menu = menuMgr.createContextMenu(control);
130
		control.setMenu(menu);	
131
	}
132
	
133
	private Composite createInfoComposite(Composite parent){
134
		Composite composite = new Composite(parent, SWT.NULL);
135
		
136
		composite.setLayout(new GridLayout(2, false));
137
		
138
		Label searchStringLabel = new Label(composite, SWT.NULL);
139
		searchStringLabel.setText("Search String:");
140
		
141
		searchString = new Text(composite, SWT.NULL);
142
		searchString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
143
		searchString.setEditable(false);
144
//		searchString.setText("                                               ");
145
		
146
		Label configurationDescriptionLabel = new Label(composite, SWT.NULL);
147
		configurationDescriptionLabel.setText("Search for:");
148
		
149
		configurationLabel = new Text(composite, SWT.WRAP);
150
		configurationLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
151
		configurationLabel.setEditable(false);
152
		
153
		Label statusLabel = new Label(composite, SWT.NULL);
154
		statusLabel.setText("Status:");
155
		
156
		status = new Text(composite, SWT.NULL);
157
		status.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
158
		status.setEditable(false);
159
		
160
		return composite;
161
	}
162
	
163
	/**
164
	 * <p>performSearch</p>
165
	 *
166
	 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
167
	 */
168
	public void performSearch(ITaxonServiceConfigurator configurator){
169
		setPartName("Search: '" + configurator.getTitleSearchString() + "'");
170
		
171
		searchString.setText(configurator.getTitleSearchString());
172
		
173
		List<String> includedEntities = new ArrayList<String>();
174
		if(configurator.isDoTaxa())
175
			includedEntities.add(SearchOption.TAXON.getLabel());
176
		if(configurator.isDoSynonyms())
177
			includedEntities.add(SearchOption.SYNONYM.getLabel());
178
		if(configurator.isDoNamesWithoutTaxa())
179
			includedEntities.add(SearchOption.NAME.getLabel());
180
		if(configurator.isDoTaxaByCommonNames()){
181
			includedEntities.add(SearchOption.COMMON_NAME.getLabel());
182
		}
183
		
184
		String includedEntitiesString = "";
185
		for (int i = 0; i < includedEntities.size(); i++){
186
			includedEntitiesString += includedEntities.get(i);
187
			if(i < includedEntities.size() -1){
188
				includedEntitiesString += ", ";
189
			}
190
		}
191
		
192
		configurationLabel.setText(includedEntitiesString);
193
		
194
		status.setText("Searching...");
195
		
196
		searchJob = new SearchJob(DisplayProxy.getDefault(), configurator);
197
		searchJob.schedule();
198
		
199
	}
200
	
201
	/**
202
	 * <p>displaySearchResult</p>
203
	 *
204
	 * @param result a {@link java.util.List} object.
205
	 */
206
	protected void displaySearchResult(List<UuidAndTitleCache<TaxonBase>> result) {
207
		if(result.size() > 0){
208
			resultViewer.setInput(result); 
209
			status.setText(result.size() + " entities found");
210
		}else{
211
			status.setText("Search returned no results");
212
		}
213
	}
214

    
215
	/* (non-Javadoc)
216
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
217
	 */
218
	/** {@inheritDoc} */
219
	@Override
220
	public void setFocus() {
221
		//logger.warn("Setting focus to search result viewer");
222
		conversation.bind();
223
		// pass focus to resultViewer
224
		resultViewer.getControl().setFocus();
225
	}
226

    
227
	/* (non-Javadoc)
228
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
229
	 */
230
	/**
231
	 * <p>getConversationHolder</p>
232
	 *
233
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
234
	 */
235
	public ConversationHolder getConversationHolder() {
236
		return this.conversation;
237
	}
238

    
239
	/* (non-Javadoc)
240
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
241
	 */
242
	/** {@inheritDoc} */
243
	public void update(CdmDataChangeMap changeEvents) {
244
		// TODO Auto-generated method stub
245
		
246
	}
247
	
248
	/* (non-Javadoc)
249
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
250
	 */
251
	/** {@inheritDoc} */
252
	@Override
253
	public void dispose() {
254
		super.dispose();
255
		conversation.close();
256
		if(searchJob != null)
257
			searchJob.cancel();
258
		CdmStore.getContextManager().removeContextListener(contextListener);
259
	}
260
	
261
	/**
262
	 * 
263
	 * @author n.hoffmann
264
	 * @created Feb 2, 2010
265
	 * @version 1.0
266
	 */
267
	class SearchJob extends Job{
268

    
269
		private ITaxonServiceConfigurator configurator;
270
		
271
		private Display display;
272
		
273
		/**
274
		 * @param name
275
		 */
276
		public SearchJob(Display display, ITaxonServiceConfigurator configurator) {
277
			super("Performing Search");
278
			this.display = display;
279
			this.configurator = configurator;
280
		}
281

    
282
		/* (non-Javadoc)
283
		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
284
		 */
285
		@Override
286
		protected IStatus run(IProgressMonitor monitor) {
287
			monitor.beginTask("", 100);
288
			monitor.worked(20);
289
			
290
			final List<UuidAndTitleCache<TaxonBase>> searchResult = CdmStore.getSearchManager().findTaxaAndNames(configurator);
291
			monitor.worked(40);
292
			
293
			if(! monitor.isCanceled()){
294
				display.asyncExec(new Runnable() {
295
					public void run() {
296
						displaySearchResult(searchResult);
297
					}
298
				});
299
			}else{
300
				display.asyncExec(new Runnable() {
301
					public void run() {
302
						status.setText("Cancelled");
303
					}
304
				});
305
			}
306
			monitor.done();
307
			return Status.OK_STATUS;
308
		}
309
		
310
	}	
311
}
(3-3/3)