Merge branch 'release/3.12.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / TaxonNameEditor.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.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.name.container.AbstractGroup;
62 import eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer;
63 import eu.etaxonomy.taxeditor.editor.name.container.AcceptedGroup;
64 import eu.etaxonomy.taxeditor.editor.name.container.AcceptedNameContainer;
65 import eu.etaxonomy.taxeditor.editor.name.container.ContainerFactory;
66 import eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup;
67 import eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup;
68 import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDropTargetListener;
69 import eu.etaxonomy.taxeditor.model.AbstractUtility;
70 import eu.etaxonomy.taxeditor.model.IPartChangeListener;
71 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
72 import eu.etaxonomy.taxeditor.model.TaxeditorPartService;
73 import eu.etaxonomy.taxeditor.preference.Resources;
74 import eu.etaxonomy.taxeditor.security.RequiredPermissions;
75 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
76 import eu.etaxonomy.taxeditor.store.CdmStore;
77
78 /**
79 * <p>
80 * TaxonNameEditor class.
81 * </p>
82 *
83 * @author p.ciardelli
84 * @author n.hoffmann
85 * @created 15.05.2008
86 * @version 1.0
87 */
88 public class TaxonNameEditor extends EditorPart implements
89 IMultiPageTaxonEditorPage, IConversationEnabled,
90 IPartContentHasDetails, IPartChangeListener,
91 ISelectionListener, IDropTargetable, ISecuredEditor {
92
93 /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.taxon.name"</code> */
94 public static final String ID = "eu.etaxonomy.taxeditor.editor.taxon.name";
95
96 private Taxon taxon;
97
98 private ManagedForm managedForm;
99 private ScrolledForm scrolledForm;
100 private Composite parent;
101 private ISelectionProvider simpleSelectionProvider;
102
103 private final MultiPageTaxonEditor editor;
104
105 private TaxonBase selection;
106
107 private final ConversationHolder conversation;
108
109 private MenuManager menuManager;
110 private Menu menu;
111
112 private AcceptedGroup acceptedGroup;
113 private List<HomotypicalSynonymGroup> heterotypicSynonymGroups = new ArrayList<HomotypicalSynonymGroup>();
114 private MisappliedGroup misappliedGroup;
115
116 private DropTarget target;
117
118 private ISelectionService selectionService;
119
120 private TaxonBase objectAffectedByLastOperation;
121
122 private ICdmEntitySession cdmEntitySession;
123
124 /**
125 * <p>
126 * Constructor for TaxonNameEditor.
127 * </p>
128 *
129 * @param editor
130 * a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor}
131 * object.
132 */
133 public TaxonNameEditor(MultiPageTaxonEditor editor) {
134 this.editor = editor;
135 conversation = editor.getConversationHolder();
136 }
137
138 /**
139 * <p>
140 * getUndoContext
141 * </p>
142 *
143 * @return a {@link org.eclipse.core.commands.operations.IUndoContext}
144 * object.
145 */
146 public IUndoContext getUndoContext() {
147 return editor.getUndoContext();
148 }
149
150 /*
151 * (non-Javadoc)
152 *
153 * @see
154 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
155 * .Composite)
156 */
157 /** {@inheritDoc} */
158 @Override
159 public void createPartControl(Composite composite) {
160 selectionService = getSite().getWorkbenchWindow().getSelectionService();
161 selectionService.addSelectionListener(this);
162
163 createManagedForm(composite);
164
165 TaxeditorPartService.getInstance().addListener(
166 TaxeditorPartService.PART_ACTIVATED, this);
167 }
168
169 /**
170 * <p>
171 * createManagedForm
172 * </p>
173 *
174 * @param composite
175 * a {@link org.eclipse.swt.widgets.Composite} object.
176 */
177 protected void createManagedForm(Composite composite) {
178
179 managedForm = new ManagedForm(composite) {
180
181 @Override
182 public void dirtyStateChanged() {
183 firePropertyChange(PROP_DIRTY);
184 }
185
186 @Override
187 public boolean setInput(Object input) {
188 if (input instanceof AbstractGroupedContainer) {
189 selection = ((AbstractGroupedContainer) input).getData();
190 getSite().getSelectionProvider().setSelection(new StructuredSelection(selection));
191 }else if(input == null){
192 selection = null;
193 getSite().getSelectionProvider().setSelection(new StructuredSelection());
194 }
195
196
197 return super.setInput(input);
198 }
199 };
200
201 scrolledForm = managedForm.getForm();
202 parent = scrolledForm.getBody();
203
204 // register the context menu
205 menuManager = new MenuManager();
206 ISelectionProvider selectionProvider = getSite().getSelectionProvider();
207 getSite().registerContextMenu(TaxonNameEditor.ID, menuManager,
208 selectionProvider);
209
210 parent.setData(taxon);
211
212 TableWrapLayout layout = new TableWrapLayout();
213 layout.leftMargin = 0;
214 layout.rightMargin = 0;
215 layout.topMargin = 0;
216 layout.bottomMargin = 0;
217
218 layout.verticalSpacing = 0;
219 layout.horizontalSpacing = 0;
220
221 parent.setLayout(layout);
222 parent.setBackground(AbstractUtility
223 .getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
224
225 createOrUpdateNameComposites();
226
227 createDragSupport();
228
229 setFocus();
230 }
231
232 /**
233 * <p>
234 * createNameComposites
235 * </p>
236 */
237 public void createOrUpdateNameComposites() {
238 // this.taxon = (Taxon)CdmStore.getService(ITaxonService.class).load(this.getTaxon().getUuid());
239 ContainerFactory.createOrUpdateAcceptedTaxonsHomotypicGroup(this);
240 ContainerFactory.createOrUpdateHeterotypicSynonymyGroups(this);
241 ContainerFactory.createOrUpdateMisapplicationsGroup(this);
242
243
244 // Redraw composite
245 managedForm.reflow(true);
246 }
247
248 /**
249 * <p>
250 * Getter for the field <code>taxon</code>.
251 * </p>
252 *
253 * @return a {@link eu.etaxonomy.cdm.model.taxon.Taxon} object.
254 */
255 public Taxon getTaxon() {
256 return (Taxon) HibernateProxyHelper.deproxy(taxon);
257 }
258
259 /**
260 * <p>
261 * setDirty
262 * </p>
263 */
264 public void setDirty() {
265 managedForm.dirtyStateChanged();
266 }
267
268 /*
269 * (non-Javadoc)
270 *
271 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
272 */
273 /** {@inheritDoc} */
274 @Override
275 public void setFocus() {
276 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setFocus();
277 if (getSelectedContainer() == null) {
278 throw new IllegalStateException(
279 "There should always be a selected object.");
280 }
281 getSelectedContainer().setSelected();
282
283 // check permissions
284 boolean doEnable = permissionsSatisfied();
285 setEnabled(doEnable);
286 }
287
288 /* (non-Javadoc)
289 * @see eu.etaxonomy.taxeditor.editor.name.ISecuredEditorPart#permissionsSatisfied()
290 */
291 @Override
292 public boolean permissionsSatisfied() {
293 TaxonNode taxonNode = ((TaxonEditorInput)getEditorInput()).getTaxonNode();
294 boolean doEnable = CdmStore.currentAuthentiationHasPermission(taxonNode, RequiredPermissions.TAXONNODE_EDIT);
295 return doEnable;
296 }
297
298 /** {@inheritDoc} */
299 @Override
300 public void setInput(IEditorInput input) {
301 this.setInputWithNotify(input);
302 }
303
304 /*
305 * (non-Javadoc)
306 *
307 * @see
308 * eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder
309 * ()
310 */
311 /**
312 * <p>
313 * getConversationHolder
314 * </p>
315 *
316 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
317 * object.
318 */
319 @Override
320 public ConversationHolder getConversationHolder() {
321 return conversation;
322 }
323
324 /*
325 * (non-Javadoc)
326 *
327 * @see
328 * eu.etaxonomy.cdm.persistence.hibernate.ICdmPostCrudObserver#update(eu
329 * .etaxonomy.cdm.persistence.hibernate.CdmCrudEvent)
330 */
331 /** {@inheritDoc} */
332 @Override
333 public void update(CdmDataChangeMap events) {
334 // redraw();
335 }
336
337 /**
338 * Redraws this editor return true on success
339 *
340 * @return a boolean.
341 */
342 @Override
343 public boolean redraw() {
344 return redraw(true);
345 }
346
347 /**
348 * {@inheritDoc}
349 *
350 * Redraws the editor controls
351 */
352 @Override
353 public boolean redraw(boolean focus) {
354
355 createOrUpdateNameComposites();
356
357 if (focus) {
358 setFocus();
359 }
360
361 return true;
362 }
363
364 /**
365 * <p>
366 * getMultiPageTaxonEditor
367 * </p>
368 *
369 * @return a {@link eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor}
370 * object.
371 */
372 public MultiPageTaxonEditor getMultiPageTaxonEditor() {
373 return editor;
374 }
375
376 /*
377 * (non-Javadoc)
378 *
379 * @see
380 * eu.etaxonomy.taxeditor.store.operations.IPostOperationEnabled#postOperation
381 * ()
382 */
383 /** {@inheritDoc} */
384 @Override
385 public boolean postOperation(CdmBase objectAffectedByOperation) {
386
387 editor.changed(objectAffectedByOperation);
388
389 redraw(false);
390
391 if (objectAffectedByOperation instanceof TaxonBase) {
392 objectAffectedByLastOperation = (TaxonBase) objectAffectedByOperation;
393 }
394
395 return true;
396 }
397
398 /**
399 * <p>
400 * Getter for the field <code>managedForm</code>.
401 * </p>
402 *
403 * @return the managedForm
404 */
405 public ManagedForm getManagedForm() {
406 return managedForm;
407 }
408
409 /**
410 * <p>
411 * getControl
412 * </p>
413 *
414 * @return a {@link org.eclipse.swt.widgets.Composite} object.
415 */
416 @Override
417 public Composite getControl() {
418 return this.getManagedForm().getForm().getBody();
419 }
420
421 /**
422 * <p>
423 * Getter for the field <code>menu</code>.
424 * </p>
425 *
426 * @return the menu
427 */
428 public Menu getMenu() {
429 if (menu == null || menu.isDisposed()) {
430 // Creating the menu because it was either not initialised or
431 // disposed while refreshing the editor
432 menu = menuManager.createContextMenu(parent);
433 }
434 return menu;
435 }
436
437 /**
438 * <p>
439 * checkForEmptyNames
440 * </p>
441 *
442 * @return true if there are empty names
443 */
444 public boolean checkForEmptyNames() {
445 for (AbstractGroupedContainer container : getGroupedContainers()) {
446 if (container.getName() == null
447 || StringUtils.isEmpty(container.getName().getTitleCache())) {
448 return true;
449 }
450 }
451 return false;
452 }
453
454 public Set<AbstractGroupedContainer> getEmptyContainers() {
455 Set<AbstractGroupedContainer> containersWithEmptyNames = new HashSet<AbstractGroupedContainer>();
456
457 for (AbstractGroupedContainer container : getGroupedContainers()) {
458 if (container.getName() == null
459 || StringUtils.isEmpty(container.getName().getTitleCache())) {
460 containersWithEmptyNames.add(container);
461 }
462 }
463
464 return containersWithEmptyNames;
465 }
466
467 /** {@inheritDoc} */
468 @Override
469 public void doSave(IProgressMonitor monitor) {
470
471 monitor.beginTask("Saving names", getGroupedContainers().size());
472
473 try {
474 // check for empty names
475 for (AbstractGroupedContainer container : getGroupedContainers()) {
476
477 monitor.subTask("Saving composite: "
478 + container.getTaxonBase().getTitleCache());
479 container.persistName();
480
481 // In case the progress monitor was canceled throw an exception.
482 if (monitor.isCanceled()) {
483 throw new OperationCanceledException();
484 }
485
486 // Otherwise declare this step as done.
487 monitor.worked(1);
488 }
489 } finally {
490
491 // Stop the progress monitor.
492 monitor.done();
493 }
494
495 }
496
497 /** {@inheritDoc} */
498 @Override
499 public void doSaveAs() {
500 }
501
502 /** {@inheritDoc} */
503 @Override
504 public void init(IEditorSite site, IEditorInput input)
505 throws PartInitException {
506
507 if (!(input != null)) {
508 throw new PartInitException("Invalid Input: Must be IEditorInput");
509 }
510
511 if (input.getAdapter(Taxon.class) != null) {
512 taxon = CdmBase.deproxy(input.getAdapter(Taxon.class), Taxon.class);
513 } else {
514 throw new PartInitException("Invalid Input: Taxon cannot be null");
515 }
516
517 setSite(site);
518 setInput(input);
519
520 simpleSelectionProvider = new SimpleSelectionProvider();
521 getSite().setSelectionProvider(simpleSelectionProvider);
522 }
523
524
525 /**
526 *
527 */
528 private void createDragSupport() {
529 // Listen for names being dragged outside of existing homotypic groups -
530 // user wants to create a new group
531 Transfer[] types = new Transfer[] { CdmDataTransfer.getInstance() };
532 int operations = DND.DROP_MOVE;
533 if (target == null) {
534 target = new DropTarget(parent, operations);
535 target.setTransfer(types);
536 target.addDropListener(new NameEditorDropTargetListener(this));
537 }
538 }
539
540 /**
541 * <p>
542 * Getter for the field <code>acceptedNameContainer</code>.
543 * </p>
544 *
545 * @return a
546 * {@link eu.etaxonomy.taxeditor.editor.name.container.AcceptedNameContainer}
547 * object.
548 */
549 public AcceptedNameContainer getAcceptedNameContainer() {
550 return getAcceptedGroup().getAcceptedNameContainer();
551 }
552
553 /**
554 * <p>
555 * getSynonymGroup
556 * </p>
557 *
558 * @param homotypicalGroup
559 * a {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup} object.
560 * @return a
561 * {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
562 * object.
563 */
564 public HomotypicalSynonymGroup getHomotypicalGroupContainer(
565 HomotypicalGroup homotypicalGroup) {
566 for (HomotypicalSynonymGroup group : getHeterotypicSynonymGroups()) {
567 if (group.getGroup().equals(homotypicalGroup)) {
568 return group;
569 }
570 }
571
572 return null;
573 }
574
575 /**
576 * <p>
577 * getDirtyNames
578 * </p>
579 *
580 * @return a Set containing all composites that have been edited
581 */
582 public Set<AbstractGroupedContainer> getDirtyNames() {
583 Set<AbstractGroupedContainer> dirtyNames = new HashSet<AbstractGroupedContainer>();
584
585 for (AbstractGroupedContainer composite : getGroupedContainers()) {
586 if (composite.isDirty()) {
587 dirtyNames.add(composite);
588 }
589 }
590
591 return dirtyNames;
592 }
593
594 /**
595 * <p>
596 * getGroupedContainers
597 * </p>
598 *
599 * @return a {@link java.util.List} object.
600 */
601 public List<AbstractGroupedContainer> getGroupedContainers() {
602 List<AbstractGroupedContainer> groupedComposites = new ArrayList<AbstractGroupedContainer>();
603
604 for (AbstractGroup group : getAllGroups()) {
605 groupedComposites.addAll(group.getGroupedContainers());
606 }
607
608 return groupedComposites;
609 }
610
611 /**
612 * <p>
613 * getAllGroups
614 * </p>
615 *
616 * @return a {@link java.util.List} object.
617 */
618 public List<AbstractGroup> getAllGroups() {
619 List<AbstractGroup> allGroups = new ArrayList<AbstractGroup>();
620
621 allGroups.add(getAcceptedGroup());
622
623 // List<HomotypicalSynonymGroup> grps = getHeterotypicSynonymGroups(); // UNUSED => remove
624
625 heterotypicSynonymGroups = getHeterotypicSynonymGroups();
626
627 if (heterotypicSynonymGroups != null) {
628 allGroups.addAll(heterotypicSynonymGroups);
629 }
630
631 if (misappliedGroup != null) {
632 allGroups.add(misappliedGroup);
633 }
634
635 return allGroups;
636 }
637
638 /*
639 * (non-Javadoc)
640 *
641 * @see org.eclipse.ui.part.EditorPart#isDirty()
642 */
643 /** {@inheritDoc} */
644 @Override
645 public boolean isDirty() {
646 return editor.isDirty();
647 }
648
649 /*
650 * (non-Javadoc)
651 *
652 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
653 */
654 /** {@inheritDoc} */
655 @Override
656 public void dispose() {
657 conversation.unregisterForDataStoreChanges(this);
658 super.dispose();
659 }
660
661 /*
662 * (non-Javadoc)
663 *
664 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
665 */
666 /** {@inheritDoc} */
667 @Override
668 public boolean isSaveAsAllowed() {
669 return false;
670 }
671
672 /*
673 * (non-Javadoc)
674 *
675 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.
676 * IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
677 */
678 /** {@inheritDoc} */
679 @Override
680 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
681
682 }
683
684 /**
685 * <p>
686 * getNameEditor
687 * </p>
688 *
689 * @return a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor}
690 * object.
691 */
692 @Override
693 public TaxonNameEditor getEditor() {
694 return this;
695 }
696
697 /**
698 * <p>
699 * Getter for the field <code>selectedObject</code>.
700 * </p>
701 *
702 * @return a
703 * {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer}
704 * object.
705 */
706 public AbstractGroupedContainer getSelectedContainer() {
707
708 TaxonBase selectedTaxonBase = null;
709
710 TaxonEditorInput input = (TaxonEditorInput) editor.getEditorInput();
711 if (input.getInitiallySelectedTaxonBase() != null) {
712 selectedTaxonBase = input.getInitiallySelectedTaxonBase();
713 } else {
714 if (selection != null) {
715 selectedTaxonBase = selection;
716 }
717 }
718
719 return (selectedTaxonBase != null) ? getContainer(selectedTaxonBase)
720 : getAcceptedNameContainer();
721 }
722
723 /**
724 * <p>
725 * dragEntered
726 * </p>
727 */
728 @Override
729 public void dragEntered() {
730 // TODO change this
731 getControl().setBackground(
732 AbstractUtility.getColor(Resources.COLOR_DRAG_ENTER));
733 }
734
735 /**
736 * <p>
737 * dragLeft
738 * </p>
739 */
740 @Override
741 public void dragLeft() {
742 getControl().setBackground(
743 AbstractUtility.getColor(Resources.COLOR_COMPOSITE_BACKGROUND));
744 }
745
746
747 /**
748 * <p>
749 * setMisapplicationsGroup
750 * </p>
751 *
752 * @param misappliedGroup
753 * a
754 * {@link eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup}
755 * object.
756 */
757 public void setMisapplicationsGroup(MisappliedGroup misappliedGroup) {
758 this.misappliedGroup = misappliedGroup;
759 }
760
761 /*
762 * (non-Javadoc)
763 *
764 * @see
765 * eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#isRedrawing()
766 */
767 /**
768 * <p>
769 * isRedrawing
770 * </p>
771 *
772 * @return a boolean.
773 */
774 @Override
775 public boolean isRedrawing() {
776 return false;
777 }
778
779 /**
780 * <p>
781 * getToolkit
782 * </p>
783 *
784 * @return a {@link org.eclipse.ui.forms.widgets.FormToolkit} object.
785 */
786 public FormToolkit getToolkit() {
787 return managedForm.getToolkit();
788 }
789
790 /**
791 * <p>
792 * getHeterotypicSynonymGroups
793 * </p>
794 *
795 * @return a {@link java.util.List} object.
796 */
797 public List<HomotypicalSynonymGroup> getHeterotypicSynonymGroups() {
798 return heterotypicSynonymGroups;
799 }
800
801 /**
802 * <p>
803 * addHeterotypicSynonymGroup
804 * </p>
805 *
806 * @param group
807 * a
808 * {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
809 * object.
810 */
811 public void addHeterotypicSynonymGroup(HomotypicalSynonymGroup group) {
812 heterotypicSynonymGroups.add(group);
813 }
814
815 /**
816 * <p>
817 * getHomotypicSynonymGroup
818 * </p>
819 *
820 * @return a
821 * {@link eu.etaxonomy.taxeditor.editor.name.container.HomotypicalSynonymGroup}
822 * object.
823 */
824 public AcceptedGroup getAcceptedGroup() {
825 return acceptedGroup;
826 }
827
828 /**
829 *
830 * @param acceptedGroup
831 */
832 public void setAcceptedGroup(AcceptedGroup acceptedGroup) {
833 this.acceptedGroup = acceptedGroup;
834 }
835
836 /**
837 * <p>
838 * Getter for the field <code>misappliedGroup</code>.
839 * </p>
840 *
841 * @return a
842 * {@link eu.etaxonomy.taxeditor.editor.name.container.MisappliedGroup}
843 * object.
844 */
845 public MisappliedGroup getMisappliedGroup() {
846 return misappliedGroup;
847 }
848
849 // TODO not very useful at the moment
850 /**
851 * <p>
852 * isActive
853 * </p>
854 *
855 * @return a boolean.
856 */
857 public boolean isActive() {
858 IWorkbenchPart activePart = AbstractUtility.getActivePart();
859 return editor.equals(activePart);
860 }
861
862 /**
863 * <p>
864 * onComplete
865 * </p>
866 *
867 * @return a boolean.
868 */
869 @Override
870 public boolean onComplete() {
871 getContainer(objectAffectedByLastOperation).setSelected();
872 return true;
873 }
874
875 /** {@inheritDoc} */
876 @Override
877 public void partChanged(Integer eventType, IWorkbenchPartReference partRef) {
878 if (!partRef.getPart(false).equals(editor)) {
879 // getSelectedObject().colorSelected(AbstractGroupedContainer.SELECTED_NO_FOCUS);
880 }
881 }
882
883 /**
884 * @param retainedGroup
885 */
886 public void removeGroup(AbstractGroup group) {
887 if (group != null) {
888 group.dispose();
889
890 //if (heterotypicSynonymGroups != null) {
891 heterotypicSynonymGroups.remove(group);
892 //}
893 }
894 }
895
896 /**
897 * @param element
898 * @return
899 */
900 public AbstractGroupedContainer getContainer(TaxonBase taxonBase) {
901 List<AbstractGroupedContainer> groupedContainers = getGroupedContainers();
902 for (AbstractGroupedContainer container : groupedContainers) {
903 if (container.getData().equals(taxonBase)
904 && container.getNameViewer().getTextWidget() != null) {
905 return container;
906 }
907 }
908 return getAcceptedNameContainer();
909 }
910
911 /* (non-Javadoc)
912 * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#setOnError()
913 */
914 @Override
915 public void setOnError() {
916 Color disabledColor = AbstractUtility.getColor(Resources.COLOR_EDITOR_ERROR);
917 setEnabled(false, disabledColor);
918 }
919
920 /* (non-Javadoc)
921 * @see eu.etaxonomy.taxeditor.editor.IMultiPageTaxonEditorPage#setDisabled()
922 */
923 @Override
924 public void setDisabled(){
925 Color disabledColor = AbstractUtility.getColor(Resources.COLOR_TEXT_DISABLED_BACKGROUND);
926 setEnabled(false);
927 }
928
929 protected void setEnabled(boolean enabled, Color background) {
930
931 for(AbstractGroupedContainer groupedContainer : getGroupedContainers()){
932 groupedContainer.setEnabled(enabled);
933 }
934
935 // send an empty selection to the current provider - TODO only on error ???
936 if (!enabled) {
937 getManagedForm().setInput(null);
938
939 for (AbstractGroupedContainer groupedContainer : getGroupedContainers()) {
940 groupedContainer.setBackground(background);
941 }
942 }
943 getControl().setBackground(background);
944 }
945
946 @Override
947 public void setEnabled(boolean enabled) {
948 Color background = AbstractUtility.getColor(enabled ? Resources.COLOR_COMPOSITE_BACKGROUND : Resources.COLOR_TEXT_DISABLED_BACKGROUND);
949 setEnabled(enabled, background);
950 }
951
952
953
954 }