提交 76e0c1ab 编写于 作者: S serge-rider

#6529 Virtual structure editor tab. Virt model events

上级 52e49e12
......@@ -294,14 +294,22 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
}
void addVirtualAttribute(DBVEntityAttribute attribute) {
addVirtualAttribute(attribute, true);
}
void addVirtualAttribute(DBVEntityAttribute attribute, boolean reflect) {
if (entityAttributes == null) {
entityAttributes = new ArrayList<>();
}
entityAttributes.add(attribute);
if (reflect) {
DBUtils.fireObjectUpdate(this);
}
}
void resetVirtualAttribute(DBVEntityAttribute attribute) {
void removeVirtualAttribute(DBVEntityAttribute attribute) {
entityAttributes.remove(attribute);
DBUtils.fireObjectUpdate(this, attribute);
}
@Nullable
......@@ -331,15 +339,24 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
}
public void addConstraint(DBVEntityConstraint constraint) {
addConstraint(constraint, true);
}
public void addConstraint(DBVEntityConstraint constraint, boolean reflect) {
if (entityConstraints == null) {
entityConstraints = new ArrayList<>();
}
entityConstraints.add(constraint);
if (reflect) {
DBUtils.fireObjectUpdate(this, constraint);
}
}
public void removeConstraint(DBVEntityConstraint constraint) {
if (entityConstraints != null) {
entityConstraints.remove(constraint);
DBUtils.fireObjectUpdate(this, constraint);
}
}
......@@ -365,11 +382,13 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
entityForeignKeys = new ArrayList<>();
}
entityForeignKeys.add(foreignKey);
DBUtils.fireObjectUpdate(this, foreignKey);
}
public synchronized void removeForeignKey(@NotNull DBVEntityForeignKey foreignKey) {
if (entityForeignKeys != null) {
entityForeignKeys.remove(foreignKey);
DBUtils.fireObjectUpdate(this, foreignKey);
}
}
......
......@@ -255,7 +255,7 @@ class DBVModelSerializerLegacy implements DBVModelSerializer
curEntity,
DBSEntityConstraintType.VIRTUAL_KEY,
atts.getValue(ATTR_NAME));
curEntity.addConstraint(curConstraint);
curEntity.addConstraint(curConstraint, false);
}
break;
case TAG_ATTRIBUTE:
......@@ -267,7 +267,7 @@ class DBVModelSerializerLegacy implements DBVModelSerializer
curAttribute = childAttribute;
} else if (curEntity != null) {
curAttribute = new DBVEntityAttribute(curEntity, null, atts.getValue(ATTR_NAME));
curEntity.addVirtualAttribute(curAttribute);
curEntity.addVirtualAttribute(curAttribute, false);
}
break;
case TAG_TRANSFORM:
......
......@@ -167,7 +167,7 @@
</editor>
<editor
id="org.jkiss.dbeaver.ui.editors.data.VirtualStructureEditor"
id="db-logical-structure"
class="org.jkiss.dbeaver.ui.editors.data.VirtualStructureEditor"
objectType="org.jkiss.dbeaver.model.struct.DBSEntity"
main="false"
......
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ui.controls.resultset;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
......@@ -30,6 +31,13 @@ import org.jkiss.dbeaver.model.struct.DBSDataContainer;
*/
public interface IResultSetContainer {
/**
* Owner project.
* May be null if results container is hosted by some external file editor.
*/
@Nullable
DBPProject getProject();
/**
* Execution context which will be used by Results viewer to read data
* @return execution context. Maybe null is container is not connected
......
......@@ -55,6 +55,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.*;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.exec.*;
......@@ -73,10 +74,7 @@ import org.jkiss.dbeaver.model.sql.SQLQueryContainer;
import org.jkiss.dbeaver.model.sql.SQLScriptElement;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.model.virtual.DBVEntity;
import org.jkiss.dbeaver.model.virtual.DBVEntityConstraint;
import org.jkiss.dbeaver.model.virtual.DBVTransformSettings;
import org.jkiss.dbeaver.model.virtual.DBVUtils;
import org.jkiss.dbeaver.model.virtual.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.DBeaverNotifications;
import org.jkiss.dbeaver.tools.transfer.registry.DataTransferNodeDescriptor;
......@@ -126,7 +124,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
*
*/
public class ResultSetViewer extends Viewer
implements DBPContextProvider, IResultSetController, ISaveablePart2, IAdaptable
implements DBPContextProvider, IResultSetController, ISaveablePart2, IAdaptable, DBPEventListener
{
private static final Log log = Log.getLog(ResultSetViewer.class);
......@@ -355,6 +353,11 @@ public class ResultSetViewer extends Viewer
}
updateFiltersText();
DBPProject project = container.getProject();
if (project != null) {
project.getDataSourceRegistry().addDataSourceListener(this);
}
}
@Override
......@@ -417,13 +420,18 @@ public class ResultSetViewer extends Viewer
}
DataFilterRegistry.getInstance().saveDataFilter(getDataContainer(), model.getDataFilter());
if (filtersPanel != null) {
DBeaverNotifications.showNotification(DBeaverNotifications.NT_GENERAL,
"Data filter was saved",
filtersPanel.getFilterText(),
DBPMessageType.INFORMATION, null);
}
}
void switchFilterFocus() {
if (filtersPanel == null) {
return;
}
boolean filterFocused = filtersPanel.getEditControl().isFocusControl();
if (filterFocused) {
if (activePresentation != null) {
......@@ -772,8 +780,10 @@ public class ResultSetViewer extends Viewer
}
panelButton.setChecked(!isPanelVisible);
panelsButton.setChecked(isPanelsVisible());
if (panelSwitchFolder != null) {
panelSwitchFolder.redraw();
}
}
});
panelButton.setChecked(panelsVisible && isPanelVisible(panel.getId()));
}
......@@ -1673,6 +1683,11 @@ public class ResultSetViewer extends Viewer
private void dispose()
{
DBPProject project = container.getProject();
if (project != null) {
project.getDataSourceRegistry().removeDataSourceListener(this);
}
savePresentationSettings();
clearData();
......@@ -2495,6 +2510,14 @@ public class ResultSetViewer extends Viewer
return refTablesMenu;
}
@Override
public void handleDataSourceEvent(DBPEvent event) {
if (event.getObject() instanceof DBVEntity && event.getData() instanceof DBVEntityForeignKey && event.getObject() == getVirtualEntity()) {
// Virtual foreign key change - let's refresh
refreshData(null);
}
}
private class TransformerAction extends Action {
private final DBDAttributeBinding attribute;
......@@ -2739,9 +2762,6 @@ public class ResultSetViewer extends Viewer
throw new DBException("Referenced constraint [" + refConstraint + "] is not a referrer");
}
DBSEntity targetEntity = refConstraint.getParentObject();
if (targetEntity == null) {
throw new DBException("Null constraint parent");
}
targetEntity = DBVUtils.getRealEntity(monitor, targetEntity);
if (!(targetEntity instanceof DBSDataContainer)) {
throw new DBException("Entity [" + DBUtils.getObjectFullName(targetEntity, DBPEvaluationContext.UI) + "] is not a data container");
......@@ -2768,12 +2788,15 @@ public class ResultSetViewer extends Viewer
return;
}
DBDAttributeConstraint constraint = new DBDAttributeConstraint(refAttr.getAttribute(), DBDAttributeConstraint.NULL_VISUAL_POSITION);
DBSEntityAttribute attribute = refAttr.getAttribute();
if (attribute != null) {
DBDAttributeConstraint constraint = new DBDAttributeConstraint(attribute, DBDAttributeConstraint.NULL_VISUAL_POSITION);
constraint.setVisible(true);
constraints.add(constraint);
createFilterConstraint(rows, ownBinding, constraint);
}
}
// Save cur data filter in state
if (curState == null) {
setNewState((DBSDataContainer) targetEntity, model.getDataFilter());
......@@ -2799,9 +2822,6 @@ public class ResultSetViewer extends Viewer
}
DBSEntity targetEntity = association.getParentObject();
if (targetEntity == null) {
throw new DBException("Null constraint parent");
}
//DBSDataContainer dataContainer = DBUtils.getAdapter(DBSDataContainer.class, targetEntity);
targetEntity = DBVUtils.getRealEntity(monitor, targetEntity);
if (!(targetEntity instanceof DBSDataContainer)) {
......@@ -2893,9 +2913,7 @@ public class ResultSetViewer extends Viewer
viewerPanel.getShell(),
ResultSetPreferences.CONFIRM_RS_PANEL_RESET,
ConfirmationDialog.CONFIRM);
if (result == IDialogConstants.CANCEL_ID) {
return false;
}
return result != IDialogConstants.CANCEL_ID;
}
return true;
}
......@@ -3454,7 +3472,6 @@ public class ResultSetViewer extends Viewer
* In some cases there may be many frequent data read requests (e.g. when user works
* with references panel). We need to execute only current one and the last one. All
* intrmediate data read requests must be ignored.
* @param dataPumpJob
*/
private void queueDataPump(ResultSetJobDataRead dataPumpJob) {
synchronized (dataPumpJobQueue) {
......@@ -3764,9 +3781,14 @@ public class ResultSetViewer extends Viewer
}
private DBVEntity getVirtualEntity(DBSEntity entity) {
return entity != null ?
DBVUtils.getVirtualEntity(entity, true) :
DBVUtils.getVirtualEntity(getDataContainer(), true);
if (entity != null) {
return DBVUtils.getVirtualEntity(entity, true);
}
DBSDataContainer dataContainer = getDataContainer();
if (dataContainer != null) {
return DBVUtils.getVirtualEntity(dataContainer, true);
}
return null;
}
private void checkEntityIdentifiers(ResultSetPersister persister) throws DBException
......
......@@ -18,9 +18,11 @@ package org.jkiss.dbeaver.ui.controls.resultset.panel.grouping;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCStatistics;
......@@ -76,6 +78,13 @@ public class GroupingResultsContainer implements IResultSetContainer {
return groupFunctions;
}
@Nullable
@Override
public DBPProject getProject() {
DBSDataContainer dataContainer = getDataContainer();
return dataContainer == null || dataContainer.getDataSource() == null ? null : dataContainer.getDataSource().getContainer().getProject();
}
@Override
public DBCExecutionContext getExecutionContext() {
return presentation.getController().getExecutionContext();
......
......@@ -27,11 +27,13 @@ import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
......@@ -107,6 +109,13 @@ class ReferencesResultsContainer implements IResultSetContainer {
return parentController.getActivePresentation();
}
@Nullable
@Override
public DBPProject getProject() {
DBSDataContainer dataContainer = getDataContainer();
return dataContainer == null || dataContainer.getDataSource() == null ? null : dataContainer.getDataSource().getContainer().getProject();
}
@Override
public DBCExecutionContext getExecutionContext() {
return DBUtils.getDefaultContext(dataContainer, false);
......
......@@ -29,6 +29,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDCursor;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.data.DBDDataReceiver;
......@@ -142,6 +143,12 @@ public class CursorViewDialog extends ValueViewDialog implements IResultSetConta
}
@Nullable
@Override
public DBPProject getProject() {
return getValueController().getExecutionContext().getDataSource().getContainer().getProject();
}
@Override
public DBCExecutionContext getExecutionContext() {
return getValueController() == null ? null : getValueController().getExecutionContext();
......
......@@ -28,6 +28,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
......@@ -115,6 +116,12 @@ public abstract class AbstractDataEditor<OBJECT_TYPE extends DBSObject> extends
super.dispose();
}
@NotNull
@Override
public DBPProject getProject() {
return getDatabaseObject().getDataSource().getContainer().getProject();
}
@Nullable
@Override
public ResultSetViewer getResultSetController()
......
......@@ -16,6 +16,8 @@
*/
package org.jkiss.dbeaver.ui.editors.data;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
......@@ -24,12 +26,13 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDAttributeTransformerDescriptor;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraint;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType;
import org.jkiss.dbeaver.model.virtual.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
......@@ -49,8 +52,7 @@ import java.util.stream.Collectors;
/**
* VirtualStructureEditor
*/
public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEntity>
{
public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEntity> implements DBPEventListener {
private static final Log log = Log.getLog(VirtualStructureEditor.class);
private boolean activated;
......@@ -58,9 +60,9 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
private DBSEntity entity;
private DBVEntity vEntity;
private EditDictionaryPage editDictionaryPage;
private EditConstraintPage editUniqueKeyPage;
private DBVEntityConstraint uniqueConstraint;
private boolean fkChanged = false;
private Table ukTable;
private Table fkTable;
@Override
public void createPartControl(Composite parent) {
......@@ -72,52 +74,96 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
@Override
public void setFocus() {
this.parent.setFocus();
}
@Override
public void refreshPart(Object source, boolean force) {
new AbstractJob("Load logical entity references") {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
for (DBVEntityForeignKey fk : vEntity.getForeignKeys()) {
try {
fk.getRealReferenceConatraint(monitor);
fk.getAssociatedEntity(monitor);
} catch (DBException e) {
log.debug(e);
}
}
UIUtils.asyncExec(() -> refreshVisuals());
return Status.OK_STATUS;
}
}.schedule();
}
private void refreshVisuals() {
ukTable.removeAll();
try {
for (DBVEntityConstraint uk : vEntity.getConstraints()) {
if (!CommonUtils.isEmpty(uk.getAttributes())) {
createUniqueKeyItem(ukTable, uk);
}
}
} catch (Exception e) {
DBWorkbench.getPlatformUI().showError("Foreign keys", "Error loading virtual unique keys", e);
}
UIUtils.packColumns(ukTable, true);
fkTable.removeAll();
try {
for (DBVEntityForeignKey fk : vEntity.getForeignKeys()) {
createForeignKeyItem(fkTable, fk);
}
} catch (Exception e) {
DBWorkbench.getPlatformUI().showError("Foreign keys", "Error loading virtual foreign keys", e);
}
UIUtils.packColumns(fkTable, true);
}
@Override
public void activatePart() {
if (!activated) {
createEditorUI();
refreshPart(this, true);
activated = true;
}
}
private void createEditorUI() {
try {
UIUtils.runInProgressService(monitor -> {
for (DBVEntityForeignKey fk : vEntity.getForeignKeys()) {
try {
fk.getRealReferenceConatraint(monitor);
fk.getAssociatedEntity(monitor);
} catch (DBException e) {
log.debug(e);
@Override
public void dispose() {
if (activated) {
DBSEntity dbObject = getDatabaseObject();
if (dbObject != null) {
DBUtils.getObjectRegistry(dbObject).removeDataSourceListener(this);
}
}
});
} catch (InvocationTargetException e) {
log.error(e.getTargetException());
} catch (InterruptedException e) {
// ignore
super.dispose();
}
Composite composite = UIUtils.createComposite(parent, 1);
private void createEditorUI() {
Composite composite = UIUtils.createComposite(parent, 2);
((GridLayout)composite.getLayout()).makeColumnsEqualWidth = true;
Composite keysComposite = UIUtils.createComposite(composite, 1);
keysComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
//createColumnsPage(tabFolder);
createUniqueKeysPage(composite);
createForeignKeysPage(composite);
createUniqueKeysPage(keysComposite);
createForeignKeysPage(keysComposite);
//createDictionaryPage(composite);
UIUtils.createInfoLabel(composite, "Entity logical structure is defined on client-side." +
Composite attrsComposite = UIUtils.createComposite(composite, 1);
attrsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
UIUtils.createInfoLabel(composite, "Entity logical structure exists only on the client-side, not in a real database." +
"\nYou can define virtual unique/foreign keys even if physical database " +
"doesn't have or doesn't support them.", GridData.FILL_HORIZONTAL, 2);
parent.layout(true, true);
DBSEntity dbObject = getDatabaseObject();
if (dbObject != null) {
DBUtils.getObjectRegistry(dbObject).addDataSourceListener(this);
}
}
private void createDictionaryPage(TabFolder tabFolder) {
......@@ -138,20 +184,13 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
}
Group group = UIUtils.createControlGroup(parent, "Virtual Unique Keys", 1, GridData.FILL_BOTH, SWT.DEFAULT);
Table ukTable = new Table(group, SWT.FULL_SELECTION | SWT.BORDER);
ukTable = new Table(group, SWT.FULL_SELECTION | SWT.BORDER);
ukTable.setLayoutData(new GridData(GridData.FILL_BOTH));
ukTable.setHeaderVisible(true);
UIUtils.executeOnResize(ukTable, () -> UIUtils.packColumns(ukTable, true));
UIUtils.createTableColumn(ukTable, SWT.LEFT, "Ref Table");
UIUtils.createTableColumn(ukTable, SWT.LEFT, "Columns");
for (DBVEntityConstraint uk : vEntity.getConstraints()) {
if (!CommonUtils.isEmpty(uk.getAttributes())) {
createUniqueKeyItem(ukTable, uk);
}
}
{
Composite buttonsPanel = UIUtils.createComposite(group, 3);
buttonsPanel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
......@@ -239,30 +278,24 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
private void createForeignKeysPage(Composite parent) {
Group group = UIUtils.createControlGroup(parent, "Virtual Foreign Keys", 1, GridData.FILL_BOTH, SWT.DEFAULT);
Table fkTable = new Table(group, SWT.FULL_SELECTION | SWT.BORDER);
fkTable = new Table(group, SWT.FULL_SELECTION | SWT.BORDER);
fkTable.setLayoutData(new GridData(GridData.FILL_BOTH));
fkTable.setHeaderVisible(true);
UIUtils.executeOnResize(fkTable, () -> UIUtils.packColumns(fkTable, true));
UIUtils.createTableColumn(fkTable, SWT.LEFT, "Ref Table");
UIUtils.createTableColumn(fkTable, SWT.LEFT, "Columns");
UIUtils.createTableColumn(fkTable, SWT.LEFT, "Ref Datasource");
for (DBVEntityForeignKey fk : vEntity.getForeignKeys()) {
createForeignKeyItem(fkTable, fk);
}
{
Composite buttonsPanel = UIUtils.createComposite(group, 2);
buttonsPanel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
Button btnAdd = UIUtils.createDialogButton(buttonsPanel, "Add", new SelectionAdapter() {
UIUtils.createDialogButton(buttonsPanel, "Add", new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DBVEntityForeignKey virtualFK = EditForeignKeyPage.createVirtualForeignKey(vEntity);
if (virtualFK != null) {
createForeignKeyItem(fkTable, virtualFK);
fkChanged = true;
}
}
});
......@@ -278,7 +311,7 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
}
vEntity.removeForeignKey(virtualFK);
fkTable.remove(fkTable.getSelectionIndices());
fkChanged = true;
((Button)e.widget).setEnabled(false);
}
});
btnRemove.setEnabled(false);
......@@ -286,8 +319,7 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
fkTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean hasSelection = fkTable.getSelectionIndex() >= 0;
btnRemove.setEnabled(hasSelection);
btnRemove.setEnabled(fkTable.getSelectionIndex() >= 0);
}
});
}
......@@ -296,12 +328,12 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
private void createForeignKeyItem(Table fkTable, DBVEntityForeignKey fk) {
TableItem item = new TableItem(fkTable, SWT.NONE);
//item.setImage(0, DBeaverIcons.getImage(DBIcon.TREE_FOREIGN_KEY));
DBSEntity refEntity = fk.getReferencedConstraint().getParentObject();
DBSEntityConstraint refConstraint = fk.getReferencedConstraint();
DBSEntity refEntity = refConstraint.getParentObject();
item.setImage(0, DBeaverIcons.getImage(DBIcon.TREE_FOREIGN_KEY));
if (fk.getReferencedConstraint() != null) {
item.setText(0, DBUtils.getObjectFullName(refEntity, DBPEvaluationContext.UI));
}
String ownAttrNames = fk.getAttributes().stream().map(DBVEntityForeignKeyColumn::getAttributeName)
.collect(Collectors.joining(","));
String refAttrNames = fk.getAttributes().stream().map(DBVEntityForeignKeyColumn::getRefAttributeName)
......@@ -352,4 +384,10 @@ public class VirtualStructureEditor extends AbstractDatabaseObjectEditor<DBSEnti
attrItem.setText(2, colorSettings);
}
@Override
public void handleDataSourceEvent(DBPEvent event) {
if (event.getObject() == vEntity) {
UIUtils.asyncExec(() -> refreshPart(event, true));
}
}
}
......@@ -2722,6 +2722,12 @@ public class SQLEditor extends SQLEditorBase implements
tabItem.setData(DATA_PINNED, pinned);
}
@NotNull
@Override
public DBPProject getProject() {
return SQLEditor.this.getProject();
}
@Override
public DBCExecutionContext getExecutionContext() {
return SQLEditor.this.getExecutionContext();
......
......@@ -20,6 +20,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -68,6 +69,13 @@ public class SQLResultsView extends ViewPart
private class DetachedContainer implements IResultSetContainer {
private IResultSetContainer currentContainer;
@Nullable
@Override
public DBPProject getProject() {
return currentContainer == null ? null : currentContainer.getProject();
}
@Nullable
@Override
public DBCExecutionContext getExecutionContext() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册