Project

General

Profile

Download (23 KB) Statistics
| Branch: | Tag: | Revision:
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.name;
11

    
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Set;
18

    
19
import org.apache.log4j.Logger;
20
import org.eclipse.core.commands.operations.IUndoContext;
21
import org.eclipse.core.runtime.IAdaptable;
22
import org.eclipse.core.runtime.IProgressMonitor;
23
import org.eclipse.core.runtime.OperationCanceledException;
24
import org.eclipse.jface.action.MenuManager;
25
import org.eclipse.jface.dialogs.MessageDialog;
26
import org.eclipse.jface.viewers.ISelection;
27
import org.eclipse.jface.viewers.ISelectionProvider;
28
import org.eclipse.jface.viewers.StructuredSelection;
29
import org.eclipse.swt.dnd.DND;
30
import org.eclipse.swt.dnd.DropTarget;
31
import org.eclipse.swt.dnd.Transfer;
32
import org.eclipse.swt.widgets.Composite;
33
import org.eclipse.swt.widgets.Menu;
34
import org.eclipse.ui.IEditorInput;
35
import org.eclipse.ui.IEditorSite;
36
import org.eclipse.ui.ISelectionListener;
37
import org.eclipse.ui.ISelectionService;
38
import org.eclipse.ui.IWorkbenchPart;
39
import org.eclipse.ui.IWorkbenchPartReference;
40
import org.eclipse.ui.PartInitException;
41
import org.eclipse.ui.forms.ManagedForm;
42
import org.eclipse.ui.forms.widgets.FormToolkit;
43
import org.eclipse.ui.forms.widgets.ScrolledForm;
44
import org.eclipse.ui.forms.widgets.TableWrapLayout;
45
import org.eclipse.ui.part.EditorPart;
46

    
47
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
48
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
49
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
50
import eu.etaxonomy.cdm.model.common.CdmBase;
51
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
52
import eu.etaxonomy.cdm.model.taxon.Taxon;
53
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
54
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
55
import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
56
import eu.etaxonomy.taxeditor.editor.EditorUtil;
57
import eu.etaxonomy.taxeditor.editor.IDropTargetable;
58
import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;
59
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
60
import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;
61
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
62
import eu.etaxonomy.taxeditor.model.IPartChangeListener;
63
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
64
import eu.etaxonomy.taxeditor.model.TaxeditorPartService;
65
import eu.etaxonomy.taxeditor.operations.IPostOperationEnabled;
66
import eu.etaxonomy.taxeditor.preference.Resources;
67

    
68
/**
69
 * <p>TaxonNameEditor class.</p>
70
 *
71
 * @author p.ciardelli
72
 * @author n.hoffmann
73
 * @created 15.05.2008
74
 * @version 1.0
75
 */
