editor now updatable via updateSite
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / propertysheet / type / wizard / NameSearchDialog.java
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.propertysheet.type.wizard;
11
12 import java.util.List;
13
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;
37
38 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
39 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
40 import eu.etaxonomy.taxeditor.store.CdmStore;
41
42 /**
43 * @author p.ciardelli
44 * @created 13.11.2008
45 * @version 1.0
46 */
47 public class NameSearchDialog extends Dialog {
48
49 private Table resultsTable;
50 private Text searchTermText;
51
52 protected Object result;
53 private Shell shell;
54 private Button okButton;
55 private TableViewer resultsTableViewer;
56 private TaxonNameBase<?, ?> selectedName;
57
58 public NameSearchDialog(Shell parent) {
59 // TODO merge this with NameSearchDialog eu.etaxonomy.taxeditor.editor.name
60 super(parent, SWT.NONE);
61 }
62
63 /**
64 * Open the dialog
65 * @return the result
66 */
67 public Object open() {
68 createContents();
69 shell.open();
70 shell.layout();
71 Display display = getParent().getDisplay();
72 while (!shell.isDisposed()) {
73 if (!display.readAndDispatch())
74 display.sleep();
75 }
76 return result;
77 }
78
79 /**
80 * Create contents of the dialog
81 */
82 protected void createContents() {
83
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");
89
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));
94
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);
101
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.");
106
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);
111
112 // Listen for user hitting <CR> in input field
113 searchTermText.addKeyListener(new KeyAdapter() {
114 public void keyReleased(KeyEvent e) {
115 int key = e.keyCode;
116 if (key == SWT.CR) {
117 populateSearchResults();
118 }
119 }
120 });
121
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() {
127
128 // Populate search results resultsTable after clicking button
129 public void mouseUp(MouseEvent e) {
130 populateSearchResults();
131 }
132 });
133
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());
138
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));
143
144 // Set content provider of results resultsTable
145 resultsTableViewer.setContentProvider(new ArrayContentProvider());
146
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();
152 }
153 return super.getText(element);
154 }
155 });
156
157 // Sort results alphabetically
158 resultsTableViewer.setComparator(new ViewerComparator());
159
160 // Listen for user selecting reference from results list
161 resultsTable.addSelectionListener(new SelectionAdapter() {
162 public void widgetSelected(SelectionEvent e) {
163
164 Object data = e.item.getData();
165
166 // Make sure selection is a ReferenceBase
167 if (data instanceof TaxonNameBase) {
168
169 setSelectedName((TaxonNameBase<?, ?>) data);
170
171 // Enable "OK" button
172 okButton.setEnabled(true);
173 }
174 }
175 });
176
177 // Double-clicking results entry submits selected reference
178 resultsTable.addListener(SWT.MouseDoubleClick, new Listener() {
179 public void handleEvent(Event event) {
180 submitResult();
181 }
182 });
183
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);
190
191 // Create "Cancel" button
192 final Button cancelButton = new Button(okCancelComposite, SWT.NONE);
193 cancelButton.setText("Cancel");
194
195 // Close dialog popup after clicking "Cancel" button
196 cancelButton.addMouseListener(new MouseAdapter() {
197 public void mouseUp(MouseEvent e) {
198 shell.dispose();
199 }
200 });
201
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");
208
209 // Submit result when "OK" button is clicked
210 okButton.addMouseListener(new MouseAdapter() {
211 public void mouseUp(MouseEvent e) {
212 submitResult();
213 }
214 });
215
216 }
217
218 // FIXME loose typification
219 private void populateSearchResults() {
220 // Get search results
221 List resultsArray = CdmStore.searchNameString(searchTermText.getText());
222
223 // Tell user if there are no results
224 if (resultsArray.size() == 0) {
225 resultsArray.add("Query returned no results.");
226 }
227
228 // Send results to results resultsTable
229 resultsTableViewer.setInput(resultsArray.toArray());
230
231 // Disable OK button
232 okButton.setEnabled(false);
233 }
234
235 /**
236 * Populate result and close dialog popup
237 */
238 private void submitResult() {
239 result = getSelectedName();
240 shell.dispose();
241 }
242
243 private void setSelectedName(TaxonNameBase<?, ?> selectedName) {
244 this.selectedName = selectedName;
245 }
246
247 private TaxonNameBase<?, ?> getSelectedName() {
248 return selectedName;
249 }
250 }