提交 05ccc195 编写于 作者: S serge-rider

#6570 ERD entities coloring


Former-commit-id: 037ebab8
上级 2144af05
......@@ -18,8 +18,11 @@
package org.jkiss.dbeaver.ext.erd;
import org.eclipse.draw2d.PrintFigureOperation;
import org.eclipse.swt.graphics.RGB;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType;
import java.awt.*;
/**
* ERD constants
*/
......@@ -62,4 +65,15 @@ public class ERDConstants {
public static final int DEFAULT_ENTITY_BORDER_WIDTH = 2;
public static DBSEntityConstraintType CONSTRAINT_LOGICAL_FK = new DBSEntityConstraintType("erdkey", "Logical Key", null, true, false, false, true);
public static final RGB[] EXTRA_DS_COLORS = new RGB[] {
new RGB(119, 206, 130),
new RGB(206, 63, 34),
new RGB(242, 132, 35),
new RGB(124, 38, 19),
new RGB(157, 214, 245),
new RGB(173, 140, 127),
new RGB(249, 214, 205)
};
}
......@@ -188,6 +188,12 @@ public class ERDEditorEmbedded extends ERDEditorPart implements IDatabaseEditor,
} else {
diagram = new EntityDiagram(getDecorator(), dbObject, dbObject.getName());
// Fill from database even if we loaded from state (something could change since last view)
diagram.fillEntities(
monitor,
collectDatabaseTables(monitor, dbObject, diagram),
dbObject);
boolean hasPersistedState = false;
try {
// Load persisted state
......@@ -209,11 +215,6 @@ public class ERDEditorEmbedded extends ERDEditorPart implements IDatabaseEditor,
diagram.setLayoutManualAllowed(true);
diagram.setNeedsAutoLayout(!hasPersistedState);
// Fill from database even if we loaded from state (something could change since last view)
diagram.fillEntities(
monitor,
collectDatabaseTables(monitor, dbObject, diagram),
dbObject);
}
return diagram;
......
......@@ -23,6 +23,7 @@ import org.eclipse.draw2d.*;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.jkiss.dbeaver.ext.erd.ERDConstants;
import org.jkiss.dbeaver.ext.erd.editor.ERDViewStyle;
import org.jkiss.dbeaver.ext.erd.model.ERDEntity;
......@@ -114,7 +115,17 @@ public class EntityFigure extends Figure {
}
protected Color getBorderColor() {
return UIUtils.getColorRegistry().get(ERDConstants.COLOR_ERD_LINES_FOREGROUND);
int dsIndex = getPart().getDiagram().getDataSourceIndex(part.getEntity().getDataSource().getContainer());
RGB[] extraDsColors = ERDConstants.EXTRA_DS_COLORS;
if (dsIndex == 0) {
return UIUtils.getColorRegistry().get(ERDConstants.COLOR_ERD_LINES_FOREGROUND);
} else {
dsIndex--;
if (dsIndex > extraDsColors.length) {
dsIndex = dsIndex % extraDsColors.length;
}
return UIUtils.getSharedColor(extraDsColors[dsIndex]);
}
}
public EntityPart getPart() {
......
......@@ -198,13 +198,13 @@ public class DiagramLoader
}
final Document document = XMLUtils.parseDocument(in);
monitor.done();
loadDiagram(monitor, document, projectMeta, diagram);
}
public static void loadDiagram(DBRProgressMonitor monitor, Document document, DBPProject projectMeta, EntityDiagram diagram) throws DBException {
final Element diagramElem = document.getDocumentElement();
monitor.done();
// Check version
final String diagramVersion = diagramElem.getAttribute(ATTR_VERSION);
......
......@@ -69,7 +69,7 @@ public class ERDEntity extends ERDElement<DBSEntity> {
}
public DBPDataSource getDataSource() {
return dataSource;
return dataSource != null ? dataSource : getObject().getDataSource();
}
public String getAlias() {
......
......@@ -30,6 +30,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.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSObject;
......@@ -71,9 +72,19 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
}
}
private static class DataSourceInfo {
int index;
List<ERDEntity> entities = new ArrayList<>();
public DataSourceInfo(int index) {
this.index = index;
}
}
private ERDDecorator decorator;
private String name;
private final List<ERDEntity> entities = new ArrayList<>();
private final Map<DBPDataSourceContainer, DataSourceInfo> dataSourceMap = new LinkedHashMap<>();
private boolean layoutManualDesired = true;
private boolean layoutManualAllowed = false;
private boolean needsAutoLayout;
......@@ -144,6 +155,10 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
entities.add(i, entity);
}
entityMap.put(entity.getObject(), entity);
DBPDataSourceContainer dataSource = entity.getObject().getDataSource().getContainer();
DataSourceInfo dsInfo = dataSourceMap.computeIfAbsent(dataSource, dsc -> new DataSourceInfo(dataSourceMap.size()));
dsInfo.entities.add(entity);
}
if (reflect) {
......@@ -182,6 +197,14 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
synchronized (entities) {
entityMap.remove(entity.getObject());
entities.remove(entity);
DBPDataSourceContainer dataSource = entity.getObject().getDataSource().getContainer();
DataSourceInfo dsInfo = dataSourceMap.get(dataSource);
dsInfo.entities.remove(entity);
if (dsInfo.entities.isEmpty()) {
dataSourceMap.remove(dataSource);
}
}
if (reflect) {
firePropertyChange(CHILD, entity, null);
......@@ -284,6 +307,9 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
if (monitor.isCanceled()) {
break;
}
if (entityMap.containsKey(table)) {
continue;
}
monitor.subTask("Load " + table.getName());
ERDEntity erdEntity = ERDUtils.makeEntityFromObject(monitor, this, entityCache, table, null);
erdEntity.setPrimary(table == dbObject);
......@@ -299,15 +325,12 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
// Load relations
monitor.beginTask("Load entities' relations", entities.size());
for (DBSEntity table : entities) {
for (ERDEntity erdEntity : entityCache) {
if (monitor.isCanceled()) {
break;
}
monitor.subTask("Load " + table.getName());
final ERDEntity erdEntity = entityMap.get(table);
if (erdEntity != null) {
erdEntity.addModelRelations(monitor, this, true, false);
}
monitor.subTask("Load " + erdEntity.getName());
erdEntity.addModelRelations(monitor, this, true, false);
monitor.worked(1);
}
monitor.done();
......@@ -340,6 +363,20 @@ public class EntityDiagram extends ERDObject<DBSObject> implements ERDContainer
return result;
}
public List<DBPDataSourceContainer> getDataSources() {
return new ArrayList<>(dataSourceMap.keySet());
}
public List<ERDEntity> getEntities(DBPDataSourceContainer dataSourceContainer) {
DataSourceInfo dsInfo = dataSourceMap.get(dataSourceContainer);
return dsInfo == null ? Collections.emptyList() : dsInfo.entities;
}
public int getDataSourceIndex(DBPDataSourceContainer dataSource) {
DataSourceInfo dsInfo = dataSourceMap.get(dataSource);
return dsInfo == null ? 0 : dsInfo.index;
}
public void clear() {
this.entities.clear();
this.entityMap.clear();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册