76
public class TaxonNameEditor extends EditorPart implements IMultiPageTaxonEditorPage, IAdaptable, IConversationEnabled, IPostOperationEnabled, IPartContentHasDetails, IPartChangeListener
77
		, ISelectionListener, IDropTargetable {
78
	
79
	private static final Logger logger = Logger.getLogger(TaxonNameEditor.class);
80
	
81
	public class Tupel{
82
		
83
		public HomotypicalGroup homotypicalGroup;
84
		public HomotypicalSynonymGroup group;
85

    
86
		public Tupel(HomotypicalGroup homotypicalGroup, HomotypicalSynonymGroup group){
87
			this.homotypicalGroup = homotypicalGroup;
88
			this.group = group;
89
		}
90
		
91
	}
92
	
93
	/** Constant <code>ID="eu.etaxonomy.taxeditor.taxonNameEditor"</code> */
94
	public static final String ID = "eu.etaxonomy.taxeditor.taxonNameEditor";
95
	
96
	private Taxon taxon;
97
	
98
	private ManagedForm managedForm;
99
	private ScrolledForm scrolledForm; 
100
	private Composite parent;
101
	private ISelectionProvider provider;
102
	
103
	private MultiPageTaxonEditor editor;
104
	
105
	private AbstractGroupedContainer selectedObject;
106
	
107
	private AcceptedNameContainer acceptedNameContainer;
108
	
109
	private ConversationHolder conversation;
110

    
111
	private MenuManager menuManager;
112

    
113
	private Menu menu;
114
	
115
	private List<Tupel> heterotypicSynonymGroupTupel = new ArrayList<Tupel>();
116

    
117
	private MisappliedGroup misappliedGroup;
118

    
119
	private ConceptGroup conceptGroup;
120

    
121
	
122
	private DropTarget target;
123
	
124
	private ISelectionService selectionService;
125

    
126
	private ContainerFactory containerFactory;
127

    
128
	private HomotypicalSynonymGroup homotypicalSynonymGroup;
129

    
130
	private AbstractGroupedContainer objectAffectedByLastOperation;
131
	
132
	/**
133
	 * <p>Constructor for TaxonNameEditor.</p>
134
	 *
135
	 * @param editor a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor} object.
136
	 */
137
	public TaxonNameEditor(MultiPageTaxonEditor editor){
138
		this.editor = editor;
139
		conversation = editor.getConversationHolder();
140
		
141
		containerFactory = ContainerFactory.getInstance();
142
	}
143

    
144
	
145
	
146
	/**
147
	 * <p>getUndoContext</p>
148
	 *
149
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext} object.
150
	 */
151
	public IUndoContext getUndoContext() {
152
		return editor.getUndoContext();
153
	}
154

    
155
	/* (non-Javadoc)
156
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
157
	 */
158
	/** {@inheritDoc} */
159
	public void createPartControl(Composite composite) {
160
		selectionService = getSite().getWorkbenchWindow().getSelectionService();
161
		selectionService.addSelectionListener(this);
162
		
163
		createManagedForm(composite);
164
		
165
		TaxeditorPartService.getInstance().addListener(TaxeditorPartService.PART_ACTIVATED, this);
166
	}
167
	
168
	/**
169
	 * <p>createManagedForm</p>
170
	 *
171
	 * @param composite a {@link org.eclipse.swt.widgets.Composite} object.
172
	 */
173
	protected void createManagedForm(Composite composite) {
174
				
175
		managedForm = new ManagedForm(composite) {
176
			public void dirtyStateChanged() {
177
				firePropertyChange(PROP_DIRTY);
178
			}
179
			public boolean setInput(Object input) {
180
				if (input instanceof AbstractGroupedContainer) {
181
					selectedObject = (AbstractGroupedContainer) input;
182
					provider.setSelection(new StructuredSelection(selectedObject.getData()));
183
				}
184
				return super.setInput(input); 
185
			}
186
		};
187
		
188
		
189
		scrolledForm = managedForm.getForm();
190
		parent = scrolledForm.getBody();
191
		
192
		// register the context menu
193
		menuManager = new MenuManager();
194
		ISelectionProvider selectionProvider = getSite().getSelectionProvider();
195
		getSite().registerContextMenu(TaxonNameEditor.ID, menuManager, selectionProvider);
196
				
197
		parent.setData(taxon);
198
		
199
		TableWrapLayout layout = new TableWrapLayout();
200
		layout.leftMargin = 0;
201
		layout.rightMargin = 0;
202
		layout.topMargin = 0;
203
		layout.bottomMargin = 0;
204
		
205
		layout.verticalSpacing = 0;
206
		layout.horizontalSpacing = 0;
207
		
208
		parent.setLayout(layout);	
209
		parent.setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
210
		
211
		createNameComposites();
212
		
213
		createDragSupport();
214
		
215
		setFocus();
216
	}
217
	
218
	/**
219
	 * <p>createNameComposites</p>
220
	 */
221
	protected void createNameComposites(){
222
		containerFactory.createAcceptedTaxonsHomotypicGroup(this);
223
				
224
		containerFactory.createHeterotypicSynonymGroups(this);
225
		
226
		containerFactory.createMisapplicationGroup(this);
227
		
228
		containerFactory.createConceptGroup(this);
229
		
230
		for(AbstractGroupedContainer container : getGroupedContainers()){
231
			container.setMenu(getMenu());
232
		}
233
		// Redraw composite
234
		managedForm.reflow(true);
235
	}
236

    
237
	/**
238
	 * <p>Getter for the field <code>taxon</code>.</p>
239
	 *
240
	 * @return a {@link eu.etaxonomy.cdm.model.taxon.Taxon} object.
241
	 */
242
	public Taxon getTaxon() {
243
		return (Taxon) HibernateProxyHelper.deproxy(taxon);
244
	}
245
	
246
	/**
247
	 * <p>setDirty</p>
248
	 */
249
	public void setDirty() {
250
		managedForm.dirtyStateChanged();
251
	}
252
	
253
	
254
	/*
255
	 * (non-Javadoc)
256
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
257
	 */
258
	/** {@inheritDoc} */
259
	@Override
260
	public void setFocus(){
261
		getSelectedObject().setSelected();
262
	}
263
	
264
	/** {@inheritDoc} */
265
	public void setInput(IEditorInput input){
266
		this.setInputWithNotify(input);		
267
	}
268
	
269
	/*
270
	 * (non-Javadoc)
271
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
272
	 */
273
	/**
274
	 * <p>getConversationHolder</p>
275
	 *
276
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
277
	 */
278
	public ConversationHolder getConversationHolder(){
279
		return conversation;
280
	}
281
	
282
	/*
283
	 * (non-Javadoc)
284
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
285
	 */
286
	/** {@inheritDoc} */
287
	public void update(CdmDataChangeMap events) {
288
		//redraw();
289
	}
290
	
291
	/**
292
	 * Redraws this editor
293
	 * return true on success
294
	 *
295
	 * @return a boolean.
296
	 */
297
	public boolean redraw(){
298
		return redraw(true);
299
	}
300
	
301
	/**
302
	 * {@inheritDoc}
303
	 *
304
	 * Redraws the editor controls
305
	 */
306
	public boolean redraw(boolean focus) {
307
		
308
		createNameComposites();
309

    
310
		if(focus){
311
			setFocus();
312
		}
313
		
314
		return true;		
315
	}
316

    
317
	private AbstractGroupedContainer getContainerForData(CdmBase data) {
318
		if(data == null && (selectedObject != null && ! selectedObject.getControl().isDisposed())){
319
			return selectedObject;
320
		}
321
		
322
		List<AbstractGroupedContainer> groupedContainers = getGroupedContainers();
323
		for(AbstractGroupedContainer container : groupedContainers){
324
			if(container.getData().equals(data)){
325
				return container;
326
			}
327
		}
328
		return acceptedNameContainer;
329
	}
330
	
331
	/**
332
	 * <p>getMultiPageTaxonEditor</p>
333
	 *
334
	 * @return a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor} object.
335
	 */
336
	public MultiPageTaxonEditor getMultiPageTaxonEditor() {
337
		return editor;
338
	}
339

    
340

    
341
	/*
342
	 * (non-Javadoc)
343
	 * @see eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation()
344
	 */
345
	/** {@inheritDoc} */
346
	public boolean postOperation(CdmBase objectAffectedByOperation) {
347
		
348
		editor.changed(objectAffectedByOperation);
349
		
350
		redraw(false);
351
		
352
		objectAffectedByLastOperation = getContainerForData(objectAffectedByOperation);
353
		
354
		return true;
355
	}
356
	
357

    
358
	private CdmBase getSelectedData() {
359
		if(selectedObject != null){
360
			return selectedObject.getData();
361
		}
362
		return null;
363
	}
364

    
365
	/**
366
	 * <p>Getter for the field <code>managedForm</code>.</p>
367
	 *
368
	 * @return the managedForm
369
	 */
370
	public ManagedForm getManagedForm() {
371
		return managedForm;
372
	}
373
	
374
	/**
375
	 * <p>getControl</p>
376
	 *
377
	 * @return a {@link org.eclipse.swt.widgets.Composite} object.
378
	 */
379
	public Composite getControl() {
380
		return this.getManagedForm().getForm().getBody();
381
	}
382
	
383

    
384
	/**
385
	 * <p>Getter for the field <code>menu</code>.</p>
386
	 *
387
	 * @return the menu
388
	 */
389
	public Menu getMenu() {
390
		if(menu == null || menu.isDisposed()){
391
			if(menu != null && menu.isDisposed()){
392
				logger.error("Creating new Menu because it was disposed. This should not have happened");
393
			}
394
			menu = menuManager.createContextMenu(parent);
395
		}
396
		return menu;
397
	}
398

    
399
	/**
400
	 * <p>checkForEmptyNames</p>
401
	 *
402
	 * @return true if there are empty names
403
	 */
404
	public boolean checkForEmptyNames() {
405
		for(AbstractGroupedContainer container : getGroupedContainers()){
406
			if(container.getName() == null || container.getName().getTitleCache().equals("")){
407
				MessageDialog.openWarning(EditorUtil.getShell(), "No Name Specified", "An attempt was made to save a taxon or synonym with " +
408
				"an empty name. Operation was cancelled.");
409
				return true;
410
			}
411
		}
412
		return false;
413
	}
414
    
415
	/** {@inheritDoc} */
416
	@Override
417
	public void doSave(IProgressMonitor monitor) {
418

    
419
		monitor.beginTask("Saving names", getGroupedContainers().size());
420

    
421
        try {
422
			// check for empty names
423
			for(AbstractGroupedContainer container : getGroupedContainers()){
424
				
425
				monitor.subTask("Saving composite: " + container.getTaxonBase().getTitleCache());
426
				container.persistName();
427
				
428
				// In case the progress monitor was canceled throw an exception.
429
				if (monitor.isCanceled()) {
430
	            	throw new OperationCanceledException();
431
	            }
432
				
433
				// Otherwise declare this step as done.
434
				monitor.worked(1);
435
			}
436
        }
437
        finally {
438
        	
439
        	// Stop the progress monitor.
440
        	monitor.done();
441
        }
442
		
443
	}
444

    
445
	/** {@inheritDoc} */
446
	@Override
447
	public void doSaveAs() {}
448

    
449
	/** {@inheritDoc} */
450
	@Override
451
	public void init(IEditorSite site, IEditorInput input)
452
			throws PartInitException {
453
				
454
		if (!(input instanceof IEditorInput))
455
			throw new PartInitException(
456
				"Invalid Input: Must be IEditorInput");
457
		
458
		if (input.getAdapter(Taxon.class) != null) {
459
			taxon = (Taxon) input.getAdapter(Taxon.class);
460
		} else {
461
			throw new PartInitException(
462
				"Invalid Input: Taxon cannot be null");
463
		}
464

    
465
		setSite(site);
466
		setInput(input);
467
		
468
		provider = new SimpleSelectionProvider();
469
		getSite().setSelectionProvider(provider);
470
		
471
		logger.trace("New Editor instance created.");
472
	}
473
		
474
	/**
475
	 * 
476
	 */
477
	private void createDragSupport() {
478
		// Listen for names being dragged outside of existing homotypic groups -
479
		//  user wants to create a new group
480
		Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};
481
		int operations = DND.DROP_MOVE;
482
		if(target == null){
483
			target = new DropTarget(parent, operations);
484
			target.setTransfer(types);
485
			target.addDropListener(new NameEditorDropTargetListener(this));
486
		}		
487
	}
