Project

General

Profile

Download (10.1 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.ISelection;
25
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.TableViewer;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.layout.GridData;
29
import org.eclipse.swt.layout.GridLayout;
30
import org.eclipse.swt.widgets.Composite;
31
import org.eclipse.swt.widgets.Control;
32
import org.eclipse.swt.widgets.Display;
33
import org.eclipse.swt.widgets.Label;
34
import org.eclipse.swt.widgets.Menu;
35
import org.eclipse.swt.widgets.Text;
36
import org.eclipse.ui.IMemento;
37
import org.eclipse.ui.IWorkbenchActionConstants;
38
import org.eclipse.ui.part.ViewPart;
39

    
40
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
41
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
42
import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
43
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
44
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
45
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
46
import eu.etaxonomy.cdm.persistence.query.MatchMode;
47
import eu.etaxonomy.taxeditor.model.AbstractUtility;
48
import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
49
import eu.etaxonomy.taxeditor.model.IContextListener;
50
import eu.etaxonomy.taxeditor.navigation.NavigationUtil;
51
import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
52
import eu.etaxonomy.taxeditor.navigation.search.SearchBar.SearchOption;
53
import eu.etaxonomy.taxeditor.store.CdmStore;
54

    
55
/**
56
 * <p>SearchResultView class.</p>
57
 *
58
 * @author p.ciardelli
59
 * @author n.hoffmann
60
 * @created 19.01.2009
61
 * @version 1.0
62
 */
63
public class SearchResultView extends ViewPart implements IConversationEnabled{
64

    
65
	private static Object[] EMPTY = new Object[0];
66

    
67
	private class ContextListener extends ContextListenerAdapter{
68
		@Override
69
		public void contextStop(IMemento memento, IProgressMonitor monitor) {
70
			monitor.subTask(Messages.SearchResultView_REMOVE_SEARCH_RESULTS);
71
			AbstractUtility.hideView(SearchResultView.this);
72
		}
73
	}
74

    
75
	/** Constant <code>ID="eu.etaxonomy.taxeditor.navigation.searc"{trunked}</code> */
76
	public static final String ID =
77
			"eu.etaxonomy.taxeditor.navigation.search.searchResultView"; //$NON-NLS-1$
78

    
79
	private TableViewer resultViewer;
80

    
81
	private ConversationHolder conversation;
82

    
83
	private Text searchString;
84

    
85
	private Text configurationLabel;
86

    
87
	private Text status;
88

    
89
	private SearchJob searchJob;
90

    
91
	private IContextListener contextListener;
92

    
93
	/** {@inheritDoc} */
94
	@Override
95
	public void createPartControl(Composite parent) {
96

    
97
	    conversation = getConversation_internal();
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
			@Override
115
            public void doubleClick(DoubleClickEvent event) {
116
			    ISelection selection = event.getSelection();
117
			    if(selection instanceof IStructuredSelection){
118
			        Object firstElement = ((IStructuredSelection) selection).getFirstElement();
119
			        if(firstElement instanceof UuidAndTitleCache){
120
			            NavigationUtil.openEditor((UuidAndTitleCache) firstElement);
121
			        }
122
			    }
123
			}
124
		});
125

    
126
		resultViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
127

    
128
		getSite().setSelectionProvider(resultViewer);
129

    
130
		// register context menu
131
		MenuManager menuMgr = new MenuManager();
132
		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
133
		menuMgr.setRemoveAllWhenShown(true);
134
		getSite().registerContextMenu(menuMgr, resultViewer);
135

    
136
		Control control = resultViewer.getControl();
137
		Menu menu = menuMgr.createContextMenu(control);
138
		control.setMenu(menu);
139
	}
140

    
141
	private Composite createInfoComposite(Composite parent){
142
		Composite composite = new Composite(parent, SWT.NULL);
143

    
144
		composite.setLayout(new GridLayout(2, false));
145

    
146
		Label searchStringLabel = new Label(composite, SWT.NULL);
147
		searchStringLabel.setText(Messages.SearchResultView_SEARCH_STRING);
148

    
149
		searchString = new Text(composite, SWT.NULL);
150
		searchString.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
151
		searchString.setEditable(false);
152
//		searchString.setText("                                               ");
153

    
154
		Label configurationDescriptionLabel = new Label(composite, SWT.NULL);
155
		configurationDescriptionLabel.setText(Messages.SearchResultView_SEARCH_FOR);
156

    
157
		configurationLabel = new Text(composite, SWT.WRAP);
158
		configurationLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
159
		configurationLabel.setEditable(false);
160

    
161
		Label statusLabel = new Label(composite, SWT.NULL);
162
		statusLabel.setText(Messages.SearchResultView_STATUS);
163

    
164
		status = new Text(composite, SWT.NULL);
165
		status.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
166
		status.setEditable(false);
167

    
168
		return composite;
169
	}
170

    
171
	/**
172
	 * <p>performSearch</p>
173
	 *
174
	 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
175
	 */
