ref #7086 Add lifecycle methods to WS editor
authorPatrick Plitzner <p.plitzner@bgbm.org>
Thu, 30 Nov 2017 13:03:18 +0000 (14:03 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Thu, 30 Nov 2017 13:03:18 +0000 (14:03 +0100)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/WorkingSetEditor.java

index c899ff099fd35d56ccebb3767e3da420a3854849..f8c606b5712e1f74bf099bf811c5a5e2efcf000a 100644 (file)
 */
 package eu.etaxonomy.taxeditor.editor.workingSet;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.Persist;
+import org.eclipse.e4.ui.model.application.ui.MDirtyable;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
+import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
+import eu.etaxonomy.cdm.api.service.IWorkingSetService;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.description.FeatureTree;
 import eu.etaxonomy.cdm.model.description.WorkingSet;
+import eu.etaxonomy.cdm.model.location.NamedArea;
+import eu.etaxonomy.cdm.model.name.Rank;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.store.CdmStore;
 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
 /**
  * @author pplitzner
  * @since Nov 21, 2017
  *
  */
-public class WorkingSetEditor {
+public class WorkingSetEditor implements IE4SavablePart{
 
     private WorkingSetComposite composite;
 
+    private ConversationHolder conversation;
+
+    private WorkingSet workingSet;
+
+    @Inject
+    private MDirtyable dirty;
+
     @PostConstruct
     public void create(Composite parent, IEclipseContext context){
+        if(CdmStore.isActive() && conversation==null){
+            conversation = CdmStore.createConversation();
+        }
+        else{
+            return;
+        }
         CdmFormFactory cdmFormFactory = new CdmFormFactory(Display.getCurrent());
         ContextInjectionFactory.inject(cdmFormFactory, context);
         composite = new WorkingSetComposite(parent, SWT.NONE);
+        dirty.setDirty(true);
     }
 
     public void init(WorkingSet workingSet) {
+        this.workingSet = workingSet;
         composite.getTxt_label().setText(workingSet.getLabel());
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Persist
+    @Override
+    public void save(IProgressMonitor monitor) {
+        NamedArea area = composite.getArea();
+        Set<NamedArea> areas = new HashSet<>();
+        if(area!=null){
+            areas.add(area);
+        }
+        TaxonNode taxonNode = composite.getTaxonNode();
+        FeatureTree characters = composite.getCharacters();
+        DefinedTermBase rankMaxSelection = composite.getComboRankMax().getSelection();
+        Rank rankMax = null;
+        if(rankMaxSelection instanceof Rank){
+            rankMax = (Rank) rankMaxSelection;
+        }
+        DefinedTermBase rankMinSelection = composite.getComboRankMin().getSelection();
+        Rank rankMin = null;
+        if(rankMinSelection instanceof Rank){
+            rankMin = (Rank) rankMinSelection;
+        }
+
+        workingSet.setMaxRank(rankMax);
+        workingSet.setMinRank(rankMin);
+        workingSet.setDescriptiveSystem(characters);
+        workingSet.addTaxonSubtree(taxonNode);
+        workingSet.setGeoFilter(areas);
+
+        conversation.commit();
+        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
+
+        dirty.setDirty(false);
+    }
+
+    @Focus
+    public void setFocus(){
+        if(conversation!=null){
+            conversation.bind();
+        }
+    }
+
+    @PreDestroy
+    public void dispose(){
+        if(conversation!=null){
+            conversation.close();
+            conversation = null;
+        }
+    }
+
 }