Merge branch 'develop' into feature/cdm-4.7
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / handler / CreateFieldUnitHandler.java
1
2 package eu.etaxonomy.taxeditor.editor.view.derivate.handler;
3
4 import javax.inject.Named;
5
6 import org.eclipse.e4.core.di.annotations.CanExecute;
7 import org.eclipse.e4.core.di.annotations.Execute;
8 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
9 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
10 import org.eclipse.e4.ui.services.IServiceConstants;
11
12 import eu.etaxonomy.cdm.api.service.IOccurrenceService;
13 import eu.etaxonomy.cdm.api.service.ITaxonService;
14 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
15 import eu.etaxonomy.cdm.model.common.CdmBase;
16 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
17 import eu.etaxonomy.cdm.model.description.TaxonDescription;
18 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
19 import eu.etaxonomy.cdm.model.taxon.Taxon;
20 import eu.etaxonomy.taxeditor.editor.AppModelId;
21 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
22 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
23 import eu.etaxonomy.taxeditor.model.MessagingUtils;
24 import eu.etaxonomy.taxeditor.store.CdmStore;
25
26 public class CreateFieldUnitHandler {
27
28 @Execute
29 public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part, MHandledMenuItem item) {
30 DerivateView derivateView = (DerivateView) part.getObject();
31 if(item.getElementId().equals(AppModelId.HANDLEDMENUITEM_EU_ETAXONOMY_TAXEDITOR_EDITOR_HANDLEDMENUITEM_CREATE_FIELD_UNIT_FOR_TAXON)){
32 Object selectionInput = derivateView.getSelectionInput();
33 if(selectionInput instanceof CdmBase && ((CdmBase) selectionInput).isInstanceOf(Taxon.class)){
34 final Taxon taxon = HibernateProxyHelper.deproxy(CdmStore.getService(ITaxonService.class).load(((CdmBase)selectionInput).getUuid()), Taxon.class);
35 if(derivateView.isDirty()){
36 MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
37 return;
38 }
39
40 FieldUnit fieldUnit = FieldUnit.NewInstance();
41 fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class);
42 IndividualsAssociation association = IndividualsAssociation.NewInstance(fieldUnit);
43 TaxonDescription description;
44 if(!taxon.getDescriptions().isEmpty()){
45 description = taxon.getDescriptions().iterator().next();
46 }
47 else{
48 description = TaxonDescription.NewInstance(taxon);
49 }
50 description.addElement(association);
51 CdmStore.getService(ITaxonService.class).merge(taxon);
52
53
54 derivateView.getConversationHolder().commit();
55 derivateView.addFieldUnit(fieldUnit);
56 derivateView.refreshTree(fieldUnit);
57 }
58 }
59 else{
60 if(derivateView.isDirty()){
61 MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION);
62 return;
63 }
64 FieldUnit fieldUnit = FieldUnit.NewInstance();
65 fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class);
66 derivateView.getConversationHolder().commit();
67 derivateView.addFieldUnit(fieldUnit);
68 derivateView.updateRootEntities();
69 derivateView.refreshTree(fieldUnit);
70 }
71 }
72
73
74 @CanExecute
75 public boolean canExecute(@Named(IServiceConstants.ACTIVE_PART) MPart part, MHandledMenuItem item) {
76 DerivateView derivateView = (DerivateView) part.getObject();
77 boolean listenToSelectionChange = derivateView.isListenToSelectionChange();
78 setItemVisibility(item, listenToSelectionChange);
79 if(listenToSelectionChange &&
80 item.getElementId().equals(AppModelId.HANDLEDMENUITEM_EU_ETAXONOMY_TAXEDITOR_EDITOR_HANDLEDMENUITEM_CREATE_FIELD_UNIT_FOR_TAXON)){
81 Object selectionInput = derivateView.getSelectionInput();
82 if(selectionInput instanceof CdmBase && ((CdmBase) selectionInput).isInstanceOf(Taxon.class)){
83 final Taxon taxon = HibernateProxyHelper.deproxy(CdmStore.getService(ITaxonService.class).load(((CdmBase)selectionInput).getUuid()), Taxon.class);
84 item.setLabel(String.format(Messages.CreateFieldUnitContextMenu_CREATE_FIELD_UNIT_FOR, taxon.getName()));
85 }
86 }
87 return true;
88 }
89
90
91 private void setItemVisibility(MHandledMenuItem item, boolean isListeningToSelectionChange) {
92 if(item.getElementId().equals(AppModelId.HANDLEDMENUITEM_EU_ETAXONOMY_TAXEDITOR_EDITOR_HANDLEDMENUITEM_CREATEFIELDUNIT)){
93 item.setVisible(!isListeningToSelectionChange);
94 }
95 else{
96 item.setVisible(isListeningToSelectionChange);
97 }
98 }
99
100 }