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
.namerelationswizard
;
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
;
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
;
52 * An all-in-one relation wizard page where the user chooses a related name, a
53 * relationship type, and the relation's directionality.
55 * Note: does not yet return relation to wizard.
61 public class ChooseRelatedNameWizardPage
extends WizardPage
{
62 private static final Logger logger
= Logger
63 .getLogger(ChooseRelatedNameWizardPage
.class);
65 private NameRelationWizardModel relationModel
;
67 private Text txtNewName
;
69 private boolean nameSelected
= false;
71 private Table searchResultsTable
;
72 private WritableList observableSearchResultsList
= new WritableList();
73 private NonViralName noResultsDummyName
= NonViralName
.NewInstance(null);
75 public ChooseRelatedNameWizardPage(NameRelationWizardModel relationModel
) {
78 this.relationModel
= relationModel
;
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.");
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
);
90 setControl(container
);
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
);
97 txtName
= new Text(container
, SWT
.BORDER
);
98 txtName
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
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
);
110 observableSearchResultsList
.clear();
111 if (results
.size() == 0) {
112 // Populate observable list with dummy name
113 observableSearchResultsList
.add(noResultsDummyName
);
115 observableSearchResultsList
.addAll(results
);
117 btnSearch
.setEnabled(true);
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);
130 createSearchResultsViewer(container
);
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);
138 btnNewName
.setEnabled(false);
139 btnSearch
.setEnabled(false);
144 txtNewName
= new Text(container
, SWT
.BORDER
);
145 final GridData gd_txtNewName
= new GridData(SWT
.FILL
, SWT
.CENTER
, true,
147 txtNewName
.setLayoutData(gd_txtNewName
);
148 txtNewName
.setFont(TaxEditorPlugin
.getDefault().getFont
149 (ITaxEditorConstants
.CHOOSE_NAME_TEXT_FONT
));
150 txtNewName
.setBackground(Display
.getCurrent().getSystemColor(
152 txtNewName
.setEditable(false);
154 if (relationModel
.getRelatedName() != null) {
155 txtNewName
.setText(CdmUtil
.getDisplayName(relationModel
.getRelatedName()));
160 private void createSearchResultsViewer(Composite parent
) {
161 TableViewer searchResultsViewer
= new TableViewer(parent
, SWT
.BORDER
);
163 // Add content provider
164 ObservableListContentProvider searchResultsProviderList
= new ObservableListContentProvider();
165 searchResultsViewer
.setContentProvider(searchResultsProviderList
);
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
));
174 // Listens for new taxa opened for editing
175 searchResultsViewer
.setInput(observableSearchResultsList
);
177 // Sort alphabetically
178 searchResultsViewer
.setComparator(new ViewerComparator());
180 // On double click, open name editor
181 searchResultsViewer
.addDoubleClickListener(new IDoubleClickListener() {
183 public void doubleClick(DoubleClickEvent event
) {
184 IStructuredSelection selection
= (StructuredSelection
) event
186 Object element
= selection
.getFirstElement();
187 if (element
instanceof TaxonNameBase
) {
188 setNewName((TaxonNameBase
) element
);
193 searchResultsTable
= searchResultsViewer
.getTable();
194 searchResultsTable
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true,
196 searchResultsTable
.addListener(SWT
.PaintItem
, new Listener() {
198 * If MenuItem with dummy name is being drawn, put it in italics.
200 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
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.");
216 public boolean canFlipToNextPage() {
217 return isPageComplete();
220 public boolean isPageComplete() {
221 return (nameSelected
);
224 private void updatePage() {
225 getWizard().getContainer().updateButtons();
228 private void setNewName(TaxonNameBase name
) {
230 relationModel
.setRelatedName(name
);
231 txtNewName
.setText(CdmUtil
.getDisplayName(name
));
235 private void setRawNewName(String rawName
) {
237 NomenclaturalCode parentCode
= relationModel
.getBaseName().getNomenclaturalCode();
238 TaxonNameBase newName
= CdmUtil
.parseFullReference(rawName
, parentCode
, null);
239 relationModel
.setRelatedName(newName
);
240 txtNewName
.setText(rawName
+ " (new)");