diff options
author | Juergen Haug | 2019-10-19 23:12:50 +0000 |
---|---|---|
committer | Juergen Haug | 2019-10-22 08:40:39 +0000 |
commit | d97ffc5ca227d18b7ec08d7548362894233f296d (patch) | |
tree | 92754a6c5d2220b5473e95f24a73ebb6d9c803a5 /plugins/org.eclipse.etrice.ui.common.base | |
parent | 0327d439a3964c16ef650d251c8599d2830ab452 (diff) | |
download | org.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')
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; - } } |