removed java 1.5 incompatible override annotations
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / propertysheet / namerelationswizard / ChooseRelatedNameWizardPage.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.namerelationswizard;
11
12 import java.util.Set;
13
14 import org.apache.log4j.Logger;
15 import org.eclipse.core.databinding.beans.BeansObservables;
16 import org.eclipse.core.databinding.observable.list.WritableList;
17 import org.eclipse.core.databinding.observable.map.IObservableMap;
18 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
19 import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
20 import org.eclipse.jface.viewers.DoubleClickEvent;
21 import org.eclipse.jface.viewers.IDoubleClickListener;
22 import org.eclipse.jface.viewers.IStructuredSelection;
23 import org.eclipse.jface.viewers.StructuredSelection;
24 import org.eclipse.jface.viewers.TableViewer;
25 import org.eclipse.jface.viewers.ViewerComparator;
26 import org.eclipse.jface.wizard.WizardPage;
27 import org.eclipse.swt.SWT;
28 import org.eclipse.swt.events.ModifyEvent;
29 import org.eclipse.swt.events.ModifyListener;
30 import org.eclipse.swt.events.SelectionAdapter;
31 import org.eclipse.swt.events.SelectionEvent;
32 import org.eclipse.swt.layout.GridData;
33 import org.eclipse.swt.layout.GridLayout;
34 import org.eclipse.swt.widgets.Button;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Display;
37 import org.eclipse.swt.widgets.Event;
38 import org.eclipse.swt.widgets.Label;
39 import org.eclipse.swt.widgets.Listener;
40 import org.eclipse.swt.widgets.Table;
41 import org.eclipse.swt.widgets.TableItem;
42 import org.eclipse.swt.widgets.Text;
43
44 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
45 import eu.etaxonomy.cdm.model.name.NonViralName;
46 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
47 import eu.etaxonomy.taxeditor.ITaxEditorConstants;
48 import eu.etaxonomy.taxeditor.TaxEditorPlugin;
49 import eu.etaxonomy.taxeditor.model.CdmUtil;
50
51 /**
52 * An all-in-one relation wizard page where the user chooses a related name, a
53 * relationship type, and the relation's directionality.
54 *
55 * Note: does not yet return relation to wizard.
56 *
57 * @author p.ciardelli
58 * @created 04.06.2008
59 * @version 1.0
60 */
61 public class ChooseRelatedNameWizardPage extends WizardPage {
62 private static final Logger logger = Logger
63 .getLogger(ChooseRelatedNameWizardPage.class);
64
65 private NameRelationWizardModel relationModel;
66
67 private Text txtNewName;
68 private Text txtName;
69 private boolean nameSelected = false;
70
71 private Table searchResultsTable;
72 private WritableList observableSearchResultsList = new WritableList();
73 private NonViralName noResultsDummyName = NonViralName.NewInstance(null);
74
75 public ChooseRelatedNameWizardPage(NameRelationWizardModel relationModel) {
76 super("");
77
78 this.relationModel = relationModel;
79
80 setTitle("Choose related name for '" + relationModel.getBaseName() + "\".");
81 setDescription("You can either choose from search results or create a new name. Use \"*\" for wildcard searching.");
82 }
83
84 public void createControl(Composite parent) {
85 Composite container = new Composite(parent, SWT.NULL);
86 final GridLayout gridLayout = new GridLayout();
87 gridLayout.numColumns = 3;
88 container.setLayout(gridLayout);
89
90 setControl(container);
91
92 final Label lblChooseName = new Label(container, SWT.NONE);
93 lblChooseName.setText("Choose name for relation:");
94 new Label(container, SWT.NONE);
95 new Label(container, SWT.NONE);
96
97 txtName = new Text(container, SWT.BORDER);
98 txtName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
99
100 final Button btnSearch = new Button(container, SWT.NONE);
101 btnSearch.setEnabled(false);
102 btnSearch.setLayoutData(new GridData());
103 btnSearch.setText("Search");
104 btnSearch.addSelectionListener(new SelectionAdapter() {
105 public void widgetSelected(SelectionEvent e) {
106 String searchText = txtName.getText();
107 btnSearch.setEnabled(false);
108 Set<TaxonNameBase> results = CdmUtil.getNameByName(searchText);
109
110 observableSearchResultsList.clear();
111 if (results.size() == 0) {
112 // Populate observable list with dummy name
113 observableSearchResultsList.add(noResultsDummyName);
114 } else {
115 observableSearchResultsList.addAll(results);
116 }
117 btnSearch.setEnabled(true);
118 }
119 });
120
121 final Button btnNewName = new Button(container, SWT.NONE);
122 btnNewName.setEnabled(false);
123 btnNewName.setText("Create New Name");
124 btnNewName.addSelectionListener(new SelectionAdapter() {
125 public void widgetSelected(SelectionEvent e) {
126 setRawNewName(txtName.getText());
127 btnNewName.setEnabled(false);
128 }
129 });
130 createSearchResultsViewer(container);
131
132 txtName.addModifyListener(new ModifyListener() {
133 public void modifyText(ModifyEvent e) {
134 if (txtName.getText().length() > 0) {
135 btnNewName.setEnabled(true);
136 btnSearch.setEnabled(true);
137 } else {
138 btnNewName.setEnabled(false);
139 btnSearch.setEnabled(false);
140 }
141 }
142 });
143
144 txtNewName = new Text(container, SWT.BORDER);
145 final GridData gd_txtNewName = new GridData(SWT.FILL, SWT.CENTER, true,
146 false, 3, 1);
147 txtNewName.setLayoutData(gd_txtNewName);
148 txtNewName.setFont(TaxEditorPlugin.getDefault().getFont
149 (ITaxEditorConstants.CHOOSE_NAME_TEXT_FONT));
150 txtNewName.setBackground(Display.getCurrent().getSystemColor(
151 SWT.COLOR_WHITE));
152 txtNewName.setEditable(false);
153
154 if (relationModel.getRelatedName() != null) {
155 txtNewName.setText(CdmUtil.getDisplayName(relationModel.getRelatedName()));
156 nameSelected = true;
157 }
158 }
159
160 private void createSearchResultsViewer(Composite parent) {
161 TableViewer searchResultsViewer = new TableViewer(parent, SWT.BORDER);
162
163 // Add content provider
164 ObservableListContentProvider searchResultsProviderList = new ObservableListContentProvider();
165 searchResultsViewer.setContentProvider(searchResultsProviderList);
166
167 // Label provider that listens for changes to name cache
168 IObservableMap[] searchResultsLabelProviderMaps = BeansObservables
169 .observeMaps(searchResultsProviderList.getKnownElements(),
170 TaxonNameBase.class, new String[] { "titleCache" });
171 searchResultsViewer.setLabelProvider(new ObservableMapLabelProvider(
172 searchResultsLabelProviderMaps));
173
174 // Listens for new taxa opened for editing
175 searchResultsViewer.setInput(observableSearchResultsList);
176
177 // Sort alphabetically
178 searchResultsViewer.setComparator(new ViewerComparator());
179
180 // On double click, open name editor
181 searchResultsViewer.addDoubleClickListener(new IDoubleClickListener() {
182
183 public void doubleClick(DoubleClickEvent event) {
184 IStructuredSelection selection = (StructuredSelection) event
185 .getSelection();
186 Object element = selection.getFirstElement();
187 if (element instanceof TaxonNameBase) {
188 setNewName((TaxonNameBase) element);
189 }
190 }
191 });
192
193 searchResultsTable = searchResultsViewer.getTable();
194 searchResultsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
195 true, 3, 1));
196 searchResultsTable.addListener(SWT.PaintItem, new Listener() {
197 /**
198 * If MenuItem with dummy name is being drawn, put it in italics.
199 *
200 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
201 */
202 public void handleEvent(Event event) {
203 Object data = event.item.getData();
204 if (data instanceof TaxonNameBase
205 && ((TaxonNameBase) data).equals(noResultsDummyName)) {
206 TableItem item = (TableItem) event.item;
207 item.setFont(TaxEditorPlugin.getDefault().getFont(
208 ITaxEditorConstants.MENU_ITEM_ITALICS_FONT));
209 item.setText("Search returned no results.");
210 }
211 }
212 });
213 }
214
215 @Override
216 public boolean canFlipToNextPage() {
217 return isPageComplete();
218 }
219
220 public boolean isPageComplete() {
221 return (nameSelected);
222 }
223
224 private void updatePage() {
225 getWizard().getContainer().updateButtons();
226 }
227
228 private void setNewName(TaxonNameBase name) {
229 nameSelected = true;
230 relationModel.setRelatedName(name);
231 txtNewName.setText(CdmUtil.getDisplayName(name));
232 updatePage();
233 }
234
235 private void setRawNewName(String rawName) {
236 nameSelected = true;
237 NomenclaturalCode parentCode = relationModel.getBaseName().getNomenclaturalCode();
238 TaxonNameBase newName = CdmUtil.parseFullReference(rawName, parentCode, null);
239 relationModel.setRelatedName(newName);
240 txtNewName.setText(rawName + " (new)");
241 updatePage();
242 }
243 }