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
.editor
.name
;
12 import java
.util
.List
;
14 import org
.apache
.log4j
.Logger
;
15 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
16 import org
.eclipse
.jface
.viewers
.LabelProvider
;
17 import org
.eclipse
.jface
.viewers
.TableViewer
;
18 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
19 import org
.eclipse
.swt
.SWT
;
20 import org
.eclipse
.swt
.events
.KeyAdapter
;
21 import org
.eclipse
.swt
.events
.KeyEvent
;
22 import org
.eclipse
.swt
.events
.MouseAdapter
;
23 import org
.eclipse
.swt
.events
.MouseEvent
;
24 import org
.eclipse
.swt
.events
.SelectionAdapter
;
25 import org
.eclipse
.swt
.events
.SelectionEvent
;
26 import org
.eclipse
.swt
.layout
.GridData
;
27 import org
.eclipse
.swt
.layout
.GridLayout
;
28 import org
.eclipse
.swt
.widgets
.Button
;
29 import org
.eclipse
.swt
.widgets
.Composite
;
30 import org
.eclipse
.swt
.widgets
.Dialog
;
31 import org
.eclipse
.swt
.widgets
.Display
;
32 import org
.eclipse
.swt
.widgets
.Event
;
33 import org
.eclipse
.swt
.widgets
.Label
;
34 import org
.eclipse
.swt
.widgets
.Listener
;
35 import org
.eclipse
.swt
.widgets
.Shell
;
36 import org
.eclipse
.swt
.widgets
.Table
;
37 import org
.eclipse
.swt
.widgets
.Text
;
39 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
40 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
47 public class NameSearchDialog
extends Dialog
{
48 private static final Logger logger
= Logger
49 .getLogger(NameSearchDialog
.class);
51 private Table resultsTable
;
52 protected Text searchTermText
;
54 protected Object result
;
55 protected Shell shell
;
56 private Button okButton
;
57 private TableViewer resultsTableViewer
;
58 private TaxonNameBase selectedName
;
59 private int searchType
;
61 protected String dialogTitle
= "Search for a name in datasource";
62 protected String dialogMessage
= "Enter a search term for a scientific name, using '*' as a wildcard.";
64 public NameSearchDialog(Shell parent
, int searchType
) {
65 super(parent
, SWT
.NONE
);
67 this.searchType
= searchType
;
70 public NameSearchDialog(Shell parent
) {
71 super(parent
, SWT
.NONE
);
78 public Object
open() {
82 Display display
= getParent().getDisplay();
83 while (!shell
.isDisposed()) {
84 if (!display
.readAndDispatch())
91 * Create contents of the dialog
93 protected void createContents() {
95 // Create shell for popup dialog
96 shell
= new Shell(getParent(), SWT
.DIALOG_TRIM
| SWT
.APPLICATION_MODAL
);
97 shell
.setLayout(new GridLayout());
98 shell
.setSize(500, 375);
99 shell
.setText(dialogTitle
);
101 // Create composite for entire shell
102 final Composite composite
= new Composite(shell
, SWT
.NONE
);
103 composite
.setLayout(new GridLayout());
104 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
106 // Create composite for search text, search term input, and "Search" button
107 final Composite searchComposite
= new Composite(composite
, SWT
.NONE
);
108 searchComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
109 final GridLayout gridLayout
= new GridLayout();
110 gridLayout
.numColumns
= 2;
111 searchComposite
.setLayout(gridLayout
);
113 // Create search text
114 final Label label
= new Label(searchComposite
, SWT
.NONE
);
115 label
.setLayoutData(new GridData(SWT
.LEFT
, SWT
.CENTER
, false, false, 2, 1));
116 label
.setText(dialogMessage
);
118 // Create input field for search term
119 searchTermText
= new Text(searchComposite
, SWT
.BORDER
| SWT
.SINGLE
);
120 final GridData gd_searchTermText
= new GridData(SWT
.FILL
, SWT
.CENTER
, true, false);
121 searchTermText
.setLayoutData(gd_searchTermText
);
123 // Listen for user hitting <CR> in input field
124 searchTermText
.addKeyListener(new KeyAdapter() {
125 public void keyReleased(KeyEvent e
) {
128 populateSearchResults();
133 // Create "Search" button
134 final Button searchButton
= new Button(searchComposite
, SWT
.NONE
);
135 searchButton
.setLayoutData(new GridData());
136 searchButton
.setText("Search");
137 searchButton
.addMouseListener(new MouseAdapter() {
139 // Populate search results resultsTable after clicking button
140 public void mouseUp(MouseEvent e
) {
141 populateSearchResults();
145 // Create composite for results table
146 final Composite resultsComposite
= new Composite(composite
, SWT
.NONE
);
147 resultsComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
148 resultsComposite
.setLayout(new GridLayout());
150 // Create results resultsTable
151 resultsTableViewer
= new TableViewer(resultsComposite
, SWT
.BORDER
);
152 resultsTable
= resultsTableViewer
.getTable();
153 resultsTable
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
155 // Set content provider of results resultsTable
156 resultsTableViewer
.setContentProvider(new ArrayContentProvider());
158 // Set label provider for results resultsTable which shows ReferenceBase.getTitleCache()
159 resultsTableViewer
.setLabelProvider(new LabelProvider() {
160 public String
getText(Object element
) {
161 String text
= NameSearchDialog
.this.getText(element
);
165 return super.getText(element
);
169 // Sort results alphabetically
170 resultsTableViewer
.setComparator(new ViewerComparator());
172 // Listen for user selecting reference from results list
173 resultsTable
.addSelectionListener(new SelectionAdapter() {
174 public void widgetSelected(SelectionEvent e
) {
176 Object data
= e
.item
.getData();
178 if (setSelection(data
)) {
179 okButton
.setEnabled(true);
184 // Double-clicking results entry submits selected reference
185 resultsTable
.addListener(SWT
.MouseDoubleClick
, new Listener() {
186 public void handleEvent(Event event
) {
191 // Create composite for "OK" and "Cancel" buttons
192 final Composite okCancelComposite
= new Composite(composite
, SWT
.NONE
);
193 okCancelComposite
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, true, false));
194 final GridLayout gridLayout_1
= new GridLayout();
195 gridLayout_1
.numColumns
= 2;
196 okCancelComposite
.setLayout(gridLayout_1
);
198 // Create "Cancel" button
199 final Button cancelButton
= new Button(okCancelComposite
, SWT
.NONE
);
200 cancelButton
.setText("Cancel");
202 // Close dialog popup after clicking "Cancel" button
203 cancelButton
.addMouseListener(new MouseAdapter() {
204 public void mouseUp(MouseEvent e
) {
209 // Create "OK" button
210 okButton
= new Button(okCancelComposite
, SWT
.NONE
);
211 okButton
.setEnabled(false);
212 final GridData gd_okButton
= new GridData();
213 okButton
.setLayoutData(gd_okButton
);
214 okButton
.setText("OK");
216 // Submit result when "OK" button is clicked
217 okButton
.addMouseListener(new MouseAdapter() {
218 public void mouseUp(MouseEvent e
) {
229 protected boolean setSelection(Object data
) {
230 if (data
instanceof TaxonNameBase
) {
231 setSelectedName((TaxonNameBase
) data
);
240 protected String
getText(Object element
) {
241 if (element
instanceof TaxonNameBase
) {
242 return ((TaxonNameBase
) element
).getTitleCache();
247 private void populateSearchResults() {
248 // Get search results
249 List resultsArray
= doSearch();
251 // Tell user if there are no results
252 if (resultsArray
.size() == 0) {
253 resultsArray
.add("Query returned no results.");
256 // Send results to results resultsTable
257 resultsTableViewer
.setInput(resultsArray
.toArray());
260 okButton
.setEnabled(false);
263 protected List
doSearch() {
264 return CdmStore
.searchNameString(searchTermText
.getText());
268 * Populate result and close dialog popup
270 protected void submitResult() {
271 result
= getSelectedName();
275 private void setSelectedName(TaxonNameBase selectedName
) {
276 this.selectedName
= selectedName
;
279 private TaxonNameBase
getSelectedName() {