488

    
489
	/**
490
	 * <p>Getter for the field <code>acceptedNameContainer</code>.</p>
491
	 *
492
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.AcceptedNameContainer} object.
493
	 */
494
	public AcceptedNameContainer getAcceptedNameContainer() {
495
		return acceptedNameContainer;
496
	}
497
	
498
	/**
499
	 * <p>getSynonymGroup</p>
500
	 *
501
	 * @param homotypicalGroup a {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup} object.
502
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.HomotypicalSynonymGroup} object.
503
	 */
504
	public HomotypicalSynonymGroup getSynonymGroup(HomotypicalGroup homotypicalGroup) {
505
		if(getHomotypicSynonymGroup() != null && getHomotypicSynonymGroup().getGroup().equals(homotypicalGroup)){
506
			return getHomotypicSynonymGroup();
507
		}
508
		
509
		for(Tupel tupel : heterotypicSynonymGroupTupel){
510
			if(tupel.homotypicalGroup.equals(homotypicalGroup)){
511
				return tupel.group;
512
			}
513
		}
514
		
515
		return null;
516
	}
517
	
518
	/**
519
	 * <p>Getter for the field <code>conceptGroup</code>.</p>
520
	 *
521
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.ConceptGroup} object.
522
	 */
523
	public ConceptGroup getConceptGroup() {
524
		return conceptGroup;
525
	}
