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
.reference
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
15 import org
.apache
.log4j
.Logger
;
16 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
17 import org
.eclipse
.jface
.viewers
.LabelProvider
;
18 import org
.eclipse
.jface
.viewers
.TableViewer
;
19 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swt
.events
.KeyAdapter
;
22 import org
.eclipse
.swt
.events
.KeyEvent
;
23 import org
.eclipse
.swt
.events
.MouseAdapter
;
24 import org
.eclipse
.swt
.events
.MouseEvent
;
25 import org
.eclipse
.swt
.events
.SelectionAdapter
;
26 import org
.eclipse
.swt
.events
.SelectionEvent
;
27 import org
.eclipse
.swt
.layout
.GridData
;
28 import org
.eclipse
.swt
.layout
.GridLayout
;
29 import org
.eclipse
.swt
.widgets
.Button
;
30 import org
.eclipse
.swt
.widgets
.Composite
;
31 import org
.eclipse
.swt
.widgets
.Dialog
;
32 import org
.eclipse
.swt
.widgets
.Display
;
33 import org
.eclipse
.swt
.widgets
.Event
;
34 import org
.eclipse
.swt
.widgets
.Label
;
35 import org
.eclipse
.swt
.widgets
.Listener
;
36 import org
.eclipse
.swt
.widgets
.Shell
;
37 import org
.eclipse
.swt
.widgets
.Table
;
38 import org
.eclipse
.swt
.widgets
.Text
;
40 import eu
.etaxonomy
.cdm
.model
.reference
.INomenclaturalReference
;
41 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
42 import eu
.etaxonomy
.taxeditor
.model
.CdmUtil
;
49 public class ReferenceSearchDialog
extends Dialog
{
50 private static final Logger logger
= Logger
51 .getLogger(ReferenceSearchDialog
.class);
53 private Table resultsTable
;
54 private Text searchTermText
;
56 protected Object result
;
58 private Button okButton
;
59 private TableViewer resultsTableViewer
;
60 private ReferenceBase selectedReference
;
61 private int searchType
;
63 public ReferenceSearchDialog(Shell parent
, int searchType
) {
64 super(parent
, SWT
.NONE
);
66 this.searchType
= searchType
;
69 public ReferenceSearchDialog(Shell parent
) {
70 super(parent
, SWT
.NONE
);
77 public Object
open() {
81 Display display
= getParent().getDisplay();
82 while (!shell
.isDisposed()) {
83 if (!display
.readAndDispatch())
90 * Create contents of the dialog
92 protected void createContents() {
94 // Create shell for popup dialog
95 shell
= new Shell(getParent(), SWT
.DIALOG_TRIM
| SWT
.APPLICATION_MODAL
);
96 shell
.setLayout(new GridLayout());
97 shell
.setSize(500, 375);
98 shell
.setText("Search for a reference in datasource");
100 // Create composite for entire shell
101 final Composite composite
= new Composite(shell
, SWT
.NONE
);
102 composite
.setLayout(new GridLayout());
103 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
105 // Create composite for search text, search term input, and "Search" button
106 final Composite searchComposite
= new Composite(composite
, SWT
.NONE
);
107 searchComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
108 final GridLayout gridLayout
= new GridLayout();
109 gridLayout
.numColumns
= 2;
110 searchComposite
.setLayout(gridLayout
);
112 // Create search text
113 final Label label
= new Label(searchComposite
, SWT
.NONE
);
114 label
.setLayoutData(new GridData(SWT
.LEFT
, SWT
.CENTER
, false, false, 2, 1));
115 label
.setText("Enter a search term for a full reference, using '*' as a wildcard.");
117 // Create input field for search term
118 searchTermText
= new Text(searchComposite
, SWT
.BORDER
| SWT
.SINGLE
);
119 final GridData gd_searchTermText
= new GridData(SWT
.FILL
, SWT
.CENTER
, true, false);
120 searchTermText
.setLayoutData(gd_searchTermText
);
122 // Listen for user hitting <CR> in input field
123 searchTermText
.addKeyListener(new KeyAdapter() {
124 public void keyReleased(KeyEvent e
) {
127 populateSearchResults();
132 // Create "Search" button
133 final Button searchButton
= new Button(searchComposite
, SWT
.NONE
);
134 searchButton
.setLayoutData(new GridData());
135 searchButton
.setText("Search");
136 searchButton
.addMouseListener(new MouseAdapter() {
138 // Populate search results resultsTable after clicking button
139 public void mouseUp(MouseEvent e
) {
140 populateSearchResults();
144 // Create composite for results table
145 final Composite resultsComposite
= new Composite(composite
, SWT
.NONE
);
146 resultsComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
147 resultsComposite
.setLayout(new GridLayout());
149 // Create results resultsTable
150 resultsTableViewer
= new TableViewer(resultsComposite
, SWT
.BORDER
);
151 resultsTable
= resultsTableViewer
.getTable();
152 resultsTable
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
154 // Set content provider of results resultsTable
155 resultsTableViewer
.setContentProvider(new ArrayContentProvider());
157 // Set label provider for results resultsTable which shows ReferenceBase.getTitleCache()
158 resultsTableViewer
.setLabelProvider(new LabelProvider() {
159 public String
getText(Object element
) {
160 if (element
instanceof ReferenceBase
) {
161 return ((ReferenceBase
) element
).getTitleCache();
163 return super.getText(element
);
167 // Sort results alphabetically
168 resultsTableViewer
.setComparator(new ViewerComparator());
170 // Listen for user selecting reference from results list
171 resultsTable
.addSelectionListener(new SelectionAdapter() {
172 public void widgetSelected(SelectionEvent e
) {
174 Object data
= e
.item
.getData();
176 // Make sure selection is a ReferenceBase
177 if (data
instanceof ReferenceBase
) {
179 setSelectedReference((ReferenceBase
) data
);
181 // Enable "OK" button
182 okButton
.setEnabled(true);
187 // Double-clicking results entry submits selected reference
188 resultsTable
.addListener(SWT
.MouseDoubleClick
, new Listener() {
189 public void handleEvent(Event event
) {
194 // Create composite for "OK" and "Cancel" buttons
195 final Composite okCancelComposite
= new Composite(composite
, SWT
.NONE
);
196 okCancelComposite
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, true, false));
197 final GridLayout gridLayout_1
= new GridLayout();
198 gridLayout_1
.numColumns
= 2;
199 okCancelComposite
.setLayout(gridLayout_1
);
201 // Create "Cancel" button
202 final Button cancelButton
= new Button(okCancelComposite
, SWT
.NONE
);
203 cancelButton
.setText("Cancel");
205 // Close dialog popup after clicking "Cancel" button
206 cancelButton
.addMouseListener(new MouseAdapter() {
207 public void mouseUp(MouseEvent e
) {
212 // Create "OK" button
213 okButton
= new Button(okCancelComposite
, SWT
.NONE
);
214 okButton
.setEnabled(false);
215 final GridData gd_okButton
= new GridData();
216 okButton
.setLayoutData(gd_okButton
);
217 okButton
.setText("OK");
219 // Submit result when "OK" button is clicked
220 okButton
.addMouseListener(new MouseAdapter() {
221 public void mouseUp(MouseEvent e
) {
228 private void populateSearchResults() {
229 // Get search results
230 List resultsArray
= CdmUtil
.getReferencesByTitle(searchTermText
.getText());
232 // Delete non-nomenclatural references as needed
233 if (searchType
== IReferenceSearch
.NOMREF
) {
234 List nomenclaturalResultsArray
= new ArrayList();
235 for (Object result
: resultsArray
) {
236 if (result
instanceof INomenclaturalReference
) {
237 nomenclaturalResultsArray
.add(result
);
240 resultsArray
= nomenclaturalResultsArray
;
243 // Tell user if there are no results
244 if (resultsArray
.size() == 0) {
245 resultsArray
.add("Query returned no results.");
248 // Send results to results resultsTable
249 resultsTableViewer
.setInput(resultsArray
.toArray());
252 okButton
.setEnabled(false);
256 * Populate result and close dialog popup
258 private void submitResult() {
259 result
= getSelectedReference();
263 private void setSelectedReference(ReferenceBase selectedReference
) {
264 this.selectedReference
= selectedReference
;
267 private ReferenceBase
getSelectedReference() {
268 return selectedReference
;