Skip to content

Commit

Permalink
#6008 ERD: keep elements position/state on diagram refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
serge-rider committed Jun 16, 2019
1 parent 47513bb commit b483fa0
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 12 deletions.
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
Expand All @@ -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<DBPNamedObject> {

@Override
Expand Down
Expand Up @@ -47,7 +47,6 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;

/**
* Standalone ERD editor
Expand Down Expand Up @@ -126,8 +125,7 @@ protected synchronized void loadDiagram(boolean refreshMetadata)
diagramLoadingJob = LoadingJob.createService(
new AbstractLoadService<EntityDiagram>("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) {
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit b483fa0

Please sign in to comment.