526
	
527
	/**
528
	 * <p>getDirtyNames</p>
529
	 *
530
	 * @return a Set containing all composites that have been edited
531
	 */
532
	public Set<AbstractGroupedContainer> getDirtyNames(){
533
		Set<AbstractGroupedContainer> dirtyNames = new HashSet<AbstractGroupedContainer>();
534
		
535
		for(AbstractGroupedContainer composite : getGroupedContainers()){
536
			if(composite.isDirty()){
537
				dirtyNames.add(composite);
538
			}
539
		}
540
		
541
		return dirtyNames;
542
	}
543
	
544
	/**
545
	 * <p>getGroupedContainers</p>
546
	 *
547
	 * @return a {@link java.util.List} object.
548
	 */
549
	public List<AbstractGroupedContainer> getGroupedContainers(){
550
		List<AbstractGroupedContainer> groupedComposites = new ArrayList<AbstractGroupedContainer>();
551
		
552
		for(AbstractGroup group : getAllGroups()){
553
			groupedComposites.addAll(group.getGroupedContainers());
554
		}
555
		
556
		return groupedComposites;
557
	}
558
	
559
	/**
560
	 * <p>getAllGroups</p>
561
	 *
562
	 * @return a {@link java.util.List} object.
563
	 */
564
	public List<AbstractGroup> getAllGroups(){
565
		List<AbstractGroup> allGroups = new ArrayList<AbstractGroup>();
566
		
567
		allGroups.add(getHomotypicSynonymGroup());
568
		
569
		allGroups.addAll(getHeterotypicSynonymGroups());
570
				
571
		if(misappliedGroup != null){
572
			allGroups.add(misappliedGroup);
573
		}
574
		
575
		if(conceptGroup != null){
576
			allGroups.add(conceptGroup);
577
		}
578
		
579
		return allGroups;
580
	}
