Fix state handling of save button/dirty flag for indirect edits(details)
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 4 May 2018 12:20:20 +0000 (14:20 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 4 May 2018 12:42:17 +0000 (14:42 +0200)
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/event/EventUtility.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmEditorViewPart.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/e4/AbstractCdmEditorPartE4.java
eu.etaxonomy.taxeditor.workbench/src/main/java/eu/etaxonomy/taxeditor/workbench/SaveHandler.java
eu.etaxonomy.taxeditor.workbench/src/main/java/eu/etaxonomy/taxeditor/workbench/WorkbenchUtility.java
eu.etaxonomy.taxeditor.workbench/src/main/java/eu/etaxonomy/taxeditor/workbench/part/ISelectionElementEditingPart.java

index 04cfc524297ac6f7752502a0f36bfc29be6de4ff..7836bf2c1de29b042c7aaec1287c8dbcb927de00 100644 (file)
@@ -8,8 +8,6 @@
 */
 package eu.etaxonomy.taxeditor.event;
 
-import java.util.Collection;
-
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -20,12 +18,10 @@ import org.eclipse.e4.core.services.events.IEventBroker;
 import org.eclipse.e4.ui.di.UIEventTopic;
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.services.IServiceConstants;
-import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.swt.widgets.Shell;
 
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
-import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 
 /**
  * @author pplitzner
@@ -98,17 +94,6 @@ public class EventUtility {
         return shell;
     }
 
-    public static MPart getActiveEditorPart(EPartService partService){
-        Collection<MPart> parts = partService.getParts();
-        for (MPart part : parts) {
-            if(part.getObject()!=null && part.getObject() instanceof IE4SavablePart
-                    && part.isVisible()){
-                return part;
-            }
-        }
-        return null;
-    }
-
 //    private EventHandler testHandler;
 //
 //    @Inject
index 9f941b16a8ce3a69232c0b3bf8bd9cc83a9d26b0..31842669591ea69b6798551b517f512d8c9f987d 100644 (file)
@@ -3,6 +3,7 @@
  */
 package eu.etaxonomy.taxeditor.view;
 
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.widgets.Composite;
@@ -104,8 +105,8 @@ public abstract class AbstractCdmEditorViewPart extends AbstractCdmViewPart impl
     }
 
     @Override
