diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java index 75abe124d534..5d5bd7352019 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorPart.java @@ -21,6 +21,7 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PrintFigureOperation; import org.eclipse.draw2d.geometry.Dimension; @@ -32,7 +33,6 @@ import org.eclipse.gef.palette.PaletteRoot; import org.eclipse.gef.ui.actions.*; import org.eclipse.gef.ui.palette.FlyoutPaletteComposite; -import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences; import org.eclipse.gef.ui.palette.PaletteViewerProvider; import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette; import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler; @@ -73,12 +73,11 @@ import org.jkiss.dbeaver.ext.erd.editor.tools.SetPartSettingsAction; import org.jkiss.dbeaver.ext.erd.export.ERDExportFormatHandler; import org.jkiss.dbeaver.ext.erd.export.ERDExportFormatRegistry; -import org.jkiss.dbeaver.ext.erd.model.ERDDecorator; -import org.jkiss.dbeaver.ext.erd.model.ERDDecoratorDefault; -import org.jkiss.dbeaver.ext.erd.model.ERDEntity; -import org.jkiss.dbeaver.ext.erd.model.EntityDiagram; +import org.jkiss.dbeaver.ext.erd.model.*; import org.jkiss.dbeaver.ext.erd.part.DiagramPart; import org.jkiss.dbeaver.ext.erd.part.EntityPart; +import org.jkiss.dbeaver.ext.erd.part.NodePart; +import org.jkiss.dbeaver.ext.erd.part.NotePart; import org.jkiss.dbeaver.model.DBPDataSourceTask; import org.jkiss.dbeaver.model.DBPNamedObject; import org.jkiss.dbeaver.model.runtime.load.ILoadService; @@ -1091,7 +1090,17 @@ public void completeLoading(EntityDiagram entityDiagram) setInfo("Empty diagram due to error (see error log)"); } getCommandStack().flush(); - getGraphicalViewer().setContents(entityDiagram); + if (entityDiagram != null) { + EditPart oldContents = getGraphicalViewer().getContents(); + if (oldContents instanceof DiagramPart) { + if (restoreVisualSettings((DiagramPart) oldContents, entityDiagram)) { + entityDiagram.setLayoutManualAllowed(true); + entityDiagram.setLayoutManualDesired(true); + } + } + getGraphicalViewer().setContents(entityDiagram); + } + // if (zoomCombo != null) { zoomCombo.setZoomManager(rootPart.getZoomManager()); } @@ -1101,6 +1110,30 @@ public void completeLoading(EntityDiagram entityDiagram) } + private boolean restoreVisualSettings(DiagramPart oldDiagram, EntityDiagram newDiagram) { + boolean hasChanges = false; + // Collect visual settings from old diagram and apply them to the new one + for (ERDEntity newEntity : newDiagram.getEntities()) { + NodePart oldEntity = oldDiagram.getChildByObject(newEntity.getObject()); + if (oldEntity instanceof EntityPart) { + EntityDiagram.NodeVisualInfo vi = new EntityDiagram.NodeVisualInfo(oldEntity); + newDiagram.addVisualInfo(newEntity.getObject(), vi); + hasChanges = true; + } + } + + for (ERDNote newNote : newDiagram.getNotes()) { + NodePart oldNotePart = oldDiagram.getChildByObject(newNote.getObject()); + if (oldNotePart instanceof NotePart) { + EntityDiagram.NodeVisualInfo vi = new EntityDiagram.NodeVisualInfo(oldNotePart); + vi.initBounds = oldNotePart.getBounds(); + newDiagram.addVisualInfo(newNote, vi); + hasChanges = true; + } + } + return hasChanges; + } + private class Searcher extends ObjectSearcher { @Override diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorStandalone.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorStandalone.java index ed4e0529386f..1826603e3b25 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorStandalone.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/editor/ERDEditorStandalone.java @@ -47,7 +47,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; /** * Standalone ERD editor @@ -126,8 +125,7 @@ protected synchronized void loadDiagram(boolean refreshMetadata) diagramLoadingJob = LoadingJob.createService( new AbstractLoadService("Load diagram '" + getEditorInput().getName() + "'") { @Override - public EntityDiagram evaluate(DBRProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { + public EntityDiagram evaluate(DBRProgressMonitor monitor) { try { return loadContentFromFile(monitor); } catch (DBException e) { diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/EntityDiagram.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/EntityDiagram.java index 4795958e1486..554573bdc0c0 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/EntityDiagram.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/model/EntityDiagram.java @@ -19,6 +19,7 @@ */ package org.jkiss.dbeaver.ext.erd.model; +import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jface.preference.IPreferenceStore; @@ -28,6 +29,7 @@ import org.jkiss.dbeaver.ext.erd.ERDActivator; import org.jkiss.dbeaver.ext.erd.editor.ERDAttributeVisibility; import org.jkiss.dbeaver.ext.erd.editor.ERDViewStyle; +import org.jkiss.dbeaver.ext.erd.part.NodePart; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSObject; @@ -53,6 +55,20 @@ public static class NodeVisualInfo { public int borderWidth = -1; public ERDAttributeVisibility attributeVisibility; + + public NodeVisualInfo() { + } + + public NodeVisualInfo(NodePart part) { + this.initBounds = part.getBounds(); + IFigure figure = part.getFigure(); + if (figure != null) { + this.transparent = !figure.isOpaque(); + this.bgColor = figure.getBackgroundColor(); + this.fgColor = figure.getForegroundColor(); + this.font = figure.getFont(); + } + } } private ERDDecorator decorator; diff --git a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/part/DiagramPart.java b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/part/DiagramPart.java index fc7da6584cf3..39d3096d5184 100644 --- a/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/part/DiagramPart.java +++ b/plugins/org.jkiss.dbeaver.ext.erd/src/org/jkiss/dbeaver/ext/erd/part/DiagramPart.java @@ -38,10 +38,9 @@ import org.jkiss.dbeaver.ext.erd.layout.DelegatingLayoutManager; import org.jkiss.dbeaver.ext.erd.layout.GraphAnimation; import org.jkiss.dbeaver.ext.erd.layout.GraphLayoutAuto; -import org.jkiss.dbeaver.ext.erd.model.ERDEntity; -import org.jkiss.dbeaver.ext.erd.model.ERDNote; -import org.jkiss.dbeaver.ext.erd.model.EntityDiagram; +import org.jkiss.dbeaver.ext.erd.model.*; import org.jkiss.dbeaver.ext.erd.policy.DiagramContainerEditPolicy; +import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.ui.UIUtils; import java.beans.PropertyChangeEvent; @@ -323,6 +322,16 @@ public Object getAdapter(Class key) return super.getAdapter(key); } + @Nullable + public NodePart getChildByObject(Object object) { + for (Object child : getChildren()) { + if (child instanceof NodePart && ((NodePart) child).getElement().getObject() == object) { + return (NodePart) child; + } + } + return null; + } + @Nullable public EntityPart getEntityPart(ERDEntity erdEntity) {