p2izing the editor
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / eu / etaxonomy / taxeditor / editor / SelectTaxonDialog.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.editor;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.apache.log4j.Logger;
16 import org.eclipse.core.databinding.observable.set.IObservableSet;
17 import org.eclipse.jface.dialogs.Dialog;
18 import org.eclipse.jface.dialogs.IDialogConstants;
19 import org.eclipse.jface.viewers.DoubleClickEvent;
20 import org.eclipse.jface.viewers.IDoubleClickListener;
21 import org.eclipse.jface.viewers.StructuredSelection;
22 import org.eclipse.jface.viewers.TableViewer;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.events.FocusEvent;
25 import org.eclipse.swt.events.FocusListener;
26 import org.eclipse.swt.events.SelectionAdapter;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.graphics.Point;
29 import org.eclipse.swt.layout.FillLayout;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.layout.RowData;
33 import org.eclipse.swt.layout.RowLayout;
34 import org.eclipse.swt.widgets.Button;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Control;
37 import org.eclipse.swt.widgets.Display;
38 import org.eclipse.swt.widgets.Event;
39 import org.eclipse.swt.widgets.Group;
40 import org.eclipse.swt.widgets.Label;
41 import org.eclipse.swt.widgets.Listener;
42 import org.eclipse.swt.widgets.Shell;
43 import org.eclipse.swt.widgets.Text;
44 import org.eclipse.swt.widgets.TreeItem;
45
46 import com.swtdesigner.SWTResourceManager;
47
48 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
49 import eu.etaxonomy.cdm.model.taxon.Taxon;
50 import eu.etaxonomy.taxeditor.ITaxEditorConstants;
51 import eu.etaxonomy.taxeditor.TaxEditorPlugin;
52 import eu.etaxonomy.taxeditor.model.CdmSessionDataRepository;
53 import eu.etaxonomy.taxeditor.model.CdmUtil;
54 import eu.etaxonomy.taxeditor.navigation.RecentNamesTableViewer;
55 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeLabelProvider;
56 import eu.etaxonomy.taxeditor.navigation.TaxonomicTreeViewer;
57
58 /**
59 * This is a generic dialog that allows the user to choose a taxon via the
60 * taxonomic tree, recently selected names, or search.
61 *
62 * @author p.ciardelli
63 * @created 27.05.2008
64 * @version 1.0
65 */
66 public class SelectTaxonDialog extends Dialog {
67 private static final Logger logger = Logger
68 .getLogger(SelectTaxonDialog.class);
69
70 public static final String TAXON_TO_SYNONYM = "taxon_to_synonym";
71 public static final String TAXON_TO_NEW_PARENT = "taxon_to_new_parent";
72
73 private String dialogType;
74 private String shellText;
75 private String descriptionText;
76 private Text taxonNameText;
77
78 private TaxonomicTreeViewer treeViewer;
79 private Taxon taxon;
80 private Taxon destinationTaxon;
81
82 private List<Button> buttons = new ArrayList<Button>();
83
84 private Composite selectComposite;
85
86 public SelectTaxonDialog(Shell parentShell, String dialogType) {
87 super(parentShell);
88 this.dialogType = dialogType;
89 }
90
91 public Taxon open(Taxon taxon) {
92 this.taxon = taxon;
93
94 if (dialogType.equals(TAXON_TO_SYNONYM)) {
95 this.shellText = "Choose an accepted name for \""
96 + CdmUtil.getDisplayName(taxon) + "\"";
97 this.descriptionText = "You have chosen to turn \""
98 + CdmUtil.getDisplayName(taxon)
99 + "\" into a synonym. Please choose a new accepted name from one of the following options.";
100 }
101
102 if (dialogType.equals(TAXON_TO_NEW_PARENT)) {
103 this.shellText = "Choose a new parent for \""
104 + CdmUtil.getDisplayName(taxon) + "\"";
105 this.descriptionText = "You have chosen to select a new parent for \""
106 + CdmUtil.getDisplayName(taxon)
107 + "\". Please choose the new parent taxon from one of the following options.";
108 }
109
110 int returnCode = super.open();
111 if (returnCode == OK) {
112 return destinationTaxon;
113 }
114 return null;
115 }
116
117 /**
118 * Create contents of the dialog
119 *
120 * @param parent
121 */
122 @Override
123 protected Control createDialogArea(Composite parent) {
124 parent.setRedraw(true);
125 Composite container = (Composite) super.createDialogArea(parent);
126 final GridLayout gridLayout = new GridLayout();
127 gridLayout.numColumns = 2;
128 container.setLayout(gridLayout);
129
130 final Label descriptionLabel = new Label(container, SWT.WRAP);
131 descriptionLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true,
132 false, 2, 1));
133 descriptionLabel.setText(descriptionText);
134
135 final Group taxTreeGroup = new Group(container, SWT.NONE);
136 taxTreeGroup.setLayout(new GridLayout());
137 final GridData gd_group_1 = new GridData(SWT.FILL, SWT.FILL, true, true);
138 gd_group_1.heightHint = 83;
139 taxTreeGroup.setLayoutData(gd_group_1);
140
141 final Button chooseTreeButton = new Button(taxTreeGroup, SWT.RADIO);
142 buttons.add(chooseTreeButton);
143 chooseTreeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
144 false));
145 chooseTreeButton.setText("Choose from taxonomic tree");
146
147 Composite taxTreeComposite = new Composite(taxTreeGroup, SWT.BORDER);
148 taxTreeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
149 true));
150 taxTreeComposite.setLayout(new FillLayout());
151 taxTreeComposite.setBackground(Display.getCurrent().getSystemColor(
152 SWT.COLOR_WHITE));
153
154 treeViewer = new TaxonomicTreeViewer(taxTreeComposite);
155
156 IObservableSet observableTaxonSet =
157 CdmSessionDataRepository.getDefault().getObservableTaxa();
158 treeViewer.setLabelProvider(new TaxonomicTreeLabelProvider(
159 observableTaxonSet) {
160
161 });
162 treeViewer.getTree().addFocusListener(
163 new SelectButtonFocusListener(chooseTreeButton));
164 treeViewer.addDoubleClickListener(new SelectTaxonDoubleClickListener());
165 treeViewer.getTree().addListener(SWT.PaintItem, new Listener() {
166 /** If MenuItem with taxon is being drawn, put it in italics.
167 *
168 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
169 **/
170 public void handleEvent(Event event) {
171 Object data = event.item.getData();
172 if (data instanceof Taxon && ((Taxon) data).equals(taxon)) {
173 ((TreeItem) event.item).setFont(TaxEditorPlugin.getDefault().getFont
174 (ITaxEditorConstants.MENU_ITEM_ITALICS_FONT));
175 }
176 }
177 });
178
179 // Open up tree to reveal taxon
180 treeViewer.revealTaxon(taxon);
181
182 final Composite rightPaneComposite = new Composite(container, SWT.NONE);
183 rightPaneComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
184 true));
185 rightPaneComposite.setLayout(new FillLayout(SWT.VERTICAL
186 | SWT.HORIZONTAL));
187
188 final Group recentNamesGroup = new Group(rightPaneComposite, SWT.NONE);
189 recentNamesGroup.setLayout(new GridLayout());
190
191 final Button chooseRecentNamesButton = new Button(recentNamesGroup,
192 SWT.RADIO);
193 buttons.add(chooseRecentNamesButton);
194 chooseRecentNamesButton.setText("Choose from recently viewed taxa");
195
196 Composite recentNamesComposite = new Composite(recentNamesGroup,
197 SWT.BORDER);
198 recentNamesComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
199 true, true));
200 recentNamesComposite.setLayout(new FillLayout());
201 recentNamesComposite.setBackground(Display.getCurrent().getSystemColor(
202 SWT.COLOR_WHITE));
203
204 TableViewer recentNamesViewer = new RecentNamesTableViewer(
205 recentNamesComposite);
206 recentNamesViewer
207 .addDoubleClickListener(new SelectTaxonDoubleClickListener());
208 recentNamesViewer.getTable().addFocusListener(
209 new SelectButtonFocusListener(chooseRecentNamesButton));
210
211 final Group searchGroup = new Group(rightPaneComposite, SWT.NONE);
212 final GridLayout gridLayout_1 = new GridLayout();
213 gridLayout_1.numColumns = 2;
214 searchGroup.setLayout(gridLayout_1);
215
216 final Button searchForNameButton = new Button(searchGroup, SWT.RADIO);
217 buttons.add(searchForNameButton);
218 searchForNameButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER,
219 true, false));
220 searchForNameButton.setText("Search for name of accepted taxon");
221 new Label(searchGroup, SWT.NONE);
222
223 final Text searchText = new Text(searchGroup, SWT.BORDER);
224 searchText
225 .setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
226 searchText.setForeground(SWTResourceManager.getColor(192, 192, 192));
227 searchText.setText("Use \"*\" for wildcard searching");
228 searchText.addFocusListener(new SelectButtonFocusListener(
229 searchForNameButton) {
230
231 public void focusGained(FocusEvent e) {
232 selectButton(button);
233 searchText.setForeground(SWTResourceManager.getColor(0, 0, 0));
234 searchText.setText("");
235 }
236
237 public void focusLost(FocusEvent e) {
238 if (searchText.getText() == "") {
239 searchText.setForeground(SWTResourceManager.getColor(192,
240 192, 192));
241 searchText.setText("Use \"*\" for wildcard searching");
242 }
243 }
244
245 });
246
247 final Button searchButton = new Button(searchGroup, SWT.NONE);
248 searchButton.setLayoutData(new GridData());
249 searchButton.setText("Search");
250
251 selectComposite = new Composite(container, SWT.NONE);
252 selectComposite.setLayout(new RowLayout());
253 selectComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, true,
254 false, 2, 1));
255
256 taxonNameText = new Text(selectComposite, SWT.BORDER);
257 taxonNameText.setFont(SWTResourceManager.getFont("", 12, SWT.BOLD));
258 taxonNameText.setBackground(SWTResourceManager.getColor(255, 255, 255));
259 final RowData rd_text = new RowData();
260 rd_text.width = 400;
261 taxonNameText.setLayoutData(rd_text);
262 taxonNameText.setEditable(false);
263
264 //
265 initButtons();
266
267 return container;
268 }
269
270 public void setSelectedTaxon(Taxon taxon) {
271
272 this.destinationTaxon = taxon;
273 TaxonNameBase taxonName = taxon.getName();
274 if (taxonName == null) {
275 return;
276 }
277
278 taxonNameText.setText(taxonName.getTitleCache());
279
280 setOkEnabled(true);
281 }
282
283 /**
284 * Create contents of the button bar
285 *
286 * @param parent
287 */
288 @Override
289 protected void createButtonsForButtonBar(Composite parent) {
290 createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
291 true);
292 setOkEnabled(false);
293 createButton(parent, IDialogConstants.CANCEL_ID,
294 IDialogConstants.CANCEL_LABEL, false);
295 }
296
297 public void setOkEnabled(boolean enabled) {
298 getButton(IDialogConstants.OK_ID).setEnabled(enabled);
299 }
300
301 private void initButtons() {
302 for (Button button : buttons) {
303 button.addSelectionListener(new SelectionAdapter() {
304 public void widgetSelected(final SelectionEvent e) {
305 selectButton((Button) e.getSource());
306 }
307 });
308 }
309 }
310
311 /**
312 * Since buttons are not in the same layout group, the others are not
313 * automatically deselected when one is selected. This method takes care of
314 * that.
315 *
316 * @param button
317 */
318 private void selectButton(Button selectedButton) {
319 for (Button button : buttons) {
320 if (button == selectedButton)
321 button.setSelection(true);
322 else
323 button.setSelection(false);
324 }
325 }
326
327 /**
328 * Return the initial size of the dialog
329 */
330 @Override
331 protected Point getInitialSize() {
332 return new Point(700, 500);
333 }
334
335 protected void configureShell(Shell newShell) {
336 super.configureShell(newShell);
337 newShell.setImage(TaxEditorPlugin.getDefault().getImage(
338 ITaxEditorConstants.EDIT_ICON));
339 newShell.setText(shellText);
340 }
341
342 class SelectButtonFocusListener implements FocusListener {
343
344 /**
345 * The button whose group has gained focus.
346 */
347 Button button;
348
349 SelectButtonFocusListener(Button button) {
350 this.button = button;
351 }
352
353 public void focusGained(FocusEvent e) {
354 selectButton(button);
355 }
356
357 public void focusLost(FocusEvent e) {
358 }
359
360 }
361
362 class SelectTaxonDoubleClickListener implements IDoubleClickListener {
363
364 public void doubleClick(DoubleClickEvent event) {
365 Taxon taxon = null;
366 try {
367 taxon = (Taxon) ((StructuredSelection) event.getSelection())
368 .getFirstElement();
369 } catch (Exception e) {
370 e.printStackTrace();
371 taxon = null;
372 }
373 if (taxon.equals(SelectTaxonDialog.this.taxon)) {
374 return;
375 }
376
377 setSelectedTaxon(taxon);
378 }
379 }
380 }