First stabs at JFace Text functionality. Test TextViewer on NameEditorView divided...
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor.prototype2 / src / eu / etaxonomy / taxeditor / prototype2 / view / NameEditorView.java
1 package eu.etaxonomy.taxeditor.prototype2.view;
2
3 import java.beans.PropertyChangeEvent;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.eclipse.core.databinding.DataBindingContext;
8 import org.eclipse.core.databinding.beans.BeansObservables;
9 import org.eclipse.core.runtime.IProgressMonitor;
10 import org.eclipse.jface.databinding.swt.SWTObservables;
11 import org.eclipse.jface.text.Document;
12 import org.eclipse.jface.text.source.SourceViewer;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.custom.StyledText;
15 import org.eclipse.swt.events.FocusEvent;
16 import org.eclipse.swt.events.FocusListener;
17 import org.eclipse.swt.events.KeyAdapter;
18 import org.eclipse.swt.events.KeyEvent;
19 import org.eclipse.swt.events.MouseEvent;
20 import org.eclipse.swt.events.SelectionAdapter;
21 import org.eclipse.swt.events.SelectionEvent;
22 import org.eclipse.swt.events.SelectionListener;
23 import org.eclipse.swt.graphics.Point;
24 import org.eclipse.swt.graphics.Rectangle;
25 import org.eclipse.swt.layout.GridData;
26 import org.eclipse.swt.layout.GridLayout;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.CoolBar;
29 import org.eclipse.swt.widgets.CoolItem;
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.Menu;
35 import org.eclipse.swt.widgets.MenuItem;
36 import org.eclipse.swt.widgets.Text;
37 import org.eclipse.swt.widgets.ToolBar;
38 import org.eclipse.swt.widgets.ToolItem;
39 import org.eclipse.ui.IEditorInput;
40 import org.eclipse.ui.IEditorSite;
41 import org.eclipse.ui.PartInitException;
42 import org.eclipse.ui.part.EditorPart;
43 import com.swtdesigner.ResourceManager;
44 import com.swtdesigner.SWTResourceManager;
45
46 import eu.etaxonomy.cdm.model.name.TaxonName;
47 import eu.etaxonomy.taxeditor.prototype2.model.PropertySheetNode;
48 import eu.etaxonomy.taxeditor.prototype2.view.MySourceViewerConfig;
49 import eu.etaxonomy.taxeditor.prototype2.controller.FullNameTextViewerConfig;
50 import eu.etaxonomy.taxeditor.prototype2.controller.PropertySheetContentProvider;
51 import eu.etaxonomy.taxeditor.prototype2.controller.PropertySheetValueLabelProvider;
52 import eu.etaxonomy.taxeditor.prototype2.controller.SaveNameAction;
53 import eu.etaxonomy.taxeditor.prototype2.Activator;
54
55 public class NameEditorView extends EditorPart {
56
57 private StyledText styledText;
58 private TaxonName taxonname;
59 private Text clickHereToText;
60
61 public boolean dirtyBoy = false;
62 String clickText;
63
64 private DataBindingContext bindingContext = new DataBindingContext();
65
66 public static final String ID = "eu.etaxonomy.taxeditor.prototype2.view.nameeditorview"; //$NON-NLS-1$
67
68 /**
69 * Create contents of the editor part
70 * @param parent
71 */
72 @Override
73 public void createPartControl(Composite parent) {
74 //
75
76
77 // txtPlay = new Text(container, SWT.BORDER);
78 // txtPlay.setCapture(true);
79 // final GridData gd_txtPlay = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
80 // gd_txtPlay.heightHint = 96;
81 // txtPlay.setLayoutData(gd_txtPlay);
82 //// txtPlay.addVerifyListener(new VerifyListener() {
83 //// @Override
84 //// public void verifyText(VerifyEvent e) {
85 //// e.doit = Character.isDigit(e.character);
86 //// }
87 //// });
88 // txtPlay.addSelectionListener(new SelectionListener() {
89 //
90 // @Override
91 // public void widgetDefaultSelected(SelectionEvent e) {
92 // // TODO Auto-generated method stub
93 //
94 // }
95 //
96 // @Override
97 // public void widgetSelected(SelectionEvent e) {
98 // System.out.println(e.toString());
99 // }
100 //
101 //
102 // });
103 //
104 //
105 // txtPlay.addKeyListener(new KeyListener() {
106 //
107 // public void keyPressed(KeyEvent e) {
108 // System.out.println(e.character);
109 // if (e.character == '=') {
110 // Shell shell = Activator.getDefault().getWorkbench().
111 // getActiveWorkbenchWindow().getShell();
112 // PopupList list = new PopupList(shell, SWT.H_SCROLL | SWT.V_SCROLL);
113 //
114 //// Combo list = new Combo(shell, SWT.H_SCROLL | SWT.V_SCROLL);
115 //
116 // // Add the items to the list
117 // String[] OPTIONS = { "Create homo. syn.",
118 // "Create hetero. syn.",
119 // "Create mis. name",
120 // "Create homonym"};
121 //
122 // list.setItems(OPTIONS);
123 //
124 // // Open the list and get the selected item
125 // String selected = list.open(txtPlay.getBounds());
126 //
127 // // Print the item to the console
128 // System.out.println(selected);
129 // }
130 //
131 // }
132 //
133 // public void keyReleased(KeyEvent e) {
134 // // TODO Auto-generated method stub
135 //
136 // }
137 // });
138 parent.setLayout(new GridLayout());
139
140
141 final Label taxonomicallyIncludedInLabel = new Label(parent, SWT.NONE);
142 taxonomicallyIncludedInLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
143 taxonomicallyIncludedInLabel.setText("Higher taxon: ");
144
145 final CoolBar coolBar = new CoolBar(parent, SWT.NONE);
146 new CoolItem(coolBar, SWT.PUSH).setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/save_edit.gif"));
147
148
149 final ToolBar toolBar = new ToolBar(parent, SWT.NONE);
150 // toolBar.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
151
152 final ToolItem itemSave = new ToolItem(toolBar, SWT.PUSH);
153 // final CoolItem itemSave = new CoolItem(coolBar, SWT.PUSH);
154 itemSave.setToolTipText("Save taxon \"" + taxonname.getName() + "\"");
155 itemSave.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/save_edit.gif"));
156 itemSave.addSelectionListener(new SelectionListener() {
157 public void mouseDown(final MouseEvent e) {
158
159 // taxonname.setGenus(txtGenus.getText());
160 // taxonname.setSpecificEpithet(txtSpEpi.getText());
161
162 new SaveNameAction(taxonname).run();
163 }
164
165 public void widgetDefaultSelected(SelectionEvent e) {
166 new SaveNameAction(taxonname).run();
167 }
168
169 public void widgetSelected(SelectionEvent e) {
170 new SaveNameAction(taxonname).run();
171 }
172 });
173
174 final ToolItem itemMove = new ToolItem(toolBar, SWT.DROP_DOWN);
175 itemMove.setToolTipText("Move taxon \"" + taxonname.getName() + "\"");
176
177 final Menu menuMove = new Menu(toolBar);
178 addDropDown(itemMove, menuMove);
179
180 final MenuItem moveTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE);
181 moveTaxonpilosellaMenuItem.setText("Move taxon \"" + taxonname.getName() + "\" to another higher taxon");
182 moveTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() {
183 public void widgetSelected(final SelectionEvent e) {
184 new MoveDialogView(getSite().getShell());
185 MoveDialogView dialog = new MoveDialogView(getSite().getShell());
186 dialog.open();
187 }
188 });
189
190 final MenuItem turnTaxonpilosellaMenuItem = new MenuItem(menuMove, SWT.NONE);
191 turnTaxonpilosellaMenuItem.setSelection(true);
192 turnTaxonpilosellaMenuItem.setText("Turn taxon \"" + taxonname.getName() + "\" into a synonym");
193 turnTaxonpilosellaMenuItem.addSelectionListener(new SelectionAdapter() {
194 public void widgetSelected(final SelectionEvent e) {
195 new MoveDialogView(getSite().getShell());
196 MoveDialogView dialog = new MoveDialogView(getSite().getShell());
197 dialog.open();
198 }
199 });
200
201 itemMove.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/correction_change.gif"));
202
203 final ToolItem itemDelete = new ToolItem(toolBar, SWT.NONE);
204 itemDelete.setToolTipText("Delete taxon \"" + taxonname.getName() + "\"");
205 itemDelete.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/delete_edit.gif"));
206
207 final ToolItem separator1 = new ToolItem(toolBar, SWT.SEPARATOR);
208
209 final ToolItem itemAddRelationship = new ToolItem(toolBar, SWT.DROP_DOWN);
210 itemAddRelationship.setToolTipText("Add nom. or tax. relation to \"" + taxonname.getName() + "\"");
211 itemAddRelationship.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/rel_no_bg.gif"));
212
213 final Menu menuAddRel = new Menu(toolBar);
214 menuAddRel.setData("x", null);
215 addDropDown(itemAddRelationship, menuAddRel);
216
217 final MenuItem testMenuItem = new MenuItem(menuAddRel, SWT.NONE);
218 testMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/unknown_no_bg.gif"));
219 testMenuItem.setText("Add synonymy (type unknown)");
220
221 final MenuItem addHomotypicSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);
222 addHomotypicSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homosyn_no_bg.gif"));
223 addHomotypicSynonymMenuItem.setText("Add homotypic synonym");
224
225 final MenuItem addHeterotypicSynoynmMenuItem = new MenuItem(menuAddRel, SWT.NONE);
226 addHeterotypicSynoynmMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/heterosyn_no_bg.gif"));
227 addHeterotypicSynoynmMenuItem.setText("Add heterotypic synoynm");
228
229 final MenuItem addBasionymMenuItem = new MenuItem(menuAddRel, SWT.NONE);
230 addBasionymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/basionym_no_bg.gif"));
231 addBasionymMenuItem.setText("Add basionym");
232
233 final MenuItem addReplacedSynonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);
234 addReplacedSynonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/repsyn_no_bg.gif"));
235 addReplacedSynonymMenuItem.setText("Add replaced synonym");
236
237 final MenuItem addHomonymMenuItem = new MenuItem(menuAddRel, SWT.NONE);
238 addHomonymMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/homonym_no_bg.gif"));
239 addHomonymMenuItem.setText("Add homonym");
240
241 final MenuItem addOrthographicVariantMenuItem = new MenuItem(menuAddRel, SWT.NONE);
242 addOrthographicVariantMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/orthovariant_no_bg.gif"));
243 addOrthographicVariantMenuItem.setText("Add orthographic variant");
244
245 final MenuItem addMisappliedNameMenuItem = new MenuItem(menuAddRel, SWT.NONE);
246 addMisappliedNameMenuItem.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/misapplied_no_bg.gif"));
247 addMisappliedNameMenuItem.setText("Add misapplied name");
248
249 final MenuItem addConceptRelationMenuItem_1 = new MenuItem(menuAddRel, SWT.CASCADE);
250 addConceptRelationMenuItem_1.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/concept_no_bg.gif"));
251 addConceptRelationMenuItem_1.setText("Add concept relation");
252
253 final Menu menu = new Menu(addConceptRelationMenuItem_1);
254 addConceptRelationMenuItem_1.setMenu(menu);
255
256 final MenuItem checkboxMenuItem = new MenuItem(menu, SWT.CHECK);
257 checkboxMenuItem.setText("congruent");
258
259 final MenuItem checkboxMenuItem_1 = new MenuItem(menu, SWT.CHECK);
260 checkboxMenuItem_1.setSelection(true);
261 checkboxMenuItem_1.setText("included in");
262
263 final MenuItem checkboxMenuItem_2 = new MenuItem(menu, SWT.CHECK);
264 checkboxMenuItem_2.setText("includes");
265
266 final MenuItem checkboxMenuItem_3 = new MenuItem(menu, SWT.CHECK);
267 checkboxMenuItem_3.setText("overlaps");
268
269 final MenuItem checkboxMenuItem_4 = new MenuItem(menu, SWT.CHECK);
270 checkboxMenuItem_4.setText("excludes");
271
272 final MenuItem checkboxMenuItem_5 = new MenuItem(menu, SWT.CHECK);
273 checkboxMenuItem_5.setSelection(true);
274 checkboxMenuItem_5.setText("doubtful");
275
276 final ToolItem separator2 = new ToolItem(toolBar, SWT.SEPARATOR);
277
278 final ToolItem itemAddTaxon = new ToolItem(toolBar, SWT.DROP_DOWN);
279 itemAddTaxon.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/add_edit.gif"));
280 itemAddTaxon.setToolTipText("Add new taxon");
281
282 final Menu menuAdd = new Menu(toolBar);
283 menuAdd.setData("x", null);
284 addDropDown(itemAddTaxon, menuAdd);
285
286 final MenuItem addTaxonToMenuItem = new MenuItem(menuAdd, SWT.NONE);
287 addTaxonToMenuItem.setText("Add new taxon to \"" + taxonname.getName() + "\"");
288
289 final MenuItem addNewTaxonMenuItem = new MenuItem(menuAdd, SWT.NONE);
290 addNewTaxonMenuItem.setText("Add new taxon to \"Pilosella fuscoatra coll.\"");
291
292 final Composite composite = new Composite(parent, SWT.NONE);
293 composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
294 composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
295 final GridLayout gridLayout_2 = new GridLayout();
296 gridLayout_2.horizontalSpacing = 3;
297 gridLayout_2.numColumns = 2;
298 composite.setLayout(gridLayout_2);
299
300 // clickText = "Click here to start entering accepted name or enter its individual fields in the property sheet to the right";
301 clickText = taxonname.getName();
302
303 clickHereToText = new Text(composite, SWT.WRAP);
304 clickHereToText.addKeyListener(new KeyAdapter() {
305 public void keyPressed(final KeyEvent e) {
306 }
307 });
308 clickHereToText.setForeground(SWTResourceManager.getColor(192, 192, 192));
309 clickHereToText.setText(clickText);
310 clickHereToText.setFont(SWTResourceManager.getFont("Georgia", 12, SWT.ITALIC));
311 final GridData gd_clickHereToText = new GridData(SWT.FILL, SWT.FILL, true, true);
312 gd_clickHereToText.widthHint = 426;
313 clickHereToText.setLayoutData(gd_clickHereToText);
314 clickHereToText.addFocusListener(new FocusListener() {
315
316 public void focusGained(FocusEvent e) {
317 // clickHereToText.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
318 if (!dirtyBoy) {
319 clickHereToText.setText("");
320 clickHereToText.setFont(SWTResourceManager.getFont("Georgia", 12, SWT.NONE));
321 clickHereToText.setForeground(SWTResourceManager.getColor(0, 0, 0));
322 dirtyBoy = true;
323 firePropertyChange(PROP_DIRTY);
324 }
325 }
326
327 public void focusLost(FocusEvent e) {
328 // clickHereToText.setBackground(null);
329 if (clickHereToText.getText() == "") {
330 clickHereToText.setForeground(SWTResourceManager.getColor(192, 192, 192));
331 clickHereToText.setText(clickText);
332 clickHereToText.setFont(SWTResourceManager.getFont("Georgia", 12, SWT.ITALIC));
333 dirtyBoy = false;
334 } else {
335 dirtyBoy = true;
336 }
337 }
338
339 });
340
341 // Construct PropertySheetViewer, with bindings to model layer
342 PropertySheetViewer propertySheetViewer = new PropertySheetViewer(composite);
343 propertySheetViewer.setBindingContext(bindingContext);
344
345 propertySheetViewer.setContentProvider(
346 new PropertySheetContentProvider());
347 propertySheetViewer.getPropertyValueColumn().setLabelProvider(
348 new PropertySheetValueLabelProvider(propertySheetViewer));
349 propertySheetViewer.getPropertyValueColumn().setEditingSupport(
350 new PropertySheetValueEditingSupport(propertySheetViewer));
351
352 propertySheetViewer.setInput(getPropertySheetNodes(taxonname));
353
354 // Construct name field(s)
355 FullNameTextViewer acceptedNameViewer = new FullNameTextViewer(composite, SWT.BORDER | SWT.WRAP | SWT.FULL_SELECTION | SWT.FILL);
356 acceptedNameViewer.getTextWidget().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
357 acceptedNameViewer.configure(new FullNameTextViewerConfig());
358
359
360 // SourceViewer sourceviewer = new SourceViewer(composite, null, SWT.BORDER | SWT.WRAP | SWT.FULL_SELECTION);
361 // sourceviewer.setAnnotationHover(null);
362 // styledText = sourceviewer.getTextWidget();
363 // final GridData gd_styledText = new GridData(SWT.FILL, SWT.TOP, true, false);
364 // gd_styledText.heightHint = 41;
365 // gd_styledText.widthHint = 450;
366 // styledText.setLayoutData(gd_styledText);
367 // sourceviewer.setDocument(doc);
368 // sourceviewer.configure(new MySourceViewerConfig());
369 // sourceviewer.setTabsToSpacesConverter(null);
370
371 populateForm(); // will this be necessary if databinding is correctly set up?
372
373 Text testeroo = new Text(composite, SWT.BORDER);
374 testeroo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
375
376 bindingContext.bindValue( SWTObservables.observeText(testeroo, SWT.Modify),
377 BeansObservables.observeValue(taxonname,"genus"),
378 null, null);
379
380
381 // clickHereToText.addKeyListener(new KeyListener() {
382 //
383 // public void keyPressed(KeyEvent e) {
384 // dirtyBoy = true;
385 // isDirty();
386 //
387 // }
388 //
389 // public void keyReleased(KeyEvent e) {
390 // // TODO Auto-generated method stub
391 //
392 // }
393 //
394 // });
395
396 //container.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
397
398 }
399
400
401 private void populateForm() {
402 this.setPartName(taxonname.getName());
403 }
404
405 @Override
406 public void setFocus() {
407 // Set the focus
408 }
409
410 @Override
411 public void doSave(IProgressMonitor monitor) {
412 // Do the Save operation
413 }
414
415 @Override
416 public void doSaveAs() {
417 // Do the Save As operation
418 }
419
420 @Override
421 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
422
423 if (!(input instanceof IEditorInput))
424 throw new PartInitException(
425 "Invalid Input: Must be IFileEditorInput");
426
427 if (input.getAdapter(TaxonName.class) != null) {
428 taxonname = (TaxonName) input.getAdapter(TaxonName.class);
429 } else {
430
431 taxonname = null;
432 }
433
434 setSite(site);
435 setInput(input);
436 }
437
438 private List<PropertySheetNode> getPropertySheetNodes(TaxonName taxonName) {
439
440 List<PropertySheetNode> propertySheetNodes = new ArrayList<PropertySheetNode>();
441 PropertySheetNode node = new PropertySheetNode("Full Name", BeansObservables.observeValue(taxonName, "name"),
442 null, PropertySheetNode.EDITABLE);
443 propertySheetNodes.add(node);
444 new PropertySheetNode("Genus", BeansObservables.observeValue(taxonName, "genus"),
445 node, PropertySheetNode.EDITABLE);
446 new PropertySheetNode("Species Epithet", BeansObservables.observeValue(taxonName, "specificEpithet"),
447 node, PropertySheetNode.EDITABLE);
448
449 return propertySheetNodes;
450 }
451
452 @Override
453 public boolean isDirty() {
454 return dirtyBoy;
455 }
456
457 @Override
458 public boolean isSaveAsAllowed() {
459 return false;
460 }
461
462 private static void addDropDown(final ToolItem item, final Menu menu) {
463 item.addListener(SWT.Selection, new Listener() {
464 public void handleEvent(Event event) {
465 if (event.detail == SWT.ARROW) {
466 Rectangle rect = item.getBounds();
467 Point pt = new Point(rect.x, rect.y + rect.height);
468 pt = item.getParent().toDisplay(pt);
469 menu.setLocation(pt.x, pt.y);
470 menu.setVisible(true);
471 }
472 }
473 });
474 }
475 }