Project

General

Profile

Download (22.6 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.HashSet;
14
import java.util.List;
15
import java.util.Set;
16

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

    
45
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
46
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
47
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
48
import eu.etaxonomy.cdm.model.common.CdmBase;
49
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
50
import eu.etaxonomy.cdm.model.taxon.Taxon;
51
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
52
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
53
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
54
import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
55
import eu.etaxonomy.taxeditor.editor.IDropTargetable;
56
import eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage;
57
import eu.etaxonomy.taxeditor.editor.ISecuredEditor;
58
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
59
import eu.etaxonomy.taxeditor.editor.SimpleSelectionProvider;
60
import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
61
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
62
import eu.etaxonomy.taxeditor.editor.name.container.AbstractGroup;
63
import eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer;
64
import eu.etaxonomy.taxeditor.editor.name.container.AcceptedGroup;
65
import eu.etaxonomy.taxeditor.editor.name.container.AcceptedNameContainer;
66
import eu.etaxonomy.taxeditor.editor.name.container.ContainerFactory;
67
import eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup;
68
import eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup;
69
import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDropTargetListener;
70
import eu.etaxonomy.taxeditor.model.AbstractUtility;
71
import eu.etaxonomy.taxeditor.model.IPartChangeListener;
72
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
73
import eu.etaxonomy.taxeditor.model.TaxeditorPartService;
74
import eu.etaxonomy.taxeditor.preference.Resources;
75
import eu.etaxonomy.taxeditor.security.RequiredPermissions;
76
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
77
import eu.etaxonomy.taxeditor.store.CdmStore;
78

    
79
/**
80
 * <p>
81
 * TaxonNameEditor class.
82
 * </p>
83
 *
84
 * @author p.ciardelli
85
 * @author n.hoffmann
86
 * @created 15.05.2008
87
 * @version 1.0
88
 */
89
public class TaxonNameEditor extends EditorPart implements
90
		IMultiPageTaxonEditorPage, IConversationEnabled,
91
		IPartContentHasDetails, IPartChangeListener,
92
		ISelectionListener, IDropTargetable, ISecuredEditor {
93

    
94
	/** Constant <code>ID="eu.etaxonomy.taxeditor.editor.taxon.name"</code> */
95
	public static final String ID = "eu.etaxonomy.taxeditor.editor.taxon.name"; //$NON-NLS-1$
96

    
97
	private Taxon taxon;
98

    
99
	private ManagedForm managedForm;
100
	private ScrolledForm scrolledForm;
101
	private Composite parent;
102
	private ISelectionProvider simpleSelectionProvider;
103

    
104
	private final MultiPageTaxonEditor editor;
105

    
106
	private TaxonBase selection;
107

    
108
	private final ConversationHolder conversation;
109

    
110
	private MenuManager menuManager;
111
	private Menu menu;
112

    
113
	private AcceptedGroup acceptedGroup;
114
	private List<HomotypicalSynonymGroup> heterotypicSynonymGroups = new ArrayList<HomotypicalSynonymGroup>();
115
	private MisappliedGroup misappliedGroup;
116

    
117
	private DropTarget target;
118

    
119
	private ISelectionService selectionService;
120

    
121
	private TaxonBase objectAffectedByLastOperation;
122

    
123
	private ICdmEntitySession cdmEntitySession;
124

    
125
	/**
126
	 * <p>
127
	 * Constructor for TaxonNameEditor.
128
	 * </p>
129
	 *
130
	 * @param editor
131
	 *            a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor}
132
	 *            object.
133
	 */
134
	public TaxonNameEditor(MultiPageTaxonEditor editor) {
135
		this.editor = editor;
136
		conversation = editor.getConversationHolder();
137
	}
138

    
139
	/**
140
	 * <p>
141
	 * getUndoContext
142
	 * </p>
143
	 *
144
	 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
145
	 *         object.
146
	 */
147
	public IUndoContext getUndoContext() {
148
		return editor.getUndoContext();
149
	}
150

    
151
	/*
152
	 * (non-Javadoc)
153
	 *
154
	 * @see
155
	 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
156
	 * .Composite)
157
	 */
158
	/** {@inheritDoc} */
159
	@Override
160
	public void createPartControl(Composite composite) {
161
		selectionService = getSite().getWorkbenchWindow().getSelectionService();
162
		selectionService.addSelectionListener(this);
163

    
164
		createManagedForm(composite);
165

    
166
		TaxeditorPartService.getInstance().addListener(
167
				TaxeditorPartService.PART_ACTIVATED, this);
168
	}
169

    
170
	/**
171
	 * <p>
172
	 * createManagedForm
173
	 * </p>
174
	 *
175
	 * @param composite
176
	 *            a {@link org.eclipse.swt.widgets.Composite} object.
177
	 */
178
	protected void createManagedForm(Composite composite) {
179

    
180
		managedForm = new ManagedForm(composite) {
181

    
182
			@Override
183
			public void dirtyStateChanged() {
184
				firePropertyChange(PROP_DIRTY);
185
			}
186

    
187
			@Override
188
			public boolean setInput(Object input) {
189
				if (input instanceof AbstractGroupedContainer) {
190
					selection = ((AbstractGroupedContainer) input).getData();
191
					getSite().getSelectionProvider().setSelection(new StructuredSelection(selection));
192
				}else if(input == null){
193
					selection = null;
194
					getSite().getSelectionProvider().setSelection(new StructuredSelection());
195
				}
196

    
197

    
198
				return super.setInput(input);
199
			}
200
		};
201

    
202
		scrolledForm = managedForm.getForm();
203
		parent = scrolledForm.getBody();
204

    
205
		// register the context menu
206
		menuManager = new MenuManager();
207
		ISelectionProvider selectionProvider = getSite().getSelectionProvider();
208
		getSite().registerContextMenu(TaxonNameEditor.ID, menuManager,
209
				selectionProvider);
210
		menuManager.setRemoveAllWhenShown(true);
211

    
212
		parent.setData(taxon);
213

    
214
		TableWrapLayout layout = new TableWrapLayout();
215
		layout.leftMargin = 0;
216
		layout.rightMargin = 0;
217
		layout.topMargin = 0;
218
		layout.bottomMargin = 0;
219

    
220
		layout.verticalSpacing = 0;
221
		layout.horizontalSpacing = 0;
222

    
223
		parent.setLayout(layout);
224
		parent.setBackground(AbstractUtility
225
				.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
226

    
227
		createOrUpdateNameComposites();
228

    
229
		createDragSupport();
230

    
231
		setFocus();
232
	}
233

    
234
	/**
235
	 * <p>
236
	 * createNameComposites
237
	 * </p>
238
	 */
239
	public void createOrUpdateNameComposites() {
240
//		this.taxon = (Taxon)CdmStore.getService(ITaxonService.class).load(this.getTaxon().getUuid());
241
		ContainerFactory.createOrUpdateAcceptedTaxonsHomotypicGroup(this);
242
		ContainerFactory.createOrUpdateHeterotypicSynonymyGroups(this);
243
		ContainerFactory.createOrUpdateMisapplicationsGroup(this);
244

    
245

    
246
		// Redraw composite
247
		managedForm.reflow(true);
248
	}
249

    
250
	/**
251
	 * <p>
252
	 * Getter for the field <code>taxon</code>.
253
	 * </p>
254
	 *
255
	 * @return a {@link eu.etaxonomy.cdm.model.taxon.Taxon} object.
256
	 */
257
	public Taxon getTaxon() {
258
		return HibernateProxyHelper.deproxy(taxon);
259
	}
260

    
261
	/**
262
	 * <p>
263
	 * setDirty
264
	 * </p>
265
	 */
266
	public void setDirty() {
267
		managedForm.dirtyStateChanged();
268
	}
269

    
270
	/*
271
	 * (non-Javadoc)
272
	 *
273
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
274
	 */
275
	/** {@inheritDoc} */
276
	@Override
277
	public void setFocus() {
278
	    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setFocus();
279
		if (getSelectedContainer() == null) {
280
			throw new IllegalStateException(
281
					Messages.TaxonNameEditor_THERE_SHOULD_ALWAYS_BE);
282
		}
283
		getSelectedContainer().setSelected();
284

    
285
		// check permissions
286
		boolean doEnable = permissionsSatisfied();
287
		setEnabled(doEnable);
288
	}
289

    
290
	/* (non-Javadoc)
291
	 * @see eu.etaxonomy.taxeditor.editor.name.ISecuredEditorPart#permissionsSatisfied()
292
	 */
293
	@Override
294
	public boolean permissionsSatisfied() {
295
		TaxonNode taxonNode = ((TaxonEditorInput)getEditorInput()).getTaxonNode();
296
		boolean doEnable = CdmStore.currentAuthentiationHasPermission(taxonNode, RequiredPermissions.TAXONNODE_EDIT);
297
		return doEnable;
298
	}
299

    
300
	/** {@inheritDoc} */
301
	@Override
302
	public void setInput(IEditorInput input) {
303
		this.setInputWithNotify(input);
304
	}
305

    
306
	/*
307
	 * (non-Javadoc)
308
	 *
309
	 * @see
310
	 * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
311
	 * ()
312
	 */
313
	/**
314
	 * <p>
315
	 * getConversationHolder
316
	 * </p>
317
	 *
318
	 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
319
	 *         object.
320
	 */
321
	@Override
322
    public ConversationHolder getConversationHolder() {
323
		return conversation;
324
	}
325

    
326
	/*
327
	 * (non-Javadoc)
328
	 *
329
	 * @see
330
	 * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu
331
	 * .etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
332
	 */
333
	/** {@inheritDoc} */
334
	@Override
335
    public void update(CdmDataChangeMap events) {
336
		// redraw();
337
	}
338

    
339
	/**
340
	 * Redraws this editor return true on success
341
	 *
342
	 * @return a boolean.
343
	 */
344
	@Override
345
    public boolean redraw() {
346
		return redraw(true);
347
	}
348

    
349
	/**
350
	 * {@inheritDoc}
351
	 *
352
	 * Redraws the editor controls
353
	 */
354
	@Override
355
    public boolean redraw(boolean focus) {
356

    
357
		createOrUpdateNameComposites();
358

    
359
		if (focus) {
360
			setFocus();
361
		}
362

    
363
		return true;
364
	}
365

    
366
	/**
367
	 * <p>
368
	 * getMultiPageTaxonEditor
369
	 * </p>
370
	 *
371
	 * @return a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor}
372
	 *         object.
373
	 */
374
	public MultiPageTaxonEditor getMultiPageTaxonEditor() {
375
		return editor;
376
	}
377

    
378
	/*
379
	 * (non-Javadoc)
380
	 *
381
	 * @see
382
	 * eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation
383
	 * ()
384
	 */
385
	/** {@inheritDoc} */
386
	@Override
387
    public boolean postOperation(CdmBase objectAffectedByOperation) {
388

    
389
		editor.changed(objectAffectedByOperation);
390

    
391
		redraw(false);
392

    
393
		if (objectAffectedByOperation instanceof TaxonBase) {
394
			objectAffectedByLastOperation = (TaxonBase) objectAffectedByOperation;
395
		}
396

    
397
		return true;
398
	}
399

    
400
	/**
401
	 * <p>
402
	 * Getter for the field <code>managedForm</code>.
403
	 * </p>
404
	 *
405
	 * @return the managedForm
406
	 */
407
	public ManagedForm getManagedForm() {
408
		return managedForm;
409
	}
410

    
411
	/**
412
	 * <p>
413
	 * getControl
414
	 * </p>
415
	 *
416
	 * @return a {@link org.eclipse.swt.widgets.Composite} object.
417
	 */
418
	@Override
419
    public Composite getControl() {
420
		return this.getManagedForm().getForm().getBody();
421
	}
422

    
423
	/**
424
	 * <p>
425
	 * Getter for the field <code>menu</code>.
426
	 * </p>
427
	 *
428
	 * @return the menu
429
	 */
430
	public Menu getMenu() {
431
		if (menu == null || menu.isDisposed()) {
432
			// Creating the menu because it was either not initialised or
433
			// disposed while refreshing the editor
434
			menu = menuManager.createContextMenu(parent);
435
		}
436
		return menu;
437
	}
438

    
439
	/**
440
	 * <p>
441
	 * checkForEmptyNames
442
	 * </p>
443
	 *
444
	 * @return true if there are empty names
445
	 */
446
	public boolean checkForEmptyNames() {
447
		for (AbstractGroupedContainer container : getGroupedContainers()) {
448
			if (container.getName() == null
449
					|| StringUtils.isEmpty(container.getName().getTitleCache())) {
450
				return true;
451
			}
452
		}
453
		return false;
454
	}
455

    
456
	public Set<AbstractGroupedContainer> getEmptyContainers() {
457
		Set<AbstractGroupedContainer> containersWithEmptyNames = new HashSet<AbstractGroupedContainer>();
458

    
459
		for (AbstractGroupedContainer container : getGroupedContainers()) {
460
			if (container.getName() == null
461
					|| StringUtils.isEmpty(container.getName().getTitleCache())) {
462
				containersWithEmptyNames.add(container);
463
			}
464
		}
465

    
466
		return containersWithEmptyNames;
467
	}
468

    
469
	/** {@inheritDoc} */
470
	@Override
471
	public void doSave(IProgressMonitor monitor) {
472

    
473
		monitor.beginTask(Messages.TaxonNameEditor_SAVING_NAMES, getGroupedContainers().size());
474

    
475
		try {
476
			// check for empty names
477
			for (AbstractGroupedContainer container : getGroupedContainers()) {
478

    
479
				monitor.subTask(Messages.TaxonNameEditor_SAVING_COMPOSITES
480
						+ container.getTaxonBase().getTitleCache());
481
				container.persistName();
482

    
483
				// In case the progress monitor was canceled throw an exception.
484
				if (monitor.isCanceled()) {
485
					throw new OperationCanceledException();
486
				}
487

    
488
				// Otherwise declare this step as done.
489
				monitor.worked(1);
490
			}
491
		} finally {
492

    
493
			// Stop the progress monitor.
494
			monitor.done();
495
		}
496

    
497
	}
498

    
499
	/** {@inheritDoc} */
500
	@Override
501
	public void doSaveAs() {
502
	}
503

    
504
	/** {@inheritDoc} */
505
	@Override
506
	public void init(IEditorSite site, IEditorInput input)
507
			throws PartInitException {
508

    
509
		if (!(input != null)) {
510
            throw new PartInitException(Messages.TaxonNameEditor_INVALID_INPUT);
511
        }
512

    
513
		if (input.getAdapter(Taxon.class) != null) {
514
			taxon = CdmBase.deproxy(input.getAdapter(Taxon.class), Taxon.class);
515
		} else {
516
			throw new PartInitException(Messages.TaxonNameEditor_INVALID_INPUT_TAXON_NULL);
517
		}
518

    
519
		setSite(site);
520
		setInput(input);
521

    
522
		simpleSelectionProvider = new SimpleSelectionProvider();
523
		getSite().setSelectionProvider(simpleSelectionProvider);
524
	}
525

    
526

    
527
	/**
528
	 *
529
	 */
530
	private void createDragSupport() {
531
		// Listen for names being dragged outside of existing homotypic groups -
532
		// user wants to create a new group
533
		Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() };
534
		int operations = DND.DROP_MOVE;
535
		if (target == null) {
536
			target = new DropTarget(parent, operations);
537
			target.setTransfer(types);
538
			target.addDropListener(new NameEditorDropTargetListener(this));
539
		}
540
	}
541

    
542
	/**
543
	 * <p>
544
	 * Getter for the field <code>acceptedNameContainer</code>.
545
	 * </p>
546
	 *
547
	 * @return a
548
	 *         {@link eu.etaxonomy.taxeditor.editor.name.container.AcceptedNameContainer}
549
	 *         object.
550
	 */
551
	public AcceptedNameContainer getAcceptedNameContainer() {
552
		return getAcceptedGroup().getAcceptedNameContainer();
553
	}
554

    
555
	/**
556
	 * <p>
557
	 * getSynonymGroup
558
	 * </p>
559
	 *
560
	 * @param homotypicalGroup
561
	 *            a {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup} object.
562
	 * @return a
563
	 *         {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
564
	 *         object.
565
	 */
566
	public HomotypicalSynonymGroup getHomotypicalGroupContainer(
567
			HomotypicalGroup homotypicalGroup) {
568
		for (HomotypicalSynonymGroup group : getHeterotypicSynonymGroups()) {
569
			if (group.getGroup().equals(homotypicalGroup)) {
570
				return group;
571
			}
572
		}
573

    
574
		return null;
575
	}
576

    
577
	/**
578
	 * <p>
579
	 * getDirtyNames
580
	 * </p>
581
	 *
582
	 * @return a Set containing all composites that have been edited
583
	 */
584
	public Set<AbstractGroupedContainer> getDirtyNames() {
585
		Set<AbstractGroupedContainer> dirtyNames = new HashSet<AbstractGroupedContainer>();
586

    
587
		for (AbstractGroupedContainer composite : getGroupedContainers()) {
588
			if (composite.isDirty()) {
589
				dirtyNames.add(composite);
590
			}
591
		}
592

    
593
		return dirtyNames;
594
	}
595

    
596
	/**
597
	 * <p>
598
	 * getGroupedContainers
599
	 * </p>
600
	 *
601
	 * @return a {@link java.util.List} object.
602
	 */
603
	public List<AbstractGroupedContainer> getGroupedContainers() {
604
		List<AbstractGroupedContainer> groupedComposites = new ArrayList<AbstractGroupedContainer>();
605

    
606
		for (AbstractGroup group : getAllGroups()) {
607
			groupedComposites.addAll(group.getGroupedContainers());
608
		}
609

    
610
		return groupedComposites;
611
	}
612

    
613
	/**
614
	 * <p>
615
	 * getAllGroups
616
	 * </p>
617
	 *
618
	 * @return a {@link java.util.List} object.
619
	 */
620
	public List<AbstractGroup> getAllGroups() {
621
		List<AbstractGroup> allGroups = new ArrayList<AbstractGroup>();
622

    
623
		allGroups.add(getAcceptedGroup());
624

    
625
//		List<HomotypicalSynonymGroup> grps = getHeterotypicSynonymGroups(); // UNUSED => remove
626

    
627
		heterotypicSynonymGroups = getHeterotypicSynonymGroups();
628

    
629
		if (heterotypicSynonymGroups != null) {
630
			allGroups.addAll(heterotypicSynonymGroups);
631
		}
632

    
633
		if (misappliedGroup != null) {
634
			allGroups.add(misappliedGroup);
635
		}
636

    
637
		return allGroups;
638
	}
639

    
640
	/*
641
	 * (non-Javadoc)
642
	 *
643
	 * @see org.eclipse.ui.part.EditorPart#isDirty()
644
	 */
645
	/** {@inheritDoc} */
646
	@Override
647
	public boolean isDirty() {
648
		return editor.isDirty();
649
	}
650

    
651
	/*
652
	 * (non-Javadoc)
653
	 *
654
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
655
	 */
656
	/** {@inheritDoc} */
657
	@Override
658
	public void dispose() {
659
		conversation.unregisterForDataStoreChanges(this);
660
		super.dispose();
661
	}
662

    
663
	/*
664
	 * (non-Javadoc)
665
	 *
666
	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
667
	 */
668
	/** {@inheritDoc} */
669
	@Override
670
	public boolean isSaveAsAllowed() {
671
		return false;
672
	}
673

    
674
	/*
675
	 * (non-Javadoc)
676
	 *
677
	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.
678
	 * IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
679
	 */
680
	/** {@inheritDoc} */
681
	@Override
682
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
683

    
684
	}
685

    
686
	/**
687
	 * <p>
688
	 * getNameEditor
689
	 * </p>
690
	 *
691
	 * @return a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor}
692
	 *         object.
693
	 */
694
	@Override
695
    public TaxonNameEditor getEditor() {
696
		return this;
697
	}
698

    
699
	/**
700
	 * <p>
701
	 * Getter for the field <code>selectedObject</code>.
702
	 * </p>
703
	 *
704
	 * @return a
705
	 *         {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer}
706
	 *         object.
707
	 */
708
	public AbstractGroupedContainer getSelectedContainer() {
709

    
710
		TaxonBase selectedTaxonBase = null;
711

    
712
		TaxonEditorInput input = (TaxonEditorInput) editor.getEditorInput();
713
		if (input.getInitiallySelectedTaxonBase() != null) {
714
			selectedTaxonBase = input.getInitiallySelectedTaxonBase();
715
		} else {
716
			if (selection != null) {
717
				selectedTaxonBase = selection;
718
			}
719
		}
720

    
721
		return (selectedTaxonBase != null) ? getContainer(selectedTaxonBase)
722
				: getAcceptedNameContainer();
723
	}
724

    
725
	/**
726
	 * <p>
727
	 * dragEntered
728
	 * </p>
729
	 */
730
	@Override
731
    public void dragEntered() {
732
		// TODO change this
733
		getControl().setBackground(
734
				AbstractUtility.getColor(Resources.COLOR_DRAG_ENTER));
735
	}
736

    
737
	/**
738
	 * <p>
739
	 * dragLeft
740
	 * </p>
741
	 */
742
	@Override
743
    public void dragLeft() {
744
		getControl().setBackground(
745
				AbstractUtility.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
746
	}
747

    
748

    
749
	/**
750
	 * <p>
751
	 * setMisapplicationsGroup
752
	 * </p>
753
	 *
754
	 * @param misappliedGroup
755
	 *            a
756
	 *            {@link eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup}
757
	 *            object.
758
	 */
759
	public void setMisapplicationsGroup(MisappliedGroup misappliedGroup) {
760
		this.misappliedGroup = misappliedGroup;
761
	}
762

    
763
	/*
764
	 * (non-Javadoc)
765
	 *
766
	 * @see
767
	 * eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()
768
	 */
769
	/**
770
	 * <p>
771
	 * isRedrawing
772
	 * </p>
773
	 *
774
	 * @return a boolean.
775
	 */
776
	@Override
777
    public boolean isRedrawing() {
778
		return false;
779
	}
780

    
781
	/**
782
	 * <p>
783
	 * getToolkit
784
	 * </p>
785
	 *
786
	 * @return a {@link org.eclipse.ui.forms.widgets.FormToolkit} object.
787
	 */
788
	public FormToolkit getToolkit() {
789
		return managedForm.getToolkit();
790
	}
791

    
792
	/**
793
	 * <p>
794
	 * getHeterotypicSynonymGroups
795
	 * </p>
796
	 *
797
	 * @return a {@link java.util.List} object.
798
	 */
799
	public List<HomotypicalSynonymGroup> getHeterotypicSynonymGroups() {
800
		return heterotypicSynonymGroups;
801
	}
802

    
803
	/**
804
	 * <p>
805
	 * addHeterotypicSynonymGroup
806
	 * </p>
807
	 *
808
	 * @param group
809
	 *            a
810
	 *            {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
811
	 *            object.
812
	 */
813
	public void addHeterotypicSynonymGroup(HomotypicalSynonymGroup group) {
814
		heterotypicSynonymGroups.add(group);
815
	}
816

    
817
	/**
818
	 * <p>
819
	 * getHomotypicSynonymGroup
820
	 * </p>
821
	 *
822
	 * @return a
823
	 *         {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
824
	 *         object.
825
	 */
826
	public AcceptedGroup getAcceptedGroup() {
827
		return acceptedGroup;
828
	}
829

    
830
	/**
831
	 *
832
	 * @param acceptedGroup
833
	 */
834
	public void setAcceptedGroup(AcceptedGroup acceptedGroup) {
835
		this.acceptedGroup = acceptedGroup;
836
	}
837

    
838
	/**
839
	 * <p>
840
	 * Getter for the field <code>misappliedGroup</code>.
841
	 * </p>
842
	 *
843
	 * @return a
844
	 *         {@link eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup}
845
	 *         object.
846
	 */
847
	public MisappliedGroup getMisappliedGroup() {
848
		return misappliedGroup;
849
	}
850

    
851
	// TODO not very useful at the moment
852
	/**
853
	 * <p>
854
	 * isActive
855
	 * </p>
856
	 *
857
	 * @return a boolean.
858
	 */
859
	public boolean isActive() {
860
		return editor.equals(AbstractUtility.getActiveE4Part());
861
	}
862

    
863
	/**
864
	 * <p>
865
	 * onComplete
866
	 * </p>
867
	 *
868
	 * @return a boolean.
869
	 */
870
	@Override
871
    public boolean onComplete() {
872
		getContainer(objectAffectedByLastOperation).setSelected();
873
		return true;
874
	}
875

    
876
	/** {@inheritDoc} */
877
	@Override
878
    public void partChanged(Integer eventType, IWorkbenchPartReference partRef) {
879
		if (!partRef.getPart(false).equals(editor)) {
880
			// getSelectedObject().colorSelected(AbstractGroupedContainer.SELECTED_NO_FOCUS);
881
		}
882
	}
883

    
884
	/**
885
	 * @param retainedGroup
886
	 */
887
	public void removeGroup(AbstractGroup group) {
888
		if (group != null) {
889
			group.dispose();
890

    
891
			//if (heterotypicSynonymGroups != null) {
892
			heterotypicSynonymGroups.remove(group);
893
			//}
894
		}
895
	}
896

    
897
	/**
898
	 * @param element
899
	 * @return
900
	 */
901
	public AbstractGroupedContainer getContainer(TaxonBase taxonBase) {
902
		List<AbstractGroupedContainer> groupedContainers = getGroupedContainers();
903
		for (AbstractGroupedContainer container : groupedContainers) {
904
			if (container.getData().equals(taxonBase)
905
					&& container.getNameViewer().getTextWidget() != null) {
906
				return container;
907
			}
908
		}
909
		return getAcceptedNameContainer();
910
	}
911

    
912
	/* (non-Javadoc)
913
	 * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#setOnError()
914
	 */
915
	@Override
916
    public void setOnError() {
917
		Color disabledColor =  AbstractUtility.getColor(Resources.COLOR_EDITOR_ERROR);
918
		setEnabled(false, disabledColor);
919
	}
920

    
921
	/* (non-Javadoc)
922
	 * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#setDisabled()
923
	 */
924
	@Override
925
	public void setDisabled(){
926
		Color disabledColor =  AbstractUtility.getColor(Resources.COLOR_TEXT_DISABLED_BACKGROUND);
927
		setEnabled(false);
928
	}
929

    
930
	protected void setEnabled(boolean enabled, Color background) {
931

    
932
		for(AbstractGroupedContainer groupedContainer : getGroupedContainers()){
933
			groupedContainer.setEnabled(enabled);
934
		}
935

    
936
		// send an empty selection to the current provider - TODO only on error ???
937
		if (!enabled) {
938
			getManagedForm().setInput(null);
939

    
940
			for (AbstractGroupedContainer groupedContainer : getGroupedContainers()) {
941
				groupedContainer.setBackground(background);
942
			}
943
		}
944
		getControl().setBackground(background);
945
	}
946

    
947
	@Override
948
	public void setEnabled(boolean enabled) {
949
		Color background =  AbstractUtility.getColor(enabled ? Resources.COLOR_COMPOSITE_BACKGROUND : Resources.COLOR_TEXT_DISABLED_BACKGROUND);
950
		setEnabled(enabled, background);
951
	}
952

    
953

    
954

    
955
}
    (1-1/1)