-    public Object getSelectionProvidingPart() {
-        return selectionProvidingPart;
+    public MPart getSelectionProvidingPart() {
+        return (MPart) selectionProvidingPart;
     }
 
 
index e720910e46f3894e7b28ad550e2d10275a792b4b..36aa2f2aa5cb55acd2fc38d6dd7a6b015559ca11 100644 (file)
@@ -38,7 +38,6 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
 import eu.etaxonomy.taxeditor.editor.IDistributionEditor;
 import eu.etaxonomy.taxeditor.editor.ITaxonEditor;
-import eu.etaxonomy.taxeditor.event.EventUtility;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
@@ -135,7 +134,7 @@ public abstract class AbstractCdmEditorPartE4
             @Optional@Named(IServiceConstants.ACTIVE_SELECTION)Object selection,
             @Optional@Named(IServiceConstants.ACTIVE_PART)MPart activePart,
             MPart thisPart, UISynchronize sync, EPartService partService){
-        if(activePart==thisPart && EventUtility.getActiveEditorPart(partService)==null){
+        if(activePart==thisPart && WorkbenchUtility.getActiveEditorPart(partService)==null){
             showEmptyPage();
             return;
         }
@@ -302,7 +301,7 @@ public abstract class AbstractCdmEditorPartE4
      * {@inheritDoc}
      */
     @Override
-    public Object getSelectionProvidingPart() {
+    public MPart getSelectionProvidingPart() {
         return selectionProvidingPart;
     }
 
index ae6a18e1255012f588f83b3942099590a88b5c52..ccb7eaa1c3c3a5ed3664d561a323ef0f5a72d202 100644 (file)
@@ -1,68 +1,44 @@
 
 package eu.etaxonomy.taxeditor.workbench;
 
-import java.util.Collections;
-
 import javax.inject.Named;
 
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.e4.core.commands.ECommandService;
-import org.eclipse.e4.core.commands.EHandlerService;
 import org.eclipse.e4.core.di.annotations.CanExecute;
 import org.eclipse.e4.core.di.annotations.Execute;
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.services.IServiceConstants;
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.internal.e4.compatibility.CompatibilityPart;
 
-import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
 import eu.etaxonomy.taxeditor.workbench.part.ISelectionElementEditingPart;
 
 public class SaveHandler {
 
-       @Execute
-       public void execute(EPartService partService, ECommandService commandService, EHandlerService handlerService
-               , @Named(IServiceConstants.ACTIVE_PART)MPart activePart) {
-           if(activePart.isDirty()){
-               savePart(partService, commandService, handlerService, activePart);
-           } else {
-            Object e4WrappedPart = WorkbenchUtility.getE4WrappedPart(activePart.getObject());
-            if(e4WrappedPart instanceof ISelectionElementEditingPart){
-                ISelectionElementEditingPart editingPart = (ISelectionElementEditingPart)e4WrappedPart;
-                Object savablePart = WorkbenchUtility.findSavablePart(editingPart);
-                if(savablePart instanceof ISaveablePart){
-                    ((ISaveablePart) savablePart).doSave(new NullProgressMonitor());
-                }
-                else if(savablePart instanceof IE4SavablePart){
-                    ((IE4SavablePart) savablePart).save(new NullProgressMonitor());
-                }
-                else if(savablePart instanceof MPart){
-                    savePart(partService, commandService, handlerService, (MPart) savablePart);
-                }
-            }
+    @CanExecute
+    public boolean canExecute(EPartService partService) {
+        MPart activePart = partService.getActivePart();
+        if(activePart==null){
+            return false;
         }
-       }
-
-       private void savePart(EPartService partService, ECommandService commandService, EHandlerService handlerService,
-            MPart mPart) {
-        if(mPart.getObject() instanceof CompatibilityPart){
-            //FIXME E4 remove when fully migrated
-            Command command = commandService.getCommand("org.eclipse.ui.file.save");
-            ParameterizedCommand parameterizedCommand = ParameterizedCommand.generateCommand(command, Collections.EMPTY_MAP);
-            handlerService.executeHandler(parameterizedCommand);
-        }
-        else{
-            partService.savePart(mPart, false);
+        boolean isSavable = activePart.isDirty();
+        if(!isSavable){
+            if(activePart.getObject() instanceof ISelectionElementEditingPart){
+                MPart savablePart = WorkbenchUtility.findSavablePart((ISelectionElementEditingPart) activePart.getObject());
+                isSavable = savablePart.isDirty();
+            }
         }
+        return isSavable;
     }
 
 
-       @CanExecute
-       public boolean canExecute(EPartService partService) {
-           return !partService.getDirtyParts().isEmpty();
-       }
+           @Execute
+           void execute(EPartService partService, @Named(IServiceConstants.ACTIVE_PART) MPart part) {
+               if(part.isDirty()){
+                   partService.savePart(part, false);
+               }
+               else if(part.getObject() instanceof ISelectionElementEditingPart){
+                   MPart savablePart = WorkbenchUtility.findSavablePart((ISelectionElementEditingPart) part.getObject());
+                   partService.savePart(savablePart, false);
+               }
+           }
 
 }
\ No newline at end of file
index 31c267a5a1dccefa5844b695638333195462a01c..4508e52332048fc0b6d959368e7a6e25462c52db 100644 (file)
@@ -10,6 +10,7 @@ package eu.etaxonomy.taxeditor.workbench;
 
 import java.io.File;
 import java.net.URL;
+import java.util.Collection;
 import java.util.List;
 
 import org.eclipse.core.runtime.Platform;
@@ -20,6 +21,7 @@ import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
 import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.swt.program.Program;
 
 import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
@@ -33,6 +35,17 @@ import eu.etaxonomy.taxeditor.workbench.part.ISelectionElementEditingPart;
  */
 public class WorkbenchUtility {
 
+    public static MPart getActiveEditorPart(EPartService partService){
+        Collection<MPart> parts = partService.getParts();
+        for (MPart part : parts) {
+            if(part.getObject()!=null && part.getObject() instanceof IE4SavablePart
+                    && part.isVisible()){
+                return part;
+            }
+        }
+        return null;
+    }
+
     /**
      * Checks if the activePart is an E4 wrapper for a legacy part and returns
      * that part
@@ -61,12 +74,12 @@ public class WorkbenchUtility {
         return baseLocation;
     }
 
-    public static Object findSavablePart(ISelectionElementEditingPart part){
-        Object selectionProvidingPart = getE4WrappedPart(part.getSelectionProvidingPart());
-        if(selectionProvidingPart instanceof ISelectionElementEditingPart){
-            return findSavablePart((ISelectionElementEditingPart) selectionProvidingPart);
-        }
-        else if(selectionProvidingPart instanceof IE4SavablePart || selectionProvidingPart instanceof MPart){
+    public static MPart findSavablePart(ISelectionElementEditingPart part){
+        MPart selectionProvidingPart = part.getSelectionProvidingPart();
+        if(selectionProvidingPart!=null){
+            if(selectionProvidingPart.getObject() instanceof ISelectionElementEditingPart){
+                return findSavablePart((ISelectionElementEditingPart) selectionProvidingPart);
+            }
             return selectionProvidingPart;
         }
         return null;
index 9357405feac1f5e307b5b2b27690152e0dfd5b16..813a5dc009f7fb912ff04fd58a67834efd57cf94 100644 (file)
@@ -8,6 +8,8 @@
 */
 package eu.etaxonomy.taxeditor.workbench.part;
 
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+
 /**
  * Classes implementing this interface should be parts that edit elements
  * coming from other parts via a selection change
@@ -28,6 +30,6 @@ public interface ISelectionElementEditingPart {
      * Returns the part that has provided the last selection
      * @return the selection providing part
      */
-    public Object getSelectionProvidingPart();
+    public MPart getSelectionProvidingPart();
 
 }