Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2019-10-19 23:12:50 +0000
committerJuergen Haug2019-10-22 08:40:39 +0000
commitd97ffc5ca227d18b7ec08d7548362894233f296d (patch)
tree92754a6c5d2220b5473e95f24a73ebb6d9c803a5 /plugins/org.eclipse.etrice.ui.common.base
parent0327d439a3964c16ef650d251c8599d2830ab452 (diff)
downloadorg.eclipse.etrice-d97ffc5ca227d18b7ec08d7548362894233f296d.tar.gz
org.eclipse.etrice-d97ffc5ca227d18b7ec08d7548362894233f296d.tar.xz
org.eclipse.etrice-d97ffc5ca227d18b7ec08d7548362894233f296d.zip
Bug 550882 - [diagram] diagram close with "don't save" does not work
* fixed cancel * refactoring Change-Id: I602a3d3fb30a58ee338e7bb59ac06943b06003a5
Diffstat (limited to 'plugins/org.eclipse.etrice.ui.common.base')
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/plugin.xml3
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/CustomPersistencyBehavior.java18
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java28
-rw-r--r--plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/SaveOnFocusLostListener.java87
4 files changed, 74 insertions, 62 deletions
diff --git a/plugins/org.eclipse.etrice.ui.common.base/plugin.xml b/plugins/org.eclipse.etrice.ui.common.base/plugin.xml
index 2531c1c06..5b1071cd9 100644
--- a/plugins/org.eclipse.etrice.ui.common.base/plugin.xml
+++ b/plugins/org.eclipse.etrice.ui.common.base/plugin.xml
@@ -7,6 +7,9 @@
<startup
class="org.eclipse.etrice.ui.common.base.concurrency.ConcurrentModificationObserver$Initializer">
</startup>
+ <startup
+ class="org.eclipse.etrice.ui.common.base.editor.SaveOnFocusLostListener">
+ </startup>
</extension>
<extension
point="org.eclipse.ltk.core.refactoring.renameParticipants">
diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/CustomPersistencyBehavior.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/CustomPersistencyBehavior.java
index f1d57252a..c9dae7be0 100644
--- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/CustomPersistencyBehavior.java
+++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/CustomPersistencyBehavior.java
@@ -24,18 +24,15 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.etrice.ui.common.base.UIBaseActivator;
-import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
import org.eclipse.graphiti.ui.editor.DiagramBehavior;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.resource.SaveOptions;
import org.eclipse.xtext.resource.XtextResource;
@@ -49,20 +46,12 @@ import com.google.common.collect.Lists;
import com.google.inject.Inject;
public class CustomPersistencyBehavior extends DefaultPersistencyBehavior {
-
- private SaveOnFocusLostListener saveOnFocusListener;
public CustomPersistencyBehavior(DiagramBehavior diagramBehavior) {
super(diagramBehavior);
}
@Override
- public Diagram loadDiagram(URI uri) {
- saveOnFocusListener = new SaveOnFocusLostListener((IEditorPart)diagramBehavior.getDiagramContainer().getWorkbenchPart());
- return super.loadDiagram(uri);
- }
-
- @Override
protected Map<Resource, Map<?, ?>> createSaveOptions() {
// save options for xtext: activate formatting
SaveOptions xtextSaveOptions = SaveOptions.newBuilder().format().getOptions();
@@ -83,12 +72,9 @@ public class CustomPersistencyBehavior extends DefaultPersistencyBehavior {
public void saveDiagram(IProgressMonitor monitor) {
boolean valid = validateResourcesBeforeSave(monitor);
- if (valid)
+ if (valid) {
super.saveDiagram(monitor);
-
- // deactivate saveOnFocus for better usability
- // avoid retrigger loop from message box
- saveOnFocusListener.setActive(valid);
+ }
}
protected boolean validateResourcesBeforeSave(final IProgressMonitor monitor){
diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java
index 9674a3860..9f009caf8 100644
--- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java
+++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/DiagramEditorBase.java
@@ -19,6 +19,7 @@ import static org.eclipse.ui.PlatformUI.getWorkbench;
import java.util.Collection;
import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
@@ -26,6 +27,7 @@ import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.etrice.core.common.ui.editor.ISaveOnFocusLostEditor;
+import org.eclipse.etrice.core.common.ui.editor.SaveDialogEditor;
import org.eclipse.etrice.core.common.ui.linking.GlobalNonPlatformURIEditorOpener;
import org.eclipse.etrice.core.fsm.fSM.ModelComponent;
import org.eclipse.etrice.core.fsm.ui.FSMUiModule;
@@ -64,7 +66,8 @@ public abstract class DiagramEditorBase extends DiagramEditor implements IInputU
private SuperClassListener superClassListener;
- private boolean isClosing = false;
+ private SaveDialogEditor saveDialog = new SaveDialogEditor();
+ private boolean lastSaveFailed = false;
public DiagramEditorBase(Object textEditorClass) {
this.textEditorClass = textEditorClass;
@@ -108,6 +111,7 @@ public abstract class DiagramEditorBase extends DiagramEditor implements IInputU
*/
@Override
public void setFocus() {
+ lastSaveFailed = false;
if (getGraphicalViewer() == null) {
return;
}
@@ -259,12 +263,24 @@ public abstract class DiagramEditorBase extends DiagramEditor implements IInputU
@Override
public int promptToSaveOnClose() {
- isClosing = true;
- return DEFAULT;
+ return saveDialog.open(getGraphicalControl().getShell(), getPartName());
}
-
- public boolean isClosing() {
- return isClosing;
+
+ @Override
+ public boolean shouldSaveOnFocusLost() {
+ // lastSaveFailed is heuristic to avoid unsuccessful re-save
+ // TODO implement IValidatingEditor
+ return saveDialog.getResult() != NO && !lastSaveFailed && isDirty();
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ super.doSave(monitor);
+
+ // avoid auto re-save
+ lastSaveFailed = isDirty();
+ // do not quit editor if save failed but was requested by user explicitly
+ monitor.setCanceled(lastSaveFailed && saveDialog.getResult() == YES);
}
}
diff --git a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/SaveOnFocusLostListener.java b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/SaveOnFocusLostListener.java
index 8b6cf8913..a6ef08db3 100644
--- a/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/SaveOnFocusLostListener.java
+++ b/plugins/org.eclipse.etrice.ui.common.base/src/org/eclipse/etrice/ui/common/base/editor/SaveOnFocusLostListener.java
@@ -14,75 +14,82 @@
package org.eclipse.etrice.ui.common.base.editor;
+import static org.eclipse.etrice.ui.common.base.UIBaseActivator.PLUGIN_ID;
+
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
import org.eclipse.etrice.core.common.ui.editor.ISaveOnFocusLostEditor;
-import org.eclipse.etrice.ui.common.base.UIBaseActivator;
import org.eclipse.etrice.ui.common.base.preferences.UIBasePreferenceConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IStartup;
import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.statushandlers.StatusManager;
/**
- * @author Henrik Rentz-Reichert
- *
+ * Global listener in workbench for {@link ISaveOnFocusLostEditor }.
*/
-public class SaveOnFocusLostListener implements IPartListener {
-
- private final IEditorPart editor;
- private final IPreferenceStore store;
-
- private boolean isActive = true;
-
- @SuppressWarnings("unused")
- private boolean saveAfterCurrentCommand = false;
-
- public SaveOnFocusLostListener(IEditorPart editor) {
- this.editor = editor;
- this.store = UIBaseActivator.getDefault().getPreferenceStore();
- editor.getSite().getPage().addPartListener(this);
+public class SaveOnFocusLostListener implements IPartListener, IStartup {
+
+ @Override
+ public void earlyStartup() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ IPartService partService = (window != null) ? window.getPartService() : null;
+ if(partService != null) {
+ partService.addPartListener(this);
+ } else {
+ Status status = new Status(Status.ERROR, PLUGIN_ID, "Failed to register " + getClass().getSimpleName());
+ StatusManager.getManager().handle(status);
+ }
+
+ });
}
-
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
+ */
@Override
public void partActivated(IWorkbenchPart part) {
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+ */
@Override
public void partBroughtToTop(IWorkbenchPart part) {
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+ */
@Override
public void partClosed(IWorkbenchPart part) {
- if(part != editor)
- return;
-
- setActive(false);
- part.getSite().getPage().removePartListener(this);
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+ */
@Override
- public void partDeactivated(IWorkbenchPart part) {
- if (part != editor)
- return;
-
+ public void partDeactivated(IWorkbenchPart part) {
if (part instanceof ISaveOnFocusLostEditor) {
- if (((ISaveOnFocusLostEditor) part).isClosing()) {
- return;
+ ISaveOnFocusLostEditor editor = (ISaveOnFocusLostEditor) part;
+ boolean isPrefSave = Platform.getPreferencesService().getBoolean("org.eclipse.etrice.ui.common.base",
+ UIBasePreferenceConstants.SAVE_DIAG_ON_FOCUS_LOST, false, null);
+ if(isPrefSave && editor.shouldSaveOnFocusLost()) {
+ editor.doSave(new NullProgressMonitor());
}
}
-
- boolean isSaveOnFocus = store.getBoolean(UIBasePreferenceConstants.SAVE_DIAG_ON_FOCUS_LOST);
- if (isActive && isSaveOnFocus && editor.isDirty()) {
- editor.doSave(new NullProgressMonitor());
- }
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+ */
@Override
public void partOpened(IWorkbenchPart part) {
}
-
- public void setActive(boolean isActive){
- this.isActive = isActive;
- }
}

Back to the top