176
	public void performSearch(IFindTaxaAndNamesConfigurator configurator){
177
		setPartName(String.format(Messages.SearchResultView_SEARCH, configurator.getTitleSearchString()));
178

    
179
		searchString.setText(configurator.getTitleSearchString());
180

    
181
		List<String> includedEntities = new ArrayList<String>();
182
		if(configurator.isDoTaxa()) {
183
            includedEntities.add(SearchOption.TAXON.getLabel());
184
        }
185
		if(configurator.isDoSynonyms()) {
186
            includedEntities.add(SearchOption.SYNONYM.getLabel());
187
        }
188
		if(configurator.isDoNamesWithoutTaxa()) {
189
            includedEntities.add(SearchOption.NAME.getLabel());
190
        }
191
		if(configurator.isDoTaxaByCommonNames()){
192
			includedEntities.add(SearchOption.COMMON_NAME.getLabel());
193
		}
194
		configurator.setMatchMode(MatchMode.LIKE);
195

    
196
		String includedEntitiesString = ""; //$NON-NLS-1$
197
		for (int i = 0; i < includedEntities.size(); i++){
198
			includedEntitiesString += includedEntities.get(i);
199
			if(i < includedEntities.size() -1){
200
				includedEntitiesString += ", "; //$NON-NLS-1$
201
			}
202
		}
203

    
204
		configurationLabel.setText(includedEntitiesString);
205

    
206
		status.setText(Messages.SearchResultView_SEARCHING);
207

    
208
		searchJob = new SearchJob(Display.getCurrent(), configurator);
209
		searchJob.schedule();
210

    
211
	}
212

    
213
	/**
214
	 * <p>displaySearchResult</p>
215
	 *
216
	 * @param result a {@link java.util.List} object.
217
	 */
218
	protected void displaySearchResult(List<UuidAndTitleCache<IdentifiableEntity>> result) {
219
		if(result.size() > 0){
220
			resultViewer.setInput(result);
221
			status.setText(String.format(Messages.SearchResultView_CNT_ENTITIES_FOUND, result.size()));
222
		}else{
223
			resultViewer.setInput(EMPTY);
224
			status.setText(Messages.SearchResultView_NO_RESULTS);
225
		}
226
	}
227

    
228
	/** {@inheritDoc} */
229
	@Override
230
	public void setFocus() {
231
		//logger.warn("Setting focus to search result viewer");
232
		ConversationHolder conversation_internal = getConversation_internal();
233
		if(conversation_internal!=null){
234
		    conversation_internal.bind();
235
		}
236
		// pass focus to resultViewer
237
		resultViewer.getControl().setFocus();
238
	}
239

    
240
	/**
241
	 * <p>getConversationHolder</p>
242
	 *
243
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
244
	 */
245
	@Override
246
    public ConversationHolder getConversationHolder() {
247
		return this.conversation;
248
	}
249

    
250
	/** {@inheritDoc} */
251
	@Override
252
    public void update(CdmDataChangeMap changeEvents) {
253
		// TODO Auto-generated method stub
254

    
255
	}
256

    
257
	/** {@inheritDoc} */
258
	@Override
259
	public void dispose() {
260
		super.dispose();
261
		if(conversation!=null){
262
		    conversation.close();
263
		}
264
		if(searchJob != null) {
265
            searchJob.cancel();
266
        }
267
		CdmStore.getContextManager().removeContextListener(contextListener);
268
	}
269

    
270
	private ConversationHolder getConversation_internal(){
271
	    if(conversation==null && CdmStore.isActive()){
272
	        try {
273
	            conversation = CdmStore.createConversation();
274
            } catch (Exception e) {
275
                //nothing
276
            }
277
	    }
278
	    return conversation;
279
	}
280

    
281
	/**
282
	 *
283
	 * @author n.hoffmann
284
	 * @created Feb 2, 2010
285
	 * @version 1.0
286
	 */
287
	class SearchJob extends Job{
288

    
289
		private final IFindTaxaAndNamesConfigurator configurator;
290

    
291
		private final Display display;
292

    
293
		/**
294
		 * @param name
295
		 */
296
		public SearchJob(Display display, IFindTaxaAndNamesConfigurator configurator) {
297
			super(Messages.SearchResultView_PERFORMING_SEARCH);
298
			this.display = display;
299
			this.configurator = configurator;
300
		}
301

    
302
		@Override
303
		protected IStatus run(IProgressMonitor monitor) {
304
			monitor.beginTask("", 100); //$NON-NLS-1$
305
			monitor.worked(20);
306

    
307
			final List<UuidAndTitleCache<IdentifiableEntity>> searchResult = CdmStore.getSearchManager().findTaxaAndNames(configurator);
308
			monitor.worked(40);
309

    
310
			if(! monitor.isCanceled()){
311
				display.asyncExec(new Runnable() {
312
					@Override
313
                    public void run() {
314
						displaySearchResult(searchResult);
315
					}
316
				});
317
			}else{
318
				display.asyncExec(new Runnable() {
319
					@Override
320
                    public void run() {
321
						status.setText(Messages.SearchResultView_CANCELLED);
322
					}
323
				});
324
			}
325
			monitor.done();
326
			return Status.OK_STATUS;
327
		}
328

    
329
	}
330
}
(3-3/3)