diff options
| author | Florian Barbin | 2018-11-16 15:55:05 +0000 |
|---|---|---|
| committer | Florian Barbin | 2018-11-23 14:04:42 +0000 |
| commit | 7f8dfd96be7ce7449b2a19357d84a6a4f7e2fe8f (patch) | |
| tree | 0f93e8c9272747a625b5045b1c774d588094c693 | |
| parent | fc668519489a5c2d7b5702ea83664e6b8512b624 (diff) | |
| download | org.eclipse.sirius-7f8dfd96be7ce7449b2a19357d84a6a4f7e2fe8f.tar.gz org.eclipse.sirius-7f8dfd96be7ce7449b2a19357d84a6a4f7e2fe8f.tar.xz org.eclipse.sirius-7f8dfd96be7ce7449b2a19357d84a6a4f7e2fe8f.zip | |
[507064] Catch CCE and NPE at diagram opening.
* Sometimes, the GMF model can be unsynchronized with the Sirius one. In
that case, a ClassCastException or an NPE can occurs during the edit
parts creation. We now catch those exceptions and invite the end user to
refresh his diagram.
Bug: 507064
Change-Id: If769c303924da47a27454db09b5efd26f296e3ac
Signed-off-by: Florian Barbin <florian.barbin@obeo.fr>
3 files changed, 48 insertions, 26 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties index 1843e5888f..973f3870e2 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/plugin.properties +++ b/plugins/org.eclipse.sirius.diagram.ui/plugin.properties @@ -830,6 +830,8 @@ CustomTreeSelectionDialog_regexpTitle = Filter elements by name CustomTreeSelectionDialog_regexpTooltip = Expression that will be used to filer elements by name (for example 'abc', 'a?c', '*c'...) CustomTreeSelectionDialog_showLabelText = Show CustomTreeSelectionDialog_uncheckAllButtonTooltip = Uncheck All +DDiagramEditorImpl_diagramRefreshTitle = Refresh the diagram +DDiagramEditorImpl_shouldWeRefreshQuestion = This diagram needs to be refreshed before opening. Would you like to refresh it now? DDiagramEditorImpl_editorToBeClosedAndReopenedSinceContentIsNotAccessible={0}\nContent access has failed at editor opening, you can try to reopen this editor. DDiagramEditorImpl_cdoServerConnectionPbMsg = Error while connecting to remote CDO server DDiagramEditorImpl_noAssociatedGMFDiagramMsg = The gmf diagram is expected to be created before calling setInput() on the editor diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java index 27180bf6b7..ec606a3e50 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java @@ -86,6 +86,7 @@ import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.AbstractInformationControlManager; @@ -130,8 +131,8 @@ import org.eclipse.sirius.diagram.ui.business.api.view.SiriusGMFHelper; import org.eclipse.sirius.diagram.ui.business.internal.command.RefreshDiagramOnOpeningCommand; import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart; import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramNameEditPart; -import org.eclipse.sirius.diagram.ui.edit.internal.part.listener.RepresentationLinkPostCommitListener; import org.eclipse.sirius.diagram.ui.edit.internal.part.listener.DiagramHeaderPostCommitListener; +import org.eclipse.sirius.diagram.ui.edit.internal.part.listener.RepresentationLinkPostCommitListener; import org.eclipse.sirius.diagram.ui.edit.internal.part.listener.SynchronizedStatusPostCommitListener; import org.eclipse.sirius.diagram.ui.edit.internal.part.listener.VisibilityPostCommitListener; import org.eclipse.sirius.diagram.ui.internal.refresh.SiriusDiagramSessionEventBroker; @@ -558,35 +559,48 @@ public class DDiagramEditorImpl extends SiriusDiagramEditor implements DDiagramE @Override public void createPartControl(Composite parent) { - super.createPartControl(parent); - // Display the status message to inform user about reason why the - // session opening failed - if (session == null && getEditorInput() instanceof SessionEditorInput) { - SessionEditorInput sessionEditorInput = (SessionEditorInput) getEditorInput(); - IStatus status = sessionEditorInput.getStatus(); - if (status.getSeverity() >= IStatus.ERROR) { - RootEditPart rootEditPart = getGraphicalViewer().getRootEditPart(); - if (rootEditPart instanceof LayerManager) { - LayerManager layerManager = (LayerManager) rootEditPart; - IFigure layer = layerManager.getLayer(LayerConstants.PRINTABLE_LAYERS); - String message = MessageFormat.format(Messages.DDiagramEditorImpl_editorToBeClosedAndReopenedSinceContentIsNotAccessible, status.getMessage()); - layer.add(new Label(message)); + try { + super.createPartControl(parent); + // Display the status message to inform user about reason why the + // session opening failed + if (session == null && getEditorInput() instanceof SessionEditorInput) { + SessionEditorInput sessionEditorInput = (SessionEditorInput) getEditorInput(); + IStatus status = sessionEditorInput.getStatus(); + if (status.getSeverity() >= IStatus.ERROR) { + RootEditPart rootEditPart = getGraphicalViewer().getRootEditPart(); + if (rootEditPart instanceof LayerManager) { + LayerManager layerManager = (LayerManager) rootEditPart; + IFigure layer = layerManager.getLayer(LayerConstants.PRINTABLE_LAYERS); + String message = MessageFormat.format(Messages.DDiagramEditorImpl_editorToBeClosedAndReopenedSinceContentIsNotAccessible, status.getMessage()); + layer.add(new Label(message)); + } + return; } - return; } - } - if (getEditingDomain() != null) { - tabbarPostCommitListener = new TabbarRefresher(getEditingDomain()); - visibilityPostCommitListener = new VisibilityPostCommitListener(getDiagramEditPart()); - statusBarPostCommitListener = new SynchronizedStatusPostCommitListener(this); - linkNotePostCommitListener = new RepresentationLinkPostCommitListener(this); - if (isHeaderSectionEnabled()) { - diagramHeaderPostCommitListener = new DiagramHeaderPostCommitListener(getEditingDomain(), getDiagramHeader()); + if (getEditingDomain() != null) { + tabbarPostCommitListener = new TabbarRefresher(getEditingDomain()); + visibilityPostCommitListener = new VisibilityPostCommitListener(getDiagramEditPart()); + statusBarPostCommitListener = new SynchronizedStatusPostCommitListener(this); + linkNotePostCommitListener = new RepresentationLinkPostCommitListener(this); + if (isHeaderSectionEnabled()) { + diagramHeaderPostCommitListener = new DiagramHeaderPostCommitListener(getEditingDomain(), getDiagramHeader()); + } + // Update palette : should be hidden if diagram is not editable + if (!getPermissionAuthority().canEditInstance(getRepresentation())) { + notify(REPRESENTATION_EDITION_PERMISSION_DENIED); + } } - // Update palette : should be hidden if diagram is not editable - if (!getPermissionAuthority().canEditInstance(getRepresentation())) { - notify(REPRESENTATION_EDITION_PERMISSION_DENIED); + } catch (ClassCastException | NullPointerException e) { + + Boolean response = MessageDialog.openConfirm(parent.getShell(), Messages.DDiagramEditorImpl_diagramRefreshTitle, Messages.DDiagramEditorImpl_shouldWeRefreshQuestion); + close(false); + if (response) { + launchRefresh(true); + DRepresentation currentDRepresentation = getRepresentation(); + Display.getCurrent().asyncExec(() -> { + DialectUIManager.INSTANCE.openEditor(session, currentDRepresentation, new NullProgressMonitor()); + }); } } } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java index 76f7e584cd..c2b50292b3 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src/org/eclipse/sirius/diagram/ui/provider/Messages.java @@ -246,6 +246,9 @@ public final class Messages { public static String CustomTreeSelectionDialog_uncheckAllButtonTooltip; @TranslatableMessage + public static String DDiagramEditorImpl_diagramRefreshTitle; + + @TranslatableMessage public static String DDiagramEditorImpl_editorToBeClosedAndReopenedSinceContentIsNotAccessible; @TranslatableMessage @@ -264,6 +267,9 @@ public final class Messages { public static String DDiagramEditorImpl_refreshJobLabel; @TranslatableMessage + public static String DDiagramEditorImpl_shouldWeRefreshQuestion; + + @TranslatableMessage public static String DeactivateBehaviorToolsCommand_label; @TranslatableMessage |
