ref #7086 Fix focus problem when saving
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / workingSet / WorkingSetEditor.java
index 56402f581f25c1f2893cb35f8ccf4dd24b9b008c..9abb7bdded91ac918193b92c1fa145e56a005476 100644 (file)
@@ -40,29 +40,27 @@ import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.api.service.IOccurrenceService;
 import eu.etaxonomy.cdm.api.service.ITermService;
 import eu.etaxonomy.cdm.api.service.IWorkingSetService;
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
-import eu.etaxonomy.cdm.model.description.SpecimenDescription;
 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.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
-import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 import eu.etaxonomy.taxeditor.store.CdmStore;
@@ -71,6 +69,7 @@ import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
 import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
 /**
+ * Editor for configuring WorkingSets
  * @author pplitzner
  * @since Nov 21, 2017
  *
@@ -117,21 +116,34 @@ IPartContentHasDetails, IDirtyMarkable {
         labelModifyListener = new ModifyListener() {
             @Override
             public void modifyText(ModifyEvent e) {
+                workingSet.setLabel(composite.getTxt_label().getText());
                 dirty.setDirty(true);
             }
         };
         composite.getRankMin().addSelectionChangedListener(event->dirty.setDirty(true));
         composite.getRankMax().addSelectionChangedListener(event->dirty.setDirty(true));
 
-        composite.getTextAreaText().addListener(SWT.MouseDown, event-> {
-            NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
-            if(area!=null){
-                composite.setArea(area);
+        composite.getBtnChooseArea().addSelectionListener(new SelectionAdapter() {
+
+            @Override
+            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+                NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
+                if(area!=null){
+                    composite.setArea(area);
+                }
+                dirty.setDirty(true);
             }
-            dirty.setDirty(true);
         });
+        composite.getBtnRemoveArea().addSelectionListener(new SelectionAdapter() {
 
-        composite.getFeatureTreeEditorComposite().init(null, null, e->selectionService.setSelection(e.getSelection()), null);
+            @Override
+            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+                composite.removeArea();
+                dirty.setDirty(true);
+            }
+        });
+
+        composite.getFeatureTreeEditorComposite().init(null, null, e->selectionService.setSelection(e.getSelection()), null, null);
 
         //add drag'n'drop support
         Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
@@ -142,9 +154,14 @@ IPartContentHasDetails, IDirtyMarkable {
             public void keyPressed(KeyEvent e) {
                 if(e.character==SWT.DEL){
                     IStructuredSelection selection = (IStructuredSelection) composite.getTaxonNodeTree().getSelection();
-                    Iterator<TaxonNode> iterator = selection.iterator();
+                    if(selection.toList().stream().anyMatch(object->!(object instanceof TaxonNode))){
+                        MessagingUtils.warningDialog(Messages.WorkingSetEditor_DELETE_FAIL_TITLE, this.getClass(), Messages.WorkingSetEditor_DELETE_FAIL_MESSAGE);
+                        return;
+                    }
+                    Iterator<Object> iterator = selection.iterator();
                     while(iterator.hasNext()){
-                        TaxonNode taxonNode = iterator.next();
+                        Object next = iterator.next();
+                        TaxonNode taxonNode = (TaxonNode) next;
                         removeTaxonNode(taxonNode);
                     }
                 }
@@ -155,8 +172,8 @@ IPartContentHasDetails, IDirtyMarkable {
 
     public void init(UUID workingSetUuid) {
         this.workingSet = CdmStore.getService(IWorkingSetService.class).load(workingSetUuid);
-        if(workingSet.getTitleCache()!=null){
-            composite.getTxt_label().setText(workingSet.getTitleCache());
+        if(workingSet.getLabel()!=null){
+            composite.getTxt_label().setText(workingSet.getLabel());
         }
         if(workingSet.getDescriptiveSystem()!=null){
             composite.setCharacters(workingSet.getDescriptiveSystem());
@@ -202,13 +219,11 @@ IPartContentHasDetails, IDirtyMarkable {
         Viewer taxonTreeViewer = getTaxonTreeViewer();
         Collection<TaxonNode> input = (Collection<TaxonNode>) taxonTreeViewer.getInput();
         input.remove(taxonNode);
+        workingSet.removeTaxonSubtree(taxonNode);
         taxonTreeViewer.setInput(input);
         dirty.setDirty(true);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Persist
     @Override
     public void save(IProgressMonitor monitor) {
@@ -225,22 +240,14 @@ IPartContentHasDetails, IDirtyMarkable {
                 if(taxonTreeNode instanceof TaxonNode){
                     TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
                     workingSet.addTaxonSubtree(taxonNode);
-                    if(taxonNode.getTaxon()!=null){
-                        Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
-                        Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
-                        for (SpecimenOrObservationBase specimen : specimens) {
-                            Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
-                            for (SpecimenDescription specimenDescription : specimenDescriptions) {
-                                workingSet.addDescription(specimenDescription);
-                            }
-                        }
-                    }
                 }
             }
         }
         FeatureTree characters = composite.getCharacters();
-        //save characters because they can be modified in this editor
-        characters.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true));
+        if(characters!=null){
+            //save characters because they can be modified in this editor
+            characters.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true));
+        }
 
 
         DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
@@ -265,7 +272,6 @@ IPartContentHasDetails, IDirtyMarkable {
         dirty.setDirty(false);
     }
 
-    /** {@inheritDoc} */
     @PreDestroy
     public void dispose() {
         if (conversation != null) {
@@ -279,9 +285,11 @@ IPartContentHasDetails, IDirtyMarkable {
         dirty.setDirty(false);
     }
 
-    /** {@inheritDoc} */
     @Focus
     public void setFocus() {
+        if(composite!=null){
+            composite.setFocus();
+        }
         if (getConversationHolder() != null) {
             getConversationHolder().bind();
         }
@@ -294,56 +302,39 @@ IPartContentHasDetails, IDirtyMarkable {
         return composite.getTaxonNodeTree();
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    public WorkingSet getWorkingSet() {
+        return workingSet;
+    }
+
     @Override
     public void update(CdmDataChangeMap arg0) {
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public ICdmEntitySession getCdmEntitySession() {
         return cdmEntitySession;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public Collection<WorkingSet> getRootEntities() {
         return null;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public Map<Object, List<String>> getPropertyPathsMap() {
         return null;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public ConversationHolder getConversationHolder() {
         return conversation;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void changed(Object element) {
         dirty.setDirty(true);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void forceDirty() {
         dirty.setDirty(true);