581

    
582
	/* (non-Javadoc)
583
	 * @see org.eclipse.ui.part.EditorPart#isDirty()
584
	 */
585
	/** {@inheritDoc} */
586
	@Override
587
	public boolean isDirty() {
588
		return editor.isDirty();
589
	}
590
	
591
	/* (non-Javadoc)
592
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
593
	 */
594
	/** {@inheritDoc} */
595
	@Override
596
	public void dispose() {
597
		super.dispose();
598
	}
599

    
600
	/* (non-Javadoc)
601
	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
602
	 */
603
	/** {@inheritDoc} */
604
	@Override
605
	public boolean isSaveAsAllowed() {
606
		return false;
607
	}
608
	
609
	/*
610
	 * (non-Javadoc)
611
	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
612
	 */
613
	/** {@inheritDoc} */
614
	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
615
		
616
	}
617

    
618
	/**
619
	 * <p>removeContainer</p>
620
	 *
621
	 * @param container a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer} object.
622
	 */
623
	public void removeContainer(AbstractGroupedContainer container) {
624
		container.remove();
625
	}
626

    
627
	/**
628
	 * <p>addCompositeForTaxonBase</p>
629
	 *
630
	 * @param taxonBase a {@link eu.etaxonomy.cdm.model.taxon.TaxonBase} object.
631
	 * @param target a {@link eu.etaxonomy.taxeditor.editor.IDropTargetable} object.
632
	 */
633
	public void addCompositeForTaxonBase(TaxonBase taxonBase, IDropTargetable target) {
634
		
635
//		if(target instanceof AbstractGroup){
636
//			((AbstractGroup) target).redraw();
637
//		}else if(target instanceof TaxonNameEditor){
638
//			if(taxonBase instanceof Synonym){
639
//				Synonym synonym = (Synonym) taxonBase;
640
//				HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());
641
//				ContainerFactory.getInstance().createHeterotypicSynonymGroup(this, group);
642
//			}
643
//		}
644
		
645
//		if(taxonBase instanceof Synonym && target instanceof HomotypicalSynonymGroup){
646
//			new SynonymContainer(this, (HomotypicalSynonymGroup) target, (Synonym) taxonBase);
647
//		}else if(taxonBase instanceof Synonym && target instanceof TaxonNameEditor){
648
//			Synonym synonym = (Synonym) taxonBase;
649
//			HomotypicalSynonymGroup group = new HomotypicalSynonymGroup(this, synonym.getHomotypicGroup());
650
//			
651
//			new SynonymContainer(this, group, (Synonym) taxonBase);
652
//		}
653
		
654
		
655
		
656
//		else if(target instanceof MisappliedGroup){
657
//			Taxon taxon = (Taxon) taxonBase;
658
//			
659
//			if (taxon.isMisapplication()){
660
//				containerFactory.createMisapplication(this, taxon);
661
//			}else if(! taxon.equals(this.taxon)){
662
//				throw new RuntimeException("Unsupported operands");
663
//			}
664
//		}
665
	}
