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
.propertysheet
.type
.wizard
;
12 import java
.util
.List
;
14 import org
.eclipse
.jface
.viewers
.ArrayContentProvider
;
15 import org
.eclipse
.jface
.viewers
.LabelProvider
;
16 import org
.eclipse
.jface
.viewers
.TableViewer
;
17 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.events
.KeyAdapter
;
20 import org
.eclipse
.swt
.events
.KeyEvent
;
21 import org
.eclipse
.swt
.events
.MouseAdapter
;
22 import org
.eclipse
.swt
.events
.MouseEvent
;
23 import org
.eclipse
.swt
.events
.SelectionAdapter
;
24 import org
.eclipse
.swt
.events
.SelectionEvent
;
25 import org
.eclipse
.swt
.layout
.GridData
;
26 import org
.eclipse
.swt
.layout
.GridLayout
;
27 import org
.eclipse
.swt
.widgets
.Button
;
28 import org
.eclipse
.swt
.widgets
.Composite
;
29 import org
.eclipse
.swt
.widgets
.Dialog
;
30 import org
.eclipse
.swt
.widgets
.Display
;
31 import org
.eclipse
.swt
.widgets
.Event
;
32 import org
.eclipse
.swt
.widgets
.Label
;
33 import org
.eclipse
.swt
.widgets
.Listener
;
34 import org
.eclipse
.swt
.widgets
.Shell
;
35 import org
.eclipse
.swt
.widgets
.Table
;
36 import org
.eclipse
.swt
.widgets
.Text
;
38 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
39 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceBase
;
40 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
47 public class NameSearchDialog
extends Dialog
{
49 private Table resultsTable
;
50 private Text searchTermText
;
52 protected Object result
;
54 private Button okButton
;
55 private TableViewer resultsTableViewer
;
56 private TaxonNameBase
<?
, ?
> selectedName
;
58 public NameSearchDialog(Shell parent
) {
59 // TODO merge this with NameSearchDialog eu.etaxonomy.taxeditor.editor.name
60 super(parent
, SWT
.NONE
);
67 public Object
open() {
71 Display display
= getParent().getDisplay();
72 while (!shell
.isDisposed()) {
73 if (!display
.readAndDispatch())
80 * Create contents of the dialog
82 protected void createContents() {
84 // Create shell for popup dialog
85 shell
= new Shell(getParent(), SWT
.DIALOG_TRIM
| SWT
.APPLICATION_MODAL
);
86 shell
.setLayout(new GridLayout());
87 shell
.setSize(500, 375);
88 shell
.setText("Search for a name in datasource");
90 // Create composite for entire shell
91 final Composite composite
= new Composite(shell
, SWT
.NONE
);
92 composite
.setLayout(new GridLayout());
93 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
95 // Create composite for search text, search term input, and "Search" button
96 final Composite searchComposite
= new Composite(composite
, SWT
.NONE
);
97 searchComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
98 final GridLayout gridLayout
= new GridLayout();
99 gridLayout
.numColumns
= 2;
100 searchComposite
.setLayout(gridLayout
);
102 // Create search text
103 final Label label
= new Label(searchComposite
, SWT
.NONE
);
104 label
.setLayoutData(new GridData(SWT
.LEFT
, SWT
.CENTER
, false, false, 2, 1));
105 label
.setText("Enter a search term for a full name, using '*' as a wildcard.");
107 // Create input field for search term
108 searchTermText
= new Text(searchComposite
, SWT
.BORDER
| SWT
.SINGLE
);
109 final GridData gd_searchTermText
= new GridData(SWT
.FILL
, SWT
.CENTER
, true, false);
110 searchTermText
.setLayoutData(gd_searchTermText
);
112 // Listen for user hitting <CR> in input field
113 searchTermText
.addKeyListener(new KeyAdapter() {
114 public void keyReleased(KeyEvent e
) {
117 populateSearchResults();
122 // Create "Search" button
123 final Button searchButton
= new Button(searchComposite
, SWT
.NONE
);
124 searchButton
.setLayoutData(new GridData());
125 searchButton
.setText("Search");
126 searchButton
.addMouseListener(new MouseAdapter() {
128 // Populate search results resultsTable after clicking button
129 public void mouseUp(MouseEvent e
) {
130 populateSearchResults();
134 // Create composite for results table
135 final Composite resultsComposite
= new Composite(composite
, SWT
.NONE
);
136 resultsComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
137 resultsComposite
.setLayout(new GridLayout());
139 // Create results resultsTable
140 resultsTableViewer
= new TableViewer(resultsComposite
, SWT
.BORDER
);
141 resultsTable
= resultsTableViewer
.getTable();
142 resultsTable
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
144 // Set content provider of results resultsTable
145 resultsTableViewer
.setContentProvider(new ArrayContentProvider());
147 // Set label provider for results resultsTable which shows ReferenceBase.getTitleCache()
148 resultsTableViewer
.setLabelProvider(new LabelProvider() {
149 public String
getText(Object element
) {
150 if (element
instanceof ReferenceBase
) {
151 return ((ReferenceBase
<?
>) element
).getTitleCache();
153 return super.getText(element
);
157 // Sort results alphabetically
158 resultsTableViewer
.setComparator(new ViewerComparator());
160 // Listen for user selecting reference from results list
161 resultsTable
.addSelectionListener(new SelectionAdapter() {
162 public void widgetSelected(SelectionEvent e
) {
164 Object data
= e
.item
.getData();
166 // Make sure selection is a ReferenceBase
167 if (data
instanceof TaxonNameBase
) {
169 setSelectedName((TaxonNameBase
<?
, ?
>) data
);
171 // Enable "OK" button
172 okButton
.setEnabled(true);
177 // Double-clicking results entry submits selected reference
178 resultsTable
.addListener(SWT
.MouseDoubleClick
, new Listener() {
179 public void handleEvent(Event event
) {
184 // Create composite for "OK" and "Cancel" buttons
185 final Composite okCancelComposite
= new Composite(composite
, SWT
.NONE
);
186 okCancelComposite
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, true, false));
187 final GridLayout gridLayout_1
= new GridLayout();
188 gridLayout_1
.numColumns
= 2;
189 okCancelComposite
.setLayout(gridLayout_1
);
191 // Create "Cancel" button
192 final Button cancelButton
= new Button(okCancelComposite
, SWT
.NONE
);
193 cancelButton
.setText("Cancel");
195 // Close dialog popup after clicking "Cancel" button
196 cancelButton
.addMouseListener(new MouseAdapter() {
197 public void mouseUp(MouseEvent e
) {
202 // Create "OK" button
203 okButton
= new Button(okCancelComposite
, SWT
.NONE
);
204 okButton
.setEnabled(false);
205 final GridData gd_okButton
= new GridData();
206 okButton
.setLayoutData(gd_okButton
);
207 okButton
.setText("OK");
209 // Submit result when "OK" button is clicked
210 okButton
.addMouseListener(new MouseAdapter() {
211 public void mouseUp(MouseEvent e
) {
218 // FIXME loose typification
219 private void populateSearchResults() {
220 // Get search results
221 List resultsArray
= CdmStore
.searchNameString(searchTermText
.getText());
223 // Tell user if there are no results
224 if (resultsArray
.size() == 0) {
225 resultsArray
.add("Query returned no results.");
228 // Send results to results resultsTable
229 resultsTableViewer
.setInput(resultsArray
.toArray());
232 okButton
.setEnabled(false);
236 * Populate result and close dialog popup
238 private void submitResult() {
239 result
= getSelectedName();
243 private void setSelectedName(TaxonNameBase
<?
, ?
> selectedName
) {
244 this.selectedName
= selectedName
;
247 private TaxonNameBase
<?
, ?
> getSelectedName() {