666

    
667
	/**
668
	 * <p>getNameEditor</p>
669
	 *
670
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
671
	 */
672
	public TaxonNameEditor getNameEditor() {
673
		return this;
674
	}
675

    
676
	/**
677
	 * <p>Getter for the field <code>selectedObject</code>.</p>
678
	 *
679
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer} object.
680
	 */
681
	public AbstractGroupedContainer getSelectedObject(){
682
		TaxonEditorInput input = (TaxonEditorInput) editor.getEditorInput();
683
		if(input.getInitiallySelectedTaxonBase() != null){
684
			
685
			TaxonBase initiallySelectedTaxonBase = input.getInitiallySelectedTaxonBase();
686
			AbstractGroupedContainer container = getContainerForData(initiallySelectedTaxonBase);
687
			if(container != null){
688
				input.setInitiallySelectedTaxonBase(null);
689
				return container;
690
			}
691
		}else{
692
			if(selectedObject != null){
693
				return selectedObject;
694
			}
695
		}
696
		return acceptedNameContainer;
697
	}
698
	
699
	/**
700
	 * <p>dragEntered</p>
701
	 */
702
	public void dragEntered() {
703
		// TODO change this
704
		getControl().setBackground(EditorUtil.getColor(Resources.COLOR_DRAG_ENTER));
705
	}
706

    
707
	/**
708
	 * <p>dragLeft</p>
709
	 */
710
	public void dragLeft() {
711
		getControl().setBackground(EditorUtil.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
712
	}
713

    
714
	/**
715
	 * <p>Setter for the field <code>conceptGroup</code>.</p>
716
	 *
717
	 * @param conceptGroup a {@link eu.etaxonomy.taxeditor.editor.name.ConceptGroup} object.
718
	 */
719
	public void setConceptGroup(ConceptGroup conceptGroup) {
720
		this.conceptGroup = conceptGroup;
721
	}
722

    
723
	/**
724
	 * <p>setMisapplicationsGroup</p>
725
	 *
726
	 * @param misappliedGroup a {@link eu.etaxonomy.taxeditor.editor.name.MisappliedGroup} object.
727
	 */
728
	public void setMisapplicationsGroup(MisappliedGroup misappliedGroup) {
729
		this.misappliedGroup = misappliedGroup;
730
	}
731

    
732
	/*
733
	 * (non-Javadoc)
734
	 * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()
735
	 */
736
	/**
737
	 * <p>isRedrawing</p>
738
	 *
739
	 * @return a boolean.
740
	 */
741
	public boolean isRedrawing() {
742
		return false;
743
	}
744

    
745
	/**
746
	 * <p>getToolkit</p>
747
	 *
748
	 * @return a {@link org.eclipse.ui.forms.widgets.FormToolkit} object.
749
	 */
750
	public FormToolkit getToolkit() {
751
		return managedForm.getToolkit();
752
	}
753

    
754
	/**
755
	 * <p>getHeterotypicSynonymGroups</p>
756
	 *
757
	 * @return a {@link java.util.List} object.
758
	 */
759
	public List<HomotypicalSynonymGroup> getHeterotypicSynonymGroups(){
760
		List<HomotypicalSynonymGroup> list = new ArrayList<HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());
761
		
762
		for(Tupel tupel : heterotypicSynonymGroupTupel){
763
			list.add(tupel.group);
764
		}
765
		
766
		return list;
767
	}
768
	
769
	/**
770
	 * <p>getHeterotypicSynonymGroupsMap</p>
771
	 *
772
	 * @return a {@link java.util.Map} object.
773
	 */
774
	public Map<HomotypicalGroup, HomotypicalSynonymGroup> getHeterotypicSynonymGroupsMap(){
775
		Map<HomotypicalGroup, HomotypicalSynonymGroup> map = new HashMap<HomotypicalGroup, HomotypicalSynonymGroup>(heterotypicSynonymGroupTupel.size());
776
		
777
		for(Tupel tupel : heterotypicSynonymGroupTupel){
778
			map.put(tupel.homotypicalGroup, tupel.group);
779
		}
780
		
781
		return map;
782
	}
783
	
784
	/**
785
	 * <p>clearHeterotypicSynonymGroups</p>
786
	 */
787
	public void clearHeterotypicSynonymGroups(){
788
		heterotypicSynonymGroupTupel.clear();
789
	}
790

    
791
	/**
792
	 * <p>addHeterotypicSynonymGroup</p>
793
	 *
794
	 * @param group a {@link eu.etaxonomy.taxeditor.editor.name.HomotypicalSynonymGroup} object.
795
	 */
796
	public void addHeterotypicSynonymGroup(HomotypicalSynonymGroup group) {
797
		heterotypicSynonymGroupTupel.add(new Tupel(group.getGroup(), group));
798
	}
799
	
800
	/**
801
	 * <p>removeHeterotypicSynonymGroup</p>
802
	 *
803
	 * @param group a {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup} object.
804
	 */
805
	public void removeHeterotypicSynonymGroup(HomotypicalGroup group) {
806
		Tupel shouldBeRemoved = null;
807
		for(Tupel tupel : heterotypicSynonymGroupTupel){
808
			if(tupel.group.equals(group)){
809
				shouldBeRemoved = tupel;
810
				break;
811
			}			
812
		}
813
		
814
		if(shouldBeRemoved != null){
815
			heterotypicSynonymGroupTupel.remove(shouldBeRemoved);
816
		}
817
	}
818

    
819

    
820

    
821
	/**
822
	 * <p>getHomotypicSynonymGroup</p>
823
	 *
824
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.HomotypicalSynonymGroup} object.
825
	 */
826
	public HomotypicalSynonymGroup getHomotypicSynonymGroup() {
827
		return homotypicalSynonymGroup;
828
	}
829

    
830

    
831

    
832
	/**
833
	 * <p>setHomotypicSynonymGroup</p>
834
	 *
835
	 * @param homotypicalSynonymGroup a {@link eu.etaxonomy.taxeditor.editor.name.HomotypicalSynonymGroup} object.
836
	 */
837
	public void setHomotypicSynonymGroup(
838
			HomotypicalSynonymGroup homotypicalSynonymGroup) {
839
		this.homotypicalSynonymGroup = homotypicalSynonymGroup;
840
	}
841

    
842
	/**
843
	 * <p>Setter for the field <code>acceptedNameContainer</code>.</p>
844
	 *
845
	 * @param acceptedNameContainer a {@link eu.etaxonomy.taxeditor.editor.name.AcceptedNameContainer} object.
846
	 */
847
	public void setAcceptedNameContainer(
848
			AcceptedNameContainer acceptedNameContainer) {
849
		this.acceptedNameContainer = acceptedNameContainer;		
850
	}
851

    
852
	/**
853
	 * <p>Getter for the field <code>misappliedGroup</code>.</p>
854
	 *
855
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.MisappliedGroup} object.
856
	 */
857
	public MisappliedGroup getMisappliedGroup() {
858
		return misappliedGroup;
859
	}
860

    
861
	// TODO not very useful at the moment
862
	/**
863
	 * <p>isActive</p>
864
	 *
865
	 * @return a boolean.
866
	 */
867
	public boolean isActive(){
868
		
869
		
870
		IWorkbenchPart activePart = EditorUtil.getActivePart();
871
		return editor.equals(activePart);
872
	}
873

    
874
	/**
875
	 * <p>onComplete</p>
876
	 *
877
	 * @return a boolean.
878
	 */
879
	public boolean onComplete() {
880
		objectAffectedByLastOperation.setSelected();
881
		return true;
882
	}
883

    
884

    
885

    
886
	/** {@inheritDoc} */
887
	public void partChanged(Integer eventType, IWorkbenchPartReference partRef) {
888
		if(! partRef.getPart(false).equals(editor)){
889
			getSelectedObject().colorSelected(AbstractGroupedContainer.SELECTED_NO_FOCUS);
890
		}
891
	}
892

    
893
}
